SkPdfNativeObject.h revision 276fed9e0ae2e4457efd61eeb14738040feb65f1
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#ifndef EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_
263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman#define EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_
36c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
46c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include <stdint.h>
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner#include <string.h>
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner#include <string>
763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman#include "SkTDArray.h"
86c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkTDict.h"
96c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkRect.h"
106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkMatrix.h"
116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include "SkString.h"
1263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman
139a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson#include "SkPdfNYI.h"
149a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson#include "SkPdfConfig.h"
159a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson
169a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilsonclass SkPdfDictionary;
176c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeclass SkPdfStream;
186c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeclass SkPdfAllocator;
196c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer// TODO(edisonn): macro it and move it to utils
21551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid SpencerSkMatrix SkMatrixFromPdfMatrix(double array[6]);
22551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer
231f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer
246c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#define kFilteredStreamBit 0
256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#define kUnfilteredStreamBit 1
266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#define kOwnedStreamBit 2
276c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
286c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeclass SkPdfObject {
296c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke public:
306c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke     enum ObjectType {
316c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke         kInvalid_PdfObjectType,
32c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer
336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke         kBoolean_PdfObjectType,
34c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer         kInteger_PdfObjectType,
356c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke         kReal_PdfObjectType,
36620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke         kString_PdfObjectType,
37620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke         kHexString_PdfObjectType,
38c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer         kName_PdfObjectType,
39620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke         kKeyword_PdfObjectType,
40c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer         //kStream_PdfObjectType,  //  attached to a Dictionary
41620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke         kArray_PdfObjectType,
42c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer         kDictionary_PdfObjectType,
43620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke         kNull_PdfObjectType,
446c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
45757c1f9d87b516a1e3bc4cd678245b207ae9c559Brian Gaeke         // TODO(edisonn): after the pdf has been loaded completely, resolve all references
466c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke         // try the same thing with delayed loaded ...
479a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson         kReference_PdfObjectType,
489a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson
499a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson         kUndefined_PdfObjectType,  // per 1.4 spec, if the same key appear twice in the dictionary, the value is undefined
509a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson     };
519a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson
529a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilsonprivate:
539a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson    struct Reference {
549a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        unsigned int fId;
559a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        unsigned int fGen;
569a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson    };
579a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson
589a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson    // TODO(edisonn): add stream start, stream end, where stream is weither the file
599a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson    // or decoded/filtered pdf stream
609a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson
619a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson    // TODO(edisonn): add warning/report per object
626c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    // TODO(edisonn): add flag fUsed, to be used once the parsing is complete,
639a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson    // so we could show what parts have been proccessed, ignored, or generated errors
646c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
656c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    ObjectType fObjectType;
666c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
676c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    union {
686c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        bool fBooleanValue;
696c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        int64_t fIntegerValue;
706c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        // TODO(edisonn): double, float? typedefed
716c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        double fRealValue;
726c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        NotOwnedString fStr;
736c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
746c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        // TODO(edisonn): make sure the foorprint of fArray and fMap is small, otherwise, use pointers, or classes with up to 8 bytes in footprint
756c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        SkTDArray<SkPdfObject*>* fArray;
766c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        Reference fRef;
77fe4591bfc2b147c10d6a7b1a5af56454fb78daceStephen Wilson    };
78314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson    SkTDict<SkPdfObject*>* fMap;
796c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    void* fData;
809a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson
819a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson
826c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekepublic:
836c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
84620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke    SkPdfObject() : fObjectType(kInvalid_PdfObjectType), fMap(NULL), fData(NULL) {}
85620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke
86e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke    inline void* data() {
879a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        return fData;
88c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer    }
89c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer
90c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer    inline void setData(void* data) {
91620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke        fData = data;
92620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke    }
93620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke
94c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer//    ~SkPdfObject() {
95c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer//        //reset();  must be called manually!
96c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer//    }
97c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer
98c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer    void reset() {
99c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer        switch (fObjectType) {
100c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer            case kArray_PdfObjectType:
1019a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson                delete fArray;
1029a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson                break;
1039a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson
1049a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson            case kDictionary_PdfObjectType:
1059a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson                delete fMap;
106e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke                if (isStreamOwned()) {
107620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke                    delete[] fStr.fBuffer;
1086c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                    fStr.fBuffer = NULL;
1096c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                    fStr.fBytes = 0;
1106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                }
1116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                break;
1126c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
1136c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            default:
1146c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                break;
1156c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        }
1166c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        fObjectType = kInvalid_PdfObjectType;
1176c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    }
1186c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
1195af8f421b6412e52530608097e39d2602195629fDan Gohman    ObjectType type() { return fObjectType; }
1205af8f421b6412e52530608097e39d2602195629fDan Gohman
1215af8f421b6412e52530608097e39d2602195629fDan Gohman    const char* c_str() const {
1225af8f421b6412e52530608097e39d2602195629fDan Gohman        switch (fObjectType) {
1235af8f421b6412e52530608097e39d2602195629fDan Gohman            case kString_PdfObjectType:
1245af8f421b6412e52530608097e39d2602195629fDan Gohman            case kHexString_PdfObjectType:
1256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            case kKeyword_PdfObjectType:
1266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            case kName_PdfObjectType:
127fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer                return (const char*)fStr.fBuffer;
128fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
129fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer            default:
130fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer                // TODO(edisonn): report/warning
131fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer                return NULL;
132fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        }
133fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
134fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
135fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    size_t lenstr() const {
136fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        switch (fObjectType) {
137fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer            case kString_PdfObjectType:
138fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer            case kHexString_PdfObjectType:
139fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer            case kKeyword_PdfObjectType:
140fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer            case kName_PdfObjectType:
141fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer                return fStr.fBytes;
142fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
143fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer            default:
144fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer                // TODO(edisonn): report/warning
145fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer                return 0;
146fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        }
147fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
148fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
149fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
150fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    // TODO(edisonn): NYI
151fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    SkPdfDate& dateValue() const {
152fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        static SkPdfDate nyi;
153fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        return nyi;
154fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
155fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
156fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    // TODO(edisonn): NYI
157fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    SkPdfFunction& functionValue() const {
158fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        static SkPdfFunction nyi;
159fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        return nyi;
160fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
161fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
162fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    // TODO(edisonn): NYI
163fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    SkPdfFileSpec& fileSpecValue() const {
164fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        static SkPdfFileSpec nyi;
165fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        return nyi;
166fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
167fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
168fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    // TODO(edisonn): NYI
169fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    SkPdfTree& treeValue() const {
170fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        static SkPdfTree nyi;
171fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        return nyi;
172fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
173fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
174fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeBoolean(bool value, SkPdfObject* obj) {
175fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
176fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
177fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj->fObjectType = kBoolean_PdfObjectType;
178fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj->fBooleanValue = value;
179fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
180fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
181fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static SkPdfObject makeBoolean(bool value) {
182fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        SkPdfObject obj;
183fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj.fObjectType = kBoolean_PdfObjectType;
184fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj.fBooleanValue = value;
185fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        return obj;
186fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
187fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
188fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeInteger(int64_t value, SkPdfObject* obj) {
189fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
190fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
191fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj->fObjectType = kInteger_PdfObjectType;
192fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj->fIntegerValue = value;
193fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
194fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
195fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeReal(double value, SkPdfObject* obj) {
196fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
197fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
198fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj->fObjectType = kReal_PdfObjectType;
199fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj->fRealValue = value;
200fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
201fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
202fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeNull(SkPdfObject* obj) {
203fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
204fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
205fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj->fObjectType = kNull_PdfObjectType;
206fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
207fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
208fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static SkPdfObject makeNull() {
209fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        SkPdfObject obj;
210fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj.fObjectType = kNull_PdfObjectType;
211fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        return obj;
212fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
213fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
214fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static SkPdfObject kNull;
215fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
216fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeNumeric(const unsigned char* start, const unsigned char* end, SkPdfObject* obj) {
217fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
218fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
219fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        // TODO(edisonn): NYI properly
220fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        // if has dot (impl), or exceeds max int, is real, otherwise is int
221fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        bool isInt = true;
222fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        for (const unsigned char* current = start; current < end; current++) {
223fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer            if (*current == '.') {
224fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer                isInt = false;
225fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer                break;
226fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer            }
227fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer            // TODO(edisonn): report parse issue with numbers like "24asdasd123"
228fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        }
229fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        if (isInt) {
230fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer            makeInteger(atol((const char*)start), obj);
231fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        } else {
232fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer            makeReal(atof((const char*)start), obj);
233fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        }
234fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
235fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
236fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeReference(unsigned int id, unsigned int gen, SkPdfObject* obj) {
237fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
238fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
239fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj->fObjectType = kReference_PdfObjectType;
240fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj->fRef.fId = id;
241fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj->fRef.fGen = gen;
242fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
243fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
244fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
245fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeString(const unsigned char* start, SkPdfObject* obj) {
246fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        makeStringCore(start, strlen((const char*)start), obj, kString_PdfObjectType);
247fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
248fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
249fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeString(const unsigned char* start, const unsigned char* end, SkPdfObject* obj) {
250fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        makeStringCore(start, end - start, obj, kString_PdfObjectType);
25168ef0382e4efe4a4c06e47a53a275b873ba0cff4Evandro Menezes    }
252fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
253fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeString(const unsigned char* start, size_t bytes, SkPdfObject* obj) {
254fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        makeStringCore(start, bytes, obj, kString_PdfObjectType);
255fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
256fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
257fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
258fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeHexString(const unsigned char* start, SkPdfObject* obj) {
259fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        makeStringCore(start, strlen((const char*)start), obj, kHexString_PdfObjectType);
260fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
261fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
262fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeHexString(const unsigned char* start, const unsigned char* end, SkPdfObject* obj) {
263fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        makeStringCore(start, end - start, obj, kHexString_PdfObjectType);
264fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
265fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
266fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeHexString(const unsigned char* start, size_t bytes, SkPdfObject* obj) {
267fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        makeStringCore(start, bytes, obj, kHexString_PdfObjectType);
268fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
269fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
270fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
271fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeName(const unsigned char* start, SkPdfObject* obj) {
272fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        makeStringCore(start, strlen((const char*)start), obj, kName_PdfObjectType);
273fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
274fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
275fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeName(const unsigned char* start, const unsigned char* end, SkPdfObject* obj) {
276fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        makeStringCore(start, end - start, obj, kName_PdfObjectType);
277fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
278fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
279fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeName(const unsigned char* start, size_t bytes, SkPdfObject* obj) {
280fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        makeStringCore(start, bytes, obj, kName_PdfObjectType);
281fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
282fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
283fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
284fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeKeyword(const unsigned char* start, SkPdfObject* obj) {
285fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        makeStringCore(start, strlen((const char*)start), obj, kKeyword_PdfObjectType);
286fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
287fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
288fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeKeyword(const unsigned char* start, const unsigned char* end, SkPdfObject* obj) {
289fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        makeStringCore(start, end - start, obj, kKeyword_PdfObjectType);
290fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
2916c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
2926c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    static void makeKeyword(const unsigned char* start, size_t bytes, SkPdfObject* obj) {
2936c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        makeStringCore(start, bytes, obj, kKeyword_PdfObjectType);
2946c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    }
295b84551a14f1c96942eb82408652e633543b0961eMichael J. Spencer
2966c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
2976c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
2986c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    // TODO(edisonn): make the functions to return SkPdfArray, move these functions in SkPdfArray
2996c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    static void makeEmptyArray(SkPdfObject* obj) {
3006c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
3016c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
3029a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        obj->fObjectType = kArray_PdfObjectType;
3036c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        obj->fArray = new SkTDArray<SkPdfObject*>();
3046c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        // return (SkPdfArray*)obj;
3056c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    }
3066c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
307e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming    bool appendInArray(SkPdfObject* obj) {
3085af8f421b6412e52530608097e39d2602195629fDan Gohman        SkASSERT(fObjectType == kArray_PdfObjectType);
309e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming        if (fObjectType != kArray_PdfObjectType) {
310e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming            // TODO(edisonn): report err
311e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming            return false;
312e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming        }
313e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming
314e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming        fArray->push(obj);
315e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming        return true;
316e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming    }
317e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming
318e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming    size_t size() const {
319e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming        SkASSERT(fObjectType == kArray_PdfObjectType);
320e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming
321e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming        return fArray->count();
322e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming    }
323e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming
324e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming    SkPdfObject* objAtAIndex(int i) {
325e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming        SkASSERT(fObjectType == kArray_PdfObjectType);
326e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming
327e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming        return (*fArray)[i];
328e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming    }
3295af8f421b6412e52530608097e39d2602195629fDan Gohman
3305af8f421b6412e52530608097e39d2602195629fDan Gohman    SkPdfObject* removeLastInArray() {
331004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming        SkASSERT(fObjectType == kArray_PdfObjectType);
332004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming
333004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming        SkPdfObject* ret = NULL;
334004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming        fArray->pop(&ret);
335004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming
336004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming        return ret;
337004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming    }
338004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming
339004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming
340004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming    const SkPdfObject* objAtAIndex(int i) const {
341004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming        SkASSERT(fObjectType == kArray_PdfObjectType);
342004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming
343004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming        return (*fArray)[i];
344004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming    }
345004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming
346004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming    SkPdfObject* operator[](int i) {
347004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming        SkASSERT(fObjectType == kArray_PdfObjectType);
348004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming
349004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming        return (*fArray)[i];
350004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming    }
351004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming
352004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming    const SkPdfObject* operator[](int i) const {
353004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming        SkASSERT(fObjectType == kArray_PdfObjectType);
354004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming
355004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming        return (*fArray)[i];
356004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming    }
357004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming
358004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming
359004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming    // TODO(edisonn): make the functions to return SkPdfDictionary, move these functions in SkPdfDictionary
360fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    static void makeEmptyDictionary(SkPdfObject* obj) {
361fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
362fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
363fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj->fObjectType = kDictionary_PdfObjectType;
364fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        obj->fMap = new SkTDict<SkPdfObject*>(1);
365004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming        obj->fStr.fBuffer = NULL;
366004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming        obj->fStr.fBytes = 0;
367004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming    }
368004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming
369004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming    // TODO(edisonn): get all the possible names from spec, and compute a hash function
370004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming    // that would create no overlaps in the same dictionary
371004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming    // or build a tree of chars that when followed goes to a unique id/index/hash
372e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer    // TODO(edisonn): generate constants like kDictFoo, kNameDict_name
373e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer    // which will be used in code
374e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer    // add function SkPdfFastNameKey key(const char* key);
375e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer    // TODO(edisonn): setting the same key twike, will make the value undefined!
376e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer    bool set(const SkPdfObject* key, SkPdfObject* value) {
377e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer        SkASSERT(fObjectType == kDictionary_PdfObjectType);
378e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer        SkASSERT(key->fObjectType == kName_PdfObjectType);
379e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer
380e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
381e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer            // TODO(edisonn): report err
382e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer            return false;
383e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer        }
384e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer
385e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer        //// we rewrite all delimiters and white spaces with '\0', so we expect the end of name to be '\0'
386e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer        //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
3873cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola
3883cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola        return set(key->fStr.fBuffer, key->fStr.fBytes, value);
3893cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola    }
3903cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola
3913cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola    bool set(const char* key, SkPdfObject* value) {
3923cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola        return set((const unsigned char*)key, strlen(key), value);
393e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer    }
394e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer
395e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer    bool set(const unsigned char* key, size_t len, SkPdfObject* value) {
3963cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola        SkASSERT(fObjectType == kDictionary_PdfObjectType);
3973cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola
3983cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola        if (fObjectType != kDictionary_PdfObjectType) {
3993cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola            // TODO(edisonn): report err
4003cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola            return false;
4013cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola        }
4023cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola
4033cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola        return fMap->set((const char*)key, len, value);
4043cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola    }
4053cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola
4063cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola    SkPdfObject* get(const SkPdfObject* key) {
4073cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola        SkASSERT(fObjectType == kDictionary_PdfObjectType);
4083cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola        SkASSERT(key->fObjectType == kName_PdfObjectType);
4093cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola
4103cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
4113cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola            // TODO(edisonn): report err
4123cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola            return NULL;
4133cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola        }
4143cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola
4153cede2d0b2b6cc0a06f55da7c2f8e4263ec0091eRafael Espindola        //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
416e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer
417e5b57347e9485b59dd8d70f8f90d7794f473147aBenjamin Kramer        return get(key->fStr.fBuffer, key->fStr.fBytes);
4184b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck    }
4194b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck
4204b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck    SkPdfObject* get(const char* key) {
4214b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck        return get((const unsigned char*)key, strlen(key));
4224b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck    }
4234b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck
4244b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck    SkPdfObject* get(const unsigned char* key, size_t len) {
4254b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck        SkASSERT(fObjectType == kDictionary_PdfObjectType);
4264b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck        SkASSERT(key);
4274b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck        if (fObjectType != kDictionary_PdfObjectType) {
4284b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck            // TODO(edisonn): report err
4294b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck            return NULL;
4304b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck        }
4314b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck        SkPdfObject* ret = NULL;
4324b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck        fMap->find((const char*)key, len, &ret);
4334b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck
4344b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck#ifdef PDF_TRACE
4354b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck        SkString _key;
4364b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck        _key.append((const char*)key, len);
4374b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck        printf("\nget(/%s) = %s\n", _key.c_str(), ret ? ret->toString(0, len + 9).c_str() : "_NOT_FOUND");
4384b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck#endif
4394b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck
4404b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck        return ret;
4414b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck    }
4424b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck
4434b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck    const SkPdfObject* get(const SkPdfObject* key) const {
44410a431824831c1d57a62dd84346387238f516e0cRoman Divacky        SkASSERT(fObjectType == kDictionary_PdfObjectType);
4452c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky        SkASSERT(key->fObjectType == kName_PdfObjectType);
4462c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky
4472c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
4482c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky            // TODO(edisonn): report err
4492c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky            return NULL;
4502c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky        }
4512c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky
4522c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky        //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
4532c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky
4542c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky        return get(key->fStr.fBuffer, key->fStr.fBytes);
4552c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky    }
4562c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky
4572c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky    const SkPdfObject* get(const char* key) const {
4582c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky        return get((const unsigned char*)key, strlen(key));
4592c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky    }
460ba6086818d9c5070061f74ac9944666b4312c6f0Ulrich Weigand
461ba6086818d9c5070061f74ac9944666b4312c6f0Ulrich Weigand    const SkPdfObject* get(const unsigned char* key, size_t len) const {
462ba6086818d9c5070061f74ac9944666b4312c6f0Ulrich Weigand        SkASSERT(fObjectType == kDictionary_PdfObjectType);
4632c0d69fad0e658117922f3d96d9b732bedf9fd47Roman Divacky        SkASSERT(key);
4642d7a53aec2c6426eba9e5dd6462cc9e86432b410Jason W Kim        if (fObjectType != kDictionary_PdfObjectType) {
46510a431824831c1d57a62dd84346387238f516e0cRoman Divacky            // TODO(edisonn): report err
46610a431824831c1d57a62dd84346387238f516e0cRoman Divacky            return NULL;
46710a431824831c1d57a62dd84346387238f516e0cRoman Divacky        }
46810a431824831c1d57a62dd84346387238f516e0cRoman Divacky        SkPdfObject* ret = NULL;
46910a431824831c1d57a62dd84346387238f516e0cRoman Divacky        fMap->find((const char*)key, len, &ret);
47010a431824831c1d57a62dd84346387238f516e0cRoman Divacky
47110a431824831c1d57a62dd84346387238f516e0cRoman Divacky#ifdef PDF_TRACE
47210a431824831c1d57a62dd84346387238f516e0cRoman Divacky        SkString _key;
47310a431824831c1d57a62dd84346387238f516e0cRoman Divacky        _key.append((const char*)key, len);
47410a431824831c1d57a62dd84346387238f516e0cRoman Divacky        printf("\nget(/%s) = %s\n", _key.c_str(), ret ? ret->toString(0, len + 9).c_str() : "_NOT_FOUND");
47534a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt#endif
47634a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt
47710a431824831c1d57a62dd84346387238f516e0cRoman Divacky        return ret;
47834a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt    }
479d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt
480d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt    const SkPdfObject* get(const char* key, const char* abr) const {
481349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt        const SkPdfObject* ret = get(key);
482349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt        // TODO(edisonn): / is a valid name, and it might be an abreviation, so "" should not be like NULL
48357ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt        // make this distiontion in generator, and remove "" from condition
48457ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt        if (ret != NULL || abr == NULL || *abr == '\0') {
485349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt            return ret;
486349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt        }
487b453e16855f347e300f1dc0cd0dfbdd65c27b0d2Bill Schmidt        return get(abr);
488b453e16855f347e300f1dc0cd0dfbdd65c27b0d2Bill Schmidt    }
489349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt
490349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt    SkPdfObject* get(const char* key, const char* abr) {
49110a431824831c1d57a62dd84346387238f516e0cRoman Divacky        SkPdfObject* ret = get(key);
49210a431824831c1d57a62dd84346387238f516e0cRoman Divacky        // TODO(edisonn): / is a valid name, and it might be an abreviation, so "" should not be like NULL
4932d7a53aec2c6426eba9e5dd6462cc9e86432b410Jason W Kim        // make this distiontion in generator, and remove "" from condition
4942d7a53aec2c6426eba9e5dd6462cc9e86432b410Jason W Kim        if (ret != NULL || abr == NULL || *abr == '\0') {
4952d7a53aec2c6426eba9e5dd6462cc9e86432b410Jason W Kim            return ret;
49613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        }
49713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return get(abr);
49813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
49913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
50013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    SkPdfDictionary* asDictionary() {
50113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        SkASSERT(isDictionary());
50213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        if (!isDictionary()) {
50313534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim            return NULL;
50413534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        }
50513534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return (SkPdfDictionary*) this;
50613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
50713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
50813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    const SkPdfDictionary* asDictionary() const {
50913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        SkASSERT(isDictionary());
51013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        if (!isDictionary()) {
51113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim            return NULL;
51213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        }
51313534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return (SkPdfDictionary*) this;
51413534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
51513534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
51613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
51713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isReference() const {
51813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kReference_PdfObjectType;
51913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
52013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
52113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isBoolean() const {
52213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kBoolean_PdfObjectType;
52313534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
52413534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
52513534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isInteger() const {
52613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kInteger_PdfObjectType;
52713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
52813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kimprivate:
52913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isReal() const {
53013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kReal_PdfObjectType;
53113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
53213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kimpublic:
53313534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isNumber() const {
53413534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kInteger_PdfObjectType || fObjectType == kReal_PdfObjectType;
53513534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
53613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
53713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isKeywordReference() const {
53813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kKeyword_PdfObjectType && fStr.fBytes == 1 && fStr.fBuffer[0] == 'R';
53913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
54013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
54113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isKeyword() const {
54213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kKeyword_PdfObjectType;
54313534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
54413534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
54513534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isKeyword(const char* keyword) const {
54613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        if (!isKeyword()) {
54713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim            return false;
54813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        }
54913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
55013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        if (strlen(keyword) != fStr.fBytes) {
55113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim            return false;
55213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        }
55313534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
55413534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        if (strncmp(keyword, (const char*)fStr.fBuffer, fStr.fBytes) != 0) {
55513534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim            return false;
55613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        }
55713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
55813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return true;
55913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
56013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
56113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isName() const {
56213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kName_PdfObjectType;
56313534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
56413534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
56513534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isName(const char* name) const {
56613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kName_PdfObjectType && fStr.fBytes == strlen(name) && strncmp((const char*)fStr.fBuffer, name, fStr.fBytes) == 0;
56713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
56813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
56913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isArray() const {
57013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kArray_PdfObjectType;
57113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
57213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
57313534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isDate() const {
57413534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType;
57513534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
57613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
57713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isDictionary() const {
57813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kDictionary_PdfObjectType;
57913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
58013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
58113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isFunction() const {
58213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return false;  // NYI
58313534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
58413534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
58513534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isRectangle() const {
58613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kArray_PdfObjectType && fArray->count() == 4; // NYI + and elems are numbers
58713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
58813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
58913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    // TODO(edisonn): has stream .. or is stream ... TBD
59013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool hasStream() const {
59113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return isDictionary() && fStr.fBuffer != NULL;
59213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
59313534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
59413534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    // TODO(edisonn): has stream .. or is stream ... TBD
59513534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    const SkPdfStream* getStream() const {
59613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return hasStream() ? (const SkPdfStream*)this : NULL;
59713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
59813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
59913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    SkPdfStream* getStream() {
60013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return hasStream() ? (SkPdfStream*)this : NULL;
60113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
60213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
60313534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isAnyString() const {
60413534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType;
60513534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
60613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
60713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    bool isMatrix() const {
60813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fObjectType == kArray_PdfObjectType && fArray->count() == 6; // NYI + and elems are numbers
60913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
61013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
61113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    inline int64_t intValue() const {
61213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        SkASSERT(fObjectType == kInteger_PdfObjectType);
61313534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
61413534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        if (fObjectType != kInteger_PdfObjectType) {
61513534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim            // TODO(edisonn): log err
61613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim            return 0;
61713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        }
61813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fIntegerValue;
61913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
62013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kimprivate:
62113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    inline double realValue() const {
62213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        SkASSERT(fObjectType == kReal_PdfObjectType);
62313534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim
62413534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        if (fObjectType != kReal_PdfObjectType) {
62513534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim            // TODO(edisonn): log err
62613534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim            return 0;
62713534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        }
62813534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        return fRealValue;
62913534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    }
63013534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kimpublic:
63113534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim    inline double numberValue() const {
63213534672deffb571d90f2c2f0a237c67d5aa0594Jason W Kim        SkASSERT(isNumber());
63384bfc2f090639f933df06cc675c4385511516befAkira Hatanaka
63484bfc2f090639f933df06cc675c4385511516befAkira Hatanaka        if (!isNumber()) {
63584bfc2f090639f933df06cc675c4385511516befAkira Hatanaka            // TODO(edisonn): log err
63684bfc2f090639f933df06cc675c4385511516befAkira Hatanaka            return 0;
63784bfc2f090639f933df06cc675c4385511516befAkira Hatanaka        }
63884bfc2f090639f933df06cc675c4385511516befAkira Hatanaka        return fObjectType == kReal_PdfObjectType ? fRealValue : fIntegerValue;
63984bfc2f090639f933df06cc675c4385511516befAkira Hatanaka    }
64084bfc2f090639f933df06cc675c4385511516befAkira Hatanaka
64184bfc2f090639f933df06cc675c4385511516befAkira Hatanaka    inline SkScalar scalarValue() const {
64284bfc2f090639f933df06cc675c4385511516befAkira Hatanaka        SkASSERT(isNumber());
643a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka
644a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka        if (!isNumber()) {
64584bfc2f090639f933df06cc675c4385511516befAkira Hatanaka            // TODO(edisonn): log err
646a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka            return SkIntToScalar(0);
64784bfc2f090639f933df06cc675c4385511516befAkira Hatanaka        }
64884bfc2f090639f933df06cc675c4385511516befAkira Hatanaka        return fObjectType == kReal_PdfObjectType ? SkDoubleToScalar(fRealValue) :
64984bfc2f090639f933df06cc675c4385511516befAkira Hatanaka                                                    SkIntToScalar(fIntegerValue);
65088c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    }
65184bfc2f090639f933df06cc675c4385511516befAkira Hatanaka
65288c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    int referenceId() const {
65388c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        SkASSERT(fObjectType == kReference_PdfObjectType);
65488c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        return fRef.fId;
65588c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    }
65688c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka
65788c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    int referenceGeneration() const {
65888c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        SkASSERT(fObjectType == kReference_PdfObjectType);
65988c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        return fRef.fGen;
66088c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    }
66188c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka
66288c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    inline const char* nameValue() const {
663e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes        SkASSERT(fObjectType == kName_PdfObjectType);
66488c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka
66588c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        if (fObjectType != kName_PdfObjectType) {
66688c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka            // TODO(edisonn): log err
66788c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka            return "";
66888c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        }
66988c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        return (const char*)fStr.fBuffer;
67088c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    }
67188c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka
67288c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    inline const char* stringValue() const {
67388c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType);
67488c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka
67588c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_PdfObjectType) {
67688c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka            // TODO(edisonn): log err
67788c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka            return "";
67888c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        }
67988c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        return (const char*)fStr.fBuffer;
68088c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    }
68188c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka
68288c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    inline NotOwnedString strRef() {
68388c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        switch (fObjectType) {
68488c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka            case kString_PdfObjectType:
68588c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka            case kHexString_PdfObjectType:
68688c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka            case kKeyword_PdfObjectType:
68788c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka            case kName_PdfObjectType:
68888c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka                return fStr;
68988c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka
69088c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka            default:
69188c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka                // TODO(edisonn): report/warning
69288c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka                return NotOwnedString();
69388c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        }
69488c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    }
69588c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka
69688c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    // TODO(edisonn): nameValue2 and stringValue2 are used to make code generation easy,
69788c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    // but it is not a performat way to do it, since it will create an extra copy
69888c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    // remove these functions and make code generated faster
69988c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka    inline std::string nameValue2() const {
70088c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        SkASSERT(fObjectType == kName_PdfObjectType);
70188c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka
70288c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        if (fObjectType != kName_PdfObjectType) {
70388c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka            // TODO(edisonn): log err
70488c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka            return "";
70588c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        }
70688c1103c223c1e3eb430ce7081b347e1a2346967Akira Hatanaka        return std::string((const char*)fStr.fBuffer, fStr.fBytes);
7074b04713423c6da988db75c7546baa3db7ddfa119Wesley Peck    }
7088ceffeb95cca477d1faf176e95140272a28cb91cSid Manning
7098ceffeb95cca477d1faf176e95140272a28cb91cSid Manning    inline std::string stringValue2() const {
7108ceffeb95cca477d1faf176e95140272a28cb91cSid Manning        SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType);
7118ceffeb95cca477d1faf176e95140272a28cb91cSid Manning
7128ceffeb95cca477d1faf176e95140272a28cb91cSid Manning        if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_PdfObjectType) {
7138ceffeb95cca477d1faf176e95140272a28cb91cSid Manning            // TODO(edisonn): log err
7148ceffeb95cca477d1faf176e95140272a28cb91cSid Manning            return "";
7158ceffeb95cca477d1faf176e95140272a28cb91cSid Manning        }
7168ceffeb95cca477d1faf176e95140272a28cb91cSid Manning        return std::string((const char*)fStr.fBuffer, fStr.fBytes);
7178ceffeb95cca477d1faf176e95140272a28cb91cSid Manning    }
7188ceffeb95cca477d1faf176e95140272a28cb91cSid Manning
7198ceffeb95cca477d1faf176e95140272a28cb91cSid Manning    inline bool boolValue() const {
7208ceffeb95cca477d1faf176e95140272a28cb91cSid Manning        SkASSERT(fObjectType == kBoolean_PdfObjectType);
7218ceffeb95cca477d1faf176e95140272a28cb91cSid Manning
7228ceffeb95cca477d1faf176e95140272a28cb91cSid Manning        if (fObjectType != kBoolean_PdfObjectType) {
7238ceffeb95cca477d1faf176e95140272a28cb91cSid Manning            // TODO(edisonn): log err
7248ceffeb95cca477d1faf176e95140272a28cb91cSid Manning            return false;
7258ceffeb95cca477d1faf176e95140272a28cb91cSid Manning        }
7268ceffeb95cca477d1faf176e95140272a28cb91cSid Manning        return fBooleanValue;
7278ceffeb95cca477d1faf176e95140272a28cb91cSid Manning    }
7288ceffeb95cca477d1faf176e95140272a28cb91cSid Manning
7298ceffeb95cca477d1faf176e95140272a28cb91cSid Manning    SkRect rectangleValue() const {
7308ceffeb95cca477d1faf176e95140272a28cb91cSid Manning        SkASSERT(isRectangle());
7318ceffeb95cca477d1faf176e95140272a28cb91cSid Manning        if (!isRectangle()) {
7328ceffeb95cca477d1faf176e95140272a28cb91cSid Manning            return SkRect::MakeEmpty();
7338ceffeb95cca477d1faf176e95140272a28cb91cSid Manning        }
7348ceffeb95cca477d1faf176e95140272a28cb91cSid Manning
7358ceffeb95cca477d1faf176e95140272a28cb91cSid Manning        double array[4];
73650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        for (int i = 0; i < 4; i++) {
7378ceffeb95cca477d1faf176e95140272a28cb91cSid Manning            // TODO(edisonn): version where we could resolve references?
73850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            const SkPdfObject* elem = objAtAIndex(i);
73950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            if (elem == NULL || !elem->isNumber()) {
74050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow                // TODO(edisonn): report error
74150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow                return SkRect::MakeEmpty();
74250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            }
74350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            array[i] = elem->numberValue();
74450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        }
74550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
74650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        return SkRect::MakeLTRB(SkDoubleToScalar(array[0]),
74750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow                                SkDoubleToScalar(array[1]),
74850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow                                SkDoubleToScalar(array[2]),
74950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow                                SkDoubleToScalar(array[3]));
75050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow    }
75150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
75250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow    SkMatrix matrixValue() const {
75350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        SkASSERT(isMatrix());
75450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        if (!isMatrix()) {
75550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            return SkMatrix::I();
75650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        }
75750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
75850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        double array[6];
75950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        for (int i = 0; i < 6; i++) {
76050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            // TODO(edisonn): version where we could resolve references?
76150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            const SkPdfObject* elem = objAtAIndex(i);
76250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            if (elem == NULL || !elem->isNumber()) {
76350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow                // TODO(edisonn): report error
76450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow                return SkMatrix::I();
76550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            }
76650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            array[i] = elem->numberValue();
76750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        }
76850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
76950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        return SkMatrixFromPdfMatrix(array);
77050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow    }
77150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
77250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow    bool filterStream();
77350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
77450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
77550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow    bool GetFilteredStreamRef(unsigned char const** buffer, size_t* len) {
77650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        // TODO(edisonn): add params that couls let the last filter in place if it is jpeg or png to fast load images
77750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        if (!hasStream()) {
77850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            return false;
77950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        }
78050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
78150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        filterStream();
78250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
78350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        if (buffer) {
78450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            *buffer = fStr.fBuffer;
78550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        }
78650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
78750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        if (len) {
78850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            *len = fStr.fBytes >> 2;  // last 2 bits
78950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        }
79050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
79150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        return true;
79250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow    }
79350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
79450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow    bool isStreamFiltered() const {
79550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        return hasStream() && ((fStr.fBytes & 1) == kFilteredStreamBit);
79650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow    }
79750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
79850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow    bool isStreamOwned() const {
79950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        return hasStream() && ((fStr.fBytes & 2) == kOwnedStreamBit);
80050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow    }
80150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
80250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow    bool GetUnfilteredStreamRef(unsigned char const** buffer, size_t* len) const {
80350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        if (isStreamFiltered()) {
80450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            return false;
80550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        }
80650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
80750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        if (!hasStream()) {
80850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            return false;
80950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        }
81050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
81150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        if (buffer) {
81250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            *buffer = fStr.fBuffer;
81350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        }
81450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
81550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        if (len) {
81650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow            *len = fStr.fBytes >> 2;  // remove last 2 bits
81750b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        }
81850b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
81950b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        return true;
82050b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow    }
82150b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
82250b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow    bool addStream(const unsigned char* buffer, size_t len) {
82350b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        SkASSERT(!hasStream());
82450b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        SkASSERT(isDictionary());
82550b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow
82650b4c52633b0c933aabcd0741d1dae751ba339ddMarshall Clow        if (!isDictionary() || hasStream()) {
8276c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            return false;
8286c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        }
8296c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
8306c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        fStr.fBuffer = buffer;
8316c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        fStr.fBytes = (len << 2) + kUnfilteredStreamBit;
8326c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
8336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        return true;
8346c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    }
83563b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman
8366c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    static void appendSpaces(SkString* str, int level) {
8376c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        for (int i = 0 ; i < level; i++) {
8386c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            str->append(" ");
8396c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        }
8406c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    }
841620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke
842e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke    SkString toString(int firstRowLevel = 0, int level = 0) const {
843c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer        SkString str;
844c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer        appendSpaces(&str, firstRowLevel);
845620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke        switch (fObjectType) {
846620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke            case kInvalid_PdfObjectType:
847620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke                str.append("__Invalid");
848620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke                break;
849c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer
850c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer            case kBoolean_PdfObjectType:
851620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke                str.appendf("%s", fBooleanValue ? "true" : "false");
852620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke                break;
853e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke
854620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke            case kInteger_PdfObjectType:
8556c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                str.appendf("%i", (int)fIntegerValue);
8566c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                break;
8576c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
8586c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            case kReal_PdfObjectType:
8596c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                str.appendf("%f", fRealValue);
8606c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                break;
861fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
862fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer            case kString_PdfObjectType:
8636c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                str.append("\"");
8646c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                str.append((const char*)fStr.fBuffer, fStr.fBytes);
8657be2c33193aeada8c0ff3555ea54b930f204132aRafael Espindola                str.append("\"");
8666c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                break;
8676c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
8686c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            case kHexString_PdfObjectType:
8696c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                str.append("<");
8706c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                str.append((const char*)fStr.fBuffer, fStr.fBytes);
871b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                str.append(">");
872b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                break;
873b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming
874b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming            case kName_PdfObjectType:
875b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                str.append("/");
876b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                str.append((const char*)fStr.fBuffer, fStr.fBytes);
877b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                break;
878b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming
879b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming            case kKeyword_PdfObjectType:
880b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                str.append((const char*)fStr.fBuffer, fStr.fBytes);
881b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                break;
882b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming
883cbda61a468b4a2b33a54781d65023da7d9c8d291Michael J. Spencer            case kArray_PdfObjectType:
884b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                str.append("[\n");
885b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                for (unsigned int i = 0; i < size(); i++) {
886b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                    str.append(objAtAIndex(i)->toString(level + 1, level + 1));
887cbda61a468b4a2b33a54781d65023da7d9c8d291Michael J. Spencer                    if (i < size() - 1) {
888b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                        str.append(",");
8896aef977e85d5ff2ae1f8b78a62db0762e82595a5Simon Atanasyan                    }
8906aef977e85d5ff2ae1f8b78a62db0762e82595a5Simon Atanasyan                    str.append("\n");
8912d70e263c2b508bf4641273dd89a23149f6f6164David Meyer                }
8922d70e263c2b508bf4641273dd89a23149f6f6164David Meyer                appendSpaces(&str, level);
8932d70e263c2b508bf4641273dd89a23149f6f6164David Meyer                str.append("]");
894b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                break;
895b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming
896cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola            case kDictionary_PdfObjectType: {
897cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola                    SkTDict<SkPdfObject*>::Iter iter(*fMap);
898cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola                    SkPdfObject* obj = NULL;
899cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola                    const char* key = NULL;
900cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola                    str.append("<<\n");
901cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola                    while ((key = iter.next(&obj)) != NULL) {
902cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola                        appendSpaces(&str, level + 2);
903cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola                        str.appendf("/%s %s\n", key, obj->toString(0, level + strlen(key) + 4).c_str());
904cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola                    }
905cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola                    appendSpaces(&str, level);
9060cf5e3d51dd455a174a8f00cfa6b63c11e535434Rafael Espindola                    str.append(">>");
9070cf5e3d51dd455a174a8f00cfa6b63c11e535434Rafael Espindola                    if (hasStream()) {
908b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                        str.append("stream HAS_STREAM endstream");
909b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                    }
910b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming                }
9116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                break;
9126c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
9136c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            case kNull_PdfObjectType:
9146c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke                str = "NULL";
9151c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola                break;
9161c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola
9171c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola            case kReference_PdfObjectType:
9181c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola                str.appendf("%i %i R", fRef.fId, fRef.fGen);
9191c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola                break;
9201c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola
9211c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola            case kUndefined_PdfObjectType:
9221c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola                str = "Undefined";
9231c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola                break;
9241c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola
9251c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola            default:
9261c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola                str = "Error";
9271c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola                break;
9281c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola        }
9291c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola
9301c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola        return str;
9311c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    }
9321c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola
9331c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindolaprivate:
9341c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    static void makeStringCore(const unsigned char* start, SkPdfObject* obj, ObjectType type) {
9351c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola        makeStringCore(start, strlen((const char*)start), obj, type);
9361c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    }
9371c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola
9381c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    static void makeStringCore(const unsigned char* start, const unsigned char* end, SkPdfObject* obj, ObjectType type) {
9391c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola        makeStringCore(start, end - start, obj, type);
9401c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    }
9411c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola
9421c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    static void makeStringCore(const unsigned char* start, size_t bytes, SkPdfObject* obj, ObjectType type) {
9431c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
9441c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola
9451c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola        obj->fObjectType = type;
9461c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola        obj->fStr.fBuffer = start;
9471c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola        obj->fStr.fBytes = bytes;
9481c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    }
9491c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola
9501c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    bool applyFilter(const char* name);
9511c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    bool applyFlateDecodeFilter();
9521c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    bool applyDCTDecodeFilter();
9531c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola};
9541c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola
9551c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindolaclass SkPdfStream : public SkPdfObject {};
9561c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindolaclass SkPdfArray : public SkPdfObject {};
9571c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindolaclass SkPdfString : public SkPdfObject {};
958fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerclass SkPdfHexString : public SkPdfObject {};
959fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerclass SkPdfInteger : public SkPdfObject {};
9601c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindolaclass SkPdfReal : public SkPdfObject {};
961fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerclass SkPdfNumber : public SkPdfObject {};
962fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer
963fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerclass SkPdfName : public SkPdfObject {
964fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    SkPdfName() : SkPdfObject() {
965fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        SkPdfObject::makeName((const unsigned char*)"", this);
966fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
967fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerpublic:
968fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    SkPdfName(char* name) : SkPdfObject() {
969fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer        this->makeName((const unsigned char*)name, this);
970fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer    }
9716c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke};
9726c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
9732ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola#endif  // EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_
9742ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola