192f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org/* 292f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org * Copyright 2013 Google Inc. 392f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org * 492f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 592f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org * found in the LICENSE file. 692f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org */ 792f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 892f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org#include "SkPDFResourceDict.h" 992f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org#include "SkPostConfig.h" 1092f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 1192f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgSK_DEFINE_INST_COUNT(SkPDFResourceDict) 1292f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 1392f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org// Sanity check that the values of enum SkPDFResourceType correspond to the 1492f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org// expected values as defined in the arrays below. 1592f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org// If these are failing, you may need to update the resource_type_prefixes 1692f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org// and resource_type_names arrays below. 1792f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgSK_COMPILE_ASSERT(SkPDFResourceDict::kExtGState_ResourceType == 0, 1892f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org resource_type_mismatch); 1992f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgSK_COMPILE_ASSERT(SkPDFResourceDict::kPattern_ResourceType == 1, 2092f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org resource_type_mismatch); 2192f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgSK_COMPILE_ASSERT(SkPDFResourceDict::kXObject_ResourceType == 2, 2292f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org resource_type_mismatch); 2392f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgSK_COMPILE_ASSERT(SkPDFResourceDict::kFont_ResourceType == 3, 2492f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org resource_type_mismatch); 2592f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 2692f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgstatic const char resource_type_prefixes[] = { 2792f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 'G', 2892f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 'P', 2992f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 'X', 3092f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 'F' 3192f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org}; 3292f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 3392f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgstatic const char* resource_type_names[] = { 3492f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org "ExtGState", 3592f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org "Pattern", 3692f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org "XObject", 3792f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org "Font" 3892f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org}; 3992f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 4092f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgstatic char get_resource_type_prefix( 4192f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkPDFResourceDict::SkPDFResourceType type) { 4292f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkASSERT(type >= 0); 4392f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkASSERT(type < SkPDFResourceDict::kResourceTypeCount); 4492f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 4592f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org return resource_type_prefixes[type]; 4692f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org} 4792f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 4892f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgstatic const char* get_resource_type_name( 4992f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkPDFResourceDict::SkPDFResourceType type) { 5092f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkASSERT(type >= 0); 5192f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkASSERT(type < SkPDFResourceDict::kResourceTypeCount); 5292f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 5392f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org return resource_type_names[type]; 5492f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org} 5592f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 5692f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgSkPDFResourceDict::SkPDFResourceDict() : SkPDFDict() { 5792f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org const char procs[][7] = {"PDF", "Text", "ImageB", "ImageC", "ImageI"}; 5892f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkPDFArray* procSets = SkNEW(SkPDFArray()); 5992f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 6092f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org procSets->reserve(SK_ARRAY_COUNT(procs)); 6192f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(procs); i++) { 6292f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org procSets->appendName(procs[i]); 6392f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org } 6492f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org insert("ProcSets", procSets)->unref(); 6592f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 6692f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org // Actual sub-dicts will be lazily added later 6792f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org fTypes.setCount(kResourceTypeCount); 6892f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org for (size_t i=0; i < kResourceTypeCount; i++) { 6992f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org fTypes[i] = NULL; 7092f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org } 7192f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org} 7292f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 7392f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgSkPDFObject* SkPDFResourceDict::insertResourceAsReference( 7492f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkPDFResourceType type, int key, SkPDFObject* value) { 7592f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkAutoTUnref<SkPDFObjRef> ref(SkNEW_ARGS(SkPDFObjRef, (value))); 7692f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org insertResource(type, key, ref); 7792f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org fResources.add(value); 7892f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 7992f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org return value; 8092f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org} 8192f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 8292f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgvoid SkPDFResourceDict::getReferencedResources( 8392f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org const SkTSet<SkPDFObject*>& knownResourceObjects, 8492f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkTSet<SkPDFObject*>* newResourceObjects, 8592f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org bool recursive) const { 8692f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org // TODO: reserve not correct if we need to recursively explore. 8792f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org newResourceObjects->setReserve(newResourceObjects->count() + 8892f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org fResources.count()); 8992f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 9092f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org for (int i = 0; i < fResources.count(); i++) { 9192f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org if (!knownResourceObjects.contains(fResources[i]) && 9292f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org !newResourceObjects->contains(fResources[i])) { 9392f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org newResourceObjects->add(fResources[i]); 9492f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org fResources[i]->ref(); 9592f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org if (recursive) { 9692f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org fResources[i]->getResources(knownResourceObjects, 9792f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org newResourceObjects); 9892f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org } 9992f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org } 10092f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org } 10192f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org} 10292f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 10392f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgSkString SkPDFResourceDict::getResourceName( 10492f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkPDFResourceType type, int key) { 10592f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkString keyString; 10692f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org keyString.printf("%c%d", get_resource_type_prefix(type), key); 10792f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org return keyString; 10892f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org} 10992f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 11092f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.orgSkPDFObject* SkPDFResourceDict::insertResource( 11192f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkPDFResourceType type, int key, SkPDFObject* value) { 11292f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkPDFDict* typeDict = fTypes[type]; 11392f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org if (NULL == typeDict) { 11492f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org SkAutoTUnref<SkPDFDict> newDict(SkNEW(SkPDFDict())); 11503b202fbda1605402f98f73cece3975fc60f484ecommit-bot@chromium.org SkAutoTUnref<SkPDFName> typeName( 11603b202fbda1605402f98f73cece3975fc60f484ecommit-bot@chromium.org SkNEW_ARGS(SkPDFName, (get_resource_type_name(type)))); 11792f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org insert(typeName, newDict); // ref counting handled here 11892f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org fTypes[type] = newDict; 11992f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org typeDict = newDict.get(); 12092f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org } 12192f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org 12203b202fbda1605402f98f73cece3975fc60f484ecommit-bot@chromium.org SkAutoTUnref<SkPDFName> keyName( 12303b202fbda1605402f98f73cece3975fc60f484ecommit-bot@chromium.org SkNEW_ARGS(SkPDFName, (getResourceName(type, key)))); 12492f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org typeDict->insert(keyName, value); 12592f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org return value; 12692f3e50644221095db9c5052ee359f4565cd4d14commit-bot@chromium.org} 127