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