SkPdfNativeObject.h revision 063d7072ef45971c17045721626b3f0cd052b3b9
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>
6063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com#include "SkString.h"
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"
153aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com#include "SkPdfUtils.h"
163aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com
173aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com#include "SkPdfNativeTokenizer.h"
18571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
19571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfDictionary;
20571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfStream;
21571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfAllocator;
22571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
23571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com// TODO(edisonn): macro it and move it to utils
24571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comSkMatrix SkMatrixFromPdfMatrix(double array[6]);
25571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
26571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
27571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kFilteredStreamBit 0
28571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kUnfilteredStreamBit 1
292ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com#define kOwnedStreamBit 2
30571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
313aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfNativeObject {
32571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com public:
33571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com     enum ObjectType {
34571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kInvalid_PdfObjectType,
35571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
36571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kBoolean_PdfObjectType,
37571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kInteger_PdfObjectType,
38571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kReal_PdfObjectType,
39571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kString_PdfObjectType,
40571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kHexString_PdfObjectType,
41571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kName_PdfObjectType,
42571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kKeyword_PdfObjectType,
43571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         //kStream_PdfObjectType,  //  attached to a Dictionary
44571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kArray_PdfObjectType,
45571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kDictionary_PdfObjectType,
46571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kNull_PdfObjectType,
47571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
48571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         // TODO(edisonn): after the pdf has been loaded completely, resolve all references
49571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         // try the same thing with delayed loaded ...
50571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kReference_PdfObjectType,
51571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
52571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kUndefined_PdfObjectType,  // per 1.4 spec, if the same key appear twice in the dictionary, the value is undefined
53571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com     };
54571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
55b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com     enum DataType {
56b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com         kEmpty_Data,
57b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com         kFont_Data,
58b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com         kBitmap_Data,
59b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com     };
60b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
61571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
62063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    // TODO(edisonn): assert reset operations while in rendering!
63063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    uint32_t fInRendering : 1;
64063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    uint32_t fUnused : 31;
65063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com
66063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com
67571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    struct Reference {
68571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        unsigned int fId;
69571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        unsigned int fGen;
70571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    };
71571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
72571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): add stream start, stream end, where stream is weither the file
73571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // or decoded/filtered pdf stream
74571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
75571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): add warning/report per object
76571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): add flag fUsed, to be used once the parsing is complete,
77571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // so we could show what parts have been proccessed, ignored, or generated errors
78571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
79571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    ObjectType fObjectType;
80571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
81571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    union {
82571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        bool fBooleanValue;
83571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        int64_t fIntegerValue;
84571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): double, float? typedefed
85571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        double fRealValue;
86571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        NotOwnedString fStr;
87571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
88571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@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
893aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkTDArray<SkPdfNativeObject*>* fArray;
90571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        Reference fRef;
91571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    };
923aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkTDict<SkPdfNativeObject*>* fMap;
93b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
94b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    // TODO(edisonn): rename data with cache
95571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    void* fData;
96b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    DataType fDataType;
97571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
98571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
99571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.compublic:
100571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
101063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    SkPdfNativeObject() : fInRendering(0), fObjectType(kInvalid_PdfObjectType), fMap(NULL), fData(NULL), fDataType(kEmpty_Data) {}
102b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
103063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    bool inRendering() const { return fInRendering != 0; }
104063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    void startRendering() {fInRendering = 1;}
105063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    void doneRendering() {fInRendering = 0;}
106b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
107b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    inline bool hasData(DataType type) {
108b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        return type == fDataType;
109b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    }
110571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
111b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    inline void* data(DataType type) {
112b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        return type == fDataType ? fData : NULL;
113571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
114571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
115b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    inline void setData(void* data, DataType type) {
116b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        releaseData();
117b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        fDataType = type;
118571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fData = data;
119571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
120571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
121b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    void releaseData();
122b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
1233aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com//    ~SkPdfNativeObject() {
124222382b30a176db9d9044d9df1ae14e0fbe27181edisonn@google.com//        //reset();  must be called manually!
125222382b30a176db9d9044d9df1ae14e0fbe27181edisonn@google.com//    }
126571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
127571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    void reset() {
128571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
129571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kArray_PdfObjectType:
130571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                delete fArray;
131571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
132571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
133571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kDictionary_PdfObjectType:
134571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                delete fMap;
1352ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                if (isStreamOwned()) {
1362ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                    delete[] fStr.fBuffer;
1372ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                    fStr.fBuffer = NULL;
1382ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                    fStr.fBytes = 0;
1392ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                }
140571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
141571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
142571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
143571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
144571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
145571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fObjectType = kInvalid_PdfObjectType;
146b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        releaseData();
147571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
148571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
149571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    ObjectType type() { return fObjectType; }
150571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
151571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const char* c_str() const {
152571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
153571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kString_PdfObjectType:
154571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kHexString_PdfObjectType:
155571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kKeyword_PdfObjectType:
156276fed9e0ae2e4457efd61eeb14738040feb65f1edisonn@google.com            case kName_PdfObjectType:
157571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return (const char*)fStr.fBuffer;
158571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
159571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
160571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report/warning
161571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return NULL;
162571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
163571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
164571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
165e878e726bd1c16a0d177543471e071c7338193f4edisonn@google.com    size_t lenstr() const {
166571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
167571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kString_PdfObjectType:
168571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kHexString_PdfObjectType:
169571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kKeyword_PdfObjectType:
170276fed9e0ae2e4457efd61eeb14738040feb65f1edisonn@google.com            case kName_PdfObjectType:
171571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return fStr.fBytes;
172571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
173571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
174571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report/warning
175571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return 0;
176571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
177571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
178571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
179571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
180571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
181571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfDate& dateValue() const {
182571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfDate nyi;
183571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
184571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
185571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
186571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
187571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfFunction& functionValue() const {
188571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfFunction nyi;
189571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
190571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
191571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
192571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
193571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfFileSpec& fileSpecValue() const {
194571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfFileSpec nyi;
195571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
196571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
197571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
198571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
199571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfTree& treeValue() const {
200571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfTree nyi;
201571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
202571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
203571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2043aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeBoolean(bool value, SkPdfNativeObject* obj) {
205571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
206571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
207571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kBoolean_PdfObjectType;
208571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fBooleanValue = value;
209571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
210571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2113aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static SkPdfNativeObject makeBoolean(bool value) {
2123aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject obj;
213571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj.fObjectType = kBoolean_PdfObjectType;
214571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj.fBooleanValue = value;
215571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return obj;
216571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
217571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2183aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeInteger(int64_t value, SkPdfNativeObject* obj) {
219571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
220571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
221571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kInteger_PdfObjectType;
222571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fIntegerValue = value;
223571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
224571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2253aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeReal(double value, SkPdfNativeObject* obj) {
226571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
227571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
228571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kReal_PdfObjectType;
229571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fRealValue = value;
230571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
231571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2323aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeNull(SkPdfNativeObject* obj) {
233571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
234571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
235571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kNull_PdfObjectType;
236571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
237571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2383aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static SkPdfNativeObject makeNull() {
2393aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject obj;
240571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj.fObjectType = kNull_PdfObjectType;
241571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return obj;
242571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
243571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2443aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static SkPdfNativeObject kNull;
245571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2463aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeNumeric(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj) {
247571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
248571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
249571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): NYI properly
250571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // if has dot (impl), or exceeds max int, is real, otherwise is int
251571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        bool isInt = true;
2522ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        for (const unsigned char* current = start; current < end; current++) {
253571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            if (*current == '.') {
254571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                isInt = false;
255571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
256571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            }
257571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report parse issue with numbers like "24asdasd123"
258571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
259571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (isInt) {
260571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            makeInteger(atol((const char*)start), obj);
261571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        } else {
262571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            makeReal(atof((const char*)start), obj);
263571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
264571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
265571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2663aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeReference(unsigned int id, unsigned int gen, SkPdfNativeObject* obj) {
267571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
268571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
269571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kReference_PdfObjectType;
270571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fRef.fId = id;
271571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fRef.fGen = gen;
272571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
273571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
274571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2753aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeString(const unsigned char* start, SkPdfNativeObject* obj) {
276571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kString_PdfObjectType);
277571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
278571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2793aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeString(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj) {
280571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, kString_PdfObjectType);
281571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
282571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2833aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeString(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj) {
284571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, bytes, obj, kString_PdfObjectType);
285571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
286571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
287571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2883aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeHexString(const unsigned char* start, SkPdfNativeObject* obj) {
289571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kHexString_PdfObjectType);
290571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
291571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2923aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeHexString(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj) {
293571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, kHexString_PdfObjectType);
294571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
295571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2963aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeHexString(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj) {
297571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, bytes, obj, kHexString_PdfObjectType);
298571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
299571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
300571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3013aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeName(const unsigned char* start, SkPdfNativeObject* obj) {
302571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kName_PdfObjectType);
303571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
304571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3053aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeName(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj) {
306571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, kName_PdfObjectType);
307571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
308571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3093aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeName(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj) {
310571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, bytes, obj, kName_PdfObjectType);
311571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
312571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
313571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3143aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeKeyword(const unsigned char* start, SkPdfNativeObject* obj) {
315571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kKeyword_PdfObjectType);
316571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
317571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3183aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeKeyword(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj) {
319571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, kKeyword_PdfObjectType);
320571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
321571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3223aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeKeyword(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj) {
323571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, bytes, obj, kKeyword_PdfObjectType);
324571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
325571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
326571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
327571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
328571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): make the functions to return SkPdfArray, move these functions in SkPdfArray
3293aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeEmptyArray(SkPdfNativeObject* obj) {
330571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
331571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
332571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kArray_PdfObjectType;
3333aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        obj->fArray = new SkTDArray<SkPdfNativeObject*>();
334571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // return (SkPdfArray*)obj;
335571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
336571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3373aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    bool appendInArray(SkPdfNativeObject* obj) {
338571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
339571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kArray_PdfObjectType) {
340571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
341571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
342571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
343571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
344571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fArray->push(obj);
345571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
346571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
347571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
348571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    size_t size() const {
349571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
350571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
351571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fArray->count();
352571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
353571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3543aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* objAtAIndex(int i) {
355571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
356571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
357571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
358571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
359571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3603aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* removeLastInArray() {
361571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
362571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3633aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject* ret = NULL;
364571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fArray->pop(&ret);
365571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
366571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return ret;
367571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
368571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
369571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3703aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* objAtAIndex(int i) const {
371571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
372571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
373571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
374571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
375571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3763aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* operator[](int i) {
377571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
378571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
379571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
380571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
381571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3823aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* operator[](int i) const {
383571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
384571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
385571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
386571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
387571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
388571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
389571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): make the functions to return SkPdfDictionary, move these functions in SkPdfDictionary
3903aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeEmptyDictionary(SkPdfNativeObject* obj) {
391571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
392571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
393571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kDictionary_PdfObjectType;
3943aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        obj->fMap = new SkTDict<SkPdfNativeObject*>(1);
395571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBuffer = NULL;
396571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBytes = 0;
397571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
398571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
399571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): get all the possible names from spec, and compute a hash function
400571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // that would create no overlaps in the same dictionary
401571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // or build a tree of chars that when followed goes to a unique id/index/hash
402571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): generate constants like kDictFoo, kNameDict_name
403571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // which will be used in code
404571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // add function SkPdfFastNameKey key(const char* key);
405571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): setting the same key twike, will make the value undefined!
4063aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    bool set(const SkPdfNativeObject* key, SkPdfNativeObject* value) {
407571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
408571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fObjectType == kName_PdfObjectType);
409571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
410571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
411571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
412571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
413571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
414571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4152ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        //// we rewrite all delimiters and white spaces with '\0', so we expect the end of name to be '\0'
4162ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
417571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
418d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return set(key->fStr.fBuffer, key->fStr.fBytes, value);
419571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
420571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4213aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    bool set(const char* key, SkPdfNativeObject* value) {
422d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return set((const unsigned char*)key, strlen(key), value);
423d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com    }
424d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com
4253aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    bool set(const unsigned char* key, size_t len, SkPdfNativeObject* value) {
426571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
427571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
428571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kDictionary_PdfObjectType) {
429571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
430571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
431571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
432571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
433d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return fMap->set((const char*)key, len, value);
434571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
435571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4363aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* get(const SkPdfNativeObject* key) {
437571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
438571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fObjectType == kName_PdfObjectType);
439571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
440571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
441571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
4423fc482620e8af9442f588e3bf364e198c41ba913edisonn@google.com            return NULL;
443571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
444571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4452ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
446571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
447d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return get(key->fStr.fBuffer, key->fStr.fBytes);
448571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
449571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4503aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* get(const char* key) {
451d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return get((const unsigned char*)key, strlen(key));
452d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com    }
453d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com
4543aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* get(const unsigned char* key, size_t len) {
455571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
456571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key);
457571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kDictionary_PdfObjectType) {
458571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
459571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
460571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
4613aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject* ret = NULL;
462d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        fMap->find((const char*)key, len, &ret);
4639a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
4649a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com#ifdef PDF_TRACE
4659a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        SkString _key;
4669a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        _key.append((const char*)key, len);
4679a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        printf("\nget(/%s) = %s\n", _key.c_str(), ret ? ret->toString(0, len + 9).c_str() : "_NOT_FOUND");
4689a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com#endif
4699a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
470571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return ret;
471571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
472571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4733aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* get(const SkPdfNativeObject* key) const {
474571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
475571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fObjectType == kName_PdfObjectType);
476571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
477571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
478571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
4793fc482620e8af9442f588e3bf364e198c41ba913edisonn@google.com            return NULL;
480571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
481571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4822ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
483571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
484d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return get(key->fStr.fBuffer, key->fStr.fBytes);
485571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
486571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4873aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* get(const char* key) const {
488d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return get((const unsigned char*)key, strlen(key));
489d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com    }
490d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com
4913aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* get(const unsigned char* key, size_t len) const {
492571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
493571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key);
494571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kDictionary_PdfObjectType) {
495571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
496571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
497571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
4983aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject* ret = NULL;
499d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        fMap->find((const char*)key, len, &ret);
5009a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
5019a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com#ifdef PDF_TRACE
5029a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        SkString _key;
5039a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        _key.append((const char*)key, len);
5049a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        printf("\nget(/%s) = %s\n", _key.c_str(), ret ? ret->toString(0, len + 9).c_str() : "_NOT_FOUND");
5059a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com#endif
5069a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
507571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return ret;
508571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
509571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5103aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* get(const char* key, const char* abr) const {
5113aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        const SkPdfNativeObject* ret = get(key);
512571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): / is a valid name, and it might be an abreviation, so "" should not be like NULL
513571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // make this distiontion in generator, and remove "" from condition
514571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (ret != NULL || abr == NULL || *abr == '\0') {
515571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return ret;
516571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
517571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return get(abr);
518571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
519571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5203aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* get(const char* key, const char* abr) {
5213aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject* ret = get(key);
522571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): / is a valid name, and it might be an abreviation, so "" should not be like NULL
523571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // make this distiontion in generator, and remove "" from condition
524571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (ret != NULL || abr == NULL || *abr == '\0') {
525571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return ret;
526571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
527571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return get(abr);
528571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
529571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
530571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfDictionary* asDictionary() {
531571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isDictionary());
532571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isDictionary()) {
533571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
534571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
535571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (SkPdfDictionary*) this;
536571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
537571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
538571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const SkPdfDictionary* asDictionary() const {
539571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isDictionary());
540571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isDictionary()) {
541571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
542571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
543571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (SkPdfDictionary*) this;
544571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
545571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
546571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
547571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isReference() const {
548571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kReference_PdfObjectType;
549571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
550571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
551571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isBoolean() const {
552571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kBoolean_PdfObjectType;
553571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
554571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
555571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isInteger() const {
556571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kInteger_PdfObjectType;
557571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
558571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
559571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isReal() const {
560571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kReal_PdfObjectType;
561571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
562571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.compublic:
563571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isNumber() const {
564571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kInteger_PdfObjectType || fObjectType == kReal_PdfObjectType;
565571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
566571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
567571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isKeywordReference() const {
568571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kKeyword_PdfObjectType && fStr.fBytes == 1 && fStr.fBuffer[0] == 'R';
569571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
570571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
571571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isKeyword() const {
572571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kKeyword_PdfObjectType;
573571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
574571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5754ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com    bool isKeyword(const char* keyword) const {
5764ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        if (!isKeyword()) {
5774ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com            return false;
5784ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        }
5794ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com
5804ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        if (strlen(keyword) != fStr.fBytes) {
5814ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com            return false;
5824ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        }
5834ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com
5844ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        if (strncmp(keyword, (const char*)fStr.fBuffer, fStr.fBytes) != 0) {
5854ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com            return false;
5864ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        }
5874ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com
5884ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        return true;
5894ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com    }
5904ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com
591571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isName() const {
592571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kName_PdfObjectType;
593571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
594571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
59578b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com    bool isName(const char* name) const {
59678b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com        return fObjectType == kName_PdfObjectType && fStr.fBytes == strlen(name) && strncmp((const char*)fStr.fBuffer, name, fStr.fBytes) == 0;
59778b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com    }
59878b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com
599571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isArray() const {
600571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kArray_PdfObjectType;
601571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
602571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
603571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isDate() const {
604571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType;
605571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
606571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
607571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isDictionary() const {
608571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kDictionary_PdfObjectType;
609571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
610571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
611571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isFunction() const {
612571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return false;  // NYI
613571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
614571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
615571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isRectangle() const {
616571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kArray_PdfObjectType && fArray->count() == 4; // NYI + and elems are numbers
617571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
618571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
619571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): has stream .. or is stream ... TBD
620571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool hasStream() const {
621571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return isDictionary() && fStr.fBuffer != NULL;
622571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
623571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
624571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): has stream .. or is stream ... TBD
625571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const SkPdfStream* getStream() const {
626571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return hasStream() ? (const SkPdfStream*)this : NULL;
627571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
628571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
629571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfStream* getStream() {
630571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return hasStream() ? (SkPdfStream*)this : NULL;
631571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
632571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
633571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isAnyString() const {
634571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType;
635571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
636571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
637b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    bool isHexString() const {
638b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        return fObjectType == kHexString_PdfObjectType;
639b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    }
640b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
641571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isMatrix() const {
642571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kArray_PdfObjectType && fArray->count() == 6; // NYI + and elems are numbers
643571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
644571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
645571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline int64_t intValue() const {
646571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kInteger_PdfObjectType);
647571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
648571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kInteger_PdfObjectType) {
649571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
650571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return 0;
651571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
652571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fIntegerValue;
653571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
654571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
655571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline double realValue() const {
656571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kReal_PdfObjectType);
657571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
658571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kReal_PdfObjectType) {
659571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
660571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return 0;
661571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
662571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fRealValue;
663571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
664571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.compublic:
665571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline double numberValue() const {
666571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isNumber());
667571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
668571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isNumber()) {
669571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
670571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return 0;
671571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
672571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kReal_PdfObjectType ? fRealValue : fIntegerValue;
673571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
674571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
675a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com    inline SkScalar scalarValue() const {
676a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com        SkASSERT(isNumber());
677a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com
678a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com        if (!isNumber()) {
679a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com            // TODO(edisonn): log err
680a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com            return SkIntToScalar(0);
681a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com        }
682a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com        return fObjectType == kReal_PdfObjectType ? SkDoubleToScalar(fRealValue) :
683a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com                                                    SkIntToScalar(fIntegerValue);
684a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com    }
685a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com
686571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    int referenceId() const {
687571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kReference_PdfObjectType);
688571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fRef.fId;
689571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
690571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
691571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    int referenceGeneration() const {
692571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kReference_PdfObjectType);
693571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fRef.fGen;
694571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
695571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
696571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline const char* nameValue() const {
697571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kName_PdfObjectType);
698571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
699571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kName_PdfObjectType) {
700571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
701571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return "";
702571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
703571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (const char*)fStr.fBuffer;
704571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
705571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
706571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline const char* stringValue() const {
707571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType);
708571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
709571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_PdfObjectType) {
710571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
711571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return "";
712571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
713571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (const char*)fStr.fBuffer;
714571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
715571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
7162ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    inline NotOwnedString strRef() {
7172ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        switch (fObjectType) {
7182ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            case kString_PdfObjectType:
7192ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            case kHexString_PdfObjectType:
7202ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            case kKeyword_PdfObjectType:
721276fed9e0ae2e4457efd61eeb14738040feb65f1edisonn@google.com            case kName_PdfObjectType:
7222ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                return fStr;
7232ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com
7242ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            default:
7252ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                // TODO(edisonn): report/warning
7262ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                return NotOwnedString();
7272ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        }
7282ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    }
7292ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com
730571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): nameValue2 and stringValue2 are used to make code generation easy,
731571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // but it is not a performat way to do it, since it will create an extra copy
732571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // remove these functions and make code generated faster
733063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    inline SkString nameValue2() const {
734571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kName_PdfObjectType);
735571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
736571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kName_PdfObjectType) {
737571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
738063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com            return SkString();
739571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
740063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com        return SkString((const char*)fStr.fBuffer, fStr.fBytes);
741571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
742571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
743063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    inline SkString stringValue2() const {
744571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType);
745571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
746571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_PdfObjectType) {
747571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
748063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com            return SkString();
749571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
750063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com        return SkString((const char*)fStr.fBuffer, fStr.fBytes);
751571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
752571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
753571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline bool boolValue() const {
754571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kBoolean_PdfObjectType);
755571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
756f111a4b6855277bba8dac84cce7ccfa1b3f25d7cedisonn@google.com        if (fObjectType != kBoolean_PdfObjectType) {
757571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
758571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
759571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
760571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fBooleanValue;
761571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
762571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
763571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkRect rectangleValue() const {
764571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isRectangle());
765571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isRectangle()) {
766571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return SkRect::MakeEmpty();
767571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
768571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
769571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        double array[4];
770571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        for (int i = 0; i < 4; i++) {
771571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): version where we could resolve references?
7723aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            const SkPdfNativeObject* elem = objAtAIndex(i);
773571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            if (elem == NULL || !elem->isNumber()) {
774571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report error
775571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return SkRect::MakeEmpty();
776571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            }
777571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            array[i] = elem->numberValue();
778571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
779571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
780571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return SkRect::MakeLTRB(SkDoubleToScalar(array[0]),
781571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                                SkDoubleToScalar(array[1]),
782571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                                SkDoubleToScalar(array[2]),
783571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                                SkDoubleToScalar(array[3]));
784571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
785571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
786571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkMatrix matrixValue() const {
787571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isMatrix());
788571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isMatrix()) {
789571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return SkMatrix::I();
790571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
791571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
792571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        double array[6];
793571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        for (int i = 0; i < 6; i++) {
794571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): version where we could resolve references?
7953aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            const SkPdfNativeObject* elem = objAtAIndex(i);
796571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            if (elem == NULL || !elem->isNumber()) {
797571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report error
798571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return SkMatrix::I();
799571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            }
800571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            array[i] = elem->numberValue();
801571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
802571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
803571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return SkMatrixFromPdfMatrix(array);
804571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
805571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
8062ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool filterStream();
807571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
808571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
8092ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool GetFilteredStreamRef(unsigned char const** buffer, size_t* len) {
810571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): add params that couls let the last filter in place if it is jpeg or png to fast load images
811571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!hasStream()) {
812571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
813571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
814571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
8152ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        filterStream();
816571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
817571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (buffer) {
818571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            *buffer = fStr.fBuffer;
819571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
820571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
821571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (len) {
8222ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            *len = fStr.fBytes >> 2;  // last 2 bits
823571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
824571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
825571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
826571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
827571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
828571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isStreamFiltered() const {
829571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return hasStream() && ((fStr.fBytes & 1) == kFilteredStreamBit);
830571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
831571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
8322ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool isStreamOwned() const {
8332ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        return hasStream() && ((fStr.fBytes & 2) == kOwnedStreamBit);
8342ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    }
8352ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com
8362ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool GetUnfilteredStreamRef(unsigned char const** buffer, size_t* len) const {
837571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (isStreamFiltered()) {
838571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
839571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
840571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
841571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!hasStream()) {
842571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
843571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
844571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
845571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (buffer) {
846571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            *buffer = fStr.fBuffer;
847571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
848571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
849571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (len) {
8502ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            *len = fStr.fBytes >> 2;  // remove last 2 bits
851571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
852571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
853571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
854571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
855571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
8562ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool addStream(const unsigned char* buffer, size_t len) {
857571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(!hasStream());
858571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isDictionary());
859571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
860571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isDictionary() || hasStream()) {
861571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
862571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
863571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
864571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fStr.fBuffer = buffer;
865571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fStr.fBytes = (len << 2) + kUnfilteredStreamBit;
866571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
867571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
868571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
869571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
870276fed9e0ae2e4457efd61eeb14738040feb65f1edisonn@google.com    static void appendSpaces(SkString* str, int level) {
8719a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        for (int i = 0 ; i < level; i++) {
8729a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com            str->append(" ");
8739a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        }
8749a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com    }
8759a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
8763aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void append(SkString* str, const char* data, size_t len, const char* prefix = "\\x") {
8773aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        for (unsigned int i = 0 ; i < len; i++) {
8783aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            if (data[i] == kNUL_PdfWhiteSpace) {
8793aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
8803aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("00");
8813aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else if (data[i] == kHT_PdfWhiteSpace) {
8823aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
8833aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("09");
8843aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else if (data[i] == kLF_PdfWhiteSpace) {
8853aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
8863aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("0A");
8873aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else if (data[i] == kFF_PdfWhiteSpace) {
8883aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
8893aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("0C");
8903aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else if (data[i] == kCR_PdfWhiteSpace) {
8913aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
8923aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("0D");
8933aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else {
8943aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(data + i, 1);
8953aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            }
8963aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        }
8973aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    }
8983aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com
899e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com    SkString toString(int firstRowLevel = 0, int level = 0) {
900571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkString str;
9019a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        appendSpaces(&str, firstRowLevel);
902571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
903571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kInvalid_PdfObjectType:
9049a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("__Invalid");
905571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
906571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
907571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kBoolean_PdfObjectType:
9089a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.appendf("%s", fBooleanValue ? "true" : "false");
909571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
910571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
911571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kInteger_PdfObjectType:
9129a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.appendf("%i", (int)fIntegerValue);
913571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
914571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
915571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kReal_PdfObjectType:
9169a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.appendf("%f", fRealValue);
917571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
918571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
919571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kString_PdfObjectType:
9209a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("\"");
9213aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                append(&str, (const char*)fStr.fBuffer, fStr.fBytes);
9229a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("\"");
923571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
924571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
925571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kHexString_PdfObjectType:
9269a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("<");
927b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                for (unsigned int i = 0 ; i < fStr.fBytes; i++) {
928b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                    str.appendf("%02x", (unsigned int)fStr.fBuffer[i]);
929b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                }
9309a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append(">");
931571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
932571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
933571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kName_PdfObjectType:
9349a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("/");
9353aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                append(&str, (const char*)fStr.fBuffer, fStr.fBytes, "#");
936571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
937571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
938571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kKeyword_PdfObjectType:
9393aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                append(&str, (const char*)fStr.fBuffer, fStr.fBytes);
940571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
941571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
942571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kArray_PdfObjectType:
9439a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("[\n");
944571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                for (unsigned int i = 0; i < size(); i++) {
9459a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    str.append(objAtAIndex(i)->toString(level + 1, level + 1));
9469a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    if (i < size() - 1) {
9479a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                        str.append(",");
9489a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    }
9499a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    str.append("\n");
950571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                }
9519a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                appendSpaces(&str, level);
952571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.append("]");
953571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
954571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
9559a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com            case kDictionary_PdfObjectType: {
9563aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                    SkTDict<SkPdfNativeObject*>::Iter iter(*fMap);
9573aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                    SkPdfNativeObject* obj = NULL;
9589a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    const char* key = NULL;
9599a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    str.append("<<\n");
9609a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    while ((key = iter.next(&obj)) != NULL) {
9619a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                        appendSpaces(&str, level + 2);
9629a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                        str.appendf("/%s %s\n", key, obj->toString(0, level + strlen(key) + 4).c_str());
9639a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    }
9649a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    appendSpaces(&str, level);
9659a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    str.append(">>");
9669a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    if (hasStream()) {
967e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        const unsigned char* stream = NULL;
968e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        size_t length = 0;
969e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        if (GetFilteredStreamRef(&stream, &length)) {
970b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                            str.append("stream\n");
9713aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                            append(&str, (const char*)stream, length > 256 ? 256 : length);
972b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                            str.append("\nendstream");
973e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        } else {
974e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                            str.append("stream STREAM_ERROR endstream");
975e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        }
9769a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    }
977571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                }
978571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
979571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
980571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kNull_PdfObjectType:
981571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str = "NULL";
982571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
983571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
984571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kReference_PdfObjectType:
9859a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.appendf("%i %i R", fRef.fId, fRef.fGen);
986571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
987571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
988571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kUndefined_PdfObjectType:
989571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str = "Undefined";
990571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
991571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
992571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
9939a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str = "Error";
994571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
995571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
996571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
997571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return str;
998571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
999571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1000571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
10013aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeStringCore(const unsigned char* start, SkPdfNativeObject* obj, ObjectType type) {
1002571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, type);
1003571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1004571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
10053aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeStringCore(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj, ObjectType type) {
1006571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, type);
1007571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1008571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
10093aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeStringCore(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj, ObjectType type) {
1010571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
1011571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1012571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = type;
1013571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBuffer = start;
1014571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBytes = bytes;
1015571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1016571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
10172ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool applyFilter(const char* name);
10182ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool applyFlateDecodeFilter();
10192ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool applyDCTDecodeFilter();
1020571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com};
1021571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
10223aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfStream : public SkPdfNativeObject {};
10233aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfArray : public SkPdfNativeObject {};
10243aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfString : public SkPdfNativeObject {};
10253aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfHexString : public SkPdfNativeObject {};
10263aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfInteger : public SkPdfNativeObject {};
10273aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfReal : public SkPdfNativeObject {};
10283aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfNumber : public SkPdfNativeObject {};
1029571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
10303aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfName : public SkPdfNativeObject {
10313aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfName() : SkPdfNativeObject() {
10323aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject::makeName((const unsigned char*)"", this);
103378b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com    }
103478b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.compublic:
10353aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfName(char* name) : SkPdfNativeObject() {
10362ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        this->makeName((const unsigned char*)name, this);
103778b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com    }
103878b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com};
103978b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com
1040571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#endif  // EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_
1041