119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org/* 319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * Copyright 2010 The Android Open Source Project 419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * 519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * Use of this source code is governed by a BSD-style license that can be 619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * found in the LICENSE file. 719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 1019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#ifndef SkPDFGraphicState_DEFINED 1119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#define SkPDFGraphicState_DEFINED 1219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 1319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#include "SkPaint.h" 1419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#include "SkPDFTypes.h" 1519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#include "SkTemplates.h" 1619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#include "SkThread.h" 1719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 1819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgclass SkPDFFormXObject; 1919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 2019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org/** \class SkPDFGraphicState 2119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPaint objects roughly correspond to graphic state dictionaries that can 2219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org be installed. So that a given dictionary is only output to the pdf file 2319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org once, we want to canonicalize them. Static methods in this class manage 2419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org a weakly referenced set of SkPDFGraphicState objects: when the last 2519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org reference to a SkPDFGraphicState is removed, it removes itself from the 2619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static set of objects. 2719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 2819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org*/ 2919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgclass SkPDFGraphicState : public SkPDFDict { 3019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgpublic: 319d2ebe897190c9ea93f3c737440bf5ae891a910bcommit-bot@chromium.org enum SkPDFSMaskMode { 329d2ebe897190c9ea93f3c737440bf5ae891a910bcommit-bot@chromium.org kAlpha_SMaskMode, 339d2ebe897190c9ea93f3c737440bf5ae891a910bcommit-bot@chromium.org kLuminosity_SMaskMode 349d2ebe897190c9ea93f3c737440bf5ae891a910bcommit-bot@chromium.org }; 359d2ebe897190c9ea93f3c737440bf5ae891a910bcommit-bot@chromium.org 3619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual ~SkPDFGraphicState(); 3719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 3809b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com virtual void getResources(const SkTSet<SkPDFObject*>& knownResourceObjects, 3909b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com SkTSet<SkPDFObject*>* newResourceObjects); 4019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 4119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org // Override emitObject and getOutputSize so that we can populate 4219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org // the dictionary on demand. 4319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, 4419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool indirect); 4519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); 4619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 4719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Get the graphic state for the passed SkPaint. The reference count of 4819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * the object is incremented and it is the caller's responsibility to 4919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * unreference it when done. This is needed to accommodate the weak 5019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * reference pattern used when the returned object is new and has no 5119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * other references. 5219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param paint The SkPaint to emulate. 5319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 5419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static SkPDFGraphicState* GetGraphicStateForPaint(const SkPaint& paint); 5519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 5619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Make a graphic state that only sets the passed soft mask. The 5719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * reference count of the object is incremented and it is the caller's 5819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * responsibility to unreference it when done. 599d2ebe897190c9ea93f3c737440bf5ae891a910bcommit-bot@chromium.org * @param sMask The form xobject to use as a soft mask. 609d2ebe897190c9ea93f3c737440bf5ae891a910bcommit-bot@chromium.org * @param invert Indicates if the alpha of the sMask should be inverted. 619d2ebe897190c9ea93f3c737440bf5ae891a910bcommit-bot@chromium.org * @param sMaskMode Whether to use alpha or luminosity for the sMask. 6219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 6319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static SkPDFGraphicState* GetSMaskGraphicState(SkPDFFormXObject* sMask, 649d2ebe897190c9ea93f3c737440bf5ae891a910bcommit-bot@chromium.org bool invert, 659d2ebe897190c9ea93f3c737440bf5ae891a910bcommit-bot@chromium.org SkPDFSMaskMode sMaskMode); 6619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 6719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Get a graphic state that only unsets the soft mask. The reference 6819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * count of the object is incremented and it is the caller's responsibility 6919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * to unreference it when done. This is needed to accommodate the weak 7019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * reference pattern used when the returned object is new and has no 7119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * other references. 7219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 7319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static SkPDFGraphicState* GetNoSMaskGraphicState(); 7419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 7519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgprivate: 7619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org const SkPaint fPaint; 7719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkTDArray<SkPDFObject*> fResources; 7819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool fPopulated; 7919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool fSMask; 8019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 8119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org class GSCanonicalEntry { 8219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org public: 8319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPDFGraphicState* fGraphicState; 8419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org const SkPaint* fPaint; 8519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 8619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool operator==(const GSCanonicalEntry& b) const; 8719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org explicit GSCanonicalEntry(SkPDFGraphicState* gs) 8819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org : fGraphicState(gs), 8919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org fPaint(&gs->fPaint) {} 9019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org explicit GSCanonicalEntry(const SkPaint* paint) 9119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org : fGraphicState(NULL), 9219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org fPaint(paint) {} 9319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org }; 9419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 9519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org // This should be made a hash table if performance is a problem. 9619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static SkTDArray<GSCanonicalEntry>& CanonicalPaints(); 9719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static SkBaseMutex& CanonicalPaintsMutex(); 9819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 9919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPDFGraphicState(); 10019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org explicit SkPDFGraphicState(const SkPaint& paint); 10119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 10219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org void populateDict(); 10319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 10419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static SkPDFObject* GetInvertFunction(); 10519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 10619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static int Find(const SkPaint& paint); 10719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org}; 10819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 10919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#endif 110