aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar halcanary <halcanary@google.com>2016-04-01 11:51:00 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-04-01 11:51:00 -0700
commit895f3f0544ce38d35999771754cbb1d876c14b5a (patch)
tree8336645c502bfe4c4f7faee145d25a1e05d35047
parent389666bf1fed53a92b8c320157ee5fc0d5173552 (diff)
SkPDF: properly dedup bitmaps in shaders
-rw-r--r--gm/subsetshader.cpp35
-rw-r--r--src/pdf/SkBitmapKey.h1
-rw-r--r--src/pdf/SkPDFShader.cpp11
3 files changed, 41 insertions, 6 deletions
diff --git a/gm/subsetshader.cpp b/gm/subsetshader.cpp
new file mode 100644
index 0000000000..c4ef5f7a77
--- /dev/null
+++ b/gm/subsetshader.cpp
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "Resources.h"
+#include "SkBitmap.h"
+#include "gm.h"
+
+DEF_SIMPLE_GM(bitmap_subset_shader, canvas, 256, 256) {
+ canvas->clear(SK_ColorWHITE);
+
+ SkBitmap source;
+ if (!GetResourceAsBitmap("color_wheel.png", &source)) {
+ return;
+ }
+ SkIRect left = SkIRect::MakeWH(source.width()/2, source.height());
+ SkIRect right = SkIRect::MakeXYWH(source.width()/2, 0,
+ source.width()/2, source.height());
+ SkBitmap leftBitmap, rightBitmap;
+ source.extractSubset(&leftBitmap, left);
+ source.extractSubset(&rightBitmap, right);
+
+ SkMatrix matrix;
+ matrix.setScale(0.75f, 0.75f);
+ matrix.preRotate(30.0f);
+ SkShader::TileMode tm = SkShader::kRepeat_TileMode;
+ SkPaint paint;
+ paint.setShader(SkShader::MakeBitmapShader(leftBitmap, tm, tm, &matrix));
+ canvas->drawRect(SkRect::MakeWH(256.0f, 128.0f), paint);
+ paint.setShader(SkShader::MakeBitmapShader(rightBitmap, tm, tm, &matrix));
+ canvas->drawRect(SkRect::MakeXYWH(0, 128.0f, 256.0f, 128.0f), paint);
+}
diff --git a/src/pdf/SkBitmapKey.h b/src/pdf/SkBitmapKey.h
index 4723debac2..53d4d64f32 100644
--- a/src/pdf/SkBitmapKey.h
+++ b/src/pdf/SkBitmapKey.h
@@ -25,6 +25,7 @@ public:
return fID == rhs.fID && fSubset == rhs.fSubset;
}
bool operator!=(const SkBitmapKey& rhs) const { return !(*this == rhs); }
+ uint32_t id() const { return fID; }
private:
SkIRect fSubset;
diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp
index abcae7be12..c30d8a4281 100644
--- a/src/pdf/SkPDFShader.cpp
+++ b/src/pdf/SkPDFShader.cpp
@@ -430,7 +430,7 @@ public:
SkIRect fBBox;
SkBitmap fImage;
- uint32_t fPixelGeneration;
+ SkBitmapKey fBitmapKey;
SkShader::TileMode fImageTileModes[2];
State(SkShader* shader, const SkMatrix& canvasTransform,
@@ -1052,8 +1052,8 @@ bool SkPDFShader::State::operator==(const SkPDFShader::State& b) const {
}
if (fType == SkShader::kNone_GradientType) {
- if (fPixelGeneration != b.fPixelGeneration ||
- fPixelGeneration == 0 ||
+ if (fBitmapKey != b.fBitmapKey ||
+ fBitmapKey.id() == 0 ||
fImageTileModes[0] != b.fImageTileModes[0] ||
fImageTileModes[1] != b.fImageTileModes[1]) {
return false;
@@ -1099,8 +1099,7 @@ bool SkPDFShader::State::operator==(const SkPDFShader::State& b) const {
SkPDFShader::State::State(SkShader* shader, const SkMatrix& canvasTransform,
const SkIRect& bbox, SkScalar rasterScale)
: fCanvasTransform(canvasTransform),
- fBBox(bbox),
- fPixelGeneration(0) {
+ fBBox(bbox) {
fInfo.fColorCount = 0;
fInfo.fColors = nullptr;
fInfo.fColorOffsets = nullptr;
@@ -1154,7 +1153,7 @@ SkPDFShader::State::State(SkShader* shader, const SkMatrix& canvasTransform,
fShaderTransform.setTranslate(shaderRect.x(), shaderRect.y());
fShaderTransform.preScale(1 / scale.width(), 1 / scale.height());
}
- fPixelGeneration = fImage.getGenerationID();
+ fBitmapKey = SkBitmapKey(fImage);
} else {
AllocateGradientInfoStorage();
shader->asAGradient(&fInfo);