Home | History | Annotate | Download | only in pdf
      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 sk_sp<SkPDFObject> 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 {
     37     uint32_t operator()(const Key& k) const { return k.fHash; }
     38 };
     39 
     40 using HashMap = SkTHashMap<Key, sk_sp<SkPDFObject>, KeyHash>;
     41 
     42 inline 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 
     54 inline 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 }
     65 inline bool operator!=(const Key& u, const Key& v) { return !(u == v); }
     66 
     67 }  // namespace SkPDFGradientShader
     68 #endif  // SkPDFGradientShader_DEFINED
     69