SkPdfNativeObject.h revision 0fd25d8b22ae092183f3dc67dec4c0c1bbde06bf
1cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com/*
2cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * Copyright 2013 Google Inc.
3cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com *
4cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * Use of this source code is governed by a BSD-style license that can be
5cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * found in the LICENSE file.
6cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com */
7cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com
8cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#ifndef SkPdfNativeObject_DEFINED
9cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#define SkPdfNativeObject_DEFINED
10571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
11571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include <stdint.h>
12571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include <string.h>
13063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com#include "SkString.h"
14571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkTDArray.h"
15571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkTDict.h"
16571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkRect.h"
17571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkMatrix.h"
18571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkString.h"
19571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
20571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkPdfNYI.h"
21571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#include "SkPdfConfig.h"
223aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com#include "SkPdfUtils.h"
233aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com
243aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com#include "SkPdfNativeTokenizer.h"
25571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
26571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfDictionary;
27571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfStream;
28571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comclass SkPdfAllocator;
29571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
30571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com// TODO(edisonn): macro it and move it to utils
31571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comSkMatrix SkMatrixFromPdfMatrix(double array[6]);
32571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
33571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
34571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kFilteredStreamBit 0
35571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com#define kUnfilteredStreamBit 1
362ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com#define kOwnedStreamBit 2
37571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
383aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfNativeObject {
39571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com public:
40571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com     enum ObjectType {
41571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kInvalid_PdfObjectType,
42571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
43571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kBoolean_PdfObjectType,
44571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kInteger_PdfObjectType,
45571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kReal_PdfObjectType,
46571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kString_PdfObjectType,
47571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kHexString_PdfObjectType,
48571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kName_PdfObjectType,
49571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kKeyword_PdfObjectType,
50571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         //kStream_PdfObjectType,  //  attached to a Dictionary
51571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kArray_PdfObjectType,
52571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kDictionary_PdfObjectType,
53571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kNull_PdfObjectType,
54571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
55571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         // TODO(edisonn): after the pdf has been loaded completely, resolve all references
56571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         // try the same thing with delayed loaded ...
57571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kReference_PdfObjectType,
58571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
59571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com         kUndefined_PdfObjectType,  // per 1.4 spec, if the same key appear twice in the dictionary, the value is undefined
60571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com     };
61571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
62b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com     enum DataType {
63b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com         kEmpty_Data,
64b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com         kFont_Data,
65b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com         kBitmap_Data,
66b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com     };
67b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
68571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
69063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    // TODO(edisonn): assert reset operations while in rendering!
70063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    uint32_t fInRendering : 1;
71063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    uint32_t fUnused : 31;
72063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com
73063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com
74571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    struct Reference {
75571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        unsigned int fId;
76571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        unsigned int fGen;
77571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    };
78571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
79571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): add stream start, stream end, where stream is weither the file
80571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // or decoded/filtered pdf stream
81571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
82571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): add warning/report per object
83571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): add flag fUsed, to be used once the parsing is complete,
84571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // so we could show what parts have been proccessed, ignored, or generated errors
85571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
86571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    ObjectType fObjectType;
87571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
88571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    union {
89571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        bool fBooleanValue;
90571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        int64_t fIntegerValue;
91571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): double, float? typedefed
92571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        double fRealValue;
93571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        NotOwnedString fStr;
94571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
95571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@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
963aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkTDArray<SkPdfNativeObject*>* fArray;
97571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        Reference fRef;
98571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    };
993aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkTDict<SkPdfNativeObject*>* fMap;
100b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
101b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    // TODO(edisonn): rename data with cache
102571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    void* fData;
103b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    DataType fDataType;
104571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
105571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1060fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com    // Keep this the last entrys
1070fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com#ifdef PDF_TRACK_OBJECT_USAGE
1080fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com    mutable bool fUsed;
1090fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com#endif   // PDF_TRACK_OBJECT_USAGE
1100fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
111571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.compublic:
112571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1130fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com    SkPdfNativeObject() : fInRendering(0)
1140fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com                        , fObjectType(kInvalid_PdfObjectType)
1150fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com                        , fMap(NULL)
1160fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com                        , fData(NULL)
1170fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com                        , fDataType(kEmpty_Data)
1180fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com#ifdef PDF_TRACK_OBJECT_USAGE
1190fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com                        , fUsed(false)
1200fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com#endif   // PDF_TRACK_OBJECT_USAGE
1210fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com    {}
122b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
123063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    bool inRendering() const { return fInRendering != 0; }
124063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    void startRendering() {fInRendering = 1;}
125063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    void doneRendering() {fInRendering = 0;}
126b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
127b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    inline bool hasData(DataType type) {
128b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        return type == fDataType;
129b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    }
130571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
131b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    inline void* data(DataType type) {
132b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        return type == fDataType ? fData : NULL;
133571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
134571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
135b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    inline void setData(void* data, DataType type) {
136b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        releaseData();
137b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        fDataType = type;
138571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fData = data;
139571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
140571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
141b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    void releaseData();
142b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
1433aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com//    ~SkPdfNativeObject() {
144222382b30a176db9d9044d9df1ae14e0fbe27181edisonn@google.com//        //reset();  must be called manually!
145222382b30a176db9d9044d9df1ae14e0fbe27181edisonn@google.com//    }
146571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
147571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    void reset() {
1480fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUnused();
1490fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
150571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
151571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kArray_PdfObjectType:
152571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                delete fArray;
153571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
154571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
155571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kDictionary_PdfObjectType:
156571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                delete fMap;
1572ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                if (isStreamOwned()) {
1582ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                    delete[] fStr.fBuffer;
1592ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                    fStr.fBuffer = NULL;
1602ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                    fStr.fBytes = 0;
1612ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                }
162571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
163571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
164571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
165571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
166571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
167571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fObjectType = kInvalid_PdfObjectType;
168b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        releaseData();
169571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
170571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1710fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com    ObjectType type() {
1720fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
1730fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
1740fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        return fObjectType;
1750fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com    }
176571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
177571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const char* c_str() const {
1780fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
1790fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
180571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
181571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kString_PdfObjectType:
182571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kHexString_PdfObjectType:
183571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kKeyword_PdfObjectType:
184276fed9e0ae2e4457efd61eeb14738040feb65f1edisonn@google.com            case kName_PdfObjectType:
185571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return (const char*)fStr.fBuffer;
186571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
187571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
188571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report/warning
189571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return NULL;
190571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
191571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
192571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
193e878e726bd1c16a0d177543471e071c7338193f4edisonn@google.com    size_t lenstr() const {
1940fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
1950fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
196571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
197571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kString_PdfObjectType:
198571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kHexString_PdfObjectType:
199571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kKeyword_PdfObjectType:
200276fed9e0ae2e4457efd61eeb14738040feb65f1edisonn@google.com            case kName_PdfObjectType:
201571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return fStr.fBytes;
202571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
203571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
204571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report/warning
205571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return 0;
206571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
207571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
208571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
209571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
210571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
211571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfDate& dateValue() const {
212571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfDate nyi;
213571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
214571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
215571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
216571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
217571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfFunction& functionValue() const {
218571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfFunction nyi;
219571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
220571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
221571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
222571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
223571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfFileSpec& fileSpecValue() const {
224571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfFileSpec nyi;
225571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
226571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
227571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
228571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
229571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfTree& treeValue() const {
230571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfTree nyi;
231571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
232571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
233571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2343aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeBoolean(bool value, SkPdfNativeObject* obj) {
235571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
236571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
237571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kBoolean_PdfObjectType;
238571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fBooleanValue = value;
239571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
240571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2413aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static SkPdfNativeObject makeBoolean(bool value) {
2423aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject obj;
243571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj.fObjectType = kBoolean_PdfObjectType;
244571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj.fBooleanValue = value;
245571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return obj;
246571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
247571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2483aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeInteger(int64_t value, SkPdfNativeObject* obj) {
249571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
250571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
251571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kInteger_PdfObjectType;
252571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fIntegerValue = value;
253571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
254571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2553aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeReal(double value, SkPdfNativeObject* obj) {
256571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
257571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
258571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kReal_PdfObjectType;
259571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fRealValue = value;
260571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
261571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2623aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeNull(SkPdfNativeObject* obj) {
263571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
264571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
265571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kNull_PdfObjectType;
266571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
267571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2683aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static SkPdfNativeObject makeNull() {
2693aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject obj;
270571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj.fObjectType = kNull_PdfObjectType;
271571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return obj;
272571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
273571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2743aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static SkPdfNativeObject kNull;
275571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2763aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeNumeric(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj) {
277571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
278571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
279571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): NYI properly
280571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // if has dot (impl), or exceeds max int, is real, otherwise is int
281571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        bool isInt = true;
2822ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        for (const unsigned char* current = start; current < end; current++) {
283571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            if (*current == '.') {
284571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                isInt = false;
285571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
286571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            }
287571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report parse issue with numbers like "24asdasd123"
288571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
289571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (isInt) {
290571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            makeInteger(atol((const char*)start), obj);
291571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        } else {
292571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            makeReal(atof((const char*)start), obj);
293571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
294571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
295571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
2963aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeReference(unsigned int id, unsigned int gen, SkPdfNativeObject* obj) {
297571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
298571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
299571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kReference_PdfObjectType;
300571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fRef.fId = id;
301571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fRef.fGen = gen;
302571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
303571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
304571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3053aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeString(const unsigned char* start, SkPdfNativeObject* obj) {
306571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kString_PdfObjectType);
307571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
308571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3093aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeString(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj) {
310571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, kString_PdfObjectType);
311571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
312571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3133aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeString(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj) {
314571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, bytes, obj, kString_PdfObjectType);
315571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
316571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
317571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3183aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeHexString(const unsigned char* start, SkPdfNativeObject* obj) {
319571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kHexString_PdfObjectType);
320571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
321571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3223aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeHexString(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj) {
323571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, kHexString_PdfObjectType);
324571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
325571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3263aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeHexString(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj) {
327571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, bytes, obj, kHexString_PdfObjectType);
328571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
329571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
330571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3313aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeName(const unsigned char* start, SkPdfNativeObject* obj) {
332571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kName_PdfObjectType);
333571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
334571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3353aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeName(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj) {
336571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, kName_PdfObjectType);
337571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
338571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3393aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeName(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj) {
340571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, bytes, obj, kName_PdfObjectType);
341571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
342571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
343571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3443aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeKeyword(const unsigned char* start, SkPdfNativeObject* obj) {
345571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kKeyword_PdfObjectType);
346571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
347571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3483aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeKeyword(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj) {
349571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, kKeyword_PdfObjectType);
350571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
351571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3523aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeKeyword(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj) {
353571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, bytes, obj, kKeyword_PdfObjectType);
354571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
355571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
356571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
357571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
358571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): make the functions to return SkPdfArray, move these functions in SkPdfArray
3593aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeEmptyArray(SkPdfNativeObject* obj) {
360571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
361571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
362571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kArray_PdfObjectType;
3633aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        obj->fArray = new SkTDArray<SkPdfNativeObject*>();
364571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // return (SkPdfArray*)obj;
365571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
366571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3673aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    bool appendInArray(SkPdfNativeObject* obj) {
368571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
369571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kArray_PdfObjectType) {
370571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
371571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
372571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
373571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
374571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fArray->push(obj);
375571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
376571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
377571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
378571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    size_t size() const {
3790fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
3800fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
381571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
382571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
383571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fArray->count();
384571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
385571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3863aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* objAtAIndex(int i) {
3870fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
3880fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
389571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
390571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
391571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
392571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
393571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3943aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* removeLastInArray() {
3950fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        // SkPdfMarkObjectUsed();
3960fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
397571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
398571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3993aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject* ret = NULL;
400571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fArray->pop(&ret);
401571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
402571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return ret;
403571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
404571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
405571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4063aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* objAtAIndex(int i) const {
4070fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
4080fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
409571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
410571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
411571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
412571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
413571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4143aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* operator[](int i) {
415571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
416571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
417571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
418571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
419571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4203aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* operator[](int i) const {
4210fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
4220fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
423571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
424571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
425571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
426571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
427571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
428571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
429571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): make the functions to return SkPdfDictionary, move these functions in SkPdfDictionary
4303aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeEmptyDictionary(SkPdfNativeObject* obj) {
431571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
432571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
433571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kDictionary_PdfObjectType;
4343aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        obj->fMap = new SkTDict<SkPdfNativeObject*>(1);
435571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBuffer = NULL;
436571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBytes = 0;
437571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
438571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
439571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): get all the possible names from spec, and compute a hash function
440571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // that would create no overlaps in the same dictionary
441571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // or build a tree of chars that when followed goes to a unique id/index/hash
442571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): generate constants like kDictFoo, kNameDict_name
443571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // which will be used in code
444571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // add function SkPdfFastNameKey key(const char* key);
445571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): setting the same key twike, will make the value undefined!
4463aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    bool set(const SkPdfNativeObject* key, SkPdfNativeObject* value) {
4470fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        //SkPdfMarkObjectUsed();
4480fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
449571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
450571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fObjectType == kName_PdfObjectType);
451571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
452571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
453571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
454571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
455571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
456571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4572ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        //// we rewrite all delimiters and white spaces with '\0', so we expect the end of name to be '\0'
4582ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
459571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
460d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return set(key->fStr.fBuffer, key->fStr.fBytes, value);
461571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
462571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4633aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    bool set(const char* key, SkPdfNativeObject* value) {
4640fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        //SkPdfMarkObjectUsed();
4650fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
466d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return set((const unsigned char*)key, strlen(key), value);
467d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com    }
468d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com
4693aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    bool set(const unsigned char* key, size_t len, SkPdfNativeObject* value) {
4700fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        //SkPdfMarkObjectUsed();
4710fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
472571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
473571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
474571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kDictionary_PdfObjectType) {
475571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
476571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
477571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
478571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
479d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return fMap->set((const char*)key, len, value);
480571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
481571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4823aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* get(const SkPdfNativeObject* key) {
4830fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
4840fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
485571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
486571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fObjectType == kName_PdfObjectType);
487571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
488571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
489571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
4903fc482620e8af9442f588e3bf364e198c41ba913edisonn@google.com            return NULL;
491571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
492571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4932ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
494571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
495d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return get(key->fStr.fBuffer, key->fStr.fBytes);
496571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
497571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4983aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* get(const char* key) {
4990fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5000fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
501d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return get((const unsigned char*)key, strlen(key));
502d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com    }
503d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com
5043aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* get(const unsigned char* key, size_t len) {
5050fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5060fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
507571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
508571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key);
509571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kDictionary_PdfObjectType) {
510571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
511571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
512571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
5133aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject* ret = NULL;
514d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        fMap->find((const char*)key, len, &ret);
5159a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
5169a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com#ifdef PDF_TRACE
5179a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        SkString _key;
5189a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        _key.append((const char*)key, len);
5199a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        printf("\nget(/%s) = %s\n", _key.c_str(), ret ? ret->toString(0, len + 9).c_str() : "_NOT_FOUND");
5209a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com#endif
5219a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
522571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return ret;
523571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
524571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5253aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* get(const SkPdfNativeObject* key) const {
5260fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5270fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
528571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
529571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fObjectType == kName_PdfObjectType);
530571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
531571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
532571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
5333fc482620e8af9442f588e3bf364e198c41ba913edisonn@google.com            return NULL;
534571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
535571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5362ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
537571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
538d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return get(key->fStr.fBuffer, key->fStr.fBytes);
539571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
540571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5413aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* get(const char* key) const {
5420fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5430fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
544d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return get((const unsigned char*)key, strlen(key));
545d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com    }
546d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com
5473aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* get(const unsigned char* key, size_t len) const {
5480fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5490fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
550571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
551571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key);
552571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kDictionary_PdfObjectType) {
553571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
554571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
555571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
5563aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject* ret = NULL;
557d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        fMap->find((const char*)key, len, &ret);
5589a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
5599a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com#ifdef PDF_TRACE
5609a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        SkString _key;
5619a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        _key.append((const char*)key, len);
5629a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        printf("\nget(/%s) = %s\n", _key.c_str(), ret ? ret->toString(0, len + 9).c_str() : "_NOT_FOUND");
5639a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com#endif
5649a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
565571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return ret;
566571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
567571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5683aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* get(const char* key, const char* abr) const {
5690fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5700fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
5713aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        const SkPdfNativeObject* ret = get(key);
572571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): / is a valid name, and it might be an abreviation, so "" should not be like NULL
573571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // make this distiontion in generator, and remove "" from condition
574571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (ret != NULL || abr == NULL || *abr == '\0') {
575571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return ret;
576571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
577571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return get(abr);
578571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
579571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5803aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* get(const char* key, const char* abr) {
5810fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5820fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
5833aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject* ret = get(key);
584571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): / is a valid name, and it might be an abreviation, so "" should not be like NULL
585571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // make this distiontion in generator, and remove "" from condition
586571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (ret != NULL || abr == NULL || *abr == '\0') {
587571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return ret;
588571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
589571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return get(abr);
590571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
591571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
592571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfDictionary* asDictionary() {
5930fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5940fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
595571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isDictionary());
596571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isDictionary()) {
597571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
598571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
599571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (SkPdfDictionary*) this;
600571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
601571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
602571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const SkPdfDictionary* asDictionary() const {
6030fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6040fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
605571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isDictionary());
606571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isDictionary()) {
607571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
608571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
609571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (SkPdfDictionary*) this;
610571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
611571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
612571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
613571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isReference() const {
6140fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6150fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
616571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kReference_PdfObjectType;
617571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
618571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
619571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isBoolean() const {
6200fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6210fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
622571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kBoolean_PdfObjectType;
623571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
624571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
625571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isInteger() const {
6260fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6270fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
628571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kInteger_PdfObjectType;
629571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
630571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
631571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isReal() const {
6320fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6330fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
634571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kReal_PdfObjectType;
635571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
636571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.compublic:
637571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isNumber() const {
6380fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6390fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
640571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kInteger_PdfObjectType || fObjectType == kReal_PdfObjectType;
641571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
642571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
643571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isKeywordReference() const {
6440fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6450fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
646571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kKeyword_PdfObjectType && fStr.fBytes == 1 && fStr.fBuffer[0] == 'R';
647571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
648571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
649571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isKeyword() const {
6500fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6510fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
652571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kKeyword_PdfObjectType;
653571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
654571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
6554ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com    bool isKeyword(const char* keyword) const {
6560fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6570fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
6584ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        if (!isKeyword()) {
6594ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com            return false;
6604ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        }
6614ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com
6624ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        if (strlen(keyword) != fStr.fBytes) {
6634ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com            return false;
6644ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        }
6654ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com
6664ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        if (strncmp(keyword, (const char*)fStr.fBuffer, fStr.fBytes) != 0) {
6674ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com            return false;
6684ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        }
6694ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com
6704ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        return true;
6714ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com    }
6724ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com
673571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isName() const {
6740fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6750fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
676571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kName_PdfObjectType;
677571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
678571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
67978b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com    bool isName(const char* name) const {
6800fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6810fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
68278b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com        return fObjectType == kName_PdfObjectType && fStr.fBytes == strlen(name) && strncmp((const char*)fStr.fBuffer, name, fStr.fBytes) == 0;
68378b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com    }
68478b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com
685571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isArray() const {
6860fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6870fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
688571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kArray_PdfObjectType;
689571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
690571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
691571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isDate() const {
6920fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6930fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
694571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType;
695571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
696571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
697571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isDictionary() const {
6980fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6990fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
700571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kDictionary_PdfObjectType;
701571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
702571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
703571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isFunction() const {
7040fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7050fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
706571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return false;  // NYI
707571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
708571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
709571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isRectangle() const {
7100fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7110fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
712571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kArray_PdfObjectType && fArray->count() == 4; // NYI + and elems are numbers
713571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
714571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
715571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): has stream .. or is stream ... TBD
716571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool hasStream() const {
7170fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7180fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
719571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return isDictionary() && fStr.fBuffer != NULL;
720571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
721571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
722571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): has stream .. or is stream ... TBD
723571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const SkPdfStream* getStream() const {
7240fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7250fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
726571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return hasStream() ? (const SkPdfStream*)this : NULL;
727571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
728571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
729571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfStream* getStream() {
7300fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7310fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
732571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return hasStream() ? (SkPdfStream*)this : NULL;
733571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
734571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
735571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isAnyString() const {
7360fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7370fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
738571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType;
739571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
740571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
741b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    bool isHexString() const {
7420fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7430fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
744b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        return fObjectType == kHexString_PdfObjectType;
745b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    }
746b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
747571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isMatrix() const {
7480fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7490fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
750571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kArray_PdfObjectType && fArray->count() == 6; // NYI + and elems are numbers
751571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
752571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
753571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline int64_t intValue() const {
7540fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7550fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
756571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kInteger_PdfObjectType);
757571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
758571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kInteger_PdfObjectType) {
759571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
760571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return 0;
761571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
762571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fIntegerValue;
763571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
764571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
765571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline double realValue() const {
7660fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7670fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
768571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kReal_PdfObjectType);
769571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
770571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kReal_PdfObjectType) {
771571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
772571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return 0;
773571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
774571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fRealValue;
775571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
776571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.compublic:
777571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline double numberValue() const {
7780fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7790fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
780571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isNumber());
781571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
782571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isNumber()) {
783571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
784571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return 0;
785571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
786571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kReal_PdfObjectType ? fRealValue : fIntegerValue;
787571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
788571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
789a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com    inline SkScalar scalarValue() const {
7900fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7910fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
792a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com        SkASSERT(isNumber());
793a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com
794a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com        if (!isNumber()) {
795a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com            // TODO(edisonn): log err
796a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com            return SkIntToScalar(0);
797a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com        }
798a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com        return fObjectType == kReal_PdfObjectType ? SkDoubleToScalar(fRealValue) :
799a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com                                                    SkIntToScalar(fIntegerValue);
800a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com    }
801a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com
802571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    int referenceId() const {
8030fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8040fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
805571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kReference_PdfObjectType);
806571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fRef.fId;
807571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
808571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
809571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    int referenceGeneration() const {
8100fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8110fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
812571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kReference_PdfObjectType);
813571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fRef.fGen;
814571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
815571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
816571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline const char* nameValue() const {
8170fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8180fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
819571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kName_PdfObjectType);
820571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
821571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kName_PdfObjectType) {
822571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
823571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return "";
824571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
825571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (const char*)fStr.fBuffer;
826571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
827571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
828571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline const char* stringValue() const {
8290fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8300fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
831571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType);
832571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
833571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_PdfObjectType) {
834571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
835571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return "";
836571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
837571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (const char*)fStr.fBuffer;
838571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
839571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
8402ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    inline NotOwnedString strRef() {
8410fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8420fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
8432ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        switch (fObjectType) {
8442ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            case kString_PdfObjectType:
8452ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            case kHexString_PdfObjectType:
8462ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            case kKeyword_PdfObjectType:
847276fed9e0ae2e4457efd61eeb14738040feb65f1edisonn@google.com            case kName_PdfObjectType:
8482ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                return fStr;
8492ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com
8502ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            default:
8512ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                // TODO(edisonn): report/warning
8522ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                return NotOwnedString();
8532ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        }
8542ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    }
8552ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com
856571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): nameValue2 and stringValue2 are used to make code generation easy,
857571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // but it is not a performat way to do it, since it will create an extra copy
858571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // remove these functions and make code generated faster
859063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    inline SkString nameValue2() const {
8600fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8610fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
862571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kName_PdfObjectType);
863571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
864571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kName_PdfObjectType) {
865571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
866063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com            return SkString();
867571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
868063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com        return SkString((const char*)fStr.fBuffer, fStr.fBytes);
869571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
870571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
871063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    inline SkString stringValue2() const {
8720fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8730fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
874571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType);
875571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
876571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_PdfObjectType) {
877571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
878063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com            return SkString();
879571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
880063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com        return SkString((const char*)fStr.fBuffer, fStr.fBytes);
881571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
882571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
883571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline bool boolValue() const {
8840fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8850fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
886571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kBoolean_PdfObjectType);
887571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
888f111a4b6855277bba8dac84cce7ccfa1b3f25d7cedisonn@google.com        if (fObjectType != kBoolean_PdfObjectType) {
889571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
890571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
891571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
892571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fBooleanValue;
893571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
894571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
895571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkRect rectangleValue() const {
8960fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8970fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
898571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isRectangle());
899571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isRectangle()) {
900571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return SkRect::MakeEmpty();
901571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
902571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
903571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        double array[4];
904571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        for (int i = 0; i < 4; i++) {
905571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): version where we could resolve references?
9063aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            const SkPdfNativeObject* elem = objAtAIndex(i);
907571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            if (elem == NULL || !elem->isNumber()) {
908571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report error
909571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return SkRect::MakeEmpty();
910571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            }
911571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            array[i] = elem->numberValue();
912571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
913571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
914571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return SkRect::MakeLTRB(SkDoubleToScalar(array[0]),
915571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                                SkDoubleToScalar(array[1]),
916571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                                SkDoubleToScalar(array[2]),
917571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                                SkDoubleToScalar(array[3]));
918571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
919571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
920571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkMatrix matrixValue() const {
9210fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
9220fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
923571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isMatrix());
924571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isMatrix()) {
925571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return SkMatrix::I();
926571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
927571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
928571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        double array[6];
929571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        for (int i = 0; i < 6; i++) {
930571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): version where we could resolve references?
9313aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            const SkPdfNativeObject* elem = objAtAIndex(i);
932571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            if (elem == NULL || !elem->isNumber()) {
933571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report error
934571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return SkMatrix::I();
935571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            }
936571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            array[i] = elem->numberValue();
937571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
938571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
939571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return SkMatrixFromPdfMatrix(array);
940571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
941571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
9422ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool filterStream();
943571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
944571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
9452ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool GetFilteredStreamRef(unsigned char const** buffer, size_t* len) {
9460fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
9470fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
948571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): add params that couls let the last filter in place if it is jpeg or png to fast load images
949571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!hasStream()) {
950571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
951571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
952571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
9532ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        filterStream();
954571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
955571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (buffer) {
956571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            *buffer = fStr.fBuffer;
957571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
958571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
959571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (len) {
9602ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            *len = fStr.fBytes >> 2;  // last 2 bits
961571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
962571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
963571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
964571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
965571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
966571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isStreamFiltered() const {
9670fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
9680fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
969571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return hasStream() && ((fStr.fBytes & 1) == kFilteredStreamBit);
970571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
971571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
9722ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool isStreamOwned() const {
9730fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
9740fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
9752ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        return hasStream() && ((fStr.fBytes & 2) == kOwnedStreamBit);
9762ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    }
9772ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com
9782ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool GetUnfilteredStreamRef(unsigned char const** buffer, size_t* len) const {
9790fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
9800fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
981571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (isStreamFiltered()) {
982571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
983571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
984571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
985571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!hasStream()) {
986571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
987571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
988571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
989571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (buffer) {
990571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            *buffer = fStr.fBuffer;
991571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
992571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
993571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (len) {
9942ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            *len = fStr.fBytes >> 2;  // remove last 2 bits
995571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
996571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
997571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
998571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
999571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
10002ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool addStream(const unsigned char* buffer, size_t len) {
10010fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        //SkPdfMarkObjectUsed();
10020fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
1003571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(!hasStream());
1004571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isDictionary());
1005571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1006571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isDictionary() || hasStream()) {
1007571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
1008571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
1009571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1010571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fStr.fBuffer = buffer;
1011571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fStr.fBytes = (len << 2) + kUnfilteredStreamBit;
1012571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1013571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
1014571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1015571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1016276fed9e0ae2e4457efd61eeb14738040feb65f1edisonn@google.com    static void appendSpaces(SkString* str, int level) {
10179a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        for (int i = 0 ; i < level; i++) {
10189a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com            str->append(" ");
10199a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        }
10209a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com    }
10219a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
10223aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void append(SkString* str, const char* data, size_t len, const char* prefix = "\\x") {
10233aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        for (unsigned int i = 0 ; i < len; i++) {
10243aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            if (data[i] == kNUL_PdfWhiteSpace) {
10253aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
10263aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("00");
10273aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else if (data[i] == kHT_PdfWhiteSpace) {
10283aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
10293aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("09");
10303aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else if (data[i] == kLF_PdfWhiteSpace) {
10313aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
10323aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("0A");
10333aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else if (data[i] == kFF_PdfWhiteSpace) {
10343aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
10353aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("0C");
10363aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else if (data[i] == kCR_PdfWhiteSpace) {
10373aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
10383aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("0D");
10393aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else {
10403aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(data + i, 1);
10413aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            }
10423aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        }
10433aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    }
10443aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com
1045e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com    SkString toString(int firstRowLevel = 0, int level = 0) {
1046571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkString str;
10479a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        appendSpaces(&str, firstRowLevel);
1048571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
1049571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kInvalid_PdfObjectType:
10509a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("__Invalid");
1051571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1052571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1053571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kBoolean_PdfObjectType:
10549a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.appendf("%s", fBooleanValue ? "true" : "false");
1055571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1056571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1057571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kInteger_PdfObjectType:
10589a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.appendf("%i", (int)fIntegerValue);
1059571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1060571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1061571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kReal_PdfObjectType:
10629a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.appendf("%f", fRealValue);
1063571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1064571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1065571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kString_PdfObjectType:
10669a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("\"");
10673aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                append(&str, (const char*)fStr.fBuffer, fStr.fBytes);
10689a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("\"");
1069571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1070571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1071571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kHexString_PdfObjectType:
10729a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("<");
1073b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                for (unsigned int i = 0 ; i < fStr.fBytes; i++) {
1074b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                    str.appendf("%02x", (unsigned int)fStr.fBuffer[i]);
1075b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                }
10769a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append(">");
1077571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1078571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1079571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kName_PdfObjectType:
10809a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("/");
10813aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                append(&str, (const char*)fStr.fBuffer, fStr.fBytes, "#");
1082571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1083571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1084571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kKeyword_PdfObjectType:
10853aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                append(&str, (const char*)fStr.fBuffer, fStr.fBytes);
1086571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1087571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1088571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kArray_PdfObjectType:
10899a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("[\n");
1090571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                for (unsigned int i = 0; i < size(); i++) {
10919a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    str.append(objAtAIndex(i)->toString(level + 1, level + 1));
10929a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    if (i < size() - 1) {
10939a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                        str.append(",");
10949a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    }
10959a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    str.append("\n");
1096571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                }
10979a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                appendSpaces(&str, level);
1098571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.append("]");
1099571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1100571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
11019a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com            case kDictionary_PdfObjectType: {
11023aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                    SkTDict<SkPdfNativeObject*>::Iter iter(*fMap);
11033aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                    SkPdfNativeObject* obj = NULL;
11049a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    const char* key = NULL;
11059a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    str.append("<<\n");
11069a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    while ((key = iter.next(&obj)) != NULL) {
11079a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                        appendSpaces(&str, level + 2);
11089a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                        str.appendf("/%s %s\n", key, obj->toString(0, level + strlen(key) + 4).c_str());
11099a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    }
11109a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    appendSpaces(&str, level);
11119a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    str.append(">>");
11129a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    if (hasStream()) {
1113e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        const unsigned char* stream = NULL;
1114e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        size_t length = 0;
1115e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        if (GetFilteredStreamRef(&stream, &length)) {
1116b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                            str.append("stream\n");
11173aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                            append(&str, (const char*)stream, length > 256 ? 256 : length);
1118b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                            str.append("\nendstream");
1119e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        } else {
1120e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                            str.append("stream STREAM_ERROR endstream");
1121e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        }
11229a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    }
1123571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                }
1124571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1125571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1126571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kNull_PdfObjectType:
1127571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str = "NULL";
1128571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1129571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1130571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kReference_PdfObjectType:
11319a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.appendf("%i %i R", fRef.fId, fRef.fGen);
1132571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1133571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1134571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kUndefined_PdfObjectType:
1135571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str = "Undefined";
1136571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1137571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1138571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
11399a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str = "Error";
1140571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1141571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
1142571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1143571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return str;
1144571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1145571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1146571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
11473aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeStringCore(const unsigned char* start, SkPdfNativeObject* obj, ObjectType type) {
1148571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, type);
1149571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1150571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
11513aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeStringCore(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj, ObjectType type) {
1152571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        makeStringCore(start, end - start, obj, type);
1153571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1154571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
11553aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void makeStringCore(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj, ObjectType type) {
1156571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
1157571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1158571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = type;
1159571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBuffer = start;
1160571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBytes = bytes;
1161571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1162571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
11632ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool applyFilter(const char* name);
11642ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool applyFlateDecodeFilter();
11652ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool applyDCTDecodeFilter();
1166571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com};
1167571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
11683aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfStream : public SkPdfNativeObject {};
11693aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfArray : public SkPdfNativeObject {};
11703aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfString : public SkPdfNativeObject {};
11713aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfHexString : public SkPdfNativeObject {};
11723aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfInteger : public SkPdfNativeObject {};
11733aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfReal : public SkPdfNativeObject {};
11743aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfNumber : public SkPdfNativeObject {};
1175571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
11763aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfName : public SkPdfNativeObject {
11773aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfName() : SkPdfNativeObject() {
11783aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject::makeName((const unsigned char*)"", this);
117978b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com    }
118078b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.compublic:
11813aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfName(char* name) : SkPdfNativeObject() {
11822ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        this->makeName((const unsigned char*)name, this);
118378b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com    }
118478b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com};
118578b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com
1186cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#endif  // SkPdfNativeObject
1187