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

Side by Side Diff: experimental/PdfViewer/pdfparser/native/SkPdfNativeObject.cpp

Issue 23020003: pdfviewer: debug code for drawText (show magenta background for text, to show text even when we fai… (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 1
2 #include "SkPdfObject.h" 2 #include "SkPdfNativeObject.h"
3 #include "SkPdfStreamCommonDictionary_autogen.h" 3 #include "SkPdfStreamCommonDictionary_autogen.h"
4 4
5 #include "SkFlate.h" 5 #include "SkFlate.h"
6 #include "SkStream.h" 6 #include "SkStream.h"
7 #include "SkPdfNativeTokenizer.h" 7 #include "SkPdfNativeTokenizer.h"
8 8
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkPdfFont.h" 10 #include "SkPdfFont.h"
11 11
12 SkPdfObject SkPdfObject::kNull = SkPdfObject::makeNull(); 12 SkPdfNativeObject SkPdfNativeObject::kNull = SkPdfNativeObject::makeNull();
13 13
14 bool SkPdfObject::applyFlateDecodeFilter() { 14 bool SkPdfNativeObject::applyFlateDecodeFilter() {
15 if (!SkFlate::HaveFlate()) { 15 if (!SkFlate::HaveFlate()) {
16 // TODO(edisonn): warn, make callers handle it 16 // TODO(edisonn): warn, make callers handle it
17 return false; 17 return false;
18 } 18 }
19 19
20 const unsigned char* old = fStr.fBuffer; 20 const unsigned char* old = fStr.fBuffer;
21 bool deleteOld = isStreamOwned(); 21 bool deleteOld = isStreamOwned();
22 22
23 SkMemoryStream skstream(fStr.fBuffer, fStr.fBytes >> 2, false); 23 SkMemoryStream skstream(fStr.fBuffer, fStr.fBytes >> 2, false);
24 SkDynamicMemoryWStream uncompressedData; 24 SkDynamicMemoryWStream uncompressedData;
25 25
26 if (SkFlate::Inflate(&skstream, &uncompressedData)) { 26 if (SkFlate::Inflate(&skstream, &uncompressedData)) {
27 fStr.fBytes = (uncompressedData.bytesWritten() << 2) + kOwnedStreamBit + kUnfilteredStreamBit; 27 fStr.fBytes = (uncompressedData.bytesWritten() << 2) + kOwnedStreamBit + kUnfilteredStreamBit;
28 fStr.fBuffer = (const unsigned char*)new unsigned char[uncompressedData. bytesWritten()]; 28 fStr.fBuffer = (const unsigned char*)new unsigned char[uncompressedData. bytesWritten()];
29 uncompressedData.copyTo((void*)fStr.fBuffer); 29 uncompressedData.copyTo((void*)fStr.fBuffer);
30 30
31 if (deleteOld) { 31 if (deleteOld) {
32 delete[] old; 32 delete[] old;
33 } 33 }
34 34
35 return true; 35 return true;
36 } else { 36 } else {
37 // TODO(edisonn): warn, make callers handle it 37 // TODO(edisonn): warn, make callers handle it
38 return false; 38 return false;
39 } 39 }
40 } 40 }
41 41
42 bool SkPdfObject::applyDCTDecodeFilter() { 42 bool SkPdfNativeObject::applyDCTDecodeFilter() {
43 // this would fail, and it won't allow any more filters. 43 // this would fail, and it won't allow any more filters.
44 // technically, it would be possible, but not a real world scenario 44 // technically, it would be possible, but not a real world scenario
45 // TODO(edisonn): or get the image here and store it for fast retrieval? 45 // TODO(edisonn): or get the image here and store it for fast retrieval?
46 return false; 46 return false;
47 } 47 }
48 48
49 bool SkPdfObject::applyFilter(const char* name) { 49 bool SkPdfNativeObject::applyFilter(const char* name) {
50 if (strcmp(name, "FlateDecode") == 0) { 50 if (strcmp(name, "FlateDecode") == 0) {
51 return applyFlateDecodeFilter(); 51 return applyFlateDecodeFilter();
52 } else if (strcmp(name, "DCTDecode") == 0) { 52 } else if (strcmp(name, "DCTDecode") == 0) {
53 return applyDCTDecodeFilter(); 53 return applyDCTDecodeFilter();
54 } 54 }
55 // TODO(edisonn): allert, not supported, but should be implemented asap 55 // TODO(edisonn): allert, not supported, but should be implemented asap
56 return false; 56 return false;
57 } 57 }
58 58
59 bool SkPdfObject::filterStream() { 59 bool SkPdfNativeObject::filterStream() {
60 if (!hasStream()) { 60 if (!hasStream()) {
61 return false; 61 return false;
62 } 62 }
63 63
64 if (isStreamFiltered()) { 64 if (isStreamFiltered()) {
65 return true; 65 return true;
66 } 66 }
67 67
68 SkPdfStreamCommonDictionary* stream = (SkPdfStreamCommonDictionary*)this; 68 SkPdfStreamCommonDictionary* stream = (SkPdfStreamCommonDictionary*)this;
69 69
70 if (!stream->has_Filter()) { 70 if (!stream->has_Filter()) {
71 fStr.fBytes = ((fStr.fBytes >> 1) << 1) + kFilteredStreamBit; 71 fStr.fBytes = ((fStr.fBytes >> 1) << 1) + kFilteredStreamBit;
72 } else if (stream->isFilterAName(NULL)) { 72 } else if (stream->isFilterAName(NULL)) {
73 std::string filterName = stream->getFilterAsName(NULL); 73 std::string filterName = stream->getFilterAsName(NULL);
74 applyFilter(filterName.c_str()); 74 applyFilter(filterName.c_str());
75 } else if (stream->isFilterAArray(NULL)) { 75 } else if (stream->isFilterAArray(NULL)) {
76 const SkPdfArray* filters = stream->getFilterAsArray(NULL); 76 const SkPdfArray* filters = stream->getFilterAsArray(NULL);
77 int cnt = filters->size(); 77 int cnt = filters->size();
78 for (int i = cnt - 1; i >= 0; i--) { 78 for (int i = cnt - 1; i >= 0; i--) {
79 const SkPdfObject* filterName = filters->objAtAIndex(i); 79 const SkPdfNativeObject* filterName = filters->objAtAIndex(i);
80 if (filterName != NULL && filterName->isName()) { 80 if (filterName != NULL && filterName->isName()) {
81 if (!applyFilter(filterName->nameValue())) { 81 if (!applyFilter(filterName->nameValue())) {
82 break; 82 break;
83 } 83 }
84 } else { 84 } else {
85 // TODO(edisonn): report warning 85 // TODO(edisonn): report warning
86 } 86 }
87 } 87 }
88 } 88 }
89 89
90 return true; 90 return true;
91 } 91 }
92 92
93 void SkPdfObject::releaseData() { 93 void SkPdfNativeObject::releaseData() {
94 if (fData) { 94 if (fData) {
95 switch (fDataType) { 95 switch (fDataType) {
96 case kFont_Data: 96 case kFont_Data:
97 delete (SkPdfFont*)fData; 97 delete (SkPdfFont*)fData;
98 break; 98 break;
99 case kBitmap_Data: 99 case kBitmap_Data:
100 delete (SkBitmap*)fData; 100 delete (SkBitmap*)fData;
101 break; 101 break;
102 default: 102 default:
103 SkASSERT(false); 103 SkASSERT(false);
104 break; 104 break;
105 } 105 }
106 } 106 }
107 fData = NULL; 107 fData = NULL;
108 fDataType = kEmpty_Data; 108 fDataType = kEmpty_Data;
109 } 109 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698