@@ -500,7 +500,8 @@ RawImage DngDecoder::decodeRawInternal() {
500500void DngDecoder::handleMetadata (const TiffIFD* raw) {
501501 // Crop
502502 if (const std::optional<iRectangle2D> aa = parseACTIVEAREA (raw))
503- mRaw ->subFrame (*aa);
503+ if (aa->hasPositiveArea ())
504+ mRaw ->subFrame (*aa);
504505
505506 if (raw->hasEntry (TiffTag::DEFAULTCROPORIGIN) &&
506507 raw->hasEntry (TiffTag::DEFAULTCROPSIZE)) {
@@ -509,13 +510,19 @@ void DngDecoder::handleMetadata(const TiffIFD* raw) {
509510 const TiffEntry* size_entry = raw->getEntry (TiffTag::DEFAULTCROPSIZE);
510511
511512 const auto tl_r = origin_entry->getRationalArray (2 );
512- std::array<unsigned , 2 > tl;
513- std::transform (tl_r.begin (), tl_r.end (), tl.begin (),
514- [](const NotARational<unsigned >& r) {
515- if (r.den == 0 || r.num % r.den != 0 )
516- ThrowRDE (" Error decoding default crop origin" );
517- return r.num / r.den ;
518- });
513+ std::array<unsigned , 2 > tl = {0 , 0 };
514+ try {
515+ std::transform (tl_r.begin (), tl_r.end (), tl.begin (),
516+ [](const NotARational<unsigned >& r) {
517+ if (r.den == 0 || r.num % r.den != 0 )
518+ ThrowRDE (" Error decoding default crop origin" );
519+ return r.num / r.den ;
520+ });
521+ } catch (const RawDecoderException& e) {
522+ // We push back errors from the crop parser, since the image may still
523+ // be usable
524+ mRaw ->setError (e.what ());
525+ }
519526
520527 if (iPoint2D cropOrigin (tl[0 ], tl[1 ]);
521528 cropped.isPointInsideInclusive (cropOrigin))
@@ -524,13 +531,20 @@ void DngDecoder::handleMetadata(const TiffIFD* raw) {
524531 cropped.dim = mRaw ->dim - cropped.pos ;
525532
526533 const auto sz_r = size_entry->getRationalArray (2 );
527- std::array<unsigned , 2 > sz;
528- std::transform (sz_r.begin (), sz_r.end (), sz.begin (),
529- [](const NotARational<unsigned >& r) {
530- if (r.den == 0 || r.num % r.den != 0 )
531- ThrowRDE (" Error decoding default crop size" );
532- return r.num / r.den ;
533- });
534+ std::array<unsigned , 2 > sz = {static_cast <unsigned >(mRaw ->dim .x ),
535+ static_cast <unsigned >(mRaw ->dim .y )};
536+ try {
537+ std::transform (sz_r.begin (), sz_r.end (), sz.begin (),
538+ [](const NotARational<unsigned >& r) {
539+ if (r.den == 0 || r.num % r.den != 0 )
540+ ThrowRDE (" Error decoding default crop size" );
541+ return r.num / r.den ;
542+ });
543+ } catch (const RawDecoderException& e) {
544+ // We push back errors from the crop parser, since the image may still
545+ // be usable
546+ mRaw ->setError (e.what ());
547+ }
534548
535549 if (iPoint2D size (sz[0 ], sz[1 ]);
536550 size.isThisInside (mRaw ->dim ) &&
0 commit comments