diff options
author | halcanary <halcanary@google.com> | 2015-12-10 08:59:43 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-10 08:59:43 -0800 |
commit | 712fdf7603c62820b21174da9b0a2071c174936b (patch) | |
tree | 52f88b6e297f2bce7b940adb9cfe052178076758 /src/pdf | |
parent | a06e6ab3fafb8c8712bc296f72c3f8b88856f1fe (diff) |
SkDocument::setDCTEncoder() for old versions of webkit
Review URL: https://codereview.chromium.org/1505763003
Diffstat (limited to 'src/pdf')
-rw-r--r-- | src/pdf/SkPDFBitmap.cpp | 18 | ||||
-rw-r--r-- | src/pdf/SkPDFBitmap.h | 2 | ||||
-rw-r--r-- | src/pdf/SkPDFCanon.h | 3 | ||||
-rw-r--r-- | src/pdf/SkPDFDevice.cpp | 3 |
4 files changed, 23 insertions, 3 deletions
diff --git a/src/pdf/SkPDFBitmap.cpp b/src/pdf/SkPDFBitmap.cpp index 0c53da6974..4e49db518d 100644 --- a/src/pdf/SkPDFBitmap.cpp +++ b/src/pdf/SkPDFBitmap.cpp @@ -468,7 +468,8 @@ void PDFJpegBitmap::emitObject(SkWStream* stream, //////////////////////////////////////////////////////////////////////////////// -SkPDFObject* SkPDFCreateBitmapObject(const SkImage* image) { +SkPDFObject* SkPDFCreateBitmapObject(const SkImage* image, + SkPixelSerializer* pixelSerializer) { SkAutoTUnref<SkData> data(image->refEncoded()); SkJFIFInfo info; if (data && SkIsJFIF(data, &info)) { @@ -481,6 +482,21 @@ SkPDFObject* SkPDFCreateBitmapObject(const SkImage* image) { return new PDFJpegBitmap(info.fSize, data, yuv); } } + + if (pixelSerializer) { + SkBitmap bm; + SkAutoPixmapUnlock apu; + if (as_IB(image)->getROPixels(&bm) && bm.requestLock(&apu)) { + data.reset(pixelSerializer->encode(apu.pixmap())); + if (data && SkIsJFIF(data, &info)) { + bool yuv = info.fType == SkJFIFInfo::kYCbCr; + if (info.fSize == image->dimensions()) { // Sanity check. + return new PDFJpegBitmap(info.fSize, data, yuv); + } + } + } + } + SkPDFObject* smask = image_compute_is_opaque(image) ? nullptr : new PDFAlphaBitmap(image); #ifdef SK_PDF_IMAGE_STATS diff --git a/src/pdf/SkPDFBitmap.h b/src/pdf/SkPDFBitmap.h index d931331431..b0254c1f55 100644 --- a/src/pdf/SkPDFBitmap.h +++ b/src/pdf/SkPDFBitmap.h @@ -16,6 +16,6 @@ class SkImage; * It is designed to use a minimal amout of memory, aside from refing * the image, and its emitObject() does not cache any data. */ -SkPDFObject* SkPDFCreateBitmapObject(const SkImage*); +SkPDFObject* SkPDFCreateBitmapObject(const SkImage*, SkPixelSerializer*); #endif // SkPDFBitmap_DEFINED diff --git a/src/pdf/SkPDFCanon.h b/src/pdf/SkPDFCanon.h index 3d2ba6a77d..9ecb3a02d9 100644 --- a/src/pdf/SkPDFCanon.h +++ b/src/pdf/SkPDFCanon.h @@ -10,6 +10,7 @@ #include "SkBitmap.h" #include "SkPDFGraphicState.h" #include "SkPDFShader.h" +#include "SkPixelSerializer.h" #include "SkTDArray.h" #include "SkTHash.h" @@ -80,6 +81,8 @@ public: SkTHashMap<uint32_t, bool> fCanEmbedTypeface; + SkAutoTUnref<SkPixelSerializer> fPixelSerializer; + private: struct FontRec { SkPDFFont* fFont; diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp index 1c5b4da070..012caf6d7d 100644 --- a/src/pdf/SkPDFDevice.cpp +++ b/src/pdf/SkPDFDevice.cpp @@ -2433,7 +2433,8 @@ void SkPDFDevice::internalDrawImage(const SkMatrix& origMatrix, } SkAutoTUnref<SkPDFObject> pdfimage(SkSafeRef(fCanon->findPDFBitmap(image))); if (!pdfimage) { - pdfimage.reset(SkPDFCreateBitmapObject(image)); + pdfimage.reset(SkPDFCreateBitmapObject( + image, fCanon->fPixelSerializer)); if (!pdfimage) { return; } |