bu5hm4n pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=6b74aad0238d177d6e435958420b9c606e7338db

commit 6b74aad0238d177d6e435958420b9c606e7338db
Author: Marcel Hollerbach <marcel-hollerb...@t-online.de>
Date:   Mon Jun 13 13:15:49 2016 +0200

    evas_generic_loaders: port poppler to the cpp api
    
    Summary: This ports the loader to the stable cpp api.
    
    Test Plan: Please test this patch and tell me if there are differences
    
    Reviewers: DaveMDS
    
    Subscribers: jayji
    
    Differential Revision: https://phab.enlightenment.org/D4039
---
 configure.ac                  |   8 +-
 src/generic/evas/pdf/main.cpp | 173 +++++++++++++++++++-----------------------
 2 files changed, 78 insertions(+), 103 deletions(-)

diff --git a/configure.ac b/configure.ac
index f1cf8df..fc715e5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2864,13 +2864,7 @@ 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_EXISTS([poppler >= 0.20],
-                    [AC_DEFINE(HAVE_POPPLER_020, 1, [Have poppler at least 
0.20])])
-
-   PKG_CHECK_EXISTS([poppler >= 0.31],
-                    [AC_DEFINE(HAVE_POPPLER_031, 1, [Have poppler at least 
0.31])])
+   PKG_CHECK_MODULES([POPPLER], [poppler-cpp >= 0.12], [have_poppler="yes"])
 fi
 
 if test "x${want_spectre}" = "xyes"; then
diff --git a/src/generic/evas/pdf/main.cpp b/src/generic/evas/pdf/main.cpp
index d9af1d3..426e97c 100644
--- a/src/generic/evas/pdf/main.cpp
+++ b/src/generic/evas/pdf/main.cpp
@@ -8,19 +8,19 @@
 #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-global.h>
+#include <poppler-rectangle.h>
+#include <poppler-document.h>
+#include <poppler-page.h>
+#include <poppler-page-renderer.h>
+
 #include "shmfile.h"
 #include "timeout.h"
 
-#define DATA32  unsigned int
+#define DATA32 unsigned int
+typedef char RGB24[3];
 
 //#define PDF_DBG
 
@@ -30,11 +30,12 @@
 #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,9 +45,7 @@ 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;
 
    if (!file || !*file)
      return EINA_FALSE;
@@ -54,55 +53,36 @@ 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();
+
    if (cw > w) cw = w;
    if (ch > h) ch = h;
-   if ((rot == 90) || (rot == 270))
-     {
-        double t;
-        // swap width & height
-        t = w; w = h; h = t;
-        // 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 +94,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;
@@ -130,77 +110,78 @@ Eina_Bool poppler_init(const char *file, int page_nbr, 
int size_w, int size_h)
    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 *dst;
+   int y, x;
 
    if (dpi <= 0.0) dpi = DEF_DPI;
 
-#ifdef HAVE_POPPLER_031
-   output_dev->setFontAntialias(EINA_TRUE);
-   output_dev->setVectorAntialias(EINA_TRUE);
-#endif
+   renderer = new page_renderer();
 
-#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();
+   renderer->set_render_hint(page_renderer::render_hint::text_antialiasing, 1);
+   renderer->set_render_hint(page_renderer::render_hint::antialiasing, 1);
+
+   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;
    dst = (DATA32 *)data;
-   for (y = 0; y < crop_height; y++)
+
+#define IMAGE_PIXEL_ITERATOR \
+   for (y = 0; y < crop_height; y++) \
+     for (x = 0; x < crop_width; x++)
+
+   if (out.format() == image::format_mono)
      {
-        memcpy(dst, src, crop_width * sizeof(DATA32));
-        src += width;
-        dst += crop_width;
+        //FIXME no idea what this format is like
      }
-
- del_outpput_dev:
-   delete output_dev;
+   if (out.format() == image::format_rgb24)
+     {
+        RGB24 *src;
+        src = (RGB24*) out.data();
+        IMAGE_PIXEL_ITERATOR
+          {
+             DATA32 d = 0xFF000000;
+             int pos = x+y*crop_width;
+             d |= src[pos][0] >> 8;
+             d |= src[pos][1] >> 16;
+             d |= src[pos][2] >> 24;
+             dst[pos] =  d;
+          }
+      }
+    else if (out.format() == image::format_argb32)
+      {
+         DATA32 *src;
+
+         src = (DATA32*) out.data();
+         IMAGE_PIXEL_ITERATOR
+           {
+              int pos = x+y*crop_width;
+
+              dst[pos] = src[pos];
+           }
+      }
+
+ end:
+   delete renderer;
 }
 
 int

-- 


Reply via email to