aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pdf
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-10-03 19:29:21 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-10-03 19:29:21 +0000
commit608ea6508ae2e9ea05ea863ba50fc27d44d2eae9 (patch)
tree883b082511c8a08fbfea62c5b9a5fcec1ffecaac /src/pdf
parentf7f5b7c506e5809c178d57232b477849ea614de5 (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')
-rw-r--r--src/pdf/SkPDFImage.cpp39
-rw-r--r--src/pdf/SkPDFImage.h7
2 files changed, 28 insertions, 18 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) {
diff --git a/src/pdf/SkPDFImage.h b/src/pdf/SkPDFImage.h
index 52d323d0ee..10f8be6270 100644
--- a/src/pdf/SkPDFImage.h
+++ b/src/pdf/SkPDFImage.h
@@ -10,6 +10,7 @@
#ifndef SkPDFImage_DEFINED
#define SkPDFImage_DEFINED
+#include "SkPicture.h"
#include "SkPDFDevice.h"
#include "SkPDFStream.h"
#include "SkPDFTypes.h"
@@ -38,7 +39,7 @@ public:
*/
static SkPDFImage* CreateImage(const SkBitmap& bitmap,
const SkIRect& srcRect,
- EncodeToDCTStream encoder);
+ SkPicture::EncodeBitmap encoder);
virtual ~SkPDFImage();
@@ -60,7 +61,7 @@ private:
SkBitmap fBitmap;
bool fIsAlpha;
SkIRect fSrcRect;
- EncodeToDCTStream fEncoder;
+ SkPicture::EncodeBitmap fEncoder;
bool fStreamValid;
SkTDArray<SkPDFObject*> fResources;
@@ -80,7 +81,7 @@ private:
* May be NULL.
*/
SkPDFImage(SkStream* stream, const SkBitmap& bitmap, bool isAlpha,
- const SkIRect& srcRect, EncodeToDCTStream encoder);
+ const SkIRect& srcRect, SkPicture::EncodeBitmap encoder);
/** Copy constructor, used to generate substitutes.
* @param image The SkPDFImage to copy.