/*
* Copyright 2017 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkPDFGradientShader_DEFINED
#define SkPDFGradientShader_DEFINED
#include "SkPDFTypes.h"
#include "SkPDFUtils.h"
#include "SkShader.h"
class SkMatrix;
class SkPDFDocument;
struct SkIRect;
namespace SkPDFGradientShader {
sk_sp<SkPDFObject> Make(SkPDFDocument* doc,
SkShader* shader,
const SkMatrix& matrix,
const SkIRect& surfaceBBox);
struct Key {
SkShader::GradientType fType;
SkShader::GradientInfo fInfo;
std::unique_ptr<SkColor[]> fColors;
std::unique_ptr<SkScalar[]> fStops;
SkMatrix fCanvasTransform;
SkMatrix fShaderTransform;
SkIRect fBBox;
uint32_t fHash;
};
struct KeyHash {
uint32_t operator()(const Key& k) const { return k.fHash; }
};
using HashMap = SkTHashMap<Key, sk_sp<SkPDFObject>, KeyHash>;
inline bool operator==(const SkShader::GradientInfo& u, const SkShader::GradientInfo& v) {
return u.fColorCount == v.fColorCount
&& u.fPoint[0] == v.fPoint[0]
&& u.fPoint[1] == v.fPoint[1]
&& u.fRadius[0] == v.fRadius[0]
&& u.fRadius[1] == v.fRadius[1]
&& u.fTileMode == v.fTileMode
&& u.fGradientFlags == v.fGradientFlags
&& SkPackedArrayEqual(u.fColors, v.fColors, u.fColorCount)
&& SkPackedArrayEqual(u.fColorOffsets, v.fColorOffsets, u.fColorCount);
}
inline bool operator==(const Key& u, const Key& v) {
SkASSERT(u.fInfo.fColors == u.fColors.get());
SkASSERT(u.fInfo.fColorOffsets == u.fStops.get());
SkASSERT(v.fInfo.fColors == v.fColors.get());
SkASSERT(v.fInfo.fColorOffsets == v.fStops.get());
return u.fType == v.fType
&& u.fInfo == v.fInfo
&& u.fCanvasTransform == v.fCanvasTransform
&& u.fShaderTransform == v.fShaderTransform
&& u.fBBox == v.fBBox;
}
inline bool operator!=(const Key& u, const Key& v) { return !(u == v); }
} // namespace SkPDFGradientShader
#endif // SkPDFGradientShader_DEFINED