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