poppler: update to version 0.22.1
authorAli Gholami Rudi <ali@rudi.ir>
Fri, 8 Mar 2013 17:15:39 +0000 (8 20:45 +0330)
committerAli Gholami Rudi <ali@rudi.ir>
Fri, 8 Mar 2013 17:15:39 +0000 (8 20:45 +0330)
I dislike both c++ and poppler but I am surprised to see
how clean poppler's new interface is.  mupdf should learn.

Makefile
doc.h
fbpdf.c
poppler.c

index d3b6351..c4a0cae 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -19,6 +19,6 @@ fbdjvu: fbpdf.o djvulibre.o draw.o
 
 # pdf support using poppler
 poppler.o: poppler.c
-       $(CC) -c $(CFLAGS) `pkg-config --cflags poppler-glib` $<
+       $(CXX) -c $(CFLAGS) `pkg-config --cflags poppler-cpp` $<
 fbpdf2: fbpdf.o poppler.o draw.o
-       $(CC) -o $@ $^ $(LDFLAGS) `pkg-config --libs poppler-glib`
+       $(CXX) -o $@ $^ $(LDFLAGS) `pkg-config --libs poppler-cpp`
diff --git a/doc.h b/doc.h
index 88ba15c..9780303 100644 (file)
--- a/doc.h
+++ b/doc.h
@@ -2,7 +2,8 @@
 typedef unsigned int fbval_t;
 
 /* optimized version of fb_val() */
-#define FB_VAL(r, g, b)        fb_val((r), (g), (b))
+//#define FB_VAL(r, g, b)      fb_val((r), (g), (b))
+#define FB_VAL(r, g, b)        (((r) << 16) | ((g) << 8) | (b))
 
 struct doc *doc_open(char *path);
 int doc_pages(struct doc *doc);
diff --git a/fbpdf.c b/fbpdf.c
index 1001c71..8cfc880 100644 (file)
--- a/fbpdf.c
+++ b/fbpdf.c
@@ -1,9 +1,9 @@
 /*
  * fbpdf - a small framebuffer pdf viewer using mupdf
  *
- * Copyright (C) 2009-2012 Ali Gholami Rudi <ali at rudi dot ir>
+ * Copyright (C) 2009-2013 Ali Gholami Rudi <ali at rudi dot ir>
  *
- * This program is released under the modified BSD license.
+ * This program is released under the Modified BSD license.
  */
 #include <ctype.h>
 #include <signal.h>
dissimilarity index 77%
index 2ab78f4..f27af3b 100644 (file)
--- a/poppler.c
+++ b/poppler.c
@@ -1,67 +1,75 @@
-#include <stdlib.h>
-#include <string.h>
-#include <cairo/cairo.h>
-#include <glib/poppler.h>
-#include "doc.h"
-
-struct doc {
-       PopplerDocument *doc;
-};
-
-int doc_draw(struct doc *doc, int p, int zoom, int rotate,
-               fbval_t *bitmap, int *rows, int *cols)
-{
-       cairo_t *cairo;
-       cairo_surface_t *surface;
-       PopplerPage *page;
-       unsigned char *img;
-       int i, j;
-       int h, w;
-       int iw;
-       surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, *cols, *rows);
-       cairo = cairo_create(surface);
-       cairo_scale(cairo, (float) zoom / 10, (float) zoom / 10);
-       cairo_set_source_rgb(cairo, 1.0, 1.0, 1.0);
-       cairo_paint(cairo);
-       img = cairo_image_surface_get_data(surface);
-       page = poppler_document_get_page(doc->doc, p - 1);
-       poppler_page_render(page, cairo);
-       iw = cairo_image_surface_get_width(surface);
-       h = MIN(*rows, cairo_image_surface_get_height(surface));
-       w = MIN(*cols, iw);
-       for (i = 0; i < h; i++) {
-               for (j = 0; j < w; j++) {
-                       unsigned char *s = img + (i * iw + j) * 4;
-                       bitmap[i * *cols + j] = FB_VAL(*(s + 2), *(s + 1), *s);
-               }
-       }
-       cairo_destroy(cairo);
-       cairo_surface_destroy(surface);
-       g_object_unref(G_OBJECT(page));
-       *cols = w;
-       *rows = h;
-       return 0;
-}
-
-int doc_pages(struct doc *doc)
-{
-       return poppler_document_get_n_pages(doc->doc);
-}
-
-struct doc *doc_open(char *path)
-{
-       struct doc *doc = malloc(sizeof(*doc));
-       char abspath[PATH_MAX];
-       char uri[PATH_MAX + 16];
-       realpath(path, abspath);
-       snprintf(uri, sizeof(uri), "file://%s", abspath);
-       g_type_init();
-       doc->doc = poppler_document_new_from_file(uri, NULL, NULL);
-       return doc;
-}
-
-void doc_close(struct doc *doc)
-{
-       g_object_unref(G_OBJECT(doc->doc));
-       free(doc);
-}
+#include <stdlib.h>
+#include <string.h>
+#include <poppler/cpp/poppler-document.h>
+#include <poppler/cpp/poppler-image.h>
+#include <poppler/cpp/poppler-page.h>
+#include <poppler/cpp/poppler-page-renderer.h>
+
+extern "C" {
+#include "doc.h"
+}
+
+struct doc {
+       poppler::document *doc;
+};
+
+static poppler::rotation_enum rotation(int times)
+{
+       if (times == 1)
+               return poppler::rotate_90;
+       if (times == 2)
+               return poppler::rotate_180;
+       if (times == 3)
+               return poppler::rotate_270;
+       return poppler::rotate_0;
+}
+
+int doc_draw(struct doc *doc, int p, int zoom, int rotate,
+               fbval_t *bitmap, int *rows, int *cols)
+{
+       poppler::page *page = doc->doc->create_page(p);
+       poppler::page_renderer pr;
+       int x, y;
+       int h, w;
+       unsigned char *dat;
+       pr.set_render_hint(poppler::page_renderer::antialiasing, true);
+       pr.set_render_hint(poppler::page_renderer::text_antialiasing, true);
+       poppler::image img = pr.render_page(page, 72 * zoom / 10, 72 * zoom / 10,
+                               -1, -1, -1, -1, rotation((rotate + 89) / 90));
+       h = img.height();
+       w = img.width();
+       dat = (unsigned char *) img.data();
+       for (y = 0; y < h; y++) {
+               int xs = y * *cols + (*cols - w) / 2;
+               for (x = 0; x < w; x++) {
+                       unsigned char *s = dat + img.bytes_per_row() * y + x * 4;
+                       bitmap[xs + x] = FB_VAL(s[0], s[1], s[2]);
+               }
+       }
+       *rows = h;
+       *cols = w;
+       delete page;
+       return 0;
+}
+
+int doc_pages(struct doc *doc)
+{
+       return doc->doc->pages();
+}
+
+struct doc *doc_open(char *path)
+{
+       struct doc *doc = (struct doc *) malloc(sizeof(*doc));
+       doc->doc = poppler::document::load_from_file(path);
+       if (!doc->doc) {
+               doc_close(doc);
+               return NULL;
+       }
+       return doc;
+}
+
+void doc_close(struct doc *doc)
+{
+       delete doc->doc;
+       free(doc);
+}