diff options
author | 2016-04-01 11:51:00 -0700 | |
---|---|---|
committer | 2016-04-01 11:51:00 -0700 | |
commit | 895f3f0544ce38d35999771754cbb1d876c14b5a (patch) | |
tree | 8336645c502bfe4c4f7faee145d25a1e05d35047 | |
parent | 389666bf1fed53a92b8c320157ee5fc0d5173552 (diff) |
SkPDF: properly dedup bitmaps in shaders
BUG=skia:5161
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1848383002
Review URL: https://codereview.chromium.org/1848383002
-rw-r--r-- | gm/subsetshader.cpp | 35 | ||||
-rw-r--r-- | src/pdf/SkBitmapKey.h | 1 | ||||
-rw-r--r-- | src/pdf/SkPDFShader.cpp | 11 |
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); |