Encode images with DCTDecode (JPEG) in PDFs if it makes sense. Fallback to FlateDecode (zip) if it makes sense. Otherewise include uncompressed stream.
This change will reduce the size of PDFs to 50% (in the case of the existing SKPs, we reduce the total size of PDFs from 105MB to 50MB)
Review URL: https://codereview.appspot.com/7068055
git-svn-id: http://skia.googlecode.com/svn/trunk@8835 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/pdf/SkPDFImage.cpp b/src/pdf/SkPDFImage.cpp
index f7889f1..04307be 100644
--- a/src/pdf/SkPDFImage.cpp
+++ b/src/pdf/SkPDFImage.cpp
@@ -249,7 +249,8 @@
// static
SkPDFImage* SkPDFImage::CreateImage(const SkBitmap& bitmap,
- const SkIRect& srcRect) {
+ const SkIRect& srcRect,
+ EncodeToDCTStream encoder) {
if (bitmap.getConfig() == SkBitmap::kNo_Config) {
return NULL;
}
@@ -265,10 +266,12 @@
}
SkPDFImage* image =
- new SkPDFImage(imageData, bitmap, srcRect, false);
+ SkNEW_ARGS(SkPDFImage, (imageData, bitmap, srcRect, false, encoder));
if (alphaData != NULL) {
- image->addSMask(new SkPDFImage(alphaData, bitmap, srcRect, true))->unref();
+ // Don't try to use DCT compression with alpha because alpha is small
+ // anyway and it could lead to artifacts.
+ image->addSMask(SkNEW_ARGS(SkPDFImage, (alphaData, bitmap, srcRect, true, NULL)))->unref();
}
return image;
}
@@ -289,9 +292,12 @@
GetResourcesHelper(&fResources, knownResourceObjects, newResourceObjects);
}
-SkPDFImage::SkPDFImage(SkStream* imageData, const SkBitmap& bitmap,
- const SkIRect& srcRect, bool doingAlpha) {
- this->setData(imageData);
+SkPDFImage::SkPDFImage(SkStream* imageData,
+ const SkBitmap& bitmap,
+ const SkIRect& srcRect,
+ bool doingAlpha,
+ EncodeToDCTStream encoder)
+ : SkPDFImageStream(imageData, bitmap, srcRect, encoder) {
SkBitmap::Config config = bitmap.getConfig();
bool alphaOnly = (config == SkBitmap::kA1_Config ||
config == SkBitmap::kA8_Config);