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