diff options
author | 2017-07-05 11:25:42 -0400 | |
---|---|---|
committer | 2017-07-05 17:27:54 +0000 | |
commit | 94fd66cc2502383628b2c5fb72a445460b752c35 (patch) | |
tree | d155d846ad63c613b0554c881c55ef40883f9a6a /src/pdf/SkPDFUtils.cpp | |
parent | 3a59665099da62835f54192ae9a4f2480e91c8ff (diff) |
SkPDF: Refactor PDFShader to use ShTHashMap<>
my tests run ~14% faster.
- Split out gradient shaders from image shaders. new compilation
unit: SkPDFGradientShader
- Common functions InverseTransformBBox and PopulateTilingPatternDict
moved to SkPDFUtils
- Split SkPDFShader::State into image and gradient structures.
- SkPDFCanon is now a simpler structure, with no logic of its own.
I am considering just moving all of its fields into SkPDFDocument
- SkPDFShader::State (the image/fallback shader) now is POD, making
the use of a hashmap for canonicalization straightforward.
Formerly, we used a linear search.
- Do not bother trying to canonicalize the falback image shader.
- SkPDFGradientShader::Key is not POD; comparison of two objects
requires looking at the contents of two variable-sized arrays.
We now pre-calculate the hash of the arrays using SkOpts::hash and
store a hash for the object in the fHash field.
Using that hash, we can now canonicalize using a hashmap instead
of a linar search!
- several static functions renamed to follow style guidelines
- stop using codeFunction function pointer; I find that less
clear than it could be.
- operator==() for SkPDFShader::State and SkPDFGradientShader::Key is
now much simpler and can now be inlined.
- SkArrayEqual template in SkPDFUtils.h
No change to PDF output.
BUG=skia:3585
Change-Id: I354ad1b600be6d6749abccb58d13db257370bc0b
Reviewed-on: https://skia-review.googlesource.com/21376
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>
Diffstat (limited to 'src/pdf/SkPDFUtils.cpp')
-rw-r--r-- | src/pdf/SkPDFUtils.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/pdf/SkPDFUtils.cpp b/src/pdf/SkPDFUtils.cpp index 3cbf038369..510be6c27a 100644 --- a/src/pdf/SkPDFUtils.cpp +++ b/src/pdf/SkPDFUtils.cpp @@ -486,3 +486,33 @@ void SkPDFUtils::WriteString(SkWStream* wStream, const char* cin, size_t len) { wStream->writeText(">"); } } + +bool SkPDFUtils::InverseTransformBBox(const SkMatrix& matrix, SkRect* bbox) { + SkMatrix inverse; + if (!matrix.invert(&inverse)) { + return false; + } + inverse.mapRect(bbox); + return true; +} + +void SkPDFUtils::PopulateTilingPatternDict(SkPDFDict* pattern, + SkRect& bbox, + sk_sp<SkPDFDict> resources, + const SkMatrix& matrix) { + const int kTiling_PatternType = 1; + const int kColoredTilingPattern_PaintType = 1; + const int kConstantSpacing_TilingType = 1; + + pattern->insertName("Type", "Pattern"); + pattern->insertInt("PatternType", kTiling_PatternType); + pattern->insertInt("PaintType", kColoredTilingPattern_PaintType); + pattern->insertInt("TilingType", kConstantSpacing_TilingType); + pattern->insertObject("BBox", SkPDFUtils::RectToArray(bbox)); + pattern->insertScalar("XStep", bbox.width()); + pattern->insertScalar("YStep", bbox.height()); + pattern->insertObject("Resources", std::move(resources)); + if (!matrix.isIdentity()) { + pattern->insertObject("Matrix", SkPDFUtils::MatrixToArray(matrix)); + } +} |