blob: 3de17cdc509ca104c1e8f7ee949fd84b6f86eed5 [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 {
mtklein2766c002015-06-26 11:45:03 -070054
halcanary530ea8e2015-01-23 06:17:35 -080055
56public:
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