blob: 029966a829cd4532b4b68b0b15abdbe35f63c4e1 [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);
halcanary1437c1e2016-03-13 18:30:24 -070051
52 static sk_sp<SkPDFArray> MakeRangeObject();
halcanary530ea8e2015-01-23 06:17:35 -080053};
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000054
halcanary70d15542015-11-22 12:55:04 -080055class SkPDFFunctionShader final : public SkPDFDict {
halcanary530ea8e2015-01-23 06:17:35 -080056public:
halcanary792c80f2015-02-20 07:21:05 -080057 static SkPDFFunctionShader* Create(SkPDFCanon*,
58 SkAutoTDelete<SkPDFShader::State>*);
halcanary530ea8e2015-01-23 06:17:35 -080059 virtual ~SkPDFFunctionShader();
60 bool equals(const SkPDFShader::State&) const;
halcanary530ea8e2015-01-23 06:17:35 -080061
62private:
63 SkAutoTDelete<const SkPDFShader::State> fShaderState;
halcanary2e3f9d82015-02-27 12:41:03 -080064 SkPDFFunctionShader(SkPDFShader::State*);
halcanary530ea8e2015-01-23 06:17:35 -080065 typedef SkPDFDict INHERITED;
66};
67
68/**
69 * A shader for PDF gradients. This encapsulates the function shader
70 * inside a tiling pattern while providing a common pattern interface.
71 * The encapsulation allows the use of a SMask for transparency gradients.
72 */
halcanary70d15542015-11-22 12:55:04 -080073class SkPDFAlphaFunctionShader final : public SkPDFStream {
halcanary530ea8e2015-01-23 06:17:35 -080074public:
halcanary792c80f2015-02-20 07:21:05 -080075 static SkPDFAlphaFunctionShader* Create(SkPDFCanon*,
76 SkScalar dpi,
77 SkAutoTDelete<SkPDFShader::State>*);
halcanary530ea8e2015-01-23 06:17:35 -080078 virtual ~SkPDFAlphaFunctionShader();
halcanaryfb62b3d2015-01-21 09:59:14 -080079 bool equals(const SkPDFShader::State&) const;
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000080
halcanary530ea8e2015-01-23 06:17:35 -080081private:
82 SkAutoTDelete<const SkPDFShader::State> fShaderState;
halcanary2e3f9d82015-02-27 12:41:03 -080083 SkPDFAlphaFunctionShader(SkPDFShader::State*);
halcanary547019e2015-03-24 08:12:55 -070084 typedef SkPDFStream INHERITED;
halcanary530ea8e2015-01-23 06:17:35 -080085};
commit-bot@chromium.org93a2e212013-07-23 23:16:03 +000086
halcanary70d15542015-11-22 12:55:04 -080087class SkPDFImageShader final : public SkPDFStream {
halcanary530ea8e2015-01-23 06:17:35 -080088public:
halcanary792c80f2015-02-20 07:21:05 -080089 static SkPDFImageShader* Create(SkPDFCanon*,
90 SkScalar dpi,
91 SkAutoTDelete<SkPDFShader::State>*);
halcanary530ea8e2015-01-23 06:17:35 -080092 virtual ~SkPDFImageShader();
halcanary530ea8e2015-01-23 06:17:35 -080093 bool equals(const SkPDFShader::State&) const;
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000094
halcanary530ea8e2015-01-23 06:17:35 -080095private:
96 SkAutoTDelete<const SkPDFShader::State> fShaderState;
halcanary2e3f9d82015-02-27 12:41:03 -080097 SkPDFImageShader(SkPDFShader::State*);
halcanary547019e2015-03-24 08:12:55 -070098 typedef SkPDFStream INHERITED;
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000099};
100
101#endif