diff options
Diffstat (limited to 'src/pdf/SkPDFBitmap.cpp')
-rw-r--r-- | src/pdf/SkPDFBitmap.cpp | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/src/pdf/SkPDFBitmap.cpp b/src/pdf/SkPDFBitmap.cpp index faae47ef63..b575d16430 100644 --- a/src/pdf/SkPDFBitmap.cpp +++ b/src/pdf/SkPDFBitmap.cpp @@ -376,8 +376,8 @@ public: SkISize fSize; sk_sp<SkData> fData; bool fIsYUV; - PDFJpegBitmap(SkISize size, SkData* data, bool isYUV) - : fSize(size), fData(SkRef(data)), fIsYUV(isYUV) { SkASSERT(data); } + PDFJpegBitmap(SkISize size, sk_sp<SkData> data, bool isYUV) + : fSize(size), fData(std::move(data)), fIsYUV(isYUV) { SkASSERT(fData); } void emitObject(SkWStream*, const SkPDFObjNumMap&) const override; void drop() override { fData = nullptr; } }; @@ -406,32 +406,42 @@ void PDFJpegBitmap::emitObject(SkWStream* stream, } // namespace //////////////////////////////////////////////////////////////////////////////// - -sk_sp<SkPDFObject> SkPDFCreateBitmapObject(sk_sp<SkImage> image, int encodingQuality) { - SkASSERT(image); - SkASSERT(encodingQuality >= 0); - sk_sp<SkData> data = image->refEncodedData(); - SkJFIFInfo info; - if (data && SkIsJFIF(data.get(), &info)) { - bool yuv = info.fType == SkJFIFInfo::kYCbCr; - if (info.fSize == image->dimensions()) { // Sanity check. +sk_sp<PDFJpegBitmap> make_jpeg_bitmap(sk_sp<SkData> data, SkISize size) { + SkISize jpegSize; + SkEncodedInfo::Color jpegColorType; + SkEncodedOrigin exifOrientation; + if (data && SkGetJpegInfo(data->data(), data->size(), &jpegSize, + &jpegColorType, &exifOrientation)) { + bool yuv = jpegColorType == SkEncodedInfo::kYUV_Color; + bool goodColorType = yuv || jpegColorType == SkEncodedInfo::kGray_Color; + if (jpegSize == size // Sanity check. + && goodColorType + && kTopLeft_SkEncodedOrigin == exifOrientation) { // hold on to data, not image. #ifdef SK_PDF_IMAGE_STATS gJpegImageObjects.fetch_add(1); #endif - return sk_make_sp<PDFJpegBitmap>(info.fSize, data.get(), yuv); + return sk_make_sp<PDFJpegBitmap>(jpegSize, std::move(data), yuv); } } + return nullptr; +} + +sk_sp<SkPDFObject> SkPDFCreateBitmapObject(sk_sp<SkImage> image, int encodingQuality) { + SkASSERT(image); + SkASSERT(encodingQuality >= 0); + SkISize dimensions = image->dimensions(); + sk_sp<SkData> data = image->refEncodedData(); + if (auto jpeg = make_jpeg_bitmap(std::move(data), dimensions)) { + return jpeg; + } const bool isOpaque = image_compute_is_opaque(image.get()); if (encodingQuality <= 100 && isOpaque) { data = image->encodeToData(SkEncodedImageFormat::kJPEG, encodingQuality); - if (data && SkIsJFIF(data.get(), &info)) { - bool yuv = info.fType == SkJFIFInfo::kYCbCr; - if (info.fSize == image->dimensions()) { // Sanity check. - return sk_make_sp<PDFJpegBitmap>(info.fSize, data.get(), yuv); - } + if (auto jpeg = make_jpeg_bitmap(std::move(data), dimensions)) { + return jpeg; } } |