• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 #ifndef SkPDFGradientShader_DEFINED
8 #define SkPDFGradientShader_DEFINED
9 
10 #include "SkPDFTypes.h"
11 #include "SkPDFUtils.h"
12 #include "SkShader.h"
13 
14 class SkMatrix;
15 class SkPDFDocument;
16 struct SkIRect;
17 
18 namespace SkPDFGradientShader {
19 
20 SkPDFIndirectReference Make(SkPDFDocument* doc,
21                             SkShader* shader,
22                             const SkMatrix& matrix,
23                             const SkIRect& surfaceBBox);
24 
25 struct Key {
26     SkShader::GradientType fType;
27     SkShader::GradientInfo fInfo;
28     std::unique_ptr<SkColor[]> fColors;
29     std::unique_ptr<SkScalar[]> fStops;
30     SkMatrix fCanvasTransform;
31     SkMatrix fShaderTransform;
32     SkIRect fBBox;
33     uint32_t fHash;
34 };
35 
36 struct KeyHash {
operatorKeyHash37     uint32_t operator()(const Key& k) const { return k.fHash; }
38 };
39 
40 inline bool operator==(const SkShader::GradientInfo& u, const SkShader::GradientInfo& v) {
41     return u.fColorCount    == v.fColorCount
42         && u.fPoint[0]      == v.fPoint[0]
43         && u.fPoint[1]      == v.fPoint[1]
44         && u.fRadius[0]     == v.fRadius[0]
45         && u.fRadius[1]     == v.fRadius[1]
46         && u.fTileMode      == v.fTileMode
47         && u.fGradientFlags == v.fGradientFlags
48         && SkPackedArrayEqual(u.fColors, v.fColors, u.fColorCount)
49         && SkPackedArrayEqual(u.fColorOffsets, v.fColorOffsets, u.fColorCount);
50 }
51 
52 inline bool operator==(const Key& u, const Key& v) {
53     SkASSERT(u.fInfo.fColors       == u.fColors.get());
54     SkASSERT(u.fInfo.fColorOffsets == u.fStops.get());
55     SkASSERT(v.fInfo.fColors       == v.fColors.get());
56     SkASSERT(v.fInfo.fColorOffsets == v.fStops.get());
57     return u.fType            == v.fType
58         && u.fInfo            == v.fInfo
59         && u.fCanvasTransform == v.fCanvasTransform
60         && u.fShaderTransform == v.fShaderTransform
61         && u.fBBox            == v.fBBox;
62 }
63 inline bool operator!=(const Key& u, const Key& v) { return !(u == v); }
64 
65 }  // namespace SkPDFGradientShader
66 #endif  // SkPDFGradientShader_DEFINED
67