diff options
author | 2013-08-14 18:26:20 +0000 | |
---|---|---|
committer | 2013-08-14 18:26:20 +0000 | |
commit | 3aa355527a3b91d3e12b8bee49e5637d00a736ca (patch) | |
tree | 4cd573ad78f49aca63d88ead12922049c473299f /experimental/PdfViewer/pdfparser/native/SkPdfNativeObject.cpp | |
parent | c1bf2de83549406de305e174af2b88630fdc3098 (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.cpp | 109 |
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; +} |