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