SkPdfNativeObject.h revision bca421b468f53a591333918248f54bbd958389d2
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
106bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    // Keep this the last entries
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
111bca421b468f53a591333918248f54bbd958389d2edisonn@google.com#ifdef PDF_TRACK_STREAM_OFFSETS
112571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.compublic:
113bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    int fStreamId;
114bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    int fOffsetStart;
115bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    int fOffsetEnd;
116bca421b468f53a591333918248f54bbd958389d2edisonn@google.com#endif  // PDF_TRACK_STREAM_OFFSETS
117bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
118bca421b468f53a591333918248f54bbd958389d2edisonn@google.compublic:
119bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
120bca421b468f53a591333918248f54bbd958389d2edisonn@google.com#ifdef PDF_TRACK_STREAM_OFFSETS
121bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    int streamId() const { return fStreamId; }
122bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    int offsetStart() const { return fOffsetStart; }
123bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    int offsetEnd() const { return fOffsetEnd; }
124bca421b468f53a591333918248f54bbd958389d2edisonn@google.com#endif  // PDF_TRACK_STREAM_OFFSETS
125bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
126571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1270fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com    SkPdfNativeObject() : fInRendering(0)
1280fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com                        , fObjectType(kInvalid_PdfObjectType)
1290fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com                        , fMap(NULL)
1300fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com                        , fData(NULL)
1310fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com                        , fDataType(kEmpty_Data)
1320fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com#ifdef PDF_TRACK_OBJECT_USAGE
1330fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com                        , fUsed(false)
1340fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com#endif   // PDF_TRACK_OBJECT_USAGE
135bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
136bca421b468f53a591333918248f54bbd958389d2edisonn@google.com#ifdef PDF_TRACK_STREAM_OFFSETS
137bca421b468f53a591333918248f54bbd958389d2edisonn@google.com                        , fStreamId(-1)
138bca421b468f53a591333918248f54bbd958389d2edisonn@google.com                        , fOffsetStart(-1)
139bca421b468f53a591333918248f54bbd958389d2edisonn@google.com                        , fOffsetEnd(-1)
140bca421b468f53a591333918248f54bbd958389d2edisonn@google.com#endif  // PDF_TRACK_STREAM_OFFSETS
1410fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com    {}
142b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
143063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    bool inRendering() const { return fInRendering != 0; }
144063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    void startRendering() {fInRendering = 1;}
145063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    void doneRendering() {fInRendering = 0;}
146b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
147b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    inline bool hasData(DataType type) {
148b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        return type == fDataType;
149b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    }
150571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
151b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    inline void* data(DataType type) {
152b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        return type == fDataType ? fData : NULL;
153571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
154571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
155b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    inline void setData(void* data, DataType type) {
156b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        releaseData();
157b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        fDataType = type;
158571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fData = data;
159571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
160571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
161b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    void releaseData();
162b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
1633aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com//    ~SkPdfNativeObject() {
164222382b30a176db9d9044d9df1ae14e0fbe27181edisonn@google.com//        //reset();  must be called manually!
165222382b30a176db9d9044d9df1ae14e0fbe27181edisonn@google.com//    }
166571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
167571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    void reset() {
1680fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUnused();
1690fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
170571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
171571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kArray_PdfObjectType:
172571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                delete fArray;
173571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
174571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
175571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kDictionary_PdfObjectType:
176571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                delete fMap;
1772ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                if (isStreamOwned()) {
1782ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                    delete[] fStr.fBuffer;
1792ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                    fStr.fBuffer = NULL;
1802ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                    fStr.fBytes = 0;
1812ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                }
182571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
183571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
184571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
185571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
186571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
187571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fObjectType = kInvalid_PdfObjectType;
188b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        releaseData();
189571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
190571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1910fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com    ObjectType type() {
1920fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
1930fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
1940fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        return fObjectType;
1950fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com    }
196571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
197571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const char* c_str() const {
1980fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
1990fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
200571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
201571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kString_PdfObjectType:
202571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kHexString_PdfObjectType:
203571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kKeyword_PdfObjectType:
204276fed9e0ae2e4457efd61eeb14738040feb65f1edisonn@google.com            case kName_PdfObjectType:
205571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return (const char*)fStr.fBuffer;
206571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
207571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
208571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report/warning
209571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return NULL;
210571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
211571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
212571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
213e878e726bd1c16a0d177543471e071c7338193f4edisonn@google.com    size_t lenstr() const {
2140fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
2150fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
216571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
217571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kString_PdfObjectType:
218571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kHexString_PdfObjectType:
219571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kKeyword_PdfObjectType:
220276fed9e0ae2e4457efd61eeb14738040feb65f1edisonn@google.com            case kName_PdfObjectType:
221571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return fStr.fBytes;
222571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
223571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
224571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report/warning
225571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return 0;
226571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
227571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
228571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
229571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
230571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
231571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfDate& dateValue() const {
232571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfDate nyi;
233571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
234571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
235571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
236571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
237571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfFunction& functionValue() const {
238571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfFunction nyi;
239571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
240571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
241571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
242571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
243571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfFileSpec& fileSpecValue() const {
244571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfFileSpec nyi;
245571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
246571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
247571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
248571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): NYI
249571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfTree& treeValue() const {
250571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        static SkPdfTree nyi;
251571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return nyi;
252571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
253571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
254bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeBoolean(bool value, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
255bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        STORE_TRACK_PARAMETERS(obj);
256bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
257571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
258571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
259571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kBoolean_PdfObjectType;
260571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fBooleanValue = value;
261571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
262571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
263bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static SkPdfNativeObject makeBoolean(bool value GET_TRACK_PARAMETERS) {
2643aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject obj;
265bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
266bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        STORE_TRACK_PARAMETERS(&obj);
267bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
268571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj.fObjectType = kBoolean_PdfObjectType;
269571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj.fBooleanValue = value;
270571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return obj;
271571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
272571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
273bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeInteger(int64_t value, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
274bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        STORE_TRACK_PARAMETERS(obj);
275bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
276571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
277571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
278571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kInteger_PdfObjectType;
279571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fIntegerValue = value;
280571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
281571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
282bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeReal(double value, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
283bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        STORE_TRACK_PARAMETERS(obj);
284bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
285571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
286571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
287571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kReal_PdfObjectType;
288571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fRealValue = value;
289571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
290571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
291bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeNull(SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
292bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        STORE_TRACK_PARAMETERS(obj);
293bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
294571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
295571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
296571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kNull_PdfObjectType;
297571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
298571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
299bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static SkPdfNativeObject makeNull(GET_TRACK_PARAMETERS0) {
3003aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject obj;
301bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
302bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        STORE_TRACK_PARAMETERS(&obj);
303bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
304571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj.fObjectType = kNull_PdfObjectType;
305571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return obj;
306571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
307571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
3083aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static SkPdfNativeObject kNull;
309571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
310bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeNumeric(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
311571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
312571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
313571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): NYI properly
314571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // if has dot (impl), or exceeds max int, is real, otherwise is int
315571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        bool isInt = true;
3162ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        for (const unsigned char* current = start; current < end; current++) {
317571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            if (*current == '.') {
318571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                isInt = false;
319571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
320571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            }
321571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report parse issue with numbers like "24asdasd123"
322571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
323571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (isInt) {
324bca421b468f53a591333918248f54bbd958389d2edisonn@google.com            makeInteger(atol((const char*)start), obj PUT_TRACK_PARAMETERS);
325571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        } else {
326bca421b468f53a591333918248f54bbd958389d2edisonn@google.com            makeReal(atof((const char*)start), obj PUT_TRACK_PARAMETERS);
327571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
328571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
329571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
330bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeReference(unsigned int id, unsigned int gen, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
331bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        STORE_TRACK_PARAMETERS(obj);
332bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
333571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
334571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
335571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kReference_PdfObjectType;
336571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fRef.fId = id;
337571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fRef.fGen = gen;
338571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
339571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
340bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void resetAndMakeReference(unsigned int id, unsigned int gen, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
341bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        obj->reset();
342bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeReference(id, gen, obj PUT_TRACK_PARAMETERS);
343bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    }
344571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
345bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
346bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeString(const unsigned char* start, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
347bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kString_PdfObjectType PUT_TRACK_PARAMETERS);
348571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
349571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
350bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeString(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
351bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, end - start, obj, kString_PdfObjectType PUT_TRACK_PARAMETERS);
352571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
353571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
354bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeString(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
355bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, bytes, obj, kString_PdfObjectType PUT_TRACK_PARAMETERS);
356571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
357571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
358571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
359bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeHexString(const unsigned char* start, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
360bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kHexString_PdfObjectType PUT_TRACK_PARAMETERS);
361571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
362571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
363bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeHexString(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
364bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, end - start, obj, kHexString_PdfObjectType PUT_TRACK_PARAMETERS);
365571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
366571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
367bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeHexString(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
368bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, bytes, obj, kHexString_PdfObjectType PUT_TRACK_PARAMETERS);
369571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
370571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
371571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
372bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeName(const unsigned char* start, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
373bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kName_PdfObjectType PUT_TRACK_PARAMETERS);
374571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
375571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
376bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeName(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
377bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, end - start, obj, kName_PdfObjectType PUT_TRACK_PARAMETERS);
378571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
379571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
380bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeName(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
381bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, bytes, obj, kName_PdfObjectType PUT_TRACK_PARAMETERS);
382571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
383571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
384571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
385bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeKeyword(const unsigned char* start, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
386bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, kKeyword_PdfObjectType PUT_TRACK_PARAMETERS);
387571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
388571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
389bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeKeyword(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
390bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, end - start, obj, kKeyword_PdfObjectType PUT_TRACK_PARAMETERS);
391571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
392571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
393bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeKeyword(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
394bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, bytes, obj, kKeyword_PdfObjectType PUT_TRACK_PARAMETERS);
395571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
396571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
397571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
398571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
399571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): make the functions to return SkPdfArray, move these functions in SkPdfArray
400bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeEmptyArray(SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
401bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        STORE_TRACK_PARAMETERS(obj);
402bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
403571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
404571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
405571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kArray_PdfObjectType;
4063aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        obj->fArray = new SkTDArray<SkPdfNativeObject*>();
407571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // return (SkPdfArray*)obj;
408571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
409571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4103aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    bool appendInArray(SkPdfNativeObject* obj) {
411571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
412571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kArray_PdfObjectType) {
413571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
414571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
415571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
416571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
417571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fArray->push(obj);
418571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
419571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
420571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
421571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    size_t size() const {
4220fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
4230fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
424571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
425571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
426571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fArray->count();
427571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
428571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4293aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* objAtAIndex(int i) {
4300fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
4310fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
432571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
433571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
434571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
435571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
436571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4373aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* removeLastInArray() {
4380fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        // SkPdfMarkObjectUsed();
4390fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
440571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
441571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4423aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject* ret = NULL;
443571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fArray->pop(&ret);
444571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
445571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return ret;
446571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
447571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
448571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4493aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* objAtAIndex(int i) const {
4500fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
4510fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
452571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
453571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
454571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
455571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
456571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4573aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* operator[](int i) {
458571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
459571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
460571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
461571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
462571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
4633aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* operator[](int i) const {
4640fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
4650fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
466571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kArray_PdfObjectType);
467571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
468571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (*fArray)[i];
469571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
470571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
471571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
472571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): make the functions to return SkPdfDictionary, move these functions in SkPdfDictionary
473bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeEmptyDictionary(SkPdfNativeObject* obj GET_TRACK_PARAMETERS) {
474bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        STORE_TRACK_PARAMETERS(obj);
475bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
476571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
477571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
478571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = kDictionary_PdfObjectType;
4793aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        obj->fMap = new SkTDict<SkPdfNativeObject*>(1);
480571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBuffer = NULL;
481571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBytes = 0;
482571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
483571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
484571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): get all the possible names from spec, and compute a hash function
485571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // that would create no overlaps in the same dictionary
486571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // or build a tree of chars that when followed goes to a unique id/index/hash
487571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): generate constants like kDictFoo, kNameDict_name
488571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // which will be used in code
489571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // add function SkPdfFastNameKey key(const char* key);
490571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): setting the same key twike, will make the value undefined!
4913aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    bool set(const SkPdfNativeObject* key, SkPdfNativeObject* value) {
4920fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        //SkPdfMarkObjectUsed();
4930fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
494571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
495571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fObjectType == kName_PdfObjectType);
496571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
497571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
498571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
499571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
500571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
501571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5022ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        //// we rewrite all delimiters and white spaces with '\0', so we expect the end of name to be '\0'
5032ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
504571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
505d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return set(key->fStr.fBuffer, key->fStr.fBytes, value);
506571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
507571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5083aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    bool set(const char* key, SkPdfNativeObject* value) {
5090fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        //SkPdfMarkObjectUsed();
5100fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
511d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return set((const unsigned char*)key, strlen(key), value);
512d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com    }
513d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com
5143aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    bool set(const unsigned char* key, size_t len, SkPdfNativeObject* value) {
5150fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        //SkPdfMarkObjectUsed();
5160fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
517571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
518571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
519571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kDictionary_PdfObjectType) {
520571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
521571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
522571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
523571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
524d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return fMap->set((const char*)key, len, value);
525571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
526571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5273aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* get(const SkPdfNativeObject* key) {
5280fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5290fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
530571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
531571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fObjectType == kName_PdfObjectType);
532571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
533571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
534571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
5353fc482620e8af9442f588e3bf364e198c41ba913edisonn@google.com            return NULL;
536571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
537571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5382ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
539571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
540d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return get(key->fStr.fBuffer, key->fStr.fBytes);
541571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
542571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5433aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* get(const char* key) {
5440fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5450fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
546d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return get((const unsigned char*)key, strlen(key));
547d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com    }
548d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com
5493aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* get(const unsigned char* key, size_t len) {
5500fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5510fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
552571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
553571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key);
554571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kDictionary_PdfObjectType) {
555571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
556571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
557571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
5583aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject* ret = NULL;
559d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        fMap->find((const char*)key, len, &ret);
5609a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
5619a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com#ifdef PDF_TRACE
5629a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        SkString _key;
5639a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        _key.append((const char*)key, len);
5649a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        printf("\nget(/%s) = %s\n", _key.c_str(), ret ? ret->toString(0, len + 9).c_str() : "_NOT_FOUND");
5659a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com#endif
5669a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
567571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return ret;
568571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
569571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5703aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* get(const SkPdfNativeObject* key) const {
5710fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5720fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
573571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
574571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key->fObjectType == kName_PdfObjectType);
575571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
576571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionary_PdfObjectType) {
577571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
5783fc482620e8af9442f588e3bf364e198c41ba913edisonn@google.com            return NULL;
579571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
580571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5812ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
582571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
583d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return get(key->fStr.fBuffer, key->fStr.fBytes);
584571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
585571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
5863aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* get(const char* key) const {
5870fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5880fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
589d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        return get((const unsigned char*)key, strlen(key));
590d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com    }
591d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com
5923aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* get(const unsigned char* key, size_t len) const {
5930fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
5940fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
595571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kDictionary_PdfObjectType);
596571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(key);
597571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kDictionary_PdfObjectType) {
598571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): report err
599571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
600571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
6013aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject* ret = NULL;
602d761e3295c10e467d5ae4a5f52ad80c85b656e23edisonn@google.com        fMap->find((const char*)key, len, &ret);
6039a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
6049a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com#ifdef PDF_TRACE
6059a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        SkString _key;
6069a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        _key.append((const char*)key, len);
6079a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        printf("\nget(/%s) = %s\n", _key.c_str(), ret ? ret->toString(0, len + 9).c_str() : "_NOT_FOUND");
6089a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com#endif
6099a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
610571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return ret;
611571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
612571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
6133aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    const SkPdfNativeObject* get(const char* key, const char* abr) const {
6140fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6150fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
6163aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        const SkPdfNativeObject* ret = get(key);
617571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): / is a valid name, and it might be an abreviation, so "" should not be like NULL
618571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // make this distiontion in generator, and remove "" from condition
619571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (ret != NULL || abr == NULL || *abr == '\0') {
620571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return ret;
621571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
622571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return get(abr);
623571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
624571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
6253aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfNativeObject* get(const char* key, const char* abr) {
6260fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6270fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
6283aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        SkPdfNativeObject* ret = get(key);
629571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): / is a valid name, and it might be an abreviation, so "" should not be like NULL
630571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // make this distiontion in generator, and remove "" from condition
631571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (ret != NULL || abr == NULL || *abr == '\0') {
632571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return ret;
633571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
634571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return get(abr);
635571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
636571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
637571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfDictionary* asDictionary() {
6380fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6390fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
640571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isDictionary());
641571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isDictionary()) {
642571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
643571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
644571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (SkPdfDictionary*) this;
645571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
646571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
647571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const SkPdfDictionary* asDictionary() const {
6480fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6490fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
650571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isDictionary());
651571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isDictionary()) {
652571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return NULL;
653571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
654571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (SkPdfDictionary*) this;
655571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
656571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
657571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
658571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isReference() const {
6590fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6600fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
661571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kReference_PdfObjectType;
662571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
663571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
664571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isBoolean() const {
6650fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6660fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
667571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kBoolean_PdfObjectType;
668571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
669571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
670571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isInteger() const {
6710fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6720fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
673571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kInteger_PdfObjectType;
674571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
675571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
676571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isReal() const {
6770fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6780fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
679571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kReal_PdfObjectType;
680571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
681571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.compublic:
682571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isNumber() const {
6830fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6840fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
685571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kInteger_PdfObjectType || fObjectType == kReal_PdfObjectType;
686571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
687571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
688571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isKeywordReference() const {
6890fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6900fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
691571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kKeyword_PdfObjectType && fStr.fBytes == 1 && fStr.fBuffer[0] == 'R';
692571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
693571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
694571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isKeyword() const {
6950fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
6960fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
697571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kKeyword_PdfObjectType;
698571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
699571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
7004ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com    bool isKeyword(const char* keyword) const {
7010fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7020fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
7034ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        if (!isKeyword()) {
7044ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com            return false;
7054ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        }
7064ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com
7074ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        if (strlen(keyword) != fStr.fBytes) {
7084ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com            return false;
7094ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        }
7104ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com
7114ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        if (strncmp(keyword, (const char*)fStr.fBuffer, fStr.fBytes) != 0) {
7124ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com            return false;
7134ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        }
7144ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com
7154ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com        return true;
7164ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com    }
7174ef4bed00efd247a0ea005b95b7239a9d4c14c68edisonn@google.com
718571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isName() const {
7190fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7200fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
721571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kName_PdfObjectType;
722571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
723571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
72478b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com    bool isName(const char* name) const {
7250fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7260fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
72778b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com        return fObjectType == kName_PdfObjectType && fStr.fBytes == strlen(name) && strncmp((const char*)fStr.fBuffer, name, fStr.fBytes) == 0;
72878b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com    }
72978b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com
730571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isArray() const {
7310fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7320fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
733571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kArray_PdfObjectType;
734571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
735571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
736571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isDate() const {
7370fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7380fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
739571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType;
740571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
741571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
742571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isDictionary() const {
7430fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7440fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
745571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kDictionary_PdfObjectType;
746571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
747571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
748571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isFunction() const {
7490fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7500fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
751571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return false;  // NYI
752571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
753571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
754571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isRectangle() const {
7550fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7560fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
757571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kArray_PdfObjectType && fArray->count() == 4; // NYI + and elems are numbers
758571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
759571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
760571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): has stream .. or is stream ... TBD
761571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool hasStream() const {
7620fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7630fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
764571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return isDictionary() && fStr.fBuffer != NULL;
765571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
766571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
767571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): has stream .. or is stream ... TBD
768571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    const SkPdfStream* getStream() const {
7690fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7700fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
771571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return hasStream() ? (const SkPdfStream*)this : NULL;
772571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
773571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
774571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkPdfStream* getStream() {
7750fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7760fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
777571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return hasStream() ? (SkPdfStream*)this : NULL;
778571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
779571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
780571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isAnyString() const {
7810fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7820fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
783571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType;
784571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
785571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
786b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    bool isHexString() const {
7870fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7880fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
789b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com        return fObjectType == kHexString_PdfObjectType;
790b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com    }
791b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com
792571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isMatrix() const {
7930fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
7940fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
795571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kArray_PdfObjectType && fArray->count() == 6; // NYI + and elems are numbers
796571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
797571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
798571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline int64_t intValue() const {
7990fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8000fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
801571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kInteger_PdfObjectType);
802571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
803571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kInteger_PdfObjectType) {
804571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
805571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return 0;
806571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
807571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fIntegerValue;
808571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
809571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
810571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline double realValue() const {
8110fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8120fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
813571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kReal_PdfObjectType);
814571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
815571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kReal_PdfObjectType) {
816571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
817571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return 0;
818571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
819571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fRealValue;
820571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
821571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.compublic:
822571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline double numberValue() const {
8230fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8240fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
825571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isNumber());
826571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
827571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isNumber()) {
828571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
829571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return 0;
830571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
831571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fObjectType == kReal_PdfObjectType ? fRealValue : fIntegerValue;
832571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
833571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
834a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com    inline SkScalar scalarValue() const {
8350fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8360fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
837a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com        SkASSERT(isNumber());
838a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com
839a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com        if (!isNumber()) {
840a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com            // TODO(edisonn): log err
841a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com            return SkIntToScalar(0);
842a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com        }
843a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com        return fObjectType == kReal_PdfObjectType ? SkDoubleToScalar(fRealValue) :
844a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com                                                    SkIntToScalar(fIntegerValue);
845a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com    }
846a0cefa18fc25cca4264be04ce30c0c9692487a02edisonn@google.com
847571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    int referenceId() const {
8480fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8490fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
850571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kReference_PdfObjectType);
851571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fRef.fId;
852571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
853571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
854571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    int referenceGeneration() const {
8550fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8560fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
857571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kReference_PdfObjectType);
858571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fRef.fGen;
859571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
860571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
861571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline const char* nameValue() const {
8620fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8630fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
864571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kName_PdfObjectType);
865571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
866571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kName_PdfObjectType) {
867571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
868571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return "";
869571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
870571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (const char*)fStr.fBuffer;
871571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
872571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
873571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline const char* stringValue() const {
8740fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8750fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
876571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType);
877571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
878571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_PdfObjectType) {
879571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
880571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return "";
881571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
882571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return (const char*)fStr.fBuffer;
883571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
884571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
8852ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    inline NotOwnedString strRef() {
8860fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
8870fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
8882ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        switch (fObjectType) {
8892ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            case kString_PdfObjectType:
8902ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            case kHexString_PdfObjectType:
8912ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            case kKeyword_PdfObjectType:
892276fed9e0ae2e4457efd61eeb14738040feb65f1edisonn@google.com            case kName_PdfObjectType:
8932ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                return fStr;
8942ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com
8952ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            default:
8962ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                // TODO(edisonn): report/warning
8972ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com                return NotOwnedString();
8982ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        }
8992ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    }
9002ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com
901571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // TODO(edisonn): nameValue2 and stringValue2 are used to make code generation easy,
902571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // but it is not a performat way to do it, since it will create an extra copy
903571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    // remove these functions and make code generated faster
904063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    inline SkString nameValue2() const {
9050fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
9060fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
907571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kName_PdfObjectType);
908571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
909571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kName_PdfObjectType) {
910571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
911063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com            return SkString();
912571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
913063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com        return SkString((const char*)fStr.fBuffer, fStr.fBytes);
914571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
915571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
916063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com    inline SkString stringValue2() const {
9170fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
9180fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
919571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType);
920571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
921571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_PdfObjectType) {
922571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
923063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com            return SkString();
924571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
925063d7072ef45971c17045721626b3f0cd052b3b9edisonn@google.com        return SkString((const char*)fStr.fBuffer, fStr.fBytes);
926571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
927571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
928571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    inline bool boolValue() const {
9290fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
9300fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
931571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(fObjectType == kBoolean_PdfObjectType);
932571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
933f111a4b6855277bba8dac84cce7ccfa1b3f25d7cedisonn@google.com        if (fObjectType != kBoolean_PdfObjectType) {
934571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): log err
935571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
936571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
937571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return fBooleanValue;
938571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
939571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
940571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkRect rectangleValue() const {
9410fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
9420fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
943571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isRectangle());
944571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isRectangle()) {
945571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return SkRect::MakeEmpty();
946571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
947571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
948571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        double array[4];
949571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        for (int i = 0; i < 4; i++) {
950571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): version where we could resolve references?
9513aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            const SkPdfNativeObject* elem = objAtAIndex(i);
952571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            if (elem == NULL || !elem->isNumber()) {
953571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report error
954571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return SkRect::MakeEmpty();
955571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            }
956571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            array[i] = elem->numberValue();
957571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
958571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
959571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return SkRect::MakeLTRB(SkDoubleToScalar(array[0]),
960571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                                SkDoubleToScalar(array[1]),
961571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                                SkDoubleToScalar(array[2]),
962571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                                SkDoubleToScalar(array[3]));
963571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
964571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
965571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    SkMatrix matrixValue() const {
9660fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
9670fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
968571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isMatrix());
969571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isMatrix()) {
970571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return SkMatrix::I();
971571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
972571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
973571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        double array[6];
974571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        for (int i = 0; i < 6; i++) {
975571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            // TODO(edisonn): version where we could resolve references?
9763aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            const SkPdfNativeObject* elem = objAtAIndex(i);
977571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            if (elem == NULL || !elem->isNumber()) {
978571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                // TODO(edisonn): report error
979571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                return SkMatrix::I();
980571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            }
981571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            array[i] = elem->numberValue();
982571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
983571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
984571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return SkMatrixFromPdfMatrix(array);
985571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
986571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
9872ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool filterStream();
988571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
989571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
9902ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool GetFilteredStreamRef(unsigned char const** buffer, size_t* len) {
9910fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
9920fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
993571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        // TODO(edisonn): add params that couls let the last filter in place if it is jpeg or png to fast load images
994571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!hasStream()) {
995571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
996571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
997571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
9982ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        filterStream();
999571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1000571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (buffer) {
1001571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            *buffer = fStr.fBuffer;
1002571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
1003571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1004571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (len) {
10052ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            *len = fStr.fBytes >> 2;  // last 2 bits
1006571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
1007571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1008571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
1009571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1010571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1011571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    bool isStreamFiltered() const {
10120fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
10130fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
1014571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return hasStream() && ((fStr.fBytes & 1) == kFilteredStreamBit);
1015571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1016571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
10172ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool isStreamOwned() const {
10180fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
10190fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
10202ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com        return hasStream() && ((fStr.fBytes & 2) == kOwnedStreamBit);
10212ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    }
10222ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com
10232ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool GetUnfilteredStreamRef(unsigned char const** buffer, size_t* len) const {
10240fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        SkPdfMarkObjectUsed();
10250fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
1026571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (isStreamFiltered()) {
1027571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
1028571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
1029571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1030571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!hasStream()) {
1031571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
1032571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
1033571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1034571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (buffer) {
1035571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            *buffer = fStr.fBuffer;
1036571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
1037571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1038571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (len) {
10392ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com            *len = fStr.fBytes >> 2;  // remove last 2 bits
1040571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
1041571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1042571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
1043571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1044571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
10452ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool addStream(const unsigned char* buffer, size_t len) {
10460fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com        //SkPdfMarkObjectUsed();
10470fd25d8b22ae092183f3dc67dec4c0c1bbde06bfedisonn@google.com
1048571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(!hasStream());
1049571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(isDictionary());
1050571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1051571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        if (!isDictionary() || hasStream()) {
1052571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            return false;
1053571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
1054571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1055571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fStr.fBuffer = buffer;
1056571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        fStr.fBytes = (len << 2) + kUnfilteredStreamBit;
1057571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1058571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return true;
1059571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1060571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1061276fed9e0ae2e4457efd61eeb14738040feb65f1edisonn@google.com    static void appendSpaces(SkString* str, int level) {
10629a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        for (int i = 0 ; i < level; i++) {
10639a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com            str->append(" ");
10649a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        }
10659a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com    }
10669a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com
10673aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    static void append(SkString* str, const char* data, size_t len, const char* prefix = "\\x") {
10683aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        for (unsigned int i = 0 ; i < len; i++) {
10693aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            if (data[i] == kNUL_PdfWhiteSpace) {
10703aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
10713aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("00");
10723aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else if (data[i] == kHT_PdfWhiteSpace) {
10733aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
10743aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("09");
10753aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else if (data[i] == kLF_PdfWhiteSpace) {
10763aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
10773aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("0A");
10783aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else if (data[i] == kFF_PdfWhiteSpace) {
10793aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
10803aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("0C");
10813aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else if (data[i] == kCR_PdfWhiteSpace) {
10823aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(prefix);
10833aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append("0D");
10843aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            } else {
10853aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                str->append(data + i, 1);
10863aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com            }
10873aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com        }
10883aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    }
10893aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com
1090e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com    SkString toString(int firstRowLevel = 0, int level = 0) {
1091571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkString str;
10929a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com        appendSpaces(&str, firstRowLevel);
1093571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        switch (fObjectType) {
1094571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kInvalid_PdfObjectType:
10959a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("__Invalid");
1096571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1097571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1098571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kBoolean_PdfObjectType:
10999a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.appendf("%s", fBooleanValue ? "true" : "false");
1100571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1101571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1102571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kInteger_PdfObjectType:
11039a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.appendf("%i", (int)fIntegerValue);
1104571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1105571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1106571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kReal_PdfObjectType:
11079a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.appendf("%f", fRealValue);
1108571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1109571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1110571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kString_PdfObjectType:
11119a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("\"");
11123aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                append(&str, (const char*)fStr.fBuffer, fStr.fBytes);
11139a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("\"");
1114571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1115571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1116571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kHexString_PdfObjectType:
11179a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("<");
1118b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                for (unsigned int i = 0 ; i < fStr.fBytes; i++) {
1119b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                    str.appendf("%02x", (unsigned int)fStr.fBuffer[i]);
1120b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                }
11219a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append(">");
1122571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1123571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1124571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kName_PdfObjectType:
11259a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("/");
11263aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                append(&str, (const char*)fStr.fBuffer, fStr.fBytes, "#");
1127571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1128571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1129571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kKeyword_PdfObjectType:
11303aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                append(&str, (const char*)fStr.fBuffer, fStr.fBytes);
1131571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1132571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1133571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kArray_PdfObjectType:
11349a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.append("[\n");
1135571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                for (unsigned int i = 0; i < size(); i++) {
11369a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    str.append(objAtAIndex(i)->toString(level + 1, level + 1));
11379a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    if (i < size() - 1) {
11389a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                        str.append(",");
11399a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    }
11409a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    str.append("\n");
1141571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                }
11429a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                appendSpaces(&str, level);
1143571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str.append("]");
1144571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1145571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
11469a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com            case kDictionary_PdfObjectType: {
11473aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                    SkTDict<SkPdfNativeObject*>::Iter iter(*fMap);
11483aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                    SkPdfNativeObject* obj = NULL;
11499a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    const char* key = NULL;
11509a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    str.append("<<\n");
11519a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    while ((key = iter.next(&obj)) != NULL) {
11529a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                        appendSpaces(&str, level + 2);
11539a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                        str.appendf("/%s %s\n", key, obj->toString(0, level + strlen(key) + 4).c_str());
11549a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    }
11559a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    appendSpaces(&str, level);
11569a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    str.append(">>");
11579a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    if (hasStream()) {
1158e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        const unsigned char* stream = NULL;
1159e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        size_t length = 0;
1160e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        if (GetFilteredStreamRef(&stream, &length)) {
1161b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                            str.append("stream\n");
11623aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com                            append(&str, (const char*)stream, length > 256 ? 256 : length);
1163b0145ce60ea1a3bacc786ec1285218c6fe70c8a3edisonn@google.com                            str.append("\nendstream");
1164e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        } else {
1165e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                            str.append("stream STREAM_ERROR endstream");
1166e2e01ffb948468d4c3701f7f2a1d0c5ea75657f4edisonn@google.com                        }
11679a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                    }
1168571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                }
1169571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1170571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1171571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kNull_PdfObjectType:
1172571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str = "NULL";
1173571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1174571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1175571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kReference_PdfObjectType:
11769a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str.appendf("%i %i R", fRef.fId, fRef.fGen);
1177571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1178571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1179571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            case kUndefined_PdfObjectType:
1180571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                str = "Undefined";
1181571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1182571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1183571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com            default:
11849a43c18740d3251b4d52703a0247719a0aef6474edisonn@google.com                str = "Error";
1185571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com                break;
1186571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        }
1187571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1188571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        return str;
1189571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1190571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1191571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.comprivate:
1192bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeStringCore(const unsigned char* start, SkPdfNativeObject* obj, ObjectType type GET_TRACK_PARAMETERS) {
1193bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, strlen((const char*)start), obj, type PUT_TRACK_PARAMETERS);
1194571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1195571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1196bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeStringCore(const unsigned char* start, const unsigned char* end, SkPdfNativeObject* obj, ObjectType type GET_TRACK_PARAMETERS) {
1197bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        makeStringCore(start, end - start, obj, type PUT_TRACK_PARAMETERS);
1198571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1199571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1200bca421b468f53a591333918248f54bbd958389d2edisonn@google.com    static void makeStringCore(const unsigned char* start, size_t bytes, SkPdfNativeObject* obj, ObjectType type GET_TRACK_PARAMETERS) {
1201bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        STORE_TRACK_PARAMETERS(obj);
1202bca421b468f53a591333918248f54bbd958389d2edisonn@google.com
1203571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
1204571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
1205571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fObjectType = type;
1206571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBuffer = start;
1207571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com        obj->fStr.fBytes = bytes;
1208571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com    }
1209571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
12102ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool applyFilter(const char* name);
12112ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool applyFlateDecodeFilter();
12122ccc3afa474f9485c39c2e863252ddaa3f35724bedisonn@google.com    bool applyDCTDecodeFilter();
1213571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com};
1214571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
12153aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfStream : public SkPdfNativeObject {};
12163aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfArray : public SkPdfNativeObject {};
12173aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfString : public SkPdfNativeObject {};
12183aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfHexString : public SkPdfNativeObject {};
12193aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfInteger : public SkPdfNativeObject {};
12203aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfReal : public SkPdfNativeObject {};
12213aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfNumber : public SkPdfNativeObject {};
1222571c70b95f56e22b5a7d6f4f288aa6c9a925a64fedisonn@google.com
12233aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.comclass SkPdfName : public SkPdfNativeObject {
12243aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfName() : SkPdfNativeObject() {
1225bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        SkPdfNativeObject::makeName((const unsigned char*)"", this PUT_TRACK_PARAMETERS_SRC);
122678b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com    }
122778b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.compublic:
12283aa355527a3b91d3e12b8bee49e5637d00a736caedisonn@google.com    SkPdfName(char* name) : SkPdfNativeObject() {
1229bca421b468f53a591333918248f54bbd958389d2edisonn@google.com        this->makeName((const unsigned char*)name, this PUT_TRACK_PARAMETERS_SRC);
123078b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com    }
123178b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com};
123278b38b130deb8bcfa41611039875ce0162542ac1edisonn@google.com
1233cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#endif  // SkPdfNativeObject
1234