Home | History | Annotate | Download | only in pdf
      1 /*
      2  * Copyright 2013 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "SkPDFResourceDict.h"
      9 #include "SkPostConfig.h"
     10 
     11 // Sanity check that the values of enum SkPDFResourceType correspond to the
     12 // expected values as defined in the arrays below.
     13 // If these are failing, you may need to update the resource_type_prefixes
     14 // and resource_type_names arrays below.
     15 static_assert(SkPDFResourceDict::kExtGState_ResourceType == 0, "resource_type_mismatch");
     16 static_assert(SkPDFResourceDict::kPattern_ResourceType == 1, "resource_type_mismatch");
     17 static_assert(SkPDFResourceDict::kXObject_ResourceType == 2, "resource_type_mismatch");
     18 static_assert(SkPDFResourceDict::kFont_ResourceType == 3, "resource_type_mismatch");
     19 
     20 static const char resource_type_prefixes[] = {
     21         'G',
     22         'P',
     23         'X',
     24         'F'
     25 };
     26 
     27 static const char* resource_type_names[] = {
     28         "ExtGState",
     29         "Pattern",
     30         "XObject",
     31         "Font"
     32 };
     33 
     34 static char get_resource_type_prefix(
     35         SkPDFResourceDict::SkPDFResourceType type) {
     36     SkASSERT(type >= 0);
     37     SkASSERT(type < SkPDFResourceDict::kResourceTypeCount);
     38 
     39     return resource_type_prefixes[type];
     40 }
     41 
     42 static const char* get_resource_type_name(
     43         SkPDFResourceDict::SkPDFResourceType type) {
     44     SkASSERT(type >= 0);
     45     SkASSERT(type < SK_ARRAY_COUNT(resource_type_names));
     46 
     47     return resource_type_names[type];
     48 }
     49 
     50 SkString SkPDFResourceDict::getResourceName(
     51         SkPDFResourceDict::SkPDFResourceType type, int key) {
     52     SkString keyString;
     53     keyString.printf("%c%d", get_resource_type_prefix(type), key);
     54     return keyString;
     55 }
     56 
     57 static void add_subdict(
     58         const SkTDArray<SkPDFObject*>& resourceList,
     59         SkPDFResourceDict::SkPDFResourceType type,
     60         SkPDFDict* dst) {
     61     if (0 == resourceList.count()) {
     62         return;
     63     }
     64     SkAutoTUnref<SkPDFDict> resources(new SkPDFDict);
     65     for (int i = 0; i < resourceList.count(); i++) {
     66         resources->insertObjRef(SkPDFResourceDict::getResourceName(type, i),
     67                                 SkRef(resourceList[i]));
     68     }
     69     dst->insertObject(get_resource_type_name(type), resources.detach());
     70 }
     71 
     72 SkPDFDict* SkPDFResourceDict::Create(
     73         const SkTDArray<SkPDFObject*>* gStateResources,
     74         const SkTDArray<SkPDFObject*>* patternResources,
     75         const SkTDArray<SkPDFObject*>* xObjectResources,
     76         const SkTDArray<SkPDFObject*>* fontResources) {
     77     SkAutoTUnref<SkPDFDict> dict(new SkPDFDict);
     78     static const char kProcs[][7] = {
     79         "PDF", "Text", "ImageB", "ImageC", "ImageI"};
     80     SkAutoTUnref<SkPDFArray> procSets(new SkPDFArray);
     81 
     82     procSets->reserve(SK_ARRAY_COUNT(kProcs));
     83     for (size_t i = 0; i < SK_ARRAY_COUNT(kProcs); i++) {
     84         procSets->appendName(kProcs[i]);
     85     }
     86     dict->insertObject("ProcSets", procSets.detach());
     87 
     88     if (gStateResources) {
     89         add_subdict(*gStateResources, kExtGState_ResourceType, dict);
     90     }
     91     if (patternResources) {
     92         add_subdict(*patternResources, kPattern_ResourceType, dict);
     93     }
     94     if (xObjectResources) {
     95         add_subdict(*xObjectResources, kXObject_ResourceType, dict);
     96     }
     97     if (fontResources) {
     98         add_subdict(*fontResources, kFont_ResourceType, dict);
     99     }
    100     return dict.detach();
    101 }
    102