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

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

Issue 19793011: (upload draf code for backup) pdfviewer: improve memory, son't allocate extra buffers, and put the … (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 5 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"
11 #include "SkString.h" 11 #include "SkString.h"
12 12
13 #include "SkPdfNYI.h" 13 #include "SkPdfNYI.h"
14 #include "SkPdfConfig.h" 14 #include "SkPdfConfig.h"
15 15
16 class SkPdfDictionary; 16 class SkPdfDictionary;
17 class SkPdfStream; 17 class SkPdfStream;
18 class SkPdfAllocator; 18 class SkPdfAllocator;
19 19
20 // TODO(edisonn): macro it and move it to utils 20 // TODO(edisonn): macro it and move it to utils
21 SkMatrix SkMatrixFromPdfMatrix(double array[6]); 21 SkMatrix SkMatrixFromPdfMatrix(double array[6]);
22 22
23 23
24 #define kFilteredStreamBit 0 24 #define kFilteredStreamBit 0
25 #define kUnfilteredStreamBit 1 25 #define kUnfilteredStreamBit 1
26 26 #define kOwnedStreamBit 2
27 27
28 class SkPdfObject { 28 class SkPdfObject {
29 public: 29 public:
30 enum ObjectType { 30 enum ObjectType {
31 kInvalid_PdfObjectType, 31 kInvalid_PdfObjectType,
32 32
33 kBoolean_PdfObjectType, 33 kBoolean_PdfObjectType,
34 kInteger_PdfObjectType, 34 kInteger_PdfObjectType,
35 kReal_PdfObjectType, 35 kReal_PdfObjectType,
36 kString_PdfObjectType, 36 kString_PdfObjectType,
37 kHexString_PdfObjectType, 37 kHexString_PdfObjectType,
38 kName_PdfObjectType, 38 kName_PdfObjectType,
39 kKeyword_PdfObjectType, 39 kKeyword_PdfObjectType,
40 //kStream_PdfObjectType, // attached to a Dictionary 40 //kStream_PdfObjectType, // attached to a Dictionary
41 kArray_PdfObjectType, 41 kArray_PdfObjectType,
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 private: 52 private:
53 struct NotOwnedString {
54 unsigned char* fBuffer;
55 size_t fBytes;
56 };
57
58 struct Reference { 53 struct Reference {
59 unsigned int fId; 54 unsigned int fId;
60 unsigned int fGen; 55 unsigned int fGen;
61 }; 56 };
62 57
63 // TODO(edisonn): add stream start, stream end, where stream is weither the file 58 // TODO(edisonn): add stream start, stream end, where stream is weither the file
64 // or decoded/filtered pdf stream 59 // or decoded/filtered pdf stream
65 60
66 // TODO(edisonn): add warning/report per object 61 // TODO(edisonn): add warning/report per object
67 // TODO(edisonn): add flag fUsed, to be used once the parsing is complete, 62 // TODO(edisonn): add flag fUsed, to be used once the parsing is complete,
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 // } 96 // }
102 97
103 void reset() { 98 void reset() {
104 switch (fObjectType) { 99 switch (fObjectType) {
105 case kArray_PdfObjectType: 100 case kArray_PdfObjectType:
106 delete fArray; 101 delete fArray;
107 break; 102 break;
108 103
109 case kDictionary_PdfObjectType: 104 case kDictionary_PdfObjectType:
110 delete fMap; 105 delete fMap;
106 if (isStreamOwned()) {
107 delete[] fStr.fBuffer;
108 fStr.fBuffer = NULL;
109 fStr.fBytes = 0;
110 }
111 break; 111 break;
112 112
113 default: 113 default:
114 break; 114 break;
115 } 115 }
116 fObjectType = kInvalid_PdfObjectType; 116 fObjectType = kInvalid_PdfObjectType;
117 } 117 }
118 118
119 ObjectType type() { return fObjectType; } 119 ObjectType type() { return fObjectType; }
120 120
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 } 205 }
206 206
207 static SkPdfObject makeNull() { 207 static SkPdfObject makeNull() {
208 SkPdfObject obj; 208 SkPdfObject obj;
209 obj.fObjectType = kNull_PdfObjectType; 209 obj.fObjectType = kNull_PdfObjectType;
210 return obj; 210 return obj;
211 } 211 }
212 212
213 static SkPdfObject kNull; 213 static SkPdfObject kNull;
214 214
215 static void makeNumeric(unsigned char* start, unsigned char* end, SkPdfObjec t* obj) { 215 static void makeNumeric(const unsigned char* start, const unsigned char* end , SkPdfObject* obj) {
216 SkASSERT(obj->fObjectType == kInvalid_PdfObjectType); 216 SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
217 217
218 // TODO(edisonn): NYI properly 218 // TODO(edisonn): NYI properly
219 // if has dot (impl), or exceeds max int, is real, otherwise is int 219 // if has dot (impl), or exceeds max int, is real, otherwise is int
220 bool isInt = true; 220 bool isInt = true;
221 for (unsigned char* current = start; current < end; current++) { 221 for (const unsigned char* current = start; current < end; current++) {
222 if (*current == '.') { 222 if (*current == '.') {
223 isInt = false; 223 isInt = false;
224 break; 224 break;
225 } 225 }
226 // TODO(edisonn): report parse issue with numbers like "24asdasd123" 226 // TODO(edisonn): report parse issue with numbers like "24asdasd123"
227 } 227 }
228 if (isInt) { 228 if (isInt) {
229 makeInteger(atol((const char*)start), obj); 229 makeInteger(atol((const char*)start), obj);
230 } else { 230 } else {
231 makeReal(atof((const char*)start), obj); 231 makeReal(atof((const char*)start), obj);
232 } 232 }
233 } 233 }
234 234
235 static void makeReference(unsigned int id, unsigned int gen, SkPdfObject* ob j) { 235 static void makeReference(unsigned int id, unsigned int gen, SkPdfObject* ob j) {
236 SkASSERT(obj->fObjectType == kInvalid_PdfObjectType); 236 SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
237 237
238 obj->fObjectType = kReference_PdfObjectType; 238 obj->fObjectType = kReference_PdfObjectType;
239 obj->fRef.fId = id; 239 obj->fRef.fId = id;
240 obj->fRef.fGen = gen; 240 obj->fRef.fGen = gen;
241 } 241 }
242 242
243 243
244 static void makeString(unsigned char* start, SkPdfObject* obj) { 244 static void makeString(const unsigned char* start, SkPdfObject* obj) {
245 makeStringCore(start, strlen((const char*)start), obj, kString_PdfObject Type); 245 makeStringCore(start, strlen((const char*)start), obj, kString_PdfObject Type);
246 } 246 }
247 247
248 static void makeString(unsigned char* start, unsigned char* end, SkPdfObject * obj) { 248 static void makeString(const unsigned char* start, const unsigned char* end, SkPdfObject* obj) {
249 makeStringCore(start, end - start, obj, kString_PdfObjectType); 249 makeStringCore(start, end - start, obj, kString_PdfObjectType);
250 } 250 }
251 251
252 static void makeString(unsigned char* start, size_t bytes, SkPdfObject* obj) { 252 static void makeString(const unsigned char* start, size_t bytes, SkPdfObject * obj) {
253 makeStringCore(start, bytes, obj, kString_PdfObjectType); 253 makeStringCore(start, bytes, obj, kString_PdfObjectType);
254 } 254 }
255 255
256 256
257 static void makeHexString(unsigned char* start, SkPdfObject* obj) { 257 static void makeHexString(const unsigned char* start, SkPdfObject* obj) {
258 makeStringCore(start, strlen((const char*)start), obj, kHexString_PdfObj ectType); 258 makeStringCore(start, strlen((const char*)start), obj, kHexString_PdfObj ectType);
259 } 259 }
260 260
261 static void makeHexString(unsigned char* start, unsigned char* end, SkPdfObj ect* obj) { 261 static void makeHexString(const unsigned char* start, const unsigned char* e nd, SkPdfObject* obj) {
262 makeStringCore(start, end - start, obj, kHexString_PdfObjectType); 262 makeStringCore(start, end - start, obj, kHexString_PdfObjectType);
263 } 263 }
264 264
265 static void makeHexString(unsigned char* start, size_t bytes, SkPdfObject* o bj) { 265 static void makeHexString(const unsigned char* start, size_t bytes, SkPdfObj ect* obj) {
266 makeStringCore(start, bytes, obj, kHexString_PdfObjectType); 266 makeStringCore(start, bytes, obj, kHexString_PdfObjectType);
267 } 267 }
268 268
269 269
270 static void makeName(unsigned char* start, SkPdfObject* obj) { 270 static void makeName(const unsigned char* start, SkPdfObject* obj) {
271 makeStringCore(start, strlen((const char*)start), obj, kName_PdfObjectTy pe); 271 makeStringCore(start, strlen((const char*)start), obj, kName_PdfObjectTy pe);
272 } 272 }
273 273
274 static void makeName(unsigned char* start, unsigned char* end, SkPdfObject* obj) { 274 static void makeName(const unsigned char* start, const unsigned char* end, S kPdfObject* obj) {
275 makeStringCore(start, end - start, obj, kName_PdfObjectType); 275 makeStringCore(start, end - start, obj, kName_PdfObjectType);
276 } 276 }
277 277
278 static void makeName(unsigned char* start, size_t bytes, SkPdfObject* obj) { 278 static void makeName(const unsigned char* start, size_t bytes, SkPdfObject* obj) {
279 makeStringCore(start, bytes, obj, kName_PdfObjectType); 279 makeStringCore(start, bytes, obj, kName_PdfObjectType);
280 } 280 }
281 281
282 282
283 static void makeKeyword(unsigned char* start, SkPdfObject* obj) { 283 static void makeKeyword(const unsigned char* start, SkPdfObject* obj) {
284 makeStringCore(start, strlen((const char*)start), obj, kKeyword_PdfObjec tType); 284 makeStringCore(start, strlen((const char*)start), obj, kKeyword_PdfObjec tType);
285 } 285 }
286 286
287 static void makeKeyword(unsigned char* start, unsigned char* end, SkPdfObjec t* obj) { 287 static void makeKeyword(const unsigned char* start, const unsigned char* end , SkPdfObject* obj) {
288 makeStringCore(start, end - start, obj, kKeyword_PdfObjectType); 288 makeStringCore(start, end - start, obj, kKeyword_PdfObjectType);
289 } 289 }
290 290
291 static void makeKeyword(unsigned char* start, size_t bytes, SkPdfObject* obj ) { 291 static void makeKeyword(const unsigned char* start, size_t bytes, SkPdfObjec t* obj) {
292 makeStringCore(start, bytes, obj, kKeyword_PdfObjectType); 292 makeStringCore(start, bytes, obj, kKeyword_PdfObjectType);
293 } 293 }
294 294
295 295
296 296
297 // TODO(edisonn): make the functions to return SkPdfArray, move these functi ons in SkPdfArray 297 // TODO(edisonn): make the functions to return SkPdfArray, move these functi ons in SkPdfArray
298 static void makeEmptyArray(SkPdfObject* obj) { 298 static void makeEmptyArray(SkPdfObject* obj) {
299 SkASSERT(obj->fObjectType == kInvalid_PdfObjectType); 299 SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
300 300
301 obj->fObjectType = kArray_PdfObjectType; 301 obj->fObjectType = kArray_PdfObjectType;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 // TODO(edisonn): setting the same key twike, will make the value undefined! 374 // TODO(edisonn): setting the same key twike, will make the value undefined!
375 bool set(SkPdfObject* key, SkPdfObject* value) { 375 bool set(SkPdfObject* key, SkPdfObject* value) {
376 SkASSERT(fObjectType == kDictionary_PdfObjectType); 376 SkASSERT(fObjectType == kDictionary_PdfObjectType);
377 SkASSERT(key->fObjectType == kName_PdfObjectType); 377 SkASSERT(key->fObjectType == kName_PdfObjectType);
378 378
379 if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionar y_PdfObjectType) { 379 if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionar y_PdfObjectType) {
380 // TODO(edisonn): report err 380 // TODO(edisonn): report err
381 return false; 381 return false;
382 } 382 }
383 383
384 // we rewrite all delimiters and white spaces with '\0', so we expect th e end of name to be '\0' 384 //// we rewrite all delimiters and white spaces with '\0', so we expect the end of name to be '\0'
385 SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0'); 385 //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
386 386
387 return set(key->fStr.fBuffer, key->fStr.fBytes, value); 387 return set(key->fStr.fBuffer, key->fStr.fBytes, value);
388 } 388 }
389 389
390 bool set(const char* key, SkPdfObject* value) { 390 bool set(const char* key, SkPdfObject* value) {
391 return set((const unsigned char*)key, strlen(key), value); 391 return set((const unsigned char*)key, strlen(key), value);
392 } 392 }
393 393
394 bool set(const unsigned char* key, size_t len, SkPdfObject* value) { 394 bool set(const unsigned char* key, size_t len, SkPdfObject* value) {
395 SkASSERT(fObjectType == kDictionary_PdfObjectType); 395 SkASSERT(fObjectType == kDictionary_PdfObjectType);
396 396
397 if (fObjectType != kDictionary_PdfObjectType) { 397 if (fObjectType != kDictionary_PdfObjectType) {
398 // TODO(edisonn): report err 398 // TODO(edisonn): report err
399 return false; 399 return false;
400 } 400 }
401 401
402 return fMap->set((const char*)key, len, value); 402 return fMap->set((const char*)key, len, value);
403 } 403 }
404 404
405 SkPdfObject* get(SkPdfObject* key) { 405 SkPdfObject* get(SkPdfObject* key) {
406 SkASSERT(fObjectType == kDictionary_PdfObjectType); 406 SkASSERT(fObjectType == kDictionary_PdfObjectType);
407 SkASSERT(key->fObjectType == kName_PdfObjectType); 407 SkASSERT(key->fObjectType == kName_PdfObjectType);
408 408
409 if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionar y_PdfObjectType) { 409 if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionar y_PdfObjectType) {
410 // TODO(edisonn): report err 410 // TODO(edisonn): report err
411 return NULL; 411 return NULL;
412 } 412 }
413 413
414 SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0'); 414 //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
415 415
416 return get(key->fStr.fBuffer, key->fStr.fBytes); 416 return get(key->fStr.fBuffer, key->fStr.fBytes);
417 } 417 }
418 418
419 SkPdfObject* get(const char* key) { 419 SkPdfObject* get(const char* key) {
420 return get((const unsigned char*)key, strlen(key)); 420 return get((const unsigned char*)key, strlen(key));
421 } 421 }
422 422
423 SkPdfObject* get(const unsigned char* key, size_t len) { 423 SkPdfObject* get(const unsigned char* key, size_t len) {
424 SkASSERT(fObjectType == kDictionary_PdfObjectType); 424 SkASSERT(fObjectType == kDictionary_PdfObjectType);
425 SkASSERT(key); 425 SkASSERT(key);
426 if (fObjectType != kDictionary_PdfObjectType) { 426 if (fObjectType != kDictionary_PdfObjectType) {
427 // TODO(edisonn): report err 427 // TODO(edisonn): report err
428 return NULL; 428 return NULL;
429 } 429 }
430 SkPdfObject* ret = NULL; 430 SkPdfObject* ret = NULL;
431 fMap->find((const char*)key, len, &ret); 431 fMap->find((const char*)key, len, &ret);
432 return ret; 432 return ret;
433 } 433 }
434 434
435 const SkPdfObject* get(SkPdfObject* key) const { 435 const SkPdfObject* get(SkPdfObject* key) const {
436 SkASSERT(fObjectType == kDictionary_PdfObjectType); 436 SkASSERT(fObjectType == kDictionary_PdfObjectType);
437 SkASSERT(key->fObjectType == kName_PdfObjectType); 437 SkASSERT(key->fObjectType == kName_PdfObjectType);
438 438
439 if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionar y_PdfObjectType) { 439 if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionar y_PdfObjectType) {
440 // TODO(edisonn): report err 440 // TODO(edisonn): report err
441 return NULL; 441 return NULL;
442 } 442 }
443 443
444 SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0'); 444 //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0');
445 445
446 return get(key->fStr.fBuffer, key->fStr.fBytes); 446 return get(key->fStr.fBuffer, key->fStr.fBytes);
447 } 447 }
448 448
449 const SkPdfObject* get(const char* key) const { 449 const SkPdfObject* get(const char* key) const {
450 return get((const unsigned char*)key, strlen(key)); 450 return get((const unsigned char*)key, strlen(key));
451 } 451 }
452 452
453 const SkPdfObject* get(const unsigned char* key, size_t len) const { 453 const SkPdfObject* get(const unsigned char* key, size_t len) const {
454 SkASSERT(fObjectType == kDictionary_PdfObjectType); 454 SkASSERT(fObjectType == kDictionary_PdfObjectType);
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 inline const char* stringValue() const { 630 inline const char* stringValue() const {
631 SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexStri ng_PdfObjectType); 631 SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexStri ng_PdfObjectType);
632 632
633 if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_Pd fObjectType) { 633 if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_Pd fObjectType) {
634 // TODO(edisonn): log err 634 // TODO(edisonn): log err
635 return ""; 635 return "";
636 } 636 }
637 return (const char*)fStr.fBuffer; 637 return (const char*)fStr.fBuffer;
638 } 638 }
639 639
640 inline NotOwnedString strRef() {
641 switch (fObjectType) {
642 case kString_PdfObjectType:
643 case kHexString_PdfObjectType:
644 case kKeyword_PdfObjectType:
645 return fStr;
646
647 default:
648 // TODO(edisonn): report/warning
649 return NotOwnedString();
650 }
651 }
652
640 // TODO(edisonn): nameValue2 and stringValue2 are used to make code generati on easy, 653 // TODO(edisonn): nameValue2 and stringValue2 are used to make code generati on easy,
641 // but it is not a performat way to do it, since it will create an extra cop y 654 // but it is not a performat way to do it, since it will create an extra cop y
642 // remove these functions and make code generated faster 655 // remove these functions and make code generated faster
643 inline std::string nameValue2() const { 656 inline std::string nameValue2() const {
644 SkASSERT(fObjectType == kName_PdfObjectType); 657 SkASSERT(fObjectType == kName_PdfObjectType);
645 658
646 if (fObjectType != kName_PdfObjectType) { 659 if (fObjectType != kName_PdfObjectType) {
647 // TODO(edisonn): log err 660 // TODO(edisonn): log err
648 return ""; 661 return "";
649 } 662 }
650 return (const char*)fStr.fBuffer; 663 return std::string((const char*)fStr.fBuffer, fStr.fBytes);
651 } 664 }
652 665
653 inline std::string stringValue2() const { 666 inline std::string stringValue2() const {
654 SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexStri ng_PdfObjectType); 667 SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexStri ng_PdfObjectType);
655 668
656 if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_Pd fObjectType) { 669 if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_Pd fObjectType) {
657 // TODO(edisonn): log err 670 // TODO(edisonn): log err
658 return ""; 671 return "";
659 } 672 }
660 return (const char*)fStr.fBuffer; 673 return std::string((const char*)fStr.fBuffer, fStr.fBytes);
661 } 674 }
662 675
663 inline bool boolValue() const { 676 inline bool boolValue() const {
664 SkASSERT(fObjectType == kBoolean_PdfObjectType); 677 SkASSERT(fObjectType == kBoolean_PdfObjectType);
665 678
666 if (fObjectType == kBoolean_PdfObjectType) { 679 if (fObjectType == kBoolean_PdfObjectType) {
667 // TODO(edisonn): log err 680 // TODO(edisonn): log err
668 return false; 681 return false;
669 } 682 }
670 return fBooleanValue; 683 return fBooleanValue;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 if (elem == NULL || !elem->isNumber()) { 719 if (elem == NULL || !elem->isNumber()) {
707 // TODO(edisonn): report error 720 // TODO(edisonn): report error
708 return SkMatrix::I(); 721 return SkMatrix::I();
709 } 722 }
710 array[i] = elem->numberValue(); 723 array[i] = elem->numberValue();
711 } 724 }
712 725
713 return SkMatrixFromPdfMatrix(array); 726 return SkMatrixFromPdfMatrix(array);
714 } 727 }
715 728
716 bool filterStream(SkPdfAllocator* allocator); 729 bool filterStream();
717 730
718 731
719 bool GetFilteredStreamRef(unsigned char** buffer, size_t* len, SkPdfAllocato r* allocator) { 732 bool GetFilteredStreamRef(unsigned char const** buffer, size_t* len) {
720 // TODO(edisonn): add params that couls let the last filter in place if it is jpeg or png to fast load images 733 // TODO(edisonn): add params that couls let the last filter in place if it is jpeg or png to fast load images
721 if (!hasStream()) { 734 if (!hasStream()) {
722 return false; 735 return false;
723 } 736 }
724 737
725 filterStream(allocator); 738 filterStream();
726 739
727 if (buffer) { 740 if (buffer) {
728 *buffer = fStr.fBuffer; 741 *buffer = fStr.fBuffer;
729 } 742 }
730 743
731 if (len) { 744 if (len) {
732 *len = fStr.fBytes >> 1; // last bit 745 *len = fStr.fBytes >> 2; // last 2 bits
733 } 746 }
734 747
735 return true; 748 return true;
736 } 749 }
737 750
738 bool isStreamFiltered() const { 751 bool isStreamFiltered() const {
739 return hasStream() && ((fStr.fBytes & 1) == kFilteredStreamBit); 752 return hasStream() && ((fStr.fBytes & 1) == kFilteredStreamBit);
740 } 753 }
741 754
742 bool GetUnfilteredStreamRef(unsigned char** buffer, size_t* len) const { 755 bool isStreamOwned() const {
756 return hasStream() && ((fStr.fBytes & 2) == kOwnedStreamBit);
757 }
758
759 bool GetUnfilteredStreamRef(unsigned char const** buffer, size_t* len) const {
743 if (isStreamFiltered()) { 760 if (isStreamFiltered()) {
744 return false; 761 return false;
745 } 762 }
746 763
747 if (!hasStream()) { 764 if (!hasStream()) {
748 return false; 765 return false;
749 } 766 }
750 767
751 if (buffer) { 768 if (buffer) {
752 *buffer = fStr.fBuffer; 769 *buffer = fStr.fBuffer;
753 } 770 }
754 771
755 if (len) { 772 if (len) {
756 *len = fStr.fBytes >> 1; // remove slast bit 773 *len = fStr.fBytes >> 2; // remove last 2 bits
757 } 774 }
758 775
759 return true; 776 return true;
760 } 777 }
761 778
762 bool addStream(unsigned char* buffer, size_t len) { 779 bool addStream(const unsigned char* buffer, size_t len) {
763 SkASSERT(!hasStream()); 780 SkASSERT(!hasStream());
764 SkASSERT(isDictionary()); 781 SkASSERT(isDictionary());
765 782
766 if (!isDictionary() || hasStream()) { 783 if (!isDictionary() || hasStream()) {
767 return false; 784 return false;
768 } 785 }
769 786
770 fStr.fBuffer = buffer; 787 fStr.fBuffer = buffer;
771 fStr.fBytes = (len << 2) + kUnfilteredStreamBit; 788 fStr.fBytes = (len << 2) + kUnfilteredStreamBit;
772 789
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
842 859
843 default: 860 default:
844 str = "Internal Error Object Type"; 861 str = "Internal Error Object Type";
845 break; 862 break;
846 } 863 }
847 864
848 return str; 865 return str;
849 } 866 }
850 867
851 private: 868 private:
852 static void makeStringCore(unsigned char* start, SkPdfObject* obj, ObjectTyp e type) { 869 static void makeStringCore(const unsigned char* start, SkPdfObject* obj, Obj ectType type) {
853 makeStringCore(start, strlen((const char*)start), obj, type); 870 makeStringCore(start, strlen((const char*)start), obj, type);
854 } 871 }
855 872
856 static void makeStringCore(unsigned char* start, unsigned char* end, SkPdfOb ject* obj, ObjectType type) { 873 static void makeStringCore(const unsigned char* start, const unsigned char* end, SkPdfObject* obj, ObjectType type) {
857 makeStringCore(start, end - start, obj, type); 874 makeStringCore(start, end - start, obj, type);
858 } 875 }
859 876
860 static void makeStringCore(unsigned char* start, size_t bytes, SkPdfObject* obj, ObjectType type) { 877 static void makeStringCore(const unsigned char* start, size_t bytes, SkPdfOb ject* obj, ObjectType type) {
861 SkASSERT(obj->fObjectType == kInvalid_PdfObjectType); 878 SkASSERT(obj->fObjectType == kInvalid_PdfObjectType);
862 879
863 obj->fObjectType = type; 880 obj->fObjectType = type;
864 obj->fStr.fBuffer = start; 881 obj->fStr.fBuffer = start;
865 obj->fStr.fBytes = bytes; 882 obj->fStr.fBytes = bytes;
866 } 883 }
867 884
868 bool applyFilter(const char* name, SkPdfAllocator* allocator); 885 bool applyFilter(const char* name);
869 bool applyFlateDecodeFilter(SkPdfAllocator* allocator); 886 bool applyFlateDecodeFilter();
870 bool applyDCTDecodeFilter(SkPdfAllocator* allocator); 887 bool applyDCTDecodeFilter();
871 }; 888 };
872 889
873 class SkPdfStream : public SkPdfObject {}; 890 class SkPdfStream : public SkPdfObject {};
874 class SkPdfArray : public SkPdfObject {}; 891 class SkPdfArray : public SkPdfObject {};
875 class SkPdfString : public SkPdfObject {}; 892 class SkPdfString : public SkPdfObject {};
876 class SkPdfHexString : public SkPdfObject {}; 893 class SkPdfHexString : public SkPdfObject {};
877 class SkPdfInteger : public SkPdfObject {}; 894 class SkPdfInteger : public SkPdfObject {};
878 class SkPdfReal : public SkPdfObject {}; 895 class SkPdfReal : public SkPdfObject {};
879 class SkPdfNumber : public SkPdfObject {}; 896 class SkPdfNumber : public SkPdfObject {};
880 897
881 class SkPdfName : public SkPdfObject { 898 class SkPdfName : public SkPdfObject {
882 SkPdfName() : SkPdfObject() { 899 SkPdfName() : SkPdfObject() {
883 SkPdfObject::makeName((unsigned char*)"", this); 900 SkPdfObject::makeName((const unsigned char*)"", this);
884 } 901 }
885 public: 902 public:
886 SkPdfName(char* name) : SkPdfObject() { 903 SkPdfName(char* name) : SkPdfObject() {
887 this->makeName((unsigned char*)name, this); 904 this->makeName((const unsigned char*)name, this);
888 } 905 }
889 }; 906 };
890 907
891 #endif // EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_ 908 #endif // EXPERIMENTAL_PDFVIEWER_PDFPARSER_NATIVE_SKPDFOBJECT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698