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