| Index: experimental/PdfViewer/pdfparser/native/SkPdfNativeObject.h
|
| ===================================================================
|
| --- experimental/PdfViewer/pdfparser/native/SkPdfNativeObject.h (revision 11092)
|
| +++ experimental/PdfViewer/pdfparser/native/SkPdfNativeObject.h (working copy)
|
| @@ -103,9 +103,22 @@
|
| DataType fDataType;
|
|
|
|
|
| + // Keep this the last entrys
|
| +#ifdef PDF_TRACK_OBJECT_USAGE
|
| + mutable bool fUsed;
|
| +#endif // PDF_TRACK_OBJECT_USAGE
|
| +
|
| public:
|
|
|
| - SkPdfNativeObject() : fInRendering(0), fObjectType(kInvalid_PdfObjectType), fMap(NULL), fData(NULL), fDataType(kEmpty_Data) {}
|
| + SkPdfNativeObject() : fInRendering(0)
|
| + , fObjectType(kInvalid_PdfObjectType)
|
| + , fMap(NULL)
|
| + , fData(NULL)
|
| + , fDataType(kEmpty_Data)
|
| +#ifdef PDF_TRACK_OBJECT_USAGE
|
| + , fUsed(false)
|
| +#endif // PDF_TRACK_OBJECT_USAGE
|
| + {}
|
|
|
| bool inRendering() const { return fInRendering != 0; }
|
| void startRendering() {fInRendering = 1;}
|
| @@ -132,6 +145,8 @@
|
| // }
|
|
|
| void reset() {
|
| + SkPdfMarkObjectUnused();
|
| +
|
| switch (fObjectType) {
|
| case kArray_PdfObjectType:
|
| delete fArray;
|
| @@ -153,9 +168,15 @@
|
| releaseData();
|
| }
|
|
|
| - ObjectType type() { return fObjectType; }
|
| + ObjectType type() {
|
| + SkPdfMarkObjectUsed();
|
|
|
| + return fObjectType;
|
| + }
|
| +
|
| const char* c_str() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| switch (fObjectType) {
|
| case kString_PdfObjectType:
|
| case kHexString_PdfObjectType:
|
| @@ -170,6 +191,8 @@
|
| }
|
|
|
| size_t lenstr() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| switch (fObjectType) {
|
| case kString_PdfObjectType:
|
| case kHexString_PdfObjectType:
|
| @@ -353,18 +376,24 @@
|
| }
|
|
|
| size_t size() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kArray_PdfObjectType);
|
|
|
| return fArray->count();
|
| }
|
|
|
| SkPdfNativeObject* objAtAIndex(int i) {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kArray_PdfObjectType);
|
|
|
| return (*fArray)[i];
|
| }
|
|
|
| SkPdfNativeObject* removeLastInArray() {
|
| + // SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kArray_PdfObjectType);
|
|
|
| SkPdfNativeObject* ret = NULL;
|
| @@ -375,6 +404,8 @@
|
|
|
|
|
| const SkPdfNativeObject* objAtAIndex(int i) const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kArray_PdfObjectType);
|
|
|
| return (*fArray)[i];
|
| @@ -387,6 +418,8 @@
|
| }
|
|
|
| const SkPdfNativeObject* operator[](int i) const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kArray_PdfObjectType);
|
|
|
| return (*fArray)[i];
|
| @@ -411,6 +444,8 @@
|
| // add function SkPdfFastNameKey key(const char* key);
|
| // TODO(edisonn): setting the same key twike, will make the value undefined!
|
| bool set(const SkPdfNativeObject* key, SkPdfNativeObject* value) {
|
| + //SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kDictionary_PdfObjectType);
|
| SkASSERT(key->fObjectType == kName_PdfObjectType);
|
|
|
| @@ -426,10 +461,14 @@
|
| }
|
|
|
| bool set(const char* key, SkPdfNativeObject* value) {
|
| + //SkPdfMarkObjectUsed();
|
| +
|
| return set((const unsigned char*)key, strlen(key), value);
|
| }
|
|
|
| bool set(const unsigned char* key, size_t len, SkPdfNativeObject* value) {
|
| + //SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kDictionary_PdfObjectType);
|
|
|
| if (fObjectType != kDictionary_PdfObjectType) {
|
| @@ -441,6 +480,8 @@
|
| }
|
|
|
| SkPdfNativeObject* get(const SkPdfNativeObject* key) {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kDictionary_PdfObjectType);
|
| SkASSERT(key->fObjectType == kName_PdfObjectType);
|
|
|
| @@ -455,10 +496,14 @@
|
| }
|
|
|
| SkPdfNativeObject* get(const char* key) {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return get((const unsigned char*)key, strlen(key));
|
| }
|
|
|
| SkPdfNativeObject* get(const unsigned char* key, size_t len) {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kDictionary_PdfObjectType);
|
| SkASSERT(key);
|
| if (fObjectType != kDictionary_PdfObjectType) {
|
| @@ -478,6 +523,8 @@
|
| }
|
|
|
| const SkPdfNativeObject* get(const SkPdfNativeObject* key) const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kDictionary_PdfObjectType);
|
| SkASSERT(key->fObjectType == kName_PdfObjectType);
|
|
|
| @@ -492,10 +539,14 @@
|
| }
|
|
|
| const SkPdfNativeObject* get(const char* key) const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return get((const unsigned char*)key, strlen(key));
|
| }
|
|
|
| const SkPdfNativeObject* get(const unsigned char* key, size_t len) const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kDictionary_PdfObjectType);
|
| SkASSERT(key);
|
| if (fObjectType != kDictionary_PdfObjectType) {
|
| @@ -515,6 +566,8 @@
|
| }
|
|
|
| const SkPdfNativeObject* get(const char* key, const char* abr) const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| const SkPdfNativeObject* ret = get(key);
|
| // TODO(edisonn): / is a valid name, and it might be an abreviation, so "" should not be like NULL
|
| // make this distiontion in generator, and remove "" from condition
|
| @@ -525,6 +578,8 @@
|
| }
|
|
|
| SkPdfNativeObject* get(const char* key, const char* abr) {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkPdfNativeObject* ret = get(key);
|
| // TODO(edisonn): / is a valid name, and it might be an abreviation, so "" should not be like NULL
|
| // make this distiontion in generator, and remove "" from condition
|
| @@ -535,6 +590,8 @@
|
| }
|
|
|
| SkPdfDictionary* asDictionary() {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(isDictionary());
|
| if (!isDictionary()) {
|
| return NULL;
|
| @@ -543,6 +600,8 @@
|
| }
|
|
|
| const SkPdfDictionary* asDictionary() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(isDictionary());
|
| if (!isDictionary()) {
|
| return NULL;
|
| @@ -552,34 +611,50 @@
|
|
|
|
|
| bool isReference() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kReference_PdfObjectType;
|
| }
|
|
|
| bool isBoolean() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kBoolean_PdfObjectType;
|
| }
|
|
|
| bool isInteger() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kInteger_PdfObjectType;
|
| }
|
| private:
|
| bool isReal() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kReal_PdfObjectType;
|
| }
|
| public:
|
| bool isNumber() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kInteger_PdfObjectType || fObjectType == kReal_PdfObjectType;
|
| }
|
|
|
| bool isKeywordReference() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kKeyword_PdfObjectType && fStr.fBytes == 1 && fStr.fBuffer[0] == 'R';
|
| }
|
|
|
| bool isKeyword() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kKeyword_PdfObjectType;
|
| }
|
|
|
| bool isKeyword(const char* keyword) const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| if (!isKeyword()) {
|
| return false;
|
| }
|
| @@ -596,60 +671,88 @@
|
| }
|
|
|
| bool isName() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kName_PdfObjectType;
|
| }
|
|
|
| bool isName(const char* name) const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kName_PdfObjectType && fStr.fBytes == strlen(name) && strncmp((const char*)fStr.fBuffer, name, fStr.fBytes) == 0;
|
| }
|
|
|
| bool isArray() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kArray_PdfObjectType;
|
| }
|
|
|
| bool isDate() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType;
|
| }
|
|
|
| bool isDictionary() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kDictionary_PdfObjectType;
|
| }
|
|
|
| bool isFunction() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return false; // NYI
|
| }
|
|
|
| bool isRectangle() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kArray_PdfObjectType && fArray->count() == 4; // NYI + and elems are numbers
|
| }
|
|
|
| // TODO(edisonn): has stream .. or is stream ... TBD
|
| bool hasStream() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return isDictionary() && fStr.fBuffer != NULL;
|
| }
|
|
|
| // TODO(edisonn): has stream .. or is stream ... TBD
|
| const SkPdfStream* getStream() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return hasStream() ? (const SkPdfStream*)this : NULL;
|
| }
|
|
|
| SkPdfStream* getStream() {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return hasStream() ? (SkPdfStream*)this : NULL;
|
| }
|
|
|
| bool isAnyString() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType;
|
| }
|
|
|
| bool isHexString() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kHexString_PdfObjectType;
|
| }
|
|
|
| bool isMatrix() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return fObjectType == kArray_PdfObjectType && fArray->count() == 6; // NYI + and elems are numbers
|
| }
|
|
|
| inline int64_t intValue() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kInteger_PdfObjectType);
|
|
|
| if (fObjectType != kInteger_PdfObjectType) {
|
| @@ -660,6 +763,8 @@
|
| }
|
| private:
|
| inline double realValue() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kReal_PdfObjectType);
|
|
|
| if (fObjectType != kReal_PdfObjectType) {
|
| @@ -670,6 +775,8 @@
|
| }
|
| public:
|
| inline double numberValue() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(isNumber());
|
|
|
| if (!isNumber()) {
|
| @@ -680,6 +787,8 @@
|
| }
|
|
|
| inline SkScalar scalarValue() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(isNumber());
|
|
|
| if (!isNumber()) {
|
| @@ -691,16 +800,22 @@
|
| }
|
|
|
| int referenceId() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kReference_PdfObjectType);
|
| return fRef.fId;
|
| }
|
|
|
| int referenceGeneration() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kReference_PdfObjectType);
|
| return fRef.fGen;
|
| }
|
|
|
| inline const char* nameValue() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kName_PdfObjectType);
|
|
|
| if (fObjectType != kName_PdfObjectType) {
|
| @@ -711,6 +826,8 @@
|
| }
|
|
|
| inline const char* stringValue() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType);
|
|
|
| if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_PdfObjectType) {
|
| @@ -721,6 +838,8 @@
|
| }
|
|
|
| inline NotOwnedString strRef() {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| switch (fObjectType) {
|
| case kString_PdfObjectType:
|
| case kHexString_PdfObjectType:
|
| @@ -738,6 +857,8 @@
|
| // but it is not a performat way to do it, since it will create an extra copy
|
| // remove these functions and make code generated faster
|
| inline SkString nameValue2() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kName_PdfObjectType);
|
|
|
| if (fObjectType != kName_PdfObjectType) {
|
| @@ -748,6 +869,8 @@
|
| }
|
|
|
| inline SkString stringValue2() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexString_PdfObjectType);
|
|
|
| if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_PdfObjectType) {
|
| @@ -758,6 +881,8 @@
|
| }
|
|
|
| inline bool boolValue() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(fObjectType == kBoolean_PdfObjectType);
|
|
|
| if (fObjectType != kBoolean_PdfObjectType) {
|
| @@ -768,6 +893,8 @@
|
| }
|
|
|
| SkRect rectangleValue() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(isRectangle());
|
| if (!isRectangle()) {
|
| return SkRect::MakeEmpty();
|
| @@ -791,6 +918,8 @@
|
| }
|
|
|
| SkMatrix matrixValue() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(isMatrix());
|
| if (!isMatrix()) {
|
| return SkMatrix::I();
|
| @@ -814,6 +943,8 @@
|
|
|
|
|
| bool GetFilteredStreamRef(unsigned char const** buffer, size_t* len) {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| // TODO(edisonn): add params that couls let the last filter in place if it is jpeg or png to fast load images
|
| if (!hasStream()) {
|
| return false;
|
| @@ -833,14 +964,20 @@
|
| }
|
|
|
| bool isStreamFiltered() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return hasStream() && ((fStr.fBytes & 1) == kFilteredStreamBit);
|
| }
|
|
|
| bool isStreamOwned() const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| return hasStream() && ((fStr.fBytes & 2) == kOwnedStreamBit);
|
| }
|
|
|
| bool GetUnfilteredStreamRef(unsigned char const** buffer, size_t* len) const {
|
| + SkPdfMarkObjectUsed();
|
| +
|
| if (isStreamFiltered()) {
|
| return false;
|
| }
|
| @@ -861,6 +998,8 @@
|
| }
|
|
|
| bool addStream(const unsigned char* buffer, size_t len) {
|
| + //SkPdfMarkObjectUsed();
|
| +
|
| SkASSERT(!hasStream());
|
| SkASSERT(isDictionary());
|
|
|
|
|