| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 | 8 |
| 9 #ifndef SkPDFShader_DEFINED | 9 #ifndef SkPDFShader_DEFINED |
| 10 #define SkPDFShader_DEFINED | 10 #define SkPDFShader_DEFINED |
| 11 | 11 |
| 12 #include "SkBitmapKey.h" |
| 12 #include "SkPDFTypes.h" | 13 #include "SkPDFTypes.h" |
| 14 #include "SkShader.h" |
| 13 | 15 |
| 14 class SkPDFCanon; | 16 class SkPDFCanon; |
| 15 class SkPDFDocument; | 17 class SkPDFDocument; |
| 16 class SkMatrix; | 18 class SkMatrix; |
| 17 class SkShader; | |
| 18 struct SkIRect; | 19 struct SkIRect; |
| 19 | 20 |
| 20 /** \class SkPDFShader | 21 /** \class SkPDFShader |
| 21 | 22 |
| 22 In PDF parlance, this is a pattern, used in place of a color when the | 23 In PDF parlance, this is a pattern, used in place of a color when the |
| 23 pattern color space is selected. | 24 pattern color space is selected. |
| 24 */ | 25 */ |
| 25 | 26 |
| 26 class SkPDFShader { | 27 class SkPDFShader { |
| 27 public: | 28 public: |
| 28 class State; | |
| 29 | |
| 30 /** Get the PDF shader for the passed SkShader. If the SkShader is | 29 /** Get the PDF shader for the passed SkShader. If the SkShader is |
| 31 * invalid in some way, returns nullptr. The reference count of | 30 * invalid in some way, returns nullptr. The reference count of |
| 32 * the object is incremented and it is the caller's responsibility to | 31 * the object is incremented and it is the caller's responsibility to |
| 33 * unreference it when done. This is needed to accommodate the weak | 32 * unreference it when done. This is needed to accommodate the weak |
| 34 * reference pattern used when the returned object is new and has no | 33 * reference pattern used when the returned object is new and has no |
| 35 * other references. | 34 * other references. |
| 36 * @param shader The SkShader to emulate. | 35 * @param shader The SkShader to emulate. |
| 37 * @param matrix The current transform. (PDF shaders are absolutely | 36 * @param matrix The current transform. (PDF shaders are absolutely |
| 38 * positioned, relative to where the page is drawn.) | 37 * positioned, relative to where the page is drawn.) |
| 39 * @param surfceBBox The bounding box of the drawing surface (with matrix | 38 * @param surfceBBox The bounding box of the drawing surface (with matrix |
| 40 * already applied). | 39 * already applied). |
| 41 * @param rasterScale Additional scale to be applied for early | 40 * @param rasterScale Additional scale to be applied for early |
| 42 * rasterization. | 41 * rasterization. |
| 43 */ | 42 */ |
| 44 static SkPDFObject* GetPDFShader(SkPDFDocument* doc, | 43 static sk_sp<SkPDFObject> GetPDFShader(SkPDFDocument* doc, |
| 45 SkScalar dpi, | 44 SkScalar dpi, |
| 46 SkShader* shader, | 45 SkShader* shader, |
| 47 const SkMatrix& matrix, | 46 const SkMatrix& matrix, |
| 48 const SkIRect& surfaceBBox, | 47 const SkIRect& surfaceBBox, |
| 49 SkScalar rasterScale); | 48 SkScalar rasterScale); |
| 50 | 49 |
| 51 static sk_sp<SkPDFArray> MakeRangeObject(); | 50 static sk_sp<SkPDFArray> MakeRangeObject(); |
| 52 }; | |
| 53 | 51 |
| 54 class SkPDFFunctionShader final : public SkPDFDict { | 52 class State { |
| 55 public: | 53 public: |
| 56 static SkPDFFunctionShader* Create(SkPDFCanon*, | 54 SkShader::GradientType fType; |
| 57 std::unique_ptr<SkPDFShader::State>*); | 55 SkShader::GradientInfo fInfo; |
| 58 virtual ~SkPDFFunctionShader(); | 56 std::unique_ptr<SkColor[]> fColors; |
| 59 bool equals(const SkPDFShader::State&) const; | 57 std::unique_ptr<SkScalar[]> fStops; |
| 58 SkMatrix fCanvasTransform; |
| 59 SkMatrix fShaderTransform; |
| 60 SkIRect fBBox; |
| 60 | 61 |
| 61 private: | 62 SkBitmapKey fBitmapKey; |
| 62 std::unique_ptr<const SkPDFShader::State> fShaderState; | 63 SkShader::TileMode fImageTileModes[2]; |
| 63 SkPDFFunctionShader(SkPDFShader::State*); | |
| 64 typedef SkPDFDict INHERITED; | |
| 65 }; | |
| 66 | 64 |
| 67 /** | 65 State(SkShader* shader, const SkMatrix& canvasTransform, |
| 68 * A shader for PDF gradients. This encapsulates the function shader | 66 const SkIRect& bbox, SkScalar rasterScale, |
| 69 * inside a tiling pattern while providing a common pattern interface. | 67 SkBitmap* dstImage); |
| 70 * The encapsulation allows the use of a SMask for transparency gradients. | |
| 71 */ | |
| 72 class SkPDFAlphaFunctionShader final : public SkPDFStream { | |
| 73 public: | |
| 74 static SkPDFAlphaFunctionShader* Create(SkPDFDocument*, | |
| 75 SkScalar dpi, | |
| 76 std::unique_ptr<SkPDFShader::State>*
); | |
| 77 virtual ~SkPDFAlphaFunctionShader(); | |
| 78 bool equals(const SkPDFShader::State&) const; | |
| 79 | 68 |
| 80 private: | 69 bool operator==(const State& b) const; |
| 81 std::unique_ptr<const SkPDFShader::State> fShaderState; | |
| 82 SkPDFAlphaFunctionShader(SkPDFShader::State*); | |
| 83 typedef SkPDFStream INHERITED; | |
| 84 }; | |
| 85 | 70 |
| 86 class SkPDFImageShader final : public SkPDFStream { | 71 State MakeAlphaToLuminosityState() const; |
| 87 public: | 72 State MakeOpaqueState() const; |
| 88 static SkPDFImageShader* Create(SkPDFDocument*, | |
| 89 SkScalar dpi, | |
| 90 std::unique_ptr<SkPDFShader::State>*); | |
| 91 virtual ~SkPDFImageShader(); | |
| 92 bool equals(const SkPDFShader::State&) const; | |
| 93 | 73 |
| 94 private: | 74 bool GradientHasAlpha() const; |
| 95 std::unique_ptr<const SkPDFShader::State> fShaderState; | 75 |
| 96 SkPDFImageShader(SkPDFShader::State*); | 76 State(State&&) = default; |
| 97 typedef SkPDFStream INHERITED; | 77 State& operator=(State&&) = default; |
| 78 |
| 79 private: |
| 80 State(const State& other); |
| 81 State& operator=(const State& rhs); |
| 82 void allocateGradientInfoStorage(); |
| 83 }; |
| 98 }; | 84 }; |
| 99 | 85 |
| 100 #endif | 86 #endif |
| OLD | NEW |