1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org */
8da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
10da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org#ifndef SkPDFShader_DEFINED
11da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org#define SkPDFShader_DEFINED
12da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org
13da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org#include "SkPDFStream.h"
14da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org#include "SkPDFTypes.h"
15da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org#include "SkMatrix.h"
16da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org#include "SkRefCnt.h"
17da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org#include "SkShader.h"
18da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org
19da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.orgclass SkObjRef;
20da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.orgclass SkPDFCatalog;
21da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org
22da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org/** \class SkPDFShader
23da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org
24da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org    In PDF parlance, this is a pattern, used in place of a color when the
25da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org    pattern color space is selected.
26da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org*/
27da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org
28421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.orgclass SkPDFShader {
29da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.orgpublic:
30da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org    /** Get the PDF shader for the passed SkShader. If the SkShader is
31da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org     *  invalid in some way, returns NULL. The reference count of
32da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org     *  the object is incremented and it is the caller's responsibility to
33da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org     *  unreference it when done.  This is needed to accommodate the weak
34da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org     *  reference pattern used when the returned object is new and has no
35da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org     *  other references.
36da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org     *  @param shader     The SkShader to emulate.
37da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org     *  @param matrix     The current transform. (PDF shaders are absolutely
38da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org     *                    positioned, relative to where the page is drawn.)
39da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org     *  @param surfceBBox The bounding box of the drawing surface (with matrix
40da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org     *                    already applied).
41da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org     */
42421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org    static SkPDFObject* GetPDFShader(const SkShader& shader,
43da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org                                     const SkMatrix& matrix,
44da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org                                     const SkIRect& surfaceBBox);
45da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org
46421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.orgprotected:
47421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org    class State;
48da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org
49da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org    class ShaderCanonicalEntry {
50da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org    public:
51421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org        ShaderCanonicalEntry(SkPDFObject* pdfShader, const State* state);
52421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org        bool operator==(const ShaderCanonicalEntry& b) const;
53da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org
54421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org        SkPDFObject* fPDFShader;
55421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org        const State* fState;
56da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org    };
57da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org    // This should be made a hash table if performance is a problem.
58b88cfe58e117ffe781e4ce2cba73cc4f7a795de7vandebo@chromium.org    static SkTDArray<ShaderCanonicalEntry>& CanonicalShaders();
591771cbf43d9a1334e3d870c635b4215bb888dd98digit@google.com    static SkBaseMutex& CanonicalShadersMutex();
6093a2e213441c75033b04365c7d68c8d3887288accommit-bot@chromium.org
6193a2e213441c75033b04365c7d68c8d3887288accommit-bot@chromium.org    // This is an internal method.
6293a2e213441c75033b04365c7d68c8d3887288accommit-bot@chromium.org    // CanonicalShadersMutex() should already be acquired.
6393a2e213441c75033b04365c7d68c8d3887288accommit-bot@chromium.org    // This also takes ownership of shaderState.
6493a2e213441c75033b04365c7d68c8d3887288accommit-bot@chromium.org    static SkPDFObject* GetPDFShaderByState(State* shaderState);
65421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org    static void RemoveShader(SkPDFObject* shader);
66da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org
67421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org    SkPDFShader();
6805141c23ed2731bf04e7a1ca2a03ca23014b7222robertphillips@google.com    virtual ~SkPDFShader() {};
69386dfc049baa400c13e4e98727d4c04d0242b7b8vandebo@chromium.org
70386dfc049baa400c13e4e98727d4c04d0242b7b8vandebo@chromium.org    virtual bool isValid() = 0;
71da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org};
72da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org
73da912d61ede86dd3dfa8f645c6f3977f2183812bvandebo@chromium.org#endif
74