blob: 61b6de663d22e1feb7258211631df1eaba64ecb0 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
vandebo@chromium.orgda912d62011-03-08 18:31:02 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2011 Google Inc.
vandebo@chromium.orgda912d62011-03-08 18:31:02 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
vandebo@chromium.orgda912d62011-03-08 18:31:02 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000010#ifndef SkPDFShader_DEFINED
11#define SkPDFShader_DEFINED
12
13#include "SkPDFStream.h"
14#include "SkPDFTypes.h"
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000015
halcanary792c80f2015-02-20 07:21:05 -080016class SkPDFCanon;
halcanary530ea8e2015-01-23 06:17:35 -080017class SkMatrix;
18class SkShader;
19struct SkIRect;
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000020
21/** \class SkPDFShader
22
23 In PDF parlance, this is a pattern, used in place of a color when the
24 pattern color space is selected.
25*/
26
vandebo@chromium.org421d6442011-07-20 17:39:01 +000027class SkPDFShader {
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000028public:
halcanary530ea8e2015-01-23 06:17:35 -080029 class State;
30
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000031 /** Get the PDF shader for the passed SkShader. If the SkShader is
halcanary96fcdcc2015-08-27 07:41:13 -070032 * invalid in some way, returns nullptr. The reference count of
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000033 * the object is incremented and it is the caller's responsibility to
34 * unreference it when done. This is needed to accommodate the weak
35 * reference pattern used when the returned object is new and has no
36 * other references.
fmalitac3796c72015-01-13 08:06:11 -080037 * @param shader The SkShader to emulate.
38 * @param matrix The current transform. (PDF shaders are absolutely
39 * positioned, relative to where the page is drawn.)
40 * @param surfceBBox The bounding box of the drawing surface (with matrix
41 * already applied).
halcanary530ea8e2015-01-23 06:17:35 -080042 * @param rasterScale Additional scale to be applied for early
43 * rasterization.
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000044 */
halcanary792c80f2015-02-20 07:21:05 -080045 static SkPDFObject* GetPDFShader(SkPDFCanon* canon,
46 SkScalar dpi,
47 const SkShader& shader,
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000048 const SkMatrix& matrix,
fmalitac3796c72015-01-13 08:06:11 -080049 const SkIRect& surfaceBBox,
50 SkScalar rasterScale);
halcanary530ea8e2015-01-23 06:17:35 -080051};
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000052
halcanary70d15542015-11-22 12:55:04 -080053class SkPDFFunctionShader final : public SkPDFDict {
halcanary530ea8e2015-01-23 06:17:35 -080054public:
halcanary792c80f2015-02-20 07:21:05 -080055 static SkPDFFunctionShader* Create(SkPDFCanon*,
56 SkAutoTDelete<SkPDFShader::State>*);
halcanary530ea8e2015-01-23 06:17:35 -080057 virtual ~SkPDFFunctionShader();
58 bool equals(const SkPDFShader::State&) const;
halcanary530ea8e2015-01-23 06:17:35 -080059
60private:
61 SkAutoTDelete<const SkPDFShader::State> fShaderState;
halcanary2e3f9d82015-02-27 12:41:03 -080062 SkPDFFunctionShader(SkPDFShader::State*);
halcanary530ea8e2015-01-23 06:17:35 -080063 typedef SkPDFDict INHERITED;
64};
65
66/**
67 * A shader for PDF gradients. This encapsulates the function shader
68 * inside a tiling pattern while providing a common pattern interface.
69 * The encapsulation allows the use of a SMask for transparency gradients.
70 */
halcanary70d15542015-11-22 12:55:04 -080071class SkPDFAlphaFunctionShader final : public SkPDFStream {
halcanary530ea8e2015-01-23 06:17:35 -080072public:
halcanary792c80f2015-02-20 07:21:05 -080073 static SkPDFAlphaFunctionShader* Create(SkPDFCanon*,
74 SkScalar dpi,
75 SkAutoTDelete<SkPDFShader::State>*);
halcanary530ea8e2015-01-23 06:17:35 -080076 virtual ~SkPDFAlphaFunctionShader();
halcanaryfb62b3d2015-01-21 09:59:14 -080077 bool equals(const SkPDFShader::State&) const;
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000078
halcanary530ea8e2015-01-23 06:17:35 -080079private:
80 SkAutoTDelete<const SkPDFShader::State> fShaderState;
halcanary2e3f9d82015-02-27 12:41:03 -080081 SkPDFAlphaFunctionShader(SkPDFShader::State*);
halcanary547019e2015-03-24 08:12:55 -070082 typedef SkPDFStream INHERITED;
halcanary530ea8e2015-01-23 06:17:35 -080083};
commit-bot@chromium.org93a2e212013-07-23 23:16:03 +000084
halcanary70d15542015-11-22 12:55:04 -080085class SkPDFImageShader final : public SkPDFStream {
halcanary530ea8e2015-01-23 06:17:35 -080086public:
halcanary792c80f2015-02-20 07:21:05 -080087 static SkPDFImageShader* Create(SkPDFCanon*,
88 SkScalar dpi,
89 SkAutoTDelete<SkPDFShader::State>*);
halcanary530ea8e2015-01-23 06:17:35 -080090 virtual ~SkPDFImageShader();
halcanary530ea8e2015-01-23 06:17:35 -080091 bool equals(const SkPDFShader::State&) const;
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000092
halcanary530ea8e2015-01-23 06:17:35 -080093private:
94 SkAutoTDelete<const SkPDFShader::State> fShaderState;
halcanary2e3f9d82015-02-27 12:41:03 -080095 SkPDFImageShader(SkPDFShader::State*);
halcanary547019e2015-03-24 08:12:55 -070096 typedef SkPDFStream INHERITED;
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000097};
98
99#endif