aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/PdfViewer/pdfparser/native/SkPdfNativeObject.cpp
diff options
context:
space:
mode:
authorGravatar edisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-08-14 18:26:20 +0000
committerGravatar edisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-08-14 18:26:20 +0000
commit3aa355527a3b91d3e12b8bee49e5637d00a736ca (patch)
tree4cd573ad78f49aca63d88ead12922049c473299f /experimental/PdfViewer/pdfparser/native/SkPdfNativeObject.cpp
parentc1bf2de83549406de305e174af2b88630fdc3098 (diff)
pdfviewer: 1) debug code for drawText (show magenta background for text, to show text even when we fail to load/show it), 2) some cleanup: refactor and rename classes and files
Review URL: https://codereview.chromium.org/23020003 git-svn-id: http://skia.googlecode.com/svn/trunk@10716 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'experimental/PdfViewer/pdfparser/native/SkPdfNativeObject.cpp')
-rw-r--r--experimental/PdfViewer/pdfparser/native/SkPdfNativeObject.cpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/experimental/PdfViewer/pdfparser/native/SkPdfNativeObject.cpp b/experimental/PdfViewer/pdfparser/native/SkPdfNativeObject.cpp
new file mode 100644
index 0000000000..b0f62aa8bd
--- /dev/null
+++ b/experimental/PdfViewer/pdfparser/native/SkPdfNativeObject.cpp
@@ -0,0 +1,109 @@
+
+#include "SkPdfNativeObject.h"
+#include "SkPdfStreamCommonDictionary_autogen.h"
+
+#include "SkFlate.h"
+#include "SkStream.h"
+#include "SkPdfNativeTokenizer.h"
+
+#include "SkBitmap.h"
+#include "SkPdfFont.h"
+
+SkPdfNativeObject SkPdfNativeObject::kNull = SkPdfNativeObject::makeNull();
+
+bool SkPdfNativeObject::applyFlateDecodeFilter() {
+ if (!SkFlate::HaveFlate()) {
+ // TODO(edisonn): warn, make callers handle it
+ return false;
+ }
+
+ const unsigned char* old = fStr.fBuffer;
+ bool deleteOld = isStreamOwned();
+
+ SkMemoryStream skstream(fStr.fBuffer, fStr.fBytes >> 2, false);
+ SkDynamicMemoryWStream uncompressedData;
+
+ if (SkFlate::Inflate(&skstream, &uncompressedData)) {
+ fStr.fBytes = (uncompressedData.bytesWritten() << 2) + kOwnedStreamBit + kUnfilteredStreamBit;
+ fStr.fBuffer = (const unsigned char*)new unsigned char[uncompressedData.bytesWritten()];
+ uncompressedData.copyTo((void*)fStr.fBuffer);
+
+ if (deleteOld) {
+ delete[] old;
+ }
+
+ return true;
+ } else {
+ // TODO(edisonn): warn, make callers handle it
+ return false;
+ }
+}
+
+bool SkPdfNativeObject::applyDCTDecodeFilter() {
+ // this would fail, and it won't allow any more filters.
+ // technically, it would be possible, but not a real world scenario
+ // TODO(edisonn): or get the image here and store it for fast retrieval?
+ return false;
+}
+
+bool SkPdfNativeObject::applyFilter(const char* name) {
+ if (strcmp(name, "FlateDecode") == 0) {
+ return applyFlateDecodeFilter();
+ } else if (strcmp(name, "DCTDecode") == 0) {
+ return applyDCTDecodeFilter();
+ }
+ // TODO(edisonn): allert, not supported, but should be implemented asap
+ return false;
+}
+
+bool SkPdfNativeObject::filterStream() {
+ if (!hasStream()) {
+ return false;
+ }
+
+ if (isStreamFiltered()) {
+ return true;
+ }
+
+ SkPdfStreamCommonDictionary* stream = (SkPdfStreamCommonDictionary*)this;
+
+ if (!stream->has_Filter()) {
+ fStr.fBytes = ((fStr.fBytes >> 1) << 1) + kFilteredStreamBit;
+ } else if (stream->isFilterAName(NULL)) {
+ std::string filterName = stream->getFilterAsName(NULL);
+ applyFilter(filterName.c_str());
+ } else if (stream->isFilterAArray(NULL)) {
+ const SkPdfArray* filters = stream->getFilterAsArray(NULL);
+ int cnt = filters->size();
+ for (int i = cnt - 1; i >= 0; i--) {
+ const SkPdfNativeObject* filterName = filters->objAtAIndex(i);
+ if (filterName != NULL && filterName->isName()) {
+ if (!applyFilter(filterName->nameValue())) {
+ break;
+ }
+ } else {
+ // TODO(edisonn): report warning
+ }
+ }
+ }
+
+ return true;
+}
+
+void SkPdfNativeObject::releaseData() {
+ if (fData) {
+ switch (fDataType) {
+ case kFont_Data:
+ delete (SkPdfFont*)fData;
+ break;
+ case kBitmap_Data:
+ delete (SkBitmap*)fData;
+ break;
+ default:
+ SkASSERT(false);
+ break;
+ }
+ }
+ fData = NULL;
+ fDataType = kEmpty_Data;
+}