180{
181 dbgFile <<
"Going to read layer record. Pos:" << io.pos();
182
183 if (!psdread<byteOrder>(io,
top) || !psdread<byteOrder>(io,
left) || !psdread<byteOrder>(io,
bottom) || !psdread<byteOrder>(io,
right)
185 error =
"could not read layer record";
186 return false;
187 }
188
190
194
197 return false;
198 }
199
202 return false;
203 }
204
206 if (io.atEnd()) {
207 error =
"Could not read enough data for channels";
208 return false;
209 }
210
212
213 if (!psdread<byteOrder>(io, info->
channelId)) {
214 error =
"could not read channel id";
215 delete info;
216 return false;
217 }
220 quint32 channelDataLength;
221 r = psdread<byteOrder>(io, channelDataLength);
223 } else {
225 }
226 if (!r) {
227 error =
"Could not read length for channel data";
228 delete info;
229 return false;
230 }
231
234
236 }
237
240 return false;
241 }
242
244
245 if (!psdread<byteOrder>(io,
opacity)) {
246 error =
"Could not read opacity";
247 return false;
248 }
249
251
252 if (!psdread<byteOrder>(io,
clipping)) {
253 error =
"Could not read clipping";
254 return false;
255 }
256
258
259 quint8 flags;
260 if (!psdread<byteOrder>(io, flags)) {
261 error =
"Could not read flags";
262 return false;
263 }
264 dbgFile <<
"\tflags" << flags << io.pos();
265
267
269
270 visible = flags & 2 ? false :
true;
271
273
274 if (flags & 8) {
276 } else {
278 }
279
281
282 dbgFile <<
"\tfiller at " << io.pos();
283
284 quint8 filler;
285 if (!psdread<byteOrder>(io, filler) || filler != 0) {
286 error =
"Could not read padding";
287 return false;
288 }
289
290 dbgFile <<
"\tGoing to read extra data length" << io.pos();
291
292 quint32 extraDataLength;
293 if (!psdread<byteOrder>(io, extraDataLength) || io.bytesAvailable() < extraDataLength) {
294 error = QString(
"Could not read extra layer data: %1 at pos %2").arg(extraDataLength).arg(io.pos());
295 return false;
296 }
297
298 dbgFile <<
"\tExtra data length" << extraDataLength;
299
300 if (extraDataLength > 0) {
301 dbgFile <<
"Going to read extra data field. Bytes available: " << io.bytesAvailable() <<
"pos" << io.pos();
302
303
304 quint32 layerMaskLength = 1;
305 if (!psdread<byteOrder>(io, layerMaskLength) || io.bytesAvailable() < layerMaskLength) {
306 error = QString(
"Could not read layer mask length: %1").arg(layerMaskLength);
307 return false;
308 }
309
311
312 if (layerMaskLength == 0) {
313 dbgFile <<
"\tNo layer mask/adjustment layer data. pos" << io.pos();
314 } else {
315 dbgFile <<
"\tReading layer mask/adjustment layer data. Length of block:" << layerMaskLength <<
"pos"
316 << io.pos();
317
321 error =
"could not read common records of layer mask";
322 return false;
323 }
324
328 const bool hasMaskParameters = (flags & 8) != 0;
329
332 << ", needs to read mask parameters" << hasMaskParameters;
333
334 if (layerMaskLength == 20) {
335 quint16 padding = 0;
336 if (!psdread<byteOrder>(io, padding)) {
337 error =
"Could not read layer mask padding";
338 return false;
339 }
340 } else {
341 quint32 remainingBlockLength = layerMaskLength - 18;
342
343 dbgFile <<
"\tReading selective records from layer mask info. Remaining block length"
344 << remainingBlockLength;
345
346 if (hasMaskParameters) {
347 if (!psdread<byteOrder>(io, flags)) {
348 error =
"could not read mask parameters";
349 return false;
350 }
351
352 remainingBlockLength -= 1;
353
354 dbgFile <<
"\t\tMask parameters" << QString::number(flags, 2) <<
". Remaining block length"
355 << remainingBlockLength;
356
357 if (flags & 1) {
358 quint8 dummy = 0;
359 if (!psdread<byteOrder>(io, dummy)) {
360 error =
"could not read user mask density";
361 return false;
362 }
363 remainingBlockLength -= sizeof(dummy);
364 }
365
366 if (flags & 2) {
367 double dummy = 0;
368 if (!psdread<byteOrder>(io, dummy)) {
369 error =
"could not read user mask feather";
370 return false;
371 }
372 remainingBlockLength -= sizeof(dummy);
373 }
374
375 if (flags & 4) {
376 quint8 dummy = 0;
377 if (!psdread<byteOrder>(io, dummy)) {
378 error =
"could not read vector mask density";
379 return false;
380 }
381 remainingBlockLength -= sizeof(dummy);
382 }
383
384 if (flags & 8) {
385 double dummy = 0;
386 if (!psdread<byteOrder>(io, dummy)) {
387 error =
"could not read vector mask feather";
388 return false;
389 }
390 remainingBlockLength -= sizeof(dummy);
391 }
392 }
393
394 if (remainingBlockLength >= 1) {
395 if (!psdread<byteOrder>(io, flags)) {
396 error =
"could not read 'real' mask record";
397 return false;
398 }
399
403 const bool hasMaskParameters = (flags & 8) != 0;
404
407 << ", needs to read mask parameters" << hasMaskParameters;
408
409 remainingBlockLength -= 1;
410
411 dbgFile <<
"\t\tRemaining block length" << remainingBlockLength;
412 }
413
414 if (remainingBlockLength >= 1) {
416 error =
"could not read 'real' default color";
417 return false;
418 }
419 remainingBlockLength -= 1;
420 dbgFile <<
"\t\tRead 'real' default color. Remaining block length" << remainingBlockLength;
421 }
422
423 if (remainingBlockLength >= 16) {
426 error =
"could not read 'real' mask rectangle";
427 return false;
428 }
429 remainingBlockLength -= 16;
430 dbgFile <<
"\t\tRead 'real' mask rectangle. Remaining block length" << remainingBlockLength;
431 }
432 }
433 }
434
435
436 quint32 blendingDataLength = 0;
437 if (!psdread<byteOrder>(io, blendingDataLength) || io.bytesAvailable() < blendingDataLength) {
438 error =
"Could not read extra blending data.";
439 return false;
440 }
441
442 quint32 blendingNchannels = blendingDataLength > 0 ? (blendingDataLength - 8) / 4 / 2 : 0;
443
444 dbgFile <<
"\tNumber of blending channels:" << blendingNchannels;
445
446 if (blendingDataLength > 0) {
447 if (blendingDataLength > 0) {
452 error =
"Could not read blending black/white values";
453 return false;
454 }
455 }
456 blendingDataLength -= 4;
457
458 if (blendingDataLength > 0) {
463 error =
"Could not read blending black/white values";
464 return false;
465 }
466 }
467 blendingDataLength -= 4;
468
469 dbgFile <<
"\tBlending ranges:";
472
473 for (quint32 i = 0; i < blendingNchannels; ++i) {
474 LayerBlendingRanges::LayerBlendingRange
src{};
475 LayerBlendingRanges::LayerBlendingRange dst{};
476 if (!psdread<byteOrder>(io,
src.blackValues[0]) || !psdread<byteOrder>(io,
src.blackValues[1]) || !psdread<byteOrder>(io,
src.whiteValues[0])
477 || !psdread<byteOrder>(io,
src.whiteValues[1]) || !psdread<byteOrder>(io, dst.blackValues[0]) || !psdread<byteOrder>(io, dst.blackValues[1])
478 || !psdread<byteOrder>(io, dst.whiteValues[0]) || !psdread<byteOrder>(io, dst.whiteValues[1])) {
479 error = QString(
"could not read src/dst range for channel %1").arg(i);
480 return false;
481 }
482 dbgFile <<
"\t\tread range " <<
src <<
"to" << dst <<
"for channel" << i;
484 }
485 }
486
487 dbgFile <<
"\tGoing to read layer name at" << io.pos();
488 quint8 layerNameLength;
489 if (!psdread<byteOrder>(io, layerNameLength)) {
490 error =
"Could not read layer name length";
491 return false;
492 }
493
494 dbgFile <<
"\tlayer name length unpadded" << layerNameLength <<
"pos" << io.pos();
495 layerNameLength = ((layerNameLength + 1 + 3) & ~0x03) - 1;
496
497 dbgFile <<
"\tlayer name length padded" << layerNameLength <<
"pos" << io.pos();
498
501
502 dbgFile <<
"\tAbout to read additional info blocks at" << io.pos();
503
506 return false;
507 }
508
511 }
512
514 }
515
517}
LayerBlendingRanges blendingRanges
bool transparencyProtected
int kritaColorLabelIndex(quint16 labelColor)
QString channelIdToChannelType(int channelId, psd_color_mode colormode)
quint64 channelDataLength
QVector< QPair< LayerBlendingRange, LayerBlendingRange > > sourceDestinationRanges
QPair< LayerBlendingRange, LayerBlendingRange > compositeGrayRange
bool positionedRelativeToLayer
bool invertLayerMaskWhenBlending