/*
* Copyright 2011 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkPDFShader_DEFINED
#define SkPDFShader_DEFINED
#include "SkBitmapKey.h"
#include "SkMacros.h"
#include "SkPDFTypes.h"
#include "SkShader.h"
class SkPDFDocument;
class SkMatrix;
struct SkIRect;
/** Make a PDF shader for the passed SkShader. If the SkShader is invalid in
* some way, returns nullptr.
*
* In PDF parlance, this is a pattern, used in place of a color when the
* pattern color space is selected.
*
* May cache the shader in the document for later re-use. If this function is
* called again with an equivalent shader, a new reference to the cached pdf
* shader may be returned.
*
* @param doc The parent document, must be non-null.
* @param shader The SkShader to emulate.
* @param ctm The current transform matrix. (PDF shaders are absolutely
* positioned, relative to where the page is drawn.)
* @param surfaceBBox The bounding box of the drawing surface (with matrix
* already applied).
* @param paintColor Color+Alpha of the paint. Color is usually ignored,
* unless it is a alpha shader.
*/
SkPDFIndirectReference SkPDFMakeShader(SkPDFDocument* doc,
SkShader* shader,
const SkMatrix& ctm,
const SkIRect& surfaceBBox,
SkColor paintColor);
SK_BEGIN_REQUIRE_DENSE
struct SkPDFImageShaderKey {
SkMatrix fCanvasTransform;
SkMatrix fShaderTransform;
SkIRect fBBox;
SkBitmapKey fBitmapKey;
SkShader::TileMode fImageTileModes[2];
SkColor fPaintColor;
};
SK_END_REQUIRE_DENSE
inline bool operator==(const SkPDFImageShaderKey& a, const SkPDFImageShaderKey& b) {
SkASSERT(a.fBitmapKey.fID != 0);
SkASSERT(b.fBitmapKey.fID != 0);
return a.fCanvasTransform == b.fCanvasTransform
&& a.fShaderTransform == b.fShaderTransform
&& a.fBBox == b.fBBox
&& a.fBitmapKey == b.fBitmapKey
&& a.fImageTileModes[0] == b.fImageTileModes[0]
&& a.fImageTileModes[1] == b.fImageTileModes[1]
&& a.fPaintColor == b.fPaintColor;
}
#endif