1/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkPDFResourceDict_DEFINED
9#define SkPDFResourceDict_DEFINED
10
11#include "SkPDFTypes.h"
12#include "SkTDArray.h"
13#include "SkTSet.h"
14#include "SkTypes.h"
15
16/** \class SkPDFResourceDict
17
18    A resource dictionary, which maintains the relevant sub-dicts and
19    allows generation of a list of referenced SkPDFObjects inserted with
20    insertResourceAsRef.
21*/
22class SkPDFResourceDict : public SkPDFDict {
23public:
24    SK_DECLARE_INST_COUNT(SkPDFResourceDict)
25
26     enum SkPDFResourceType{
27        kExtGState_ResourceType,
28        kPattern_ResourceType,
29        kXObject_ResourceType,
30        kFont_ResourceType,
31        // These additional types are defined by the spec, but not
32        // currently used by Skia: ColorSpace, Shading, Properties
33        kResourceTypeCount
34     };
35
36    /** Create a PDF resource dictionary.
37     *  The full set of ProcSet entries is automatically created for backwards
38     *  compatibility, as recommended by the PDF spec.
39     */
40    SkPDFResourceDict();
41
42    /** Add the value SkPDFObject as a reference to the resource dictionary
43     *  with the give type and key.
44     *  The relevant sub-dicts will be automatically generated, and the
45     *  resource will be named by concatenating a type-specific prefix and
46     *  the input key.
47     *  This object will be part of the resource list when requested later.
48     *  @param type  The type of resource being entered, like
49     *    kPattern_ResourceType or kExtGState_ResourceType.
50     *  @param key   The resource key, should be unique within its type.
51     *  @param value The resource itself.
52     *  @return The value argument is returned.
53     */
54    SkPDFObject* insertResourceAsReference(SkPDFResourceType type, int key,
55                                           SkPDFObject* value);
56
57    /**
58     * Gets resources inserted into this dictionary as a reference.
59     *
60     * @param knownResourceObjects Set containing currently known resources.
61     *     Resources in the dict and this set will not be added to the output.
62     * @param newResourceObjects   Output set to which non-preexisting resources
63     *     will be added.
64     * @param recursive            Whether or not to add resources of resources.
65     */
66    void getReferencedResources(
67            const SkTSet<SkPDFObject*>& knownResourceObjects,
68            SkTSet<SkPDFObject*>* newResourceObjects,
69            bool recursive) const;
70
71    /**
72     * Returns the name for the resource that will be generated by the resource
73     * dict.
74     *
75     *  @param type  The type of resource being entered, like
76     *    kPattern_ResourceType or kExtGState_ResourceType.
77     *  @param key   The resource key, should be unique within its type.
78     */
79    static SkString getResourceName(SkPDFResourceType type, int key);
80
81private:
82    /** Add the value to the dictionary with the given key.  Refs value.
83     *  The relevant sub-dicts will be automatically generated, and the
84     *  resource will be named by concatenating a type-specific prefix and
85     *  the input key.
86     *  The object will NOT be part of the resource list when requested later.
87     *  @param type  The type of resource being entered.
88     *  @param key   The resource key, should be unique within its type.
89     *  @param value The resource itself.
90     *  @return The value argument is returned.
91     */
92    SkPDFObject* insertResource(SkPDFResourceType type, int key,
93                                SkPDFObject* value);
94
95    SkTSet<SkPDFObject*> fResources;
96
97    SkTDArray<SkPDFDict*> fTypes;
98    typedef SkPDFDict INHERITED;
99};
100
101#endif
102