Index: src/pdf/SkPDFImage.cpp |
diff --git a/src/pdf/SkPDFImage.cpp b/src/pdf/SkPDFImage.cpp |
index fbd37ebd8eba82a4e76ae77c1db7f4e3a52dee6a..dde4e8708cf72d9bbc842be30f09c0b56a9f7c23 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,27 @@ 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 |
vandebo (ex-Chrome)
2013/09/27 16:06:13
It's unfortunate that we have to do this without g
|
+ if (!fBitmap.extractSubset(&subset, fSrcRect)) { |
vandebo (ex-Chrome)
2013/09/27 16:06:13
extractSubset doesn't have any special cases for f
reed1
2013/09/27 16:15:29
What is the concern with always calling extractSub
vandebo (ex-Chrome)
2013/09/27 16:16:37
Just that it's unnecessary computational overhead
|
+ // If Extract subset fails, make a deep copy. |
+ if (!fBitmap.copyTo(&subset, fBitmap.config())) { |
vandebo (ex-Chrome)
2013/09/27 16:06:13
Don't you still need to subset the image after thi
edisonn
2013/09/27 17:57:20
removed. extractSubset will not fork for A1, if th
|
+ return false; |
+ } |
+ } |
+ size_t pixelRefOffset = 0; |
+ SkAutoTUnref<SkData> data(fEncoder(&pixelRefOffset, subset)); |
+ if (data.get() && data->size() < get_uncompressed_size(fBitmap, fSrcRect)) { |
vandebo (ex-Chrome)
2013/09/27 16:06:13
This file is basically 80-column clean, so please
edisonn
2013/09/27 17:57:20
Done.
|
+ 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) { |