158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/*
258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Copyright 2013 Google Inc.
358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger *
458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * found in the LICENSE file.
658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */
758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#ifndef SkPDFResourceDict_DEFINED
958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define SkPDFResourceDict_DEFINED
1058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
1158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkPDFTypes.h"
1258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkTDArray.h"
1358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkTSet.h"
1458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkTypes.h"
1558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
1658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/** \class SkPDFResourceDict
1758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
1858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    A resource dictionary, which maintains the relevant sub-dicts and
1958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    allows generation of a list of referenced SkPDFObjects inserted with
2058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    insertResourceAsRef.
2158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger*/
2258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerclass SkPDFResourceDict : public SkPDFDict {
2358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerpublic:
2458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SK_DECLARE_INST_COUNT(SkPDFResourceDict)
2558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
2658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     enum SkPDFResourceType{
2758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        kExtGState_ResourceType,
2858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        kPattern_ResourceType,
2958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        kXObject_ResourceType,
3058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        kFont_ResourceType,
3158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        // These additional types are defined by the spec, but not
3258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        // currently used by Skia: ColorSpace, Shading, Properties
3358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        kResourceTypeCount
3458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     };
3558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
3658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    /** Create a PDF resource dictionary.
3758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  The full set of ProcSet entries is automatically created for backwards
3858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  compatibility, as recommended by the PDF spec.
3958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     */
4058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkPDFResourceDict();
4158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
4258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    /** Add the value SkPDFObject as a reference to the resource dictionary
4358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  with the give type and key.
4458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  The relevant sub-dicts will be automatically generated, and the
4558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  resource will be named by concatenating a type-specific prefix and
4658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  the input key.
4758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  This object will be part of the resource list when requested later.
4858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  @param type  The type of resource being entered, like
4958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *    kPattern_ResourceType or kExtGState_ResourceType.
5058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  @param key   The resource key, should be unique within its type.
5158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  @param value The resource itself.
5258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  @return The value argument is returned.
5358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     */
5458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkPDFObject* insertResourceAsReference(SkPDFResourceType type, int key,
5558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                                           SkPDFObject* value);
5658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
5758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    /**
5858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     * Gets resources inserted into this dictionary as a reference.
5958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *
6058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     * @param knownResourceObjects Set containing currently known resources.
6158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *     Resources in the dict and this set will not be added to the output.
6258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     * @param newResourceObjects   Output set to which non-preexisting resources
6358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *     will be added.
6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     * @param recursive            Whether or not to add resources of resources.
6558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     */
6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    void getReferencedResources(
6758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            const SkTSet<SkPDFObject*>& knownResourceObjects,
6858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            SkTSet<SkPDFObject*>* newResourceObjects,
6958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            bool recursive) const;
7058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
7158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    /**
7258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     * Returns the name for the resource that will be generated by the resource
7358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     * dict.
7458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *
7558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  @param type  The type of resource being entered, like
7658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *    kPattern_ResourceType or kExtGState_ResourceType.
7758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  @param key   The resource key, should be unique within its type.
7858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     */
7958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    static SkString getResourceName(SkPDFResourceType type, int key);
8058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
8158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerprivate:
8258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    /** Add the value to the dictionary with the given key.  Refs value.
8358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  The relevant sub-dicts will be automatically generated, and the
8458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  resource will be named by concatenating a type-specific prefix and
8558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  the input key.
8658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  The object will NOT be part of the resource list when requested later.
8758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  @param type  The type of resource being entered.
8858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  @param key   The resource key, should be unique within its type.
8958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  @param value The resource itself.
9058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  @return The value argument is returned.
9158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     */
9258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkPDFObject* insertResource(SkPDFResourceType type, int key,
9358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                                SkPDFObject* value);
9458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
9558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkTSet<SkPDFObject*> fResources;
9658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
9758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkTDArray<SkPDFDict*> fTypes;
9858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger};
9958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
10058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#endif
101