blob: 51add585a7ea727b38d3e881c71ac9bb96b71b4a [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
halcanary530ea8e2015-01-23 06:17:35 -080013#include "SkPDFResourceDict.h"
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000014#include "SkPDFStream.h"
15#include "SkPDFTypes.h"
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000016
halcanary792c80f2015-02-20 07:21:05 -080017class SkPDFCanon;
halcanary530ea8e2015-01-23 06:17:35 -080018class SkMatrix;
19class SkShader;
20struct SkIRect;
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000021
22/** \class SkPDFShader
23
24 In PDF parlance, this is a pattern, used in place of a color when the
25 pattern color space is selected.
26*/
27
vandebo@chromium.org421d6442011-07-20 17:39:01 +000028class SkPDFShader {
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000029public:
halcanary530ea8e2015-01-23 06:17:35 -080030 class State;
31
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000032 /** Get the PDF shader for the passed SkShader. If the SkShader is
33 * invalid in some way, returns NULL. The reference count of
34 * the object is incremented and it is the caller's responsibility to
35 * unreference it when done. This is needed to accommodate the weak
36 * reference pattern used when the returned object is new and has no
37 * other references.
fmalitac3796c72015-01-13 08:06:11 -080038 * @param shader The SkShader to emulate.
39 * @param matrix The current transform. (PDF shaders are absolutely
40 * positioned, relative to where the page is drawn.)
41 * @param surfceBBox The bounding box of the drawing surface (with matrix
42 * already applied).
halcanary530ea8e2015-01-23 06:17:35 -080043 * @param rasterScale Additional scale to be applied for early
44 * rasterization.
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000045 */
halcanary792c80f2015-02-20 07:21:05 -080046 static SkPDFObject* GetPDFShader(SkPDFCanon* canon,
47 SkScalar dpi,
48 const SkShader& shader,
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000049 const SkMatrix& matrix,
fmalitac3796c72015-01-13 08:06:11 -080050 const SkIRect& surfaceBBox,
51 SkScalar rasterScale);
halcanary530ea8e2015-01-23 06:17:35 -080052};
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000053
halcanary530ea8e2015-01-23 06:17:35 -080054class SkPDFFunctionShader : public SkPDFDict {
55 SK_DECLARE_INST_COUNT(SkPDFFunctionShader);
56
57public:
halcanary792c80f2015-02-20 07:21:05 -080058 static SkPDFFunctionShader* Create(SkPDFCanon*,
59 SkAutoTDelete<SkPDFShader::State>*);
halcanary530ea8e2015-01-23 06:17:35 -080060 virtual ~SkPDFFunctionShader();
61 bool equals(const SkPDFShader::State&) const;
halcanary530ea8e2015-01-23 06:17:35 -080062
63private:
64 SkAutoTDelete<const SkPDFShader::State> fShaderState;
halcanary2e3f9d82015-02-27 12:41:03 -080065 SkPDFFunctionShader(SkPDFShader::State*);
halcanary530ea8e2015-01-23 06:17:35 -080066 typedef SkPDFDict INHERITED;
67};
68
69/**
70 * A shader for PDF gradients. This encapsulates the function shader
71 * inside a tiling pattern while providing a common pattern interface.
72 * The encapsulation allows the use of a SMask for transparency gradients.
73 */
74class SkPDFAlphaFunctionShader : public SkPDFStream {
75public:
halcanary792c80f2015-02-20 07:21:05 -080076 static SkPDFAlphaFunctionShader* Create(SkPDFCanon*,
77 SkScalar dpi,
78 SkAutoTDelete<SkPDFShader::State>*);
halcanary530ea8e2015-01-23 06:17:35 -080079 virtual ~SkPDFAlphaFunctionShader();
halcanaryfb62b3d2015-01-21 09:59:14 -080080 bool equals(const SkPDFShader::State&) const;
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000081
halcanary530ea8e2015-01-23 06:17:35 -080082private:
83 SkAutoTDelete<const SkPDFShader::State> fShaderState;
halcanary2e3f9d82015-02-27 12:41:03 -080084 SkPDFAlphaFunctionShader(SkPDFShader::State*);
halcanary547019e2015-03-24 08:12:55 -070085 typedef SkPDFStream INHERITED;
halcanary530ea8e2015-01-23 06:17:35 -080086};
commit-bot@chromium.org93a2e212013-07-23 23:16:03 +000087
halcanary530ea8e2015-01-23 06:17:35 -080088class SkPDFImageShader : public SkPDFStream {
89public:
halcanary792c80f2015-02-20 07:21:05 -080090 static SkPDFImageShader* Create(SkPDFCanon*,
91 SkScalar dpi,
92 SkAutoTDelete<SkPDFShader::State>*);
halcanary530ea8e2015-01-23 06:17:35 -080093 virtual ~SkPDFImageShader();
halcanary530ea8e2015-01-23 06:17:35 -080094 bool equals(const SkPDFShader::State&) const;
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000095
halcanary530ea8e2015-01-23 06:17:35 -080096private:
97 SkAutoTDelete<const SkPDFShader::State> fShaderState;
halcanary2e3f9d82015-02-27 12:41:03 -080098 SkPDFImageShader(SkPDFShader::State*);
halcanary547019e2015-03-24 08:12:55 -070099 typedef SkPDFStream INHERITED;
vandebo@chromium.orgda912d62011-03-08 18:31:02 +0000100};
101
102#endif