/* * Copyright (C) 2004 Stefan Kleine Stegemann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include "poppler_splash_renderer.h" #include "poppler.h" #include #include #include #include #include #define PDF_DOC(obj) static_cast(obj) #define PAGE(obj) static_cast(obj) #define SPLASH_DEV(obj) static_cast(obj) #define SPLASH_BITMAP(obj) static_cast(obj) void* poppler_splash_device_create(int bg_red, int bg_green, int bg_blue) { BEGIN_SYNCHRONIZED; SplashColor white; #ifdef POPPLER_0_4 white.rgb8 = splashMakeRGB8(bg_red, bg_green, bg_blue); void* splashDevice = new SplashOutputDev(splashModeRGB8, gFalse, white); #endif #ifdef POPPLER_0_5 white[0] = bg_red; white[1] = bg_green; white[2] = bg_blue; // I'm not sure what bitmapRowPad should be, 1 is just a guess. void* splashDevice = new SplashOutputDev(splashModeRGB8, 1, gFalse, white); #endif END_SYNCHRONIZED; return splashDevice; } void poppler_splash_device_start_doc(void* output_dev, void* poppler_document) { if (!output_dev || !poppler_document) { return; } SYNCHRONIZED(SPLASH_DEV(output_dev)->startDoc(PDF_DOC(poppler_document)->getXRef())); } void poppler_splash_device_destroy(void* output_dev) { if (!output_dev) { return; } delete SPLASH_DEV(output_dev); } int poppler_splash_device_display_slice(void* output_dev, void* poppler_page, void* poppler_document, float hDPI, float vDPI, int rotate, float sliceX, float sliceY, float sliceW, float sliceH) { if (!output_dev || !poppler_page || !poppler_document) { return 0; } SYNCHRONIZED(PAGE(poppler_page)->displaySlice(SPLASH_DEV(output_dev), (double)hDPI, (double)vDPI, rotate, #ifdef POPPLER_0_5 gTrue, // useMediaBox #endif gTrue, // Crop (int)sliceX, (int)sliceY, (int)sliceW, (int)sliceH, NULL, // Links PDF_DOC(poppler_document)->getCatalog())); return 1; } int poppler_splash_device_get_bitmap(void* output_dev, void** bitmap, int* width, int* height) { if (!output_dev) { return 0; } SplashBitmap* _bitmap = SPLASH_DEV(output_dev)->getBitmap(); *width = _bitmap->getWidth(); *height = _bitmap->getHeight(); *bitmap = _bitmap; return 1; } int poppler_splash_device_get_rgb(void* bitmap, unsigned char** data) { if (!bitmap) { return 0; } #ifdef POPPLER_0_4 SplashRGB8* rgb8; #endif #ifdef POPPLER_0_5 SplashColorPtr color; #endif unsigned char* dataPtr; #ifdef POPPLER_0_4 rgb8 = SPLASH_BITMAP(bitmap)->getDataPtr().rgb8; #endif #ifdef POPPLER_0_5 color = SPLASH_BITMAP(bitmap)->getDataPtr(); #endif dataPtr = *data; for (int row = 0; row < SPLASH_BITMAP(bitmap)->getHeight(); row++) { for (int col = 0; col < SPLASH_BITMAP(bitmap)->getWidth(); col++) { #ifdef POPPLER_0_4 *dataPtr++ = splashRGB8R(*rgb8); *dataPtr++ = splashRGB8G(*rgb8); *dataPtr++ = splashRGB8B(*rgb8); ++rgb8; #endif #ifdef POPPLER_0_5 *dataPtr++ = splashRGB8R(color); *dataPtr++ = splashRGB8G(++color); *dataPtr++ = splashRGB8B(++color); ++color; #endif } } return 1; }