aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pdf/SkPDFBitmap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pdf/SkPDFBitmap.cpp')
-rw-r--r--src/pdf/SkPDFBitmap.cpp44
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;
}
}