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