Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/pdf/SkPDFResourceDict.cpp

Issue 18977002: Add SkPDFResourceDict class, refactor existing code (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698