OLD | NEW |
---|---|
(Empty) | |
1 | |
vandebo (ex-Chrome)
2013/07/10 18:24:31
Extra line
ducky
2013/07/10 22:54:34
Done.
| |
2 /* | |
3 * Copyright 2013 Google Inc. | |
4 * | |
5 * Use of this source code is governed by a BSD-style license that can be | |
6 * found in the LICENSE file. | |
7 */ | |
8 | |
9 #include "SkPDFResourceDict.h" | |
10 #include "SkPostConfig.h" | |
11 | |
12 SK_DEFINE_INST_COUNT(SkPDFResourceDict) | |
13 | |
14 SkPDFResourceDict::SkPDFResourceDict(bool createProcSets) : SkPDFDict() { | |
15 if (createProcSets) { | |
16 const char procs[][7] = {"PDF", "Text", "ImageB", "ImageC", "ImageI"}; | |
17 SkPDFArray* procSets = SkNEW(SkPDFArray()); | |
18 | |
19 procSets->reserve(SK_ARRAY_COUNT(procs)); | |
20 for (size_t i = 0; i < SK_ARRAY_COUNT(procs); i++) { | |
21 procSets->appendName(procs[i]); | |
22 } | |
23 | |
24 insert("ProcSets", procSets)->unref(); | |
25 } | |
26 } | |
27 | |
28 const char* SkPDFResourceDict::getResourceTypePrefix(SkPDFResourceType type) { | |
29 switch (type) { | |
30 case kExtGState_ResourceType: | |
vandebo (ex-Chrome)
2013/07/10 18:24:31
Instead of this verbose switch statement, use comp
ducky
2013/07/10 22:54:34
Done.
| |
31 return "G"; | |
32 break; | |
33 case kColorSpace_ResourceType: | |
34 SkASSERT(false); // not currently used, no definition exists | |
35 break; | |
36 case kPattern_ResourceType: | |
37 return "P"; | |
38 break; | |
39 case kShading_ResourceType: | |
40 SkASSERT(false); // not currently used, no definition exists | |
41 break; | |
42 case kXObject_ResourceType: | |
43 return "X"; | |
44 break; | |
45 case kFont_ResourceType: | |
46 return "F"; | |
47 break; | |
48 case kProperties_ResourceType: | |
49 SkASSERT(false); // not currently used, no definition exists | |
50 break; | |
51 default: | |
52 SkASSERT(false); | |
53 } | |
54 SkASSERT(false); | |
55 return NULL; | |
56 } | |
57 | |
58 const char* SkPDFResourceDict::getResourceTypeName(SkPDFResourceType type) { | |
59 switch (type) { | |
60 case kExtGState_ResourceType: | |
61 return "ExtGState"; | |
62 break; | |
63 case kColorSpace_ResourceType: | |
64 return "ColorSpace"; | |
65 break; | |
66 case kPattern_ResourceType: | |
67 return "Pattern"; | |
68 break; | |
69 case kShading_ResourceType: | |
70 return "Shading"; | |
71 break; | |
72 case kXObject_ResourceType: | |
73 return "XObject"; | |
74 break; | |
75 case kFont_ResourceType: | |
76 return "Font"; | |
77 break; | |
78 case kProperties_ResourceType: | |
79 return "Properties"; | |
80 break; | |
81 default: | |
82 SkASSERT(false); | |
83 } | |
84 SkASSERT(false); | |
85 return NULL; | |
86 } | |
87 | |
88 SkPDFObject* SkPDFResourceDict::insertResource( | |
89 SkPDFResourceType type, int key, SkPDFObject* value) { | |
90 SkPDFName* typeName = SkNEW_ARGS(SkPDFName, (getResourceTypeName(type))); | |
91 SkPDFDict* typeDict = getResourceTypeDict(typeName); | |
92 | |
93 SkString keyString(getResourceTypePrefix(type)); | |
94 keyString.appendS32(key); | |
95 SkPDFName* keyName = SkNEW_ARGS(SkPDFName, (keyString)); | |
96 typeDict->insert(keyName, value); | |
97 return value; | |
98 } | |
99 | |
100 SkPDFObject* SkPDFResourceDict::insertResourceAsRef( | |
101 SkPDFResourceType type, int key, SkPDFObject* value) { | |
102 SkAutoTUnref<SkPDFObjRef> ref(SkNEW_ARGS(SkPDFObjRef, (value))); | |
103 insertResource(type, key, ref); | |
104 fResources.add(value); | |
105 | |
106 return value; | |
107 } | |
108 | |
109 void SkPDFResourceDict::getResources( | |
110 const SkTSet<SkPDFObject*>& knownResourceObjects, | |
111 SkTSet<SkPDFObject*>* newResourceObjects, | |
112 bool recursive) const { | |
113 // TODO: reserve not correct if we need to recursively explore. | |
114 newResourceObjects->setReserve(newResourceObjects->count() + | |
115 fResources.count()); | |
116 | |
117 for (int i = 0; i < fResources.count(); i++) { | |
118 if (!knownResourceObjects.contains(fResources[i]) && | |
119 !newResourceObjects->contains(fResources[i])) { | |
120 newResourceObjects->add(fResources[i]); | |
121 fResources[i]->ref(); | |
122 if (recursive) { | |
123 fResources[i]->getResources(knownResourceObjects, | |
124 newResourceObjects); | |
125 } | |
126 } | |
127 } | |
128 } | |
129 | |
130 SkPDFDict* SkPDFResourceDict::getResourceTypeDict(SkPDFName* type) { | |
131 for (int i = 0; i < fTypes.count(); i++) { | |
132 if (*(fTypes[i].key) == *type) { | |
vandebo (ex-Chrome)
2013/07/10 18:24:31
Instead of doing a string comparison for every ins
ducky
2013/07/10 22:54:34
Done. Good point.
| |
133 return fTypes[i].value; | |
134 } | |
135 } | |
136 | |
137 // If not found, create a new record. | |
138 struct DictRec* newEntry = fTypes.append(); | |
139 newEntry->key = type; | |
140 SkAutoTUnref<SkPDFDict> newDict(SkNEW(SkPDFDict())); | |
141 newEntry->value = newDict; | |
142 insert(type, newDict); // ref counting handled in SkPDFDict::insert | |
143 return newDict.get(); | |
144 } | |
OLD | NEW |