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