Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: experimental/PdfViewer/pdfparser/native/SkPdfObject.h

Issue 21738005: pdfviewer: add indexed rbg image support, enhanche caching(setData) for SkPdfObject (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 #ifndef EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_ 1 #ifndef EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_
2 #define EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_ 2 #define EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_
3 3
4 #include <stdint.h> 4 #include <stdint.h>
5 #include <string.h> 5 #include <string.h>
6 #include <string> 6 #include <string>
7 #include "SkTDArray.h" 7 #include "SkTDArray.h"
8 #include "SkTDict.h" 8 #include "SkTDict.h"
9 #include "SkRect.h" 9 #include "SkRect.h"
10 #include "SkMatrix.h" 10 #include "SkMatrix.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 kDictionary_PdfObjectType, 42 kDictionary_PdfObjectType,
43 kNull_PdfObjectType, 43 kNull_PdfObjectType,
44 44
45 // TODO(edisonn): after the pdf has been loaded completely, resolve all references 45 // TODO(edisonn): after the pdf has been loaded completely, resolve all references
46 // try the same thing with delayed loaded ... 46 // try the same thing with delayed loaded ...
47 kReference_PdfObjectType, 47 kReference_PdfObjectType,
48 48
49 kUndefined_PdfObjectType, // per 1.4 spec, if the same key appear twic e in the dictionary, the value is undefined 49 kUndefined_PdfObjectType, // per 1.4 spec, if the same key appear twic e in the dictionary, the value is undefined
50 }; 50 };
51 51
52 enum DataType {
53 kEmpty_Data,
54 kFont_Data,
55 kBitmap_Data,
56 };
57
52 private: 58 private:
53 struct Reference { 59 struct Reference {
54 unsigned int fId; 60 unsigned int fId;
55 unsigned int fGen; 61 unsigned int fGen;
56 }; 62 };
57 63
58 // TODO(edisonn): add stream start, stream end, where stream is weither the file 64 // TODO(edisonn): add stream start, stream end, where stream is weither the file
59 // or decoded/filtered pdf stream 65 // or decoded/filtered pdf stream
60 66
61 // TODO(edisonn): add warning/report per object 67 // TODO(edisonn): add warning/report per object
62 // TODO(edisonn): add flag fUsed, to be used once the parsing is complete, 68 // TODO(edisonn): add flag fUsed, to be used once the parsing is complete,
63 // so we could show what parts have been proccessed, ignored, or generated e rrors 69 // so we could show what parts have been proccessed, ignored, or generated e rrors
64 70
65 ObjectType fObjectType; 71 ObjectType fObjectType;
66 72
67 union { 73 union {
68 bool fBooleanValue; 74 bool fBooleanValue;
69 int64_t fIntegerValue; 75 int64_t fIntegerValue;
70 // TODO(edisonn): double, float? typedefed 76 // TODO(edisonn): double, float? typedefed
71 double fRealValue; 77 double fRealValue;
72 NotOwnedString fStr; 78 NotOwnedString fStr;
73 79
74 // TODO(edisonn): make sure the foorprint of fArray and fMap is small, o therwise, use pointers, or classes with up to 8 bytes in footprint 80 // TODO(edisonn): make sure the foorprint of fArray and fMap is small, o therwise, use pointers, or classes with up to 8 bytes in footprint
75 SkTDArray<SkPdfObject*>* fArray; 81 SkTDArray<SkPdfObject*>* fArray;
76 Reference fRef; 82 Reference fRef;
77 }; 83 };
78 SkTDict<SkPdfObject*>* fMap; 84 SkTDict<SkPdfObject*>* fMap;
85
86 // TODO(edisonn): rename data with cache
79 void* fData; 87 void* fData;
88 DataType fDataType;
80 89
81 90
82 public: 91 public:
83 92
84 SkPdfObject() : fObjectType(kInvalid_PdfObjectType), fMap(NULL), fData(NULL) {} 93 SkPdfObject() : fObjectType(kInvalid_PdfObjectType), fMap(NULL), fData(NULL) , fDataType(kEmpty_Data) {}
85 94
86 inline void* data() { 95
87 return fData; 96 inline bool hasData(DataType type) {
97 return type == fDataType;
88 } 98 }
89 99
90 inline void setData(void* data) { 100 inline void* data(DataType type) {
101 return type == fDataType ? fData : NULL;
102 }
103
104 inline void setData(void* data, DataType type) {
105 releaseData();
106 fDataType = type;
91 fData = data; 107 fData = data;
92 } 108 }
93 109
110 void releaseData();
111
94 // ~SkPdfObject() { 112 // ~SkPdfObject() {
95 // //reset(); must be called manually! 113 // //reset(); must be called manually!
96 // } 114 // }
97 115
98 void reset() { 116 void reset() {
99 switch (fObjectType) { 117 switch (fObjectType) {
100 case kArray_PdfObjectType: 118 case kArray_PdfObjectType:
101 delete fArray; 119 delete fArray;
102 break; 120 break;
103 121
104 case kDictionary_PdfObjectType: 122 case kDictionary_PdfObjectType:
105 delete fMap; 123 delete fMap;
106 if (isStreamOwned()) { 124 if (isStreamOwned()) {
107 delete[] fStr.fBuffer; 125 delete[] fStr.fBuffer;
108 fStr.fBuffer = NULL; 126 fStr.fBuffer = NULL;
109 fStr.fBytes = 0; 127 fStr.fBytes = 0;
110 } 128 }
111 break; 129 break;
112 130
113 default: 131 default:
114 break; 132 break;
115 } 133 }
116 fObjectType = kInvalid_PdfObjectType; 134 fObjectType = kInvalid_PdfObjectType;
135 releaseData();
117 } 136 }
118 137
119 ObjectType type() { return fObjectType; } 138 ObjectType type() { return fObjectType; }
120 139
121 const char* c_str() const { 140 const char* c_str() const {
122 switch (fObjectType) { 141 switch (fObjectType) {
123 case kString_PdfObjectType: 142 case kString_PdfObjectType:
124 case kHexString_PdfObjectType: 143 case kHexString_PdfObjectType:
125 case kKeyword_PdfObjectType: 144 case kKeyword_PdfObjectType:
126 case kName_PdfObjectType: 145 case kName_PdfObjectType:
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 } 616 }
598 617
599 SkPdfStream* getStream() { 618 SkPdfStream* getStream() {
600 return hasStream() ? (SkPdfStream*)this : NULL; 619 return hasStream() ? (SkPdfStream*)this : NULL;
601 } 620 }
602 621
603 bool isAnyString() const { 622 bool isAnyString() const {
604 return fObjectType == kString_PdfObjectType || fObjectType == kHexString _PdfObjectType; 623 return fObjectType == kString_PdfObjectType || fObjectType == kHexString _PdfObjectType;
605 } 624 }
606 625
626 bool isHexString() const {
627 return fObjectType == kHexString_PdfObjectType;
628 }
629
607 bool isMatrix() const { 630 bool isMatrix() const {
608 return fObjectType == kArray_PdfObjectType && fArray->count() == 6; // N YI + and elems are numbers 631 return fObjectType == kArray_PdfObjectType && fArray->count() == 6; // N YI + and elems are numbers
609 } 632 }
610 633
611 inline int64_t intValue() const { 634 inline int64_t intValue() const {
612 SkASSERT(fObjectType == kInteger_PdfObjectType); 635 SkASSERT(fObjectType == kInteger_PdfObjectType);
613 636
614 if (fObjectType != kInteger_PdfObjectType) { 637 if (fObjectType != kInteger_PdfObjectType) {
615 // TODO(edisonn): log err 638 // TODO(edisonn): log err
616 return 0; 639 return 0;
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 break; 883 break;
861 884
862 case kString_PdfObjectType: 885 case kString_PdfObjectType:
863 str.append("\""); 886 str.append("\"");
864 str.append((const char*)fStr.fBuffer, fStr.fBytes); 887 str.append((const char*)fStr.fBuffer, fStr.fBytes);
865 str.append("\""); 888 str.append("\"");
866 break; 889 break;
867 890
868 case kHexString_PdfObjectType: 891 case kHexString_PdfObjectType:
869 str.append("<"); 892 str.append("<");
870 str.append((const char*)fStr.fBuffer, fStr.fBytes); 893 for (unsigned int i = 0 ; i < fStr.fBytes; i++) {
894 str.appendf("%02x", (unsigned int)fStr.fBuffer[i]);
895 }
871 str.append(">"); 896 str.append(">");
872 break; 897 break;
873 898
874 case kName_PdfObjectType: 899 case kName_PdfObjectType:
875 str.append("/"); 900 str.append("/");
876 str.append((const char*)fStr.fBuffer, fStr.fBytes); 901 str.append((const char*)fStr.fBuffer, fStr.fBytes);
877 break; 902 break;
878 903
879 case kKeyword_PdfObjectType: 904 case kKeyword_PdfObjectType:
880 str.append((const char*)fStr.fBuffer, fStr.fBytes); 905 str.append((const char*)fStr.fBuffer, fStr.fBytes);
(...skipping 20 matching lines...) Expand all
901 while ((key = iter.next(&obj)) != NULL) { 926 while ((key = iter.next(&obj)) != NULL) {
902 appendSpaces(&str, level + 2); 927 appendSpaces(&str, level + 2);
903 str.appendf("/%s %s\n", key, obj->toString(0, level + st rlen(key) + 4).c_str()); 928 str.appendf("/%s %s\n", key, obj->toString(0, level + st rlen(key) + 4).c_str());
904 } 929 }
905 appendSpaces(&str, level); 930 appendSpaces(&str, level);
906 str.append(">>"); 931 str.append(">>");
907 if (hasStream()) { 932 if (hasStream()) {
908 const unsigned char* stream = NULL; 933 const unsigned char* stream = NULL;
909 size_t length = 0; 934 size_t length = 0;
910 if (GetFilteredStreamRef(&stream, &length)) { 935 if (GetFilteredStreamRef(&stream, &length)) {
911 str.append("stream"); 936 str.append("stream\n");
912 str.append((const char*)stream, length > 256 ? 256 : length); 937 str.append((const char*)stream, length > 256 ? 256 : length);
913 str.append("endstream"); 938 str.append("\nendstream");
914 } else { 939 } else {
915 str.append("stream STREAM_ERROR endstream"); 940 str.append("stream STREAM_ERROR endstream");
916 } 941 }
917 } 942 }
918 } 943 }
919 break; 944 break;
920 945
921 case kNull_PdfObjectType: 946 case kNull_PdfObjectType:
922 str = "NULL"; 947 str = "NULL";
923 break; 948 break;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
972 SkPdfName() : SkPdfObject() { 997 SkPdfName() : SkPdfObject() {
973 SkPdfObject::makeName((const unsigned char*)"", this); 998 SkPdfObject::makeName((const unsigned char*)"", this);
974 } 999 }
975 public: 1000 public:
976 SkPdfName(char* name) : SkPdfObject() { 1001 SkPdfName(char* name) : SkPdfObject() {
977 this->makeName((const unsigned char*)name, this); 1002 this->makeName((const unsigned char*)name, this);
978 } 1003 }
979 }; 1004 };
980 1005
981 #endif // EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_ 1006 #endif // EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698