aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pdf/SkPDFBitmap.cpp
diff options
context:
space:
mode:
authorGravatar Hal Canary <halcanary@google.com>2018-04-05 16:58:41 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-04-07 14:25:30 +0000
commit83e0f1b1bb111c99d2f11d382b31caef0af5de10 (patch)
tree8ed18a789d4f8b72525ccd308af2a08e9ea409ef /src/pdf/SkPDFBitmap.cpp
parentc7695ff269a6ec7c4420d571d9077f2895166083 (diff)
SkPDF: smarter Jpeg when libjpeg-turbo is present
The fallback code does not parse the color type for EXIF-only jpegs. Since these exist in the wild, we need to find out if they are really standard YUV or greyscale Jpegs and embed them in PDFs if they are. BUG=chromium:801430 Change-Id: I93eaf8b8fc22b7169b2fce9520e022b72ad0bf81 Reviewed-on: https://skia-review.googlesource.com/118992 Commit-Queue: Hal Canary <halcanary@google.com> Reviewed-by: Leon Scroggins <scroggo@google.com>
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;
}
}