summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hollerbach <marcel-hollerbach@t-online.de>2016-06-13 10:48:29 +0200
committerMarcel Hollerbach <marcel-hollerbach@t-online.de>2016-06-13 10:48:29 +0200
commit74117442060bc871462e02a5f330246a24241cba (patch)
treed6f809fa2d6b95e0a8013cfb30dc356d0c32ae59
parentcaa9bdfe13a83bb646d60eb8609cb34ef8987f87 (diff)
downloadefl-devs/bu5hm4n/poppler-fix.tar.gz
-rw-r--r--configure.ac8
-rw-r--r--src/generic/evas/pdf/main.cpp141
-rw-r--r--src/lib/evas/common/evas_image_load.c28
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);