Chromium Code Reviews| 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 |