| 456 | } |
| 457 | |
| 458 | LoaderExifJpeg::LoaderExifJpeg(PreviewId id, const Image& image, int parIdx) : Loader(id, image) { |
| 459 | const ExifData& exifData = image_.exifData(); |
| 460 | auto pos = exifData.findKey(ExifKey(param_[parIdx].offsetKey_)); |
| 461 | if (pos != exifData.end() && pos->count() > 0) { |
| 462 | offset_ = pos->toUint32(); |
| 463 | } |
| 464 | |
| 465 | size_ = 0; |
| 466 | pos = exifData.findKey(ExifKey(param_[parIdx].sizeKey_)); |
| 467 | if (pos != exifData.end() && pos->count() > 0) { |
| 468 | size_ = pos->toUint32(); |
| 469 | } |
| 470 | |
| 471 | if (offset_ == 0 || size_ == 0) |
| 472 | return; |
| 473 | |
| 474 | if (param_[parIdx].baseOffsetKey_) { |
| 475 | pos = exifData.findKey(ExifKey(param_[parIdx].baseOffsetKey_)); |
| 476 | if (pos != exifData.end() && pos->count() > 0) { |
| 477 | offset_ += pos->toUint32(); |
| 478 | } |
| 479 | } |
| 480 | |
| 481 | if (Safe::add(offset_, size_) > image_.io().size()) |
| 482 | return; |
| 483 | |
| 484 | valid_ = true; |
| 485 | } |
| 486 | |
| 487 | Loader::UniquePtr createLoaderExifJpeg(PreviewId id, const Image& image, int parIdx) { |
| 488 | return std::make_unique<LoaderExifJpeg>(id, image, parIdx); |