From: Ali Gholami Rudi Date: Fri, 8 Mar 2013 17:15:39 +0000 (+0330) Subject: poppler: update to version 0.22.1 X-Git-Url: https://repo.or.cz/w/fbpdf.git/commitdiff_plain/6da279e3b3d971ee0d4378f13e82108228495da1 poppler: update to version 0.22.1 I dislike both c++ and poppler but I am surprised to see how clean poppler's new interface is. mupdf should learn. --- diff --git a/Makefile b/Makefile index d3b6351..c4a0cae 100644 --- 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 --- 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 --- 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 + * Copyright (C) 2009-2013 Ali Gholami Rudi * - * This program is released under the modified BSD license. + * This program is released under the Modified BSD license. */ #include #include diff --git a/poppler.c b/poppler.c dissimilarity index 77% index 2ab78f4..f27af3b 100644 --- a/poppler.c +++ b/poppler.c @@ -1,67 +1,75 @@ -#include -#include -#include -#include -#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 +#include +#include +#include +#include +#include + +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); +}