11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 20b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 40b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 70b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#ifndef SkPDFShader_DEFINED 110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#define SkPDFShader_DEFINED 120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPDFStream.h" 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPDFTypes.h" 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkMatrix.h" 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRefCnt.h" 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkShader.h" 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkObjRef; 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkPDFCatalog; 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/** \class SkPDFShader 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger In PDF parlance, this is a pattern, used in place of a color when the 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger pattern color space is selected. 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger*/ 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkPDFShader { 290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger /** Get the PDF shader for the passed SkShader. If the SkShader is 310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * invalid in some way, returns NULL. The reference count of 320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * the object is incremented and it is the caller's responsibility to 330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * unreference it when done. This is needed to accommodate the weak 340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * reference pattern used when the returned object is new and has no 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * other references. 360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * @param shader The SkShader to emulate. 370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * @param matrix The current transform. (PDF shaders are absolutely 380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * positioned, relative to where the page is drawn.) 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * @param surfceBBox The bounding box of the drawing surface (with matrix 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * already applied). 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static SkPDFObject* GetPDFShader(const SkShader& shader, 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const SkMatrix& matrix, 440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const SkIRect& surfaceBBox); 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected: 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger class State; 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger class ShaderCanonicalEntry { 500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger public: 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger ShaderCanonicalEntry(SkPDFObject* pdfShader, const State* state); 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool operator==(const ShaderCanonicalEntry& b) const; 530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPDFObject* fPDFShader; 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const State* fState; 560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger }; 570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // This should be made a hash table if performance is a problem. 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static SkTDArray<ShaderCanonicalEntry>& CanonicalShaders(); 594f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger static SkBaseMutex& CanonicalShadersMutex(); 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static void RemoveShader(SkPDFObject* shader); 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPDFShader(); 630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif 66