| Index: skia/images/SkImageDecoder_fpdfemb.cpp
|
| ===================================================================
|
| --- skia/images/SkImageDecoder_fpdfemb.cpp (revision 16859)
|
| +++ skia/images/SkImageDecoder_fpdfemb.cpp (working copy)
|
| @@ -1,236 +0,0 @@
|
| -/*
|
| - * Copyright 2007, The Android Open Source Project
|
| - *
|
| - * Licensed under the Apache License, Version 2.0 (the "License");
|
| - * you may not use this file except in compliance with the License.
|
| - * You may obtain a copy of the License at
|
| - *
|
| - * http://www.apache.org/licenses/LICENSE-2.0
|
| - *
|
| - * Unless required by applicable law or agreed to in writing, software
|
| - * distributed under the License is distributed on an "AS IS" BASIS,
|
| - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| - * See the License for the specific language governing permissions and
|
| - * limitations under the License.
|
| - */
|
| -
|
| -#include "SkImageDecoder.h"
|
| -#include "SkScaledBitmapSampler.h"
|
| -#include "SkStream.h"
|
| -#include "SkColorPriv.h"
|
| -#include "SkTDArray.h"
|
| -
|
| -#include "fpdfemb.h"
|
| -
|
| -class SkFPDFEMBImageDecoder : public SkImageDecoder {
|
| -public:
|
| - SkFPDFEMBImageDecoder() {}
|
| -
|
| - virtual Format getFormat() const {
|
| - return kBMP_Format;
|
| - }
|
| -
|
| -protected:
|
| - virtual bool onDecode(SkStream* stream, SkBitmap* bm,
|
| - SkBitmap::Config pref, Mode mode);
|
| -
|
| -private:
|
| - bool render(FPDFEMB_PAGE page, const FPDFEMB_RECT& bounds, SkBitmap* bm,
|
| - SkBitmap::Config prefConfig, SkImageDecoder::Mode mode);
|
| -};
|
| -
|
| -SkImageDecoder* SkImageDecoder_FPDFEMB_Factory(SkStream*);
|
| -SkImageDecoder* SkImageDecoder_FPDFEMB_Factory(SkStream* stream) {
|
| - static const char kPDFSig[] = { '%', 'P', 'D', 'F' };
|
| -
|
| - size_t len = stream->getLength();
|
| - char buffer[sizeof(kPDFSig)];
|
| -
|
| - SkDebugf("---- SkImageDecoder_FPDFEMB_Factory len=%d\n", len);
|
| -
|
| - if (len != 12683) { return NULL; }
|
| -
|
| - if (len > sizeof(kPDFSig) &&
|
| - stream->read(buffer, sizeof(kPDFSig)) == sizeof(kPDFSig) &&
|
| - !memcmp(buffer, kPDFSig, sizeof(kPDFSig))) {
|
| - return SkNEW(SkFPDFEMBImageDecoder);
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -extern "C" {
|
| - static void* pdf_alloc(FPDFEMB_MEMMGR* pMgr, unsigned int size) {
|
| - void* addr = sk_malloc_throw(size);
|
| - // SkDebugf("---- pdf_alloc %d %p\n", size, addr);
|
| - return addr;
|
| - }
|
| -
|
| - static void* pdf_alloc_nl(FPDFEMB_MEMMGR* pMgr, unsigned int size) {
|
| - void* addr = sk_malloc_flags(size, 0);
|
| - // SkDebugf("---- pdf_alloc_nl %d %p\n", size, addr);
|
| - return addr;
|
| - }
|
| -
|
| - static void* pdf_realloc(FPDFEMB_MEMMGR*, void* addr, unsigned int size) {
|
| - void* newaddr = sk_realloc_throw(addr, size);
|
| - // SkDebugf("---- pdf_realloc %p %d %p\n", addr, size, newaddr);
|
| - return newaddr;
|
| - }
|
| -
|
| - static void pdf_free(FPDFEMB_MEMMGR* pMgr, void* pointer) {
|
| - // SkDebugf("---- pdf_free %p\n", pointer);
|
| - sk_free(pointer);
|
| - }
|
| -
|
| - void FX_OUTPUT_LOG_FUNC(const char* format, ...) {
|
| - SkDebugf("---- LOG_FUNC %s\n", format);
|
| - }
|
| -
|
| - static unsigned int file_getsize(FPDFEMB_FILE_ACCESS* file) {
|
| - SkStream* stream = (SkStream*)file->user;
|
| - return stream->getLength();
|
| - }
|
| -
|
| - static FPDFEMB_RESULT file_readblock(FPDFEMB_FILE_ACCESS* file, void* dst,
|
| - unsigned int offset, unsigned int size) {
|
| - SkStream* stream = (SkStream*)file->user;
|
| -// SkDebugf("---- readblock %p %p %d %d\n", stream, dst, offset, size);
|
| - if (!stream->rewind()) {
|
| - SkDebugf("---- rewind failed\n");
|
| - return FPDFERR_ERROR;
|
| - }
|
| - if (stream->skip(offset) != offset) {
|
| - SkDebugf("---- skip failed\n");
|
| - return FPDFERR_ERROR;
|
| - }
|
| - if (stream->read(dst, size) != size) {
|
| - SkDebugf("---- read failed\n");
|
| - return FPDFERR_ERROR;
|
| - }
|
| - return FPDFERR_SUCCESS;
|
| - }
|
| -
|
| - static void pdf_oom_handler(void* memory, int size) {
|
| - SkDebugf("======== pdf OOM %p %d\n", memory, size);
|
| - }
|
| -}
|
| -
|
| -static inline int PDF2Pixels(int x) { return x / 100; }
|
| -static inline SkScalar PDF2Scalar(int x) {
|
| - return SkScalarMulDiv(SK_Scalar1, x, 100);
|
| -}
|
| -
|
| -bool SkFPDFEMBImageDecoder::render(FPDFEMB_PAGE page, const FPDFEMB_RECT& bounds, SkBitmap* bm,
|
| - SkBitmap::Config prefConfig, SkImageDecoder::Mode mode) {
|
| - int width = PDF2Pixels(bounds.right - bounds.left);
|
| - int height = PDF2Pixels(bounds.top - bounds.bottom);
|
| -
|
| - SkDebugf("----- bitmap size [%d %d], mode=%d\n", width, height, mode);
|
| - bm->setConfig(SkBitmap::kARGB_8888_Config, width, height);
|
| - if (SkImageDecoder::kDecodeBounds_Mode == mode) {
|
| - return true;
|
| - }
|
| -
|
| - // USE THE CODEC TO ALLOCATE THE PIXELS!!!!
|
| - if (!this->allocPixelRef(bm, NULL)) {
|
| - SkDebugf("----- failed to alloc pixels\n");
|
| - return false;
|
| - }
|
| -
|
| - bm->eraseColor(0);
|
| -
|
| - FPDFEMB_RESULT result;
|
| - FPDFEMB_BITMAP dib;
|
| -
|
| - result = FPDFEMB_CreateDIB(width, height, FPDFDIB_BGRA, bm->getPixels(),
|
| - bm->rowBytes(), &dib);
|
| - SkDebugf("---- createdib %d\n", result);
|
| -
|
| - result = FPDFEMB_StartRender(dib, page, 0, 0, width, height, 0, 0, NULL, NULL);
|
| - SkDebugf("---- render %d\n", result);
|
| -
|
| - result = FPDFEMB_DestroyDIB(dib);
|
| - SkDebugf("---- destroydib %d\n", result);
|
| -
|
| - SkPMColor* dst = bm->getAddr32(0, 0);
|
| - const uint8_t* src = (uint8_t*)dst;
|
| - int n = bm->getSize() >> 2;
|
| - for (int i = 0; i < n; i++) {
|
| - int b = *src++;
|
| - int g = *src++;
|
| - int r = *src++;
|
| - int a = *src++;
|
| - *dst++ = SkPackARGB32(a, r, g, b);
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -#define USE_FIXED_MEM (4 * 1024 * 1024)
|
| -
|
| -bool SkFPDFEMBImageDecoder::onDecode(SkStream* stream, SkBitmap* bm,
|
| - SkBitmap::Config prefConfig, Mode mode) {
|
| -
|
| - FPDFEMB_RESULT result;
|
| -#ifdef USE_FIXED_MEM
|
| - SkAutoMalloc storage(USE_FIXED_MEM);
|
| - result = FPDFEMB_InitFixedMemory(storage.get(), USE_FIXED_MEM,
|
| - pdf_oom_handler);
|
| -#else
|
| - FPDFEMB_MEMMGR memmgr;
|
| - memmgr.Alloc = pdf_alloc;
|
| - memmgr.AllocNL = pdf_alloc_nl;
|
| - memmgr.Realloc = pdf_realloc;
|
| - memmgr.Free = pdf_free;
|
| -
|
| - result = FPDFEMB_Init(&memmgr);
|
| -#endif
|
| - SkDebugf("----- SkImageDecoder_FPDFEMB_Factory init %d, streamLen = %d\n", result, stream->getLength());
|
| -
|
| - FPDFEMB_FILE_ACCESS file;
|
| - file.GetSize = file_getsize;
|
| - file.ReadBlock = file_readblock;
|
| - file.user = stream;
|
| -
|
| - FPDFEMB_DOCUMENT document;
|
| - result = FPDFEMB_StartLoadDocument(&file, NULL, &document, NULL);
|
| - SkDebugf("----- SkImageDecoder_FPDFEMB_Factory open %d %p\n", result, document);
|
| -
|
| - int pageCount = FPDFEMB_GetPageCount(document);
|
| - SkDebugf("----- SkImageDecoder_FPDFEMB_Factory pageCount %d\n", pageCount);
|
| -
|
| - if (pageCount > 0) {
|
| - FPDFEMB_PAGE page;
|
| - result = FPDFEMB_LoadPage(document, 0, &page);
|
| - SkDebugf("----- SkImageDecoder_FPDFEMB_Factory load page %d\n", result);
|
| -
|
| - int width, height;
|
| - result = FPDFEMB_GetPageSize(page, &width, &height);
|
| - SkDebugf("----- SkImageDecoder_FPDFEMB_Factory page size %d [%d %d]\n", result, width, height);
|
| -
|
| - FPDFEMB_RECT rect;
|
| - result = FPDFEMB_GetPageBBox(page, &rect);
|
| - SkDebugf("----- SkImageDecoder_FPDFEMB_Factory page rect %d [%d %d %d %d]\n", result,
|
| - rect.left, rect.top, rect.right, rect.bottom);
|
| -
|
| - SkDebugf("----- SkImageDecoder_FPDFEMB_Factory begin page parse...\n");
|
| - result = FPDFEMB_StartParse(page, false, NULL);
|
| - SkDebugf("----- SkImageDecoder_FPDFEMB_Factory page parse %d\n", result);
|
| -
|
| - if (0 == result) {
|
| - this->render(page, rect, bm, prefConfig, mode);
|
| - }
|
| -
|
| - result = FPDFEMB_ClosePage(page);
|
| - SkDebugf("----- SkImageDecoder_FPDFEMB_Factory close page %d\n", result);
|
| - }
|
| -
|
| - result = FPDFEMB_CloseDocument(document);
|
| - SkDebugf("----- SkImageDecoder_FPDFEMB_Factory close %d\n", result);
|
| -
|
| - // FPDFEMB_Exit();
|
| -
|
| - return true;
|
| -}
|
|
|