diff options
author | Hal Canary <halcanary@google.com> | 2017-07-18 10:28:31 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-07-18 19:33:34 +0000 |
commit | 4f29c20f20ce62150998786be8b9f8a81a901d72 (patch) | |
tree | 82e9ce0a4a2b83261f610ddbfe233728285ed26a /src/pdf/SkPDFBitmap.cpp | |
parent | e46828675c617fd636e8a64f3be60f7f396c35f1 (diff) |
SkPDF: Re-use Jpeg Image Shaders
Also, de-dup shader better.
- SkBitmapKeyFromImage function factors out image de-dup code.
- SkPDFUtils::ToBitmap funtion factors out to-bitmap code
- make_image_shader function now takes Image rather than Bitmap.
All tests render the same. Some are significantly smaller PDFs.
Change-Id: Id8dd36b31c8e573f44a5e9f6058d5a1d622b6385
Reviewed-on: https://skia-review.googlesource.com/24081
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Hal Canary <halcanary@google.com>
Diffstat (limited to 'src/pdf/SkPDFBitmap.cpp')
-rw-r--r-- | src/pdf/SkPDFBitmap.cpp | 28 |
1 files changed, 11 insertions, 17 deletions
diff --git a/src/pdf/SkPDFBitmap.cpp b/src/pdf/SkPDFBitmap.cpp index d0dcce6b3c..e28800bf99 100644 --- a/src/pdf/SkPDFBitmap.cpp +++ b/src/pdf/SkPDFBitmap.cpp @@ -5,35 +5,27 @@ * found in the LICENSE file. */ +#include "SkPDFBitmap.h" + #include "SkColorPriv.h" #include "SkData.h" #include "SkDeflate.h" -#include "SkImage_Base.h" +#include "SkImage.h" #include "SkJpegInfo.h" -#include "SkPDFBitmap.h" #include "SkPDFCanon.h" #include "SkPDFTypes.h" +#include "SkPDFUtils.h" #include "SkStream.h" #include "SkUnPreMultiply.h" -void image_get_ro_pixels(const SkImage* image, SkBitmap* dst) { - SkColorSpace* legacyColorSpace = nullptr; - if(as_IB(image)->getROPixels(dst, legacyColorSpace) - && dst->dimensions() == image->dimensions()) { - return; - } - // no pixels or wrong size: fill with zeros. - dst->setInfo(SkImageInfo::MakeN32(image->width(), image->height(), image->alphaType())); -} - bool image_compute_is_opaque(const SkImage* image) { if (image->isOpaque()) { return true; } // keep output PDF small at cost of possible resource use. SkBitmap bm; - image_get_ro_pixels(image, &bm); - return SkBitmap::ComputeIsOpaque(bm); + // if image can not be read, treat as transparent. + return SkPDFUtils::ToBitmap(image, &bm) && SkBitmap::ComputeIsOpaque(bm); } //////////////////////////////////////////////////////////////////////////////// @@ -286,7 +278,10 @@ static void emit_image_xobject(SkWStream* stream, const sk_sp<SkPDFObject>& smask, const SkPDFObjNumMap& objNumMap) { SkBitmap bitmap; - image_get_ro_pixels(image, &bitmap); // TODO(halcanary): test + if (!SkPDFUtils::ToBitmap(image, &bitmap)) { + // no pixels or wrong size: fill with zeros. + bitmap.setInfo(SkImageInfo::MakeN32(image->width(), image->height(), image->alphaType())); + } // Write to a temporary buffer to get the compressed length. SkDynamicMemoryWStream buffer; @@ -433,8 +428,7 @@ sk_sp<SkPDFObject> SkPDFCreateBitmapObject(sk_sp<SkImage> image, if (pixelSerializer) { SkBitmap bm; SkPixmap pmap; - SkColorSpace* legacyColorSpace = nullptr; - if (as_IB(image.get())->getROPixels(&bm, legacyColorSpace) && bm.peekPixels(&pmap)) { + if (SkPDFUtils::ToBitmap(image.get(), &bm) && bm.peekPixels(&pmap)) { data = pixelSerializer->encodeToData(pmap); if (data && SkIsJFIF(data.get(), &info)) { bool yuv = info.fType == SkJFIFInfo::kYCbCr; |