blob: 0cc059c5a0fd72327a304550da06d853ccb2a649 [file] [log] [blame]
Hal Canary94fd66c2017-07-05 11:25:42 -04001/*
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
14class SkMatrix;
15class SkPDFDocument;
16struct SkIRect;
17
18namespace SkPDFGradientShader {
19
20sk_sp<SkPDFObject> Make(SkPDFDocument* doc,
21 SkShader* shader,
22 const SkMatrix& matrix,
23 const SkIRect& surfaceBBox);
24
25struct 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
36struct KeyHash {
37 uint32_t operator()(const Key& k) const { return k.fHash; }
38};
39
40using HashMap = SkTHashMap<Key, sk_sp<SkPDFObject>, KeyHash>;
41
42inline bool operator==(const SkShader::GradientInfo& u, const SkShader::GradientInfo& v) {
43 return u.fColorCount == v.fColorCount
44 && u.fPoint[0] == v.fPoint[0]
45 && u.fPoint[1] == v.fPoint[1]
46 && u.fRadius[0] == v.fRadius[0]
47 && u.fRadius[1] == v.fRadius[1]
48 && u.fTileMode == v.fTileMode
49 && u.fGradientFlags == v.fGradientFlags
50 && SkPackedArrayEqual(u.fColors, v.fColors, u.fColorCount)
51 && SkPackedArrayEqual(u.fColorOffsets, v.fColorOffsets, u.fColorCount);
52}
53
54inline bool operator==(const Key& u, const Key& v) {
55 SkASSERT(u.fInfo.fColors == u.fColors.get());
56 SkASSERT(u.fInfo.fColorOffsets == u.fStops.get());
57 SkASSERT(v.fInfo.fColors == v.fColors.get());
58 SkASSERT(v.fInfo.fColorOffsets == v.fStops.get());
59 return u.fType == v.fType
60 && u.fInfo == v.fInfo
61 && u.fCanvasTransform == v.fCanvasTransform
62 && u.fShaderTransform == v.fShaderTransform
63 && u.fBBox == v.fBBox;
64}
65inline bool operator!=(const Key& u, const Key& v) { return !(u == v); }
66
67} // namespace SkPDFGradientShader
68#endif // SkPDFGradientShader_DEFINED