SkPdfNativeObject.h revision 222382b30a176db9d9044d9df1ae14e0fbe27181
1571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#ifndef EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_
2571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_
3571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include <stdint.h>
5571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include <string.h>
6571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include <string>
7571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkTDArray.h"
8571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkTDict.h"
9571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkRect.h"
10571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkMatrix.h"
11571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkString.h"
12571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
13571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkPdfNYI.h"
14571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkPdfConfig.h"
15571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
16571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfDictionary;
17571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfStream;
18571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfAllocator;
19571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
20571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com// TODO(edisonn): macro it and move it to utils
21571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comSkMatrix SkMatrixFromPdfMatrix(double array[6]);
22571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
23571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
24571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kFilteredStreamBit 0
25571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kUnfilteredStreamBit 1
26571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
27571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
28571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfObject {
29571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com public:
30571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com     enum ObjectType {
31571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kInvalid_PdfObjectType,
32571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
33571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kBoolean_PdfObjectType,
34571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kInteger_PdfObjectType,
35571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kReal_PdfObjectType,
36571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kString_PdfObjectType,
37571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kHexString_PdfObjectType,
38571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kName_PdfObjectType,
39571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kKeyword_PdfObjectType,
40571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         //kStream_PdfObjectType,  //  attached to a Dictionary
41571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kArray_PdfObjectType,
42571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kDictionary_PdfObjectType,
43571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kNull_PdfObjectType,
44571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
45571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         // TODO(edisonn): after the pdf has been loaded completely, resolve all references
46571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         // try the same thing with delayed loaded ...
47571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kReference_PdfObjectType,
48571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
49571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kUndefined_PdfObjectType,  // per 1.4 spec, if the same key appear twice in the dictionary, the value is undefined
50571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com     };
51571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
52571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
53571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    struct NotOwnedString {
54571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        unsigned char* fBuffer;
55571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        size_t fBytes;
56571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    };
57571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
58571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    struct Reference {
59571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        unsigned int fId;
60571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        unsigned int fGen;
61571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    };
62571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
63571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): add stream start, stream end, where stream is weither the file
64571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // or decoded/filtered pdf stream
65571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
66571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): add warning/report per object
67571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): add flag fUsed, to be used once the parsing is complete,
68571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // so we could show what parts have been proccessed, ignored, or generated errors
69571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
70571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    ObjectType fObjectType;
71571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
72571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    union {
73571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        bool fBooleanValue;
74571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        int64_t fIntegerValue;
75571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): double, float? typedefed
76571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        double fRealValue;
77571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        NotOwnedString fStr;
78571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
79571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): make sure the foorprint of fArray and fMap is small, otherwise, use pointers, or classes with up to 8 bytes in footprint
80571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkTDArray<SkPdfObject*>* fArray;
81571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        Reference fRef;
82571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    };
83571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkTDict<SkPdfObject*>* fMap;
84571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    void* fData;
85571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
86571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
87571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.compublic:
88571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
89222382b30a176db9d9044d9df1ae14e0fbe27181edisonn@google.com    SkPdfObject() : fObjectType(kInvalid_PdfObjectType), fMap(NULL), fData(NULL) {}
90571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
91571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline void* data() {
92571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fData;
93571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
94571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
95571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline void setData(void* data) {
96571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fData = data;
97571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
98571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
99222382b30a176db9d9044d9df1ae14e0fbe27181edisonn@google.com//    ~SkPdfObject() {
100222382b30a176db9d9044d9df1ae14e0fbe27181edisonn@google.com//        //reset();  must be called manually!
101222382b30a176db9d9044d9df1ae14e0fbe27181edisonn@google.com//    }
102571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
103571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    void reset() {
104571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
105571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kArray_PdfObjectType:
106571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                delete fArray;
107571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
108571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
109571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kDictionary_PdfObjectType:
110571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                delete fMap;
111571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
112571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
113571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
114571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
115571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
116571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fObjectType = kInvalid_PdfObjectType;
117571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
118571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
119571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    ObjectType type() { return fObjectType; }
120571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
121571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const char* c_str() const {
122571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
123571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kString_PdfObjectType:
124571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kHexString_PdfObjectType:
125571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kKeyword_PdfObjectType:
126571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return (const char*)fStr.fBuffer;
127571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
128571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
129571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report/warning
130571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return NULL;
131571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
132571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
133571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
134571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    size_t len() const {
135571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
136571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kString_PdfObjectType:
137571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kHexString_PdfObjectType:
138571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kKeyword_PdfObjectType:
139571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return fStr.fBytes;
140571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
141571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
142571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report/warning
143571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return 0;
144571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
145571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
146571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
147571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
148571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
149571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfDate& dateValue() const {
150571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfDate nyi;
151571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
152571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
153571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
154571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
155571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfFunction& functionValue() const {
156571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfFunction nyi;
157571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
158571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
159571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
160571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
161571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfFileSpec& fileSpecValue() const {
162571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfFileSpec nyi;
163571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
164571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
165571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
166571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
167571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfTree& treeValue() const {
168571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfTree nyi;
169571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
170571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
171571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
172571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
173571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeBoolean(bool value, SkPdfObject* obj) {
174571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
175571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
176571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kBoolean_PdfObjectType;
177571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fBooleanValue = value;
178571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
179571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
180571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static SkPdfObject makeBoolean(bool value) {
181571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkPdfObject obj;
182571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj.fObjectType = kBoolean_PdfObjectType;
183571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj.fBooleanValue = value;
184571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return obj;
185571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
186571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
187571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeInteger(int64_t value, SkPdfObject* obj) {
188571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
189571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
190571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kInteger_PdfObjectType;
191571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fIntegerValue = value;
192571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
193571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
194571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeReal(double value, SkPdfObject* obj) {
195571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
196571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
197571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kReal_PdfObjectType;
198571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fRealValue = value;
199571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
200571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
201571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeNull(SkPdfObject* obj) {
202571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
203571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
204571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kNull_PdfObjectType;
205571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
206571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
207571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static SkPdfObject makeNull() {
208571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkPdfObject obj;
209571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj.fObjectType = kNull_PdfObjectType;
210571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return obj;
211571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
212571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
213571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static SkPdfObject kNull;
214571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
215571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeNumeric(unsigned char* start, unsigned char* end, SkPdfObject* obj) {
216571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
217571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
218571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): NYI properly
219571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // if has dot (impl), or exceeds max int, is real, otherwise is int
220571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        bool isInt = true;
221571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        for (unsigned char* current = start; current < end; current++) {
222571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            if (*current == '.') {
223571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                isInt = false;
224571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
225571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            }
226571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report parse issue with numbers like "24asdasd123"
227571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
228571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (isInt) {
229571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            makeInteger(atol((const char*)start), obj);
230571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        } else {
231571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            makeReal(atof((const char*)start), obj);
232571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
233571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
234571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
235571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeReference(unsigned int id, unsigned int gen, SkPdfObject* obj) {
236571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
237571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
238571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kReference_PdfObjectType;
239571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fRef.fId = id;
240571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fRef.fGen = gen;
241571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
242571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
243571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
244571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeString(unsigned char* start, SkPdfObject* obj) {
245571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kString_PdfObjectType);
246571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
247571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
248571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeString(unsigned char* start, unsigned char* end, SkPdfObject* obj) {
249571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, kString_PdfObjectType);
250571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
251571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
252571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeString(unsigned char* start, size_t bytes, SkPdfObject* obj) {
253571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, bytes, obj, kString_PdfObjectType);
254571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
255571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
256571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
257571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeHexString(unsigned char* start, SkPdfObject* obj) {
258571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kHexString_PdfObjectType);
259571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
260571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
261571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeHexString(unsigned char* start, unsigned char* end, SkPdfObject* obj) {
262571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, kHexString_PdfObjectType);
263571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
264571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
265571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeHexString(unsigned char* start, size_t bytes, SkPdfObject* obj) {
266571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, bytes, obj, kHexString_PdfObjectType);
267571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
268571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
269571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
270571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeName(unsigned char* start, SkPdfObject* obj) {
271571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kName_PdfObjectType);
272571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
273571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
274571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeName(unsigned char* start, unsigned char* end, SkPdfObject* obj) {
275571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, kName_PdfObjectType);
276571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
277571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
278571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeName(unsigned char* start, size_t bytes, SkPdfObject* obj) {
279571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, bytes, obj, kName_PdfObjectType);
280571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
281571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
282571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
283571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeKeyword(unsigned char* start, SkPdfObject* obj) {
284571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kKeyword_PdfObjectType);
285571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
286571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
287571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeKeyword(unsigned char* start, unsigned char* end, SkPdfObject* obj) {
288571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, kKeyword_PdfObjectType);
289571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
290571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
291571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeKeyword(unsigned char* start, size_t bytes, SkPdfObject* obj) {
292571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, bytes, obj, kKeyword_PdfObjectType);
293571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
294571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
295571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
296571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
297571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): make the functions to return SkPdfArray, move these functions in SkPdfArray
298571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeEmptyArray(SkPdfObject* obj) {
299571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
300571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
301571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kArray_PdfObjectType;
302571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fArray = new SkTDArray<SkPdfObject*>();
303571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // return (SkPdfArray*)obj;
304571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
305571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
306571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool appendInArray(SkPdfObject* obj) {
307571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
308571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kArray_PdfObjectType) {
309571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
310571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
311571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
312571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
313571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fArray->push(obj);
314571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
315571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
316571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
317571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    size_t size() const {
318571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
319571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
320571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fArray->count();
321571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
322571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
323571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfObject* objAtAIndex(int i) {
324571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
325571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
326571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
327571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
328571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
329571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfObject* removeLastInArray() {
330571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
331571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
332571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkPdfObject* ret = NULL;
333571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fArray->pop(&ret);
334571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
335571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return ret;
336571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
337571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
338571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
339571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const SkPdfObject* objAtAIndex(int i) const {
340571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
341571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
342571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
343571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
344571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
345571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfObject* operator[](int i) {
346571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
347571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
348571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
349571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
350571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
351571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const SkPdfObject* operator[](int i) const {
352571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
353571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
354571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
355571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
356571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
357571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
358571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): make the functions to return SkPdfDictionary, move these functions in SkPdfDictionary
359571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeEmptyDictionary(SkPdfObject* obj) {
360571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
361571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
362571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kDictionary_PdfObjectType;
363571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fMap = new SkTDict<SkPdfObject*>(1);
364571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBuffer = NULL;
365571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBytes = 0;
366571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
367571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
368571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): get all the possible names from spec, and compute a hash function
369571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // that would create no overlaps in the same dictionary
370571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // or build a tree of chars that when followed goes to a unique id/index/hash
371571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): generate constants like kDictFoo, kNameDict_name
372571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // which will be used in code
373571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // add function SkPdfFastNameKey key(const char* key);
374571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): setting the same key twike, will make the value undefined!
375571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool set(SkPdfObject* key, SkPdfObject* value) {
376571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
377571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fObjectType == kName_PdfObjectType);
378571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
379571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
380571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
381571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
382571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
383571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
384571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // we rewrite all delimiters and white spaces with '\0', so we expect the end of name to be '\0'
385571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
386571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
387571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return set((char*)key->fStr.fBuffer, value);
388571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
389571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
390571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool set(const char* key, SkPdfObject* value) {
391571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
392571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
393571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kDictionary_PdfObjectType) {
394571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
395571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
396571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
397571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
398571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fMap->set(key, value);
399571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
400571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
401571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfObject* get(SkPdfObject* key) {
402571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
403571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fObjectType == kName_PdfObjectType);
404571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
405571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
406571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
407571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
408571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
409571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
410571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
411571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
412571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return get((char*)key->fStr.fBuffer);
413571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
414571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
415571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfObject* get(const char* key) {
416571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
417571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key);
418571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kDictionary_PdfObjectType) {
419571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
420571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
421571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
422571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkPdfObject* ret = NULL;
423571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fMap->find(key, &ret);
424571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return ret;
425571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
426571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
427571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const SkPdfObject* get(SkPdfObject* key) const {
428571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
429571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fObjectType == kName_PdfObjectType);
430571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
431571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
432571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
433571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
434571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
435571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
436571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
437571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
438571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return get((char*)key->fStr.fBuffer);
439571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
440571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
441571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
442571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const SkPdfObject* get(const char* key) const {
443571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
444571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key);
445571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kDictionary_PdfObjectType) {
446571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
447571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
448571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
449571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkPdfObject* ret = NULL;
450571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fMap->find(key, &ret);
451571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return ret;
452571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
453571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
454571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const SkPdfObject* get(const char* key, const char* abr) const {
455571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        const SkPdfObject* ret = get(key);
456571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): / is a valid name, and it might be an abreviation, so "" should not be like NULL
457571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // make this distiontion in generator, and remove "" from condition
458571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (ret != NULL || abr == NULL || *abr == '\0') {
459571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return ret;
460571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
461571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return get(abr);
462571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
463571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
464571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfObject* get(const char* key, const char* abr) {
465571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkPdfObject* ret = get(key);
466571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): / is a valid name, and it might be an abreviation, so "" should not be like NULL
467571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // make this distiontion in generator, and remove "" from condition
468571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (ret != NULL || abr == NULL || *abr == '\0') {
469571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return ret;
470571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
471571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return get(abr);
472571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
473571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
474571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfDictionary* asDictionary() {
475571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isDictionary());
476571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isDictionary()) {
477571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
478571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
479571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (SkPdfDictionary*) this;
480571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
481571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
482571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const SkPdfDictionary* asDictionary() const {
483571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isDictionary());
484571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isDictionary()) {
485571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
486571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
487571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (SkPdfDictionary*) this;
488571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
489571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
490571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
491571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isReference() const {
492571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kReference_PdfObjectType;
493571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
494571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
495571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isBoolean() const {
496571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kBoolean_PdfObjectType;
497571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
498571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
499571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isInteger() const {
500571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kInteger_PdfObjectType;
501571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
502571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
503571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isReal() const {
504571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kReal_PdfObjectType;
505571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
506571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.compublic:
507571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isNumber() const {
508571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kInteger_PdfObjectType || fObjectType == kReal_PdfObjectType;
509571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
510571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
511571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isKeywordReference() const {
512571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kKeyword_PdfObjectType && fStr.fBytes == 1 && fStr.fBuffer[0] == 'R';
513571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
514571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
515571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isKeyword() const {
516571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kKeyword_PdfObjectType;
517571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
518571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
519571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isName() const {
520571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kName_PdfObjectType;
521571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
522571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
523571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isArray() const {
524571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kArray_PdfObjectType;
525571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
526571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
527571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isDate() const {
528571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType;
529571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
530571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
531571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isDictionary() const {
532571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kDictionary_PdfObjectType;
533571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
534571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
535571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isFunction() const {
536571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return false;  // NYI
537571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
538571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
539571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isRectangle() const {
540571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kArray_PdfObjectType && fArray->count() == 4; // NYI + and elems are numbers
541571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
542571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
543571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): has stream .. or is stream ... TBD
544571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool hasStream() const {
545571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return isDictionary() && fStr.fBuffer != NULL;
546571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
547571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
548571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): has stream .. or is stream ... TBD
549571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const SkPdfStream* getStream() const {
550571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return hasStream() ? (const SkPdfStream*)this : NULL;
551571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
552571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
553571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfStream* getStream() {
554571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return hasStream() ? (SkPdfStream*)this : NULL;
555571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
556571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
557571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isAnyString() const {
558571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType;
559571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
560571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
561571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isMatrix() const {
562571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kArray_PdfObjectType && fArray->count() == 6; // NYI + and elems are numbers
563571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
564571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
565571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline int64_t intValue() const {
566571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kInteger_PdfObjectType);
567571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
568571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kInteger_PdfObjectType) {
569571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
570571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return 0;
571571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
572571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fIntegerValue;
573571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
574571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
575571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline double realValue() const {
576571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kReal_PdfObjectType);
577571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
578571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kReal_PdfObjectType) {
579571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
580571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return 0;
581571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
582571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fRealValue;
583571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
584571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.compublic:
585571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline double numberValue() const {
586571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isNumber());
587571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
588571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isNumber()) {
589571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
590571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return 0;
591571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
592571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kReal_PdfObjectType ? fRealValue : fIntegerValue;
593571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
594571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
595571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    int referenceId() const {
596571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kReference_PdfObjectType);
597571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fRef.fId;
598571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
599571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
600571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    int referenceGeneration() const {
601571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kReference_PdfObjectType);
602571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fRef.fGen;
603571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
604571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
605571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline const char* nameValue() const {
606571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kName_PdfObjectType);
607571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
608571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kName_PdfObjectType) {
609571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
610571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return "";
611571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
612571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (const char*)fStr.fBuffer;
613571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
614571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
615571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline const char* stringValue() const {
616571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType);
617571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
618571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_PdfObjectType) {
619571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
620571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return "";
621571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
622571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (const char*)fStr.fBuffer;
623571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
624571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
625571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): nameValue2 and stringValue2 are used to make code generation easy,
626571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // but it is not a performat way to do it, since it will create an extra copy
627571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // remove these functions and make code generated faster
628571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline std::string nameValue2() const {
629571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kName_PdfObjectType);
630571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
631571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kName_PdfObjectType) {
632571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
633571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return "";
634571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
635571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (const char*)fStr.fBuffer;
636571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
637571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
638571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline std::string stringValue2() const {
639571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType);
640571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
641571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_PdfObjectType) {
642571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
643571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return "";
644571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
645571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (const char*)fStr.fBuffer;
646571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
647571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
648571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline bool boolValue() const {
649571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kBoolean_PdfObjectType);
650571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
651571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType == kBoolean_PdfObjectType) {
652571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
653571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
654571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
655571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fBooleanValue;
656571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
657571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
658571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkRect rectangleValue() const {
659571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isRectangle());
660571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isRectangle()) {
661571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return SkRect::MakeEmpty();
662571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
663571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
664571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        double array[4];
665571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        for (int i = 0; i < 4; i++) {
666571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): version where we could resolve references?
667571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            const SkPdfObject* elem = objAtAIndex(i);
668571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            if (elem == NULL || !elem->isNumber()) {
669571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report error
670571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return SkRect::MakeEmpty();
671571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            }
672571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            array[i] = elem->numberValue();
673571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
674571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
675571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return SkRect::MakeLTRB(SkDoubleToScalar(array[0]),
676571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                                SkDoubleToScalar(array[1]),
677571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                                SkDoubleToScalar(array[2]),
678571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                                SkDoubleToScalar(array[3]));
679571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
680571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
681571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkMatrix matrixValue() const {
682571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isMatrix());
683571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isMatrix()) {
684571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return SkMatrix::I();
685571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
686571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
687571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        double array[6];
688571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        for (int i = 0; i < 6; i++) {
689571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): version where we could resolve references?
690571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            const SkPdfObject* elem = objAtAIndex(i);
691571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            if (elem == NULL || !elem->isNumber()) {
692571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report error
693571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return SkMatrix::I();
694571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            }
695571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            array[i] = elem->numberValue();
696571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
697571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
698571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return SkMatrixFromPdfMatrix(array);
699571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
700571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
701571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool filterStream(SkPdfAllocator* allocator);
702571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
703571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
704571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool GetFilteredStreamRef(unsigned char** buffer, size_t* len, SkPdfAllocator* allocator) {
705571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): add params that couls let the last filter in place if it is jpeg or png to fast load images
706571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!hasStream()) {
707571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
708571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
709571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
710571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        filterStream(allocator);
711571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
712571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (buffer) {
713571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            *buffer = fStr.fBuffer;
714571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
715571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
716571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (len) {
717571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            *len = fStr.fBytes >> 1;  // last bit
718571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
719571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
720571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
721571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
722571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
723571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isStreamFiltered() const {
724571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return hasStream() && ((fStr.fBytes & 1) == kFilteredStreamBit);
725571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
726571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
727571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool GetUnfilteredStreamRef(unsigned char** buffer, size_t* len) const {
728571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (isStreamFiltered()) {
729571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
730571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
731571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
732571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!hasStream()) {
733571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
734571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
735571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
736571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (buffer) {
737571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            *buffer = fStr.fBuffer;
738571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
739571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
740571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (len) {
741571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            *len = fStr.fBytes >> 1;  // remove slast bit
742571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
743571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
744571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
745571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
746571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
747571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool addStream(unsigned char* buffer, size_t len) {
748571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(!hasStream());
749571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isDictionary());
750571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
751571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isDictionary() || hasStream()) {
752571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
753571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
754571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
755571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fStr.fBuffer = buffer;
756571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fStr.fBytes = (len << 2) + kUnfilteredStreamBit;
757571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
758571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
759571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
760571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
761571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkString toString() {
762571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkString str;
763571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
764571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kInvalid_PdfObjectType:
765571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.append("Invalid");
766571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
767571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
768571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kBoolean_PdfObjectType:
769571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.appendf("Boolean: %s", fBooleanValue ? "true" : "false");
770571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
771571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
772571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kInteger_PdfObjectType:
773571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.appendf("Integer: %i", (int)fIntegerValue);
774571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
775571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
776571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kReal_PdfObjectType:
777571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.appendf("Real: %f", fRealValue);
778571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
779571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
780571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kString_PdfObjectType:
781571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.appendf("String, len() = %u: ", (unsigned int)fStr.fBytes);
782571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.append((const char*)fStr.fBuffer, fStr.fBytes);
783571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
784571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
785571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kHexString_PdfObjectType:
786571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.appendf("HexString, len() = %u: ", (unsigned int)fStr.fBytes);
787571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.append((const char*)fStr.fBuffer, fStr.fBytes);
788571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
789571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
790571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kName_PdfObjectType:
791571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.appendf("Name, len() = %u: ", (unsigned int)fStr.fBytes);
792571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.append((const char*)fStr.fBuffer, fStr.fBytes);
793571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
794571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
795571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kKeyword_PdfObjectType:
796571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.appendf("Keyword, len() = %u: ", (unsigned int)fStr.fBytes);
797571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.append((const char*)fStr.fBuffer, fStr.fBytes);
798571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
799571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
800571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kArray_PdfObjectType:
801571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.append("Array, size() = %i [", size());
802571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                for (unsigned int i = 0; i < size(); i++) {
803571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                    str.append(objAtAIndex(i)->toString());
804571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                }
805571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.append("]");
806571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
807571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
808571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kDictionary_PdfObjectType:
809571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): NYI
810571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.append("Dictionary: NYI");
811571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                if (hasStream()) {
812571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                    str.append(" HAS_STREAM");
813571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                }
814571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
815571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
816571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kNull_PdfObjectType:
817571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str = "NULL";
818571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
819571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
820571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kReference_PdfObjectType:
821571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.appendf("Reference: %i %i", fRef.fId, fRef.fGen);
822571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
823571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
824571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kUndefined_PdfObjectType:
825571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str = "Undefined";
826571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
827571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
828571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
829571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str = "Internal Error Object Type";
830571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
831571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
832571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
833571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return str;
834571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
835571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
836571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
837571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeStringCore(unsigned char* start, SkPdfObject* obj, ObjectType type) {
838571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, type);
839571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
840571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
841571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeStringCore(unsigned char* start, unsigned char* end, SkPdfObject* obj, ObjectType type) {
842571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, type);
843571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
844571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
845571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    static void makeStringCore(unsigned char* start, size_t bytes, SkPdfObject* obj, ObjectType type) {
846571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
847571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
848571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = type;
849571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBuffer = start;
850571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBytes = bytes;
851571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
852571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
853571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool applyFilter(const char* name, SkPdfAllocator* allocator);
854571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool applyFlateDecodeFilter(SkPdfAllocator* allocator);
855571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool applyDCTDecodeFilter(SkPdfAllocator* allocator);
856571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com};
857571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
858571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfStream : public SkPdfObject {};
859571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfArray : public SkPdfObject {};
860571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfString : public SkPdfObject {};
861571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfHexString : public SkPdfObject {};
862571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfInteger : public SkPdfObject {};
863571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfReal : public SkPdfObject {};
864571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfNumber : public SkPdfObject {};
865571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
866571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#endif  // EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_
867