diff options
-rw-r--r-- | configure.ac | 8 | ||||
-rw-r--r-- | src/generic/evas/pdf/main.cpp | 141 | ||||
-rw-r--r-- | src/lib/evas/common/evas_image_load.c | 28 |
3 files changed, 71 insertions, 106 deletions
diff --git a/configure.ac b/configure.ac index f37f3a5429..814e930384 100644 --- a/configure.ac +++ b/configure.ac @@ -2864,12 +2864,12 @@ have_rsvg="no" ### Check needed dependency for each generic loader if test "x${want_poppler}" = "xyes"; then - PKG_CHECK_MODULES([POPPLER], [poppler >= 0.12], [have_poppler="yes"]) + PKG_CHECK_MODULES([POPPLER], [poppler-cpp >= 0.12], [have_poppler="yes"]) - PKG_CHECK_EXISTS([poppler >= 0.20], + PKG_CHECK_EXISTS([poppler-cpp >= 0.20], [AC_DEFINE(HAVE_POPPLER_020, 1, [Have poppler at least 0.20])]) - PKG_CHECK_EXISTS([poppler >= 0.31], + PKG_CHECK_EXISTS([poppler-cpp >= 0.31], [AC_DEFINE(HAVE_POPPLER_031, 1, [Have poppler at least 0.31])]) fi @@ -5948,7 +5948,7 @@ echo "Ethumb..........: yes" echo "Ethumb_Client...: yes" echo "Elua............: $have_elua" echo "Elementary......: yes (${features_elementary})" -echo +echo echo diff --git a/src/generic/evas/pdf/main.cpp b/src/generic/evas/pdf/main.cpp index d9af1d342b..88cb58c4fd 100644 --- a/src/generic/evas/pdf/main.cpp +++ b/src/generic/evas/pdf/main.cpp @@ -8,15 +8,14 @@ #include <unistd.h> #include <libgen.h> -#include <GlobalParams.h> -#include <PDFDoc.h> -#include <ErrorCodes.h> -#include <Page.h> -#include <SplashOutputDev.h> -#include <splash/SplashBitmap.h> - #include <Eina.h> +#include "poppler/cpp/poppler-global.h" +#include "poppler/cpp/poppler-rectangle.h" +#include "poppler/cpp/poppler-document.h" +#include "poppler/cpp/poppler-page.h" +#include "poppler/cpp/poppler-page-renderer.h" + #include "shmfile.h" #include "timeout.h" @@ -24,17 +23,18 @@ //#define PDF_DBG -#ifdef PDF_DBG +//#ifdef PDF_DBG #define D(fmt, args...) fprintf(stderr, fmt, ## args) -#else +/*#else #define D(fmt, args...) #endif +*/ +using namespace poppler; - -PDFDoc *pdfdoc; bool locked = false; -::Page *page; +document *doc; +page *doc_page; int width = 0, height = 0; int crop_width = 0, crop_height = 0; void *data = NULL; @@ -44,7 +44,6 @@ double dpi = -1.0; Eina_Bool poppler_init(const char *file, int page_nbr, int size_w, int size_h) { - Object obj; double w, h, cw, ch; int rot; @@ -54,40 +53,30 @@ Eina_Bool poppler_init(const char *file, int page_nbr, int size_w, int size_h) if (page_nbr < 0) return EINA_FALSE; - if (!(globalParams = new GlobalParams())) - return EINA_FALSE; - if (!eina_init()) - goto del_global_param; + return EINA_FALSE; -#ifndef HAVE_POPPLER_031 - if (globalParams->getAntialias()) - globalParams->setAntialias((char *)"yes"); - if (globalParams->getVectorAntialias()) - globalParams->setVectorAntialias((char *)"yes"); -#endif - pdfdoc = new PDFDoc(new GooString(file), NULL); - if (!pdfdoc) - goto del_global_param; + doc = document::load_from_file(file); - if (!pdfdoc->isOk() || (pdfdoc->getErrorCode() == errEncrypted)) - goto del_pdfdoc; + if (!doc) + return EINA_FALSE; - if (page_nbr >= pdfdoc->getNumPages()) + if (page_nbr >= doc->pages()) goto del_pdfdoc; /* load the page */ - page = pdfdoc->getCatalog()->getPage(page_nbr + 1); - if (!page || !page->isOk()) + doc_page = doc->create_page(page_nbr + 1); + if (!doc_page) goto del_pdfdoc; - w = page->getMediaWidth(); - h = page->getMediaHeight(); - cw = page->getCropWidth(); - ch = page->getCropHeight(); - rot = page->getRotate(); + w = doc_page->page_rect(page_box_enum::media_box).width(); + h = doc_page->page_rect(page_box_enum::media_box).height(); + cw = doc_page->page_rect().width(); + ch = doc_page->page_rect().height(); + rot = 0; //TODO fixme + if (cw > w) cw = w; if (ch > h) ch = h; if ((rot == 90) || (rot == 270)) @@ -98,11 +87,11 @@ Eina_Bool poppler_init(const char *file, int page_nbr, int size_w, int size_h) // swap crop width & height t = cw; cw = ch; ch = t; } - + if ((size_w > 0) || (size_h > 0)) { double w2 = cw, h2 = ch; - + w2 = size_w; h2 = (size_w * ch) / cw; if (h2 > size_h) @@ -114,7 +103,7 @@ Eina_Bool poppler_init(const char *file, int page_nbr, int size_w, int size_h) if (w2 > h2) dpi = (w2 * DEF_DPI) / cw; else dpi = (h2 * DEF_DPI) / ch; } - + if (dpi > 0.0) { cw = (cw * dpi) / DEF_DPI; @@ -127,80 +116,56 @@ Eina_Bool poppler_init(const char *file, int page_nbr, int size_w, int size_h) crop_width = cw; crop_height = ch; + printf("%d-%d\n", crop_width, crop_height); + return EINA_TRUE; del_pdfdoc: - delete pdfdoc; - del_global_param: - delete globalParams; + delete doc; return EINA_FALSE; } void poppler_shutdown() { - delete pdfdoc; + delete doc; eina_shutdown(); - delete globalParams; } void poppler_load_image(int size_w EINA_UNUSED, int size_h EINA_UNUSED) { - SplashOutputDev *output_dev; - SplashColor white; - SplashColorPtr color_ptr; - DATA32 *src, *dst; - int y; - - white[0] = 255; - white[1] = 255; - white[2] = 255; - white[3] = 255; - - output_dev = new SplashOutputDev(splashModeXBGR8, 4, gFalse, white); - if (!output_dev) - return; - -#ifdef HAVE_POPPLER_020 - output_dev->startDoc(pdfdoc); -#else - output_dev->startDoc(pdfdoc->getXRef()); -#endif + page_renderer *renderer; + image out; + DATA32 *src; + DATA32 *dst; + int y; - if (dpi <= 0.0) dpi = DEF_DPI; + renderer = new page_renderer(); -#ifdef HAVE_POPPLER_031 - output_dev->setFontAntialias(EINA_TRUE); - output_dev->setVectorAntialias(EINA_TRUE); -#endif + renderer->set_render_hint(page_renderer::render_hint::text_antialiasing, 1); + renderer->set_render_hint(page_renderer::render_hint::antialiasing, 1); -#ifdef HAVE_POPPLER_020 - page->displaySlice(output_dev, dpi, dpi, - 0, false, false, - 0, 0, width, height, - false, NULL, NULL); -#else - page->displaySlice(output_dev, dpi, dpi, - 0, false, false, - 0, 0, width, height, - false, pdfdoc->getCatalog()); -#endif - color_ptr = output_dev->getBitmap()->getDataPtr(); + out = renderer->render_page(doc_page, dpi, dpi, + 0, 0, width, height, + rotate_0); shm_alloc(crop_width * crop_height * sizeof(DATA32)); - if (!shm_addr) goto del_outpput_dev; + if (!shm_addr) goto end; data = shm_addr; - src = (DATA32 *)color_ptr; + src = (DATA32 *)out.data(); dst = (DATA32 *)data; for (y = 0; y < crop_height; y++) { - memcpy(dst, src, crop_width * sizeof(DATA32)); - src += width; - dst += crop_width; + for (int x = 0; x < crop_width; x++) + { + DATA32 d = src[x+y*crop_width]; + //printf("COPIED %d\n", d); + dst[x+y*crop_width] = d; + } } - del_outpput_dev: - delete output_dev; + end: + delete renderer; } int diff --git a/src/lib/evas/common/evas_image_load.c b/src/lib/evas/common/evas_image_load.c index 0d0261510e..092799d52e 100644 --- a/src/lib/evas/common/evas_image_load.c +++ b/src/lib/evas/common/evas_image_load.c @@ -26,43 +26,43 @@ struct ext_loader_s static const struct ext_loader_s loaders[] = { /* map extensions to loaders to use for good first-guess tries */ MATCHING(".png", "png"), - + MATCHING(".jpg", "jpeg"), MATCHING(".jpeg", "jpeg"), MATCHING(".jfif", "jpeg"), - + MATCHING(".j2k", "jp2k"), MATCHING(".jp2", "jp2k"), MATCHING(".jpx", "jp2k"), MATCHING(".jpf", "jp2k"), - + MATCHING(".eet", "eet"), MATCHING(".edj", "eet"), MATCHING(".eap", "eet"), - + MATCHING(".xpm", "xpm"), - + MATCHING(".tiff", "tiff"), MATCHING(".tif", "tiff"), - + MATCHING(".gif", "gif"), - + MATCHING(".pbm", "pmaps"), MATCHING(".pgm", "pmaps"), MATCHING(".ppm", "pmaps"), MATCHING(".pnm", "pmaps"), - + MATCHING(".bmp", "bmp"), - + MATCHING(".tga", "tga"), - + MATCHING(".wbmp", "wbmp"), - + MATCHING(".webp", "webp"), - + MATCHING(".ico", "ico"), MATCHING(".cur", "ico"), - + MATCHING(".psd", "psd"), MATCHING(".tgv", "tgv"), @@ -181,7 +181,7 @@ _evas_image_file_header(Evas_Module *em, Image_Entry *ie, int *error) { Evas_Image_Load_Func *evas_image_load_func = NULL; Eina_Bool r = EINA_TRUE; - + if (!evas_module_load(em)) goto load_error; evas_image_load_func = em->functions; evas_module_use(em); |