diff options
author | 2013-10-03 19:29:21 +0000 | |
---|---|---|
committer | 2013-10-03 19:29:21 +0000 | |
commit | 608ea6508ae2e9ea05ea863ba50fc27d44d2eae9 (patch) | |
tree | 883b082511c8a08fbfea62c5b9a5fcec1ffecaac /src/pdf/SkPDFImage.cpp | |
parent | f7f5b7c506e5809c178d57232b477849ea614de5 (diff) |
Use SkPicture::ExtractBitmap callback in pdf too, there is no need for a specialized function pointer for pdf only only to pass a rectangle, when we can use subseted bitmaps.
R=scroggo@google.com, reed@google.com, vandebo@chromium.org, bsalomon@google.com
Author: edisonn@google.com
Review URL: https://codereview.chromium.org/25054002
git-svn-id: http://skia.googlecode.com/svn/trunk@11591 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/pdf/SkPDFImage.cpp')
-rw-r--r-- | src/pdf/SkPDFImage.cpp | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/src/pdf/SkPDFImage.cpp b/src/pdf/SkPDFImage.cpp index fbd37ebd8e..19ad79e4a5 100644 --- a/src/pdf/SkPDFImage.cpp +++ b/src/pdf/SkPDFImage.cpp @@ -339,7 +339,7 @@ static SkPDFArray* make_indexed_color_space(SkColorTable* table) { // static SkPDFImage* SkPDFImage::CreateImage(const SkBitmap& bitmap, const SkIRect& srcRect, - EncodeToDCTStream encoder) { + SkPicture::EncodeBitmap encoder) { if (bitmap.getConfig() == SkBitmap::kNo_Config) { return NULL; } @@ -390,7 +390,7 @@ SkPDFImage::SkPDFImage(SkStream* stream, const SkBitmap& bitmap, bool isAlpha, const SkIRect& srcRect, - EncodeToDCTStream encoder) + SkPicture::EncodeBitmap encoder) : fIsAlpha(isAlpha), fSrcRect(srcRect), fEncoder(encoder) { @@ -482,19 +482,28 @@ bool SkPDFImage::populate(SkPDFCatalog* catalog) { // Initializing image data for the first time. SkDynamicMemoryWStream dctCompressedWStream; if (!skip_compression(catalog) && fEncoder && - get_uncompressed_size(fBitmap, fSrcRect) > 1 && - fEncoder(&dctCompressedWStream, fBitmap, fSrcRect) && - dctCompressedWStream.getOffset() < - get_uncompressed_size(fBitmap, fSrcRect)) { - SkAutoTUnref<SkData> data(dctCompressedWStream.copyToData()); - SkAutoTUnref<SkStream> stream(SkNEW_ARGS(SkMemoryStream, (data))); - setData(stream.get()); - - insertName("Filter", "DCTDecode"); - insertInt("ColorTransform", kNoColorTransform); - insertInt("Length", getData()->getLength()); - setState(kCompressed_State); - return true; + get_uncompressed_size(fBitmap, fSrcRect) > 1) { + SkBitmap subset; + // Extract subset + if (!fBitmap.extractSubset(&subset, fSrcRect)) { + // TODO(edisonn) It fails only for kA1_Config, if that is a + // major concern we will fix it later, so far it is NYI. + return false; + } + size_t pixelRefOffset = 0; + SkAutoTUnref<SkData> data(fEncoder(&pixelRefOffset, subset)); + if (data.get() && data->size() < get_uncompressed_size(fBitmap, + fSrcRect)) { + SkAutoTUnref<SkStream> stream(SkNEW_ARGS(SkMemoryStream, + (data))); + setData(stream.get()); + + insertName("Filter", "DCTDecode"); + insertInt("ColorTransform", kNoColorTransform); + insertInt("Length", getData()->getLength()); + setState(kCompressed_State); + return true; + } } // Fallback method if (!fStreamValid) { |