Hello, This simple 3-patch series removes code duplication in pdf_page_render and pdf_page_render_cairo in MuPDF plugin.
Alexander
From 64262c0cad50d9dc440e4d6435714f2c7e7ec140 Mon Sep 17 00:00:00 2001 From: Alexander Monakov <amona...@ispras.ru> Date: Thu, 31 Oct 2013 01:15:59 +0400 Subject: [PATCH 2/5] Prepare to deduplicate pdf_page_render_cairo --- pdf.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/pdf.c b/pdf.c index 68fc713..1e3c0a6 100644 --- a/pdf.c +++ b/pdf.c @@ -550,14 +550,18 @@ pdf_page_render_cairo(zathura_page_t* page, mupdf_page_t* mupdf_page, cairo_t* c return ZATHURA_ERROR_UNKNOWN; } - mupdf_document_t* mupdf_document = zathura_document_get_data(document); - unsigned int page_width = cairo_image_surface_get_width(surface); unsigned int page_height = cairo_image_surface_get_height(surface); double scalex = ((double) page_width) / zathura_page_get_width(page); double scaley = ((double) page_height) /zathura_page_get_height(page); + int rowstride = cairo_image_surface_get_stride(surface); + unsigned char* image = cairo_image_surface_get_data(surface); + int components = 4; + + mupdf_document_t* mupdf_document = zathura_document_get_data(document); + /* render */ fz_display_list* display_list = fz_new_display_list(mupdf_page->ctx); fz_device* device = fz_new_list_device(mupdf_page->ctx, display_list); @@ -583,14 +587,11 @@ pdf_page_render_cairo(zathura_page_t* page, mupdf_page_t* mupdf_page, cairo_t* c fz_run_display_list(display_list, device, &fz_identity, &rect, NULL); fz_free_device(device); - int rowstride = cairo_image_surface_get_stride(surface); - unsigned char* image = cairo_image_surface_get_data(surface); - unsigned char* s = fz_pixmap_samples(mupdf_page->ctx, pixmap); unsigned int n = fz_pixmap_components(mupdf_page->ctx, pixmap); for (unsigned int y = 0; y < fz_pixmap_height(mupdf_page->ctx, pixmap); y++) { for (unsigned int x = 0; x < fz_pixmap_width(mupdf_page->ctx, pixmap); x++) { - guchar* p = image + y * rowstride + x * 4; + guchar* p = image + y * rowstride + x * components; p[0] = s[2]; p[1] = s[1]; p[2] = s[0]; -- 1.8.3.2
From a962f87c99c950624fa03d87dd37746774582dc3 Mon Sep 17 00:00:00 2001 From: Alexander Monakov <amona...@ispras.ru> Date: Thu, 31 Oct 2013 01:17:21 +0400 Subject: [PATCH 3/5] Prepare to deduplicate pdf_page_render --- pdf.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/pdf.c b/pdf.c index 1e3c0a6..13b3c6b 100644 --- a/pdf.c +++ b/pdf.c @@ -468,9 +468,10 @@ pdf_page_render(zathura_page_t* page, mupdf_page_t* mupdf_page, zathura_error_t* } /* calculate sizes */ - double scale = zathura_document_get_scale(document); - unsigned int page_width = scale * zathura_page_get_width(page); - unsigned int page_height = scale * zathura_page_get_height(page); + double scalex = zathura_document_get_scale(document); + double scaley = scalex; + unsigned int page_width = scalex * zathura_page_get_width(page); + unsigned int page_height = scaley * zathura_page_get_height(page); /* create image buffer */ zathura_image_buffer_t* image_buffer = zathura_image_buffer_create(page_width, page_height); @@ -482,6 +483,10 @@ pdf_page_render(zathura_page_t* page, mupdf_page_t* mupdf_page, zathura_error_t* return NULL; } + int rowstride = image_buffer->rowstride; + unsigned char* image = image_buffer->data; + int components = 3; + mupdf_document_t* mupdf_document = zathura_document_get_data(document); /* render */ @@ -490,7 +495,7 @@ pdf_page_render(zathura_page_t* page, mupdf_page_t* mupdf_page, zathura_error_t* fz_try (mupdf_document->ctx) { fz_matrix m; - fz_scale(&m, scale, scale); + fz_scale(&m, scalex, scaley); fz_run_page(mupdf_document->document, mupdf_page->page, device, &m, NULL); } fz_catch (mupdf_document->ctx) { if (error != NULL) { @@ -516,7 +521,7 @@ pdf_page_render(zathura_page_t* page, mupdf_page_t* mupdf_page, zathura_error_t* unsigned int n = fz_pixmap_components(mupdf_page->ctx, pixmap); for (unsigned int y = 0; y < fz_pixmap_height(mupdf_page->ctx, pixmap); y++) { for (unsigned int x = 0; x < fz_pixmap_width(mupdf_page->ctx, pixmap); x++) { - guchar* p = image_buffer->data + y * image_buffer->rowstride + x * 3; + guchar* p = image + y * rowstride + x * components; p[0] = s[2]; p[1] = s[1]; p[2] = s[0]; -- 1.8.3.2
From 1bce61203cb4ddb4be77694b6cdbbbfd35661225 Mon Sep 17 00:00:00 2001 From: Alexander Monakov <amona...@ispras.ru> Date: Thu, 31 Oct 2013 01:49:40 +0400 Subject: [PATCH 4/5] Deduplicate pdf_page_render and pdf_page_render_cairo --- pdf.c | 135 +++++++++++++++++++++++++++--------------------------------------- 1 file changed, 55 insertions(+), 80 deletions(-) diff --git a/pdf.c b/pdf.c index 13b3c6b..791751b 100644 --- a/pdf.c +++ b/pdf.c @@ -452,6 +452,54 @@ error_ret: return NULL; } +static zathura_error_t +pdf_page_render_to_buffer(mupdf_document_t* mupdf_document, mupdf_page_t* mupdf_page, + unsigned char* image, int rowstride, int components, + unsigned int page_width, unsigned int page_height, + double scalex, double scaley) +{ + fz_display_list* display_list = fz_new_display_list(mupdf_page->ctx); + fz_device* device = fz_new_list_device(mupdf_page->ctx, display_list); + + fz_try (mupdf_document->ctx) { + fz_matrix m; + fz_scale(&m, scalex, scaley); + fz_run_page(mupdf_document->document, mupdf_page->page, device, &m, NULL); + } fz_catch (mupdf_document->ctx) { + return ZATHURA_ERROR_UNKNOWN; + } + + fz_free_device(device); + + fz_irect irect = { .x1 = page_width, .y1 = page_height }; + fz_rect rect = { .x1 = page_width, .y1 = page_height }; + + fz_colorspace* colorspace = fz_device_rgb(mupdf_document->ctx); + fz_pixmap* pixmap = fz_new_pixmap_with_bbox(mupdf_page->ctx, colorspace, &irect); + fz_clear_pixmap_with_value(mupdf_page->ctx, pixmap, 0xFF); + + device = fz_new_draw_device(mupdf_page->ctx, pixmap); + fz_run_display_list(display_list, device, &fz_identity, &rect, NULL); + fz_free_device(device); + + unsigned char* s = fz_pixmap_samples(mupdf_page->ctx, pixmap); + unsigned int n = fz_pixmap_components(mupdf_page->ctx, pixmap); + for (unsigned int y = 0; y < fz_pixmap_height(mupdf_page->ctx, pixmap); y++) { + for (unsigned int x = 0; x < fz_pixmap_width(mupdf_page->ctx, pixmap); x++) { + guchar* p = image + y * rowstride + x * components; + p[0] = s[2]; + p[1] = s[1]; + p[2] = s[0]; + s += n; + } + } + + fz_drop_pixmap(mupdf_page->ctx, pixmap); + fz_drop_display_list(mupdf_page->ctx, display_list); + + return ZATHURA_ERROR_OK; +} + zathura_image_buffer_t* pdf_page_render(zathura_page_t* page, mupdf_page_t* mupdf_page, zathura_error_t* error) { @@ -485,53 +533,20 @@ pdf_page_render(zathura_page_t* page, mupdf_page_t* mupdf_page, zathura_error_t* int rowstride = image_buffer->rowstride; unsigned char* image = image_buffer->data; - int components = 3; mupdf_document_t* mupdf_document = zathura_document_get_data(document); - /* render */ - fz_display_list* display_list = fz_new_display_list(mupdf_page->ctx); - fz_device* device = fz_new_list_device(mupdf_page->ctx, display_list); + zathura_error_t e = pdf_page_render_to_buffer(mupdf_document, mupdf_page, image, rowstride, 3, + page_width, page_height, scalex, scaley); - fz_try (mupdf_document->ctx) { - fz_matrix m; - fz_scale(&m, scalex, scaley); - fz_run_page(mupdf_document->document, mupdf_page->page, device, &m, NULL); - } fz_catch (mupdf_document->ctx) { + if (e != ZATHURA_ERROR_OK) { + zathura_image_buffer_free(image_buffer); if (error != NULL) { - *error = ZATHURA_ERROR_OUT_OF_MEMORY; + *error = e; } return NULL; } - fz_free_device(device); - - fz_irect irect = { .x1 = page_width, .y1 = page_height }; - fz_rect rect = { .x1 = page_width, .y1 = page_height }; - - fz_colorspace* colorspace = fz_device_rgb(mupdf_document->ctx); - fz_pixmap* pixmap = fz_new_pixmap_with_bbox(mupdf_page->ctx, colorspace, &irect); - fz_clear_pixmap_with_value(mupdf_page->ctx, pixmap, 0xFF); - - device = fz_new_draw_device(mupdf_page->ctx, pixmap); - fz_run_display_list(display_list, device, &fz_identity, &rect, NULL); - fz_free_device(device); - - unsigned char* s = fz_pixmap_samples(mupdf_page->ctx, pixmap); - unsigned int n = fz_pixmap_components(mupdf_page->ctx, pixmap); - for (unsigned int y = 0; y < fz_pixmap_height(mupdf_page->ctx, pixmap); y++) { - for (unsigned int x = 0; x < fz_pixmap_width(mupdf_page->ctx, pixmap); x++) { - guchar* p = image + y * rowstride + x * components; - p[0] = s[2]; - p[1] = s[1]; - p[2] = s[0]; - s += n; - } - } - - fz_drop_pixmap(mupdf_page->ctx, pixmap); - fz_drop_display_list(mupdf_page->ctx, display_list); - return image_buffer; } @@ -563,51 +578,11 @@ pdf_page_render_cairo(zathura_page_t* page, mupdf_page_t* mupdf_page, cairo_t* c int rowstride = cairo_image_surface_get_stride(surface); unsigned char* image = cairo_image_surface_get_data(surface); - int components = 4; mupdf_document_t* mupdf_document = zathura_document_get_data(document); - /* render */ - fz_display_list* display_list = fz_new_display_list(mupdf_page->ctx); - fz_device* device = fz_new_list_device(mupdf_page->ctx, display_list); - - fz_try (mupdf_document->ctx) { - fz_matrix m; - fz_scale(&m, scalex, scaley); - fz_run_page(mupdf_document->document, mupdf_page->page, device, &m, NULL); - } fz_catch (mupdf_document->ctx) { - return ZATHURA_ERROR_UNKNOWN; - } - - fz_free_device(device); - - fz_irect irect = { .x1 = page_width, .y1 = page_height }; - fz_rect rect = { .x1 = page_width, .y1 = page_height }; - - fz_colorspace* colorspace = fz_device_rgb(mupdf_document->ctx); - fz_pixmap* pixmap = fz_new_pixmap_with_bbox(mupdf_page->ctx, colorspace, &irect); - fz_clear_pixmap_with_value(mupdf_page->ctx, pixmap, 0xFF); - - device = fz_new_draw_device(mupdf_page->ctx, pixmap); - fz_run_display_list(display_list, device, &fz_identity, &rect, NULL); - fz_free_device(device); - - unsigned char* s = fz_pixmap_samples(mupdf_page->ctx, pixmap); - unsigned int n = fz_pixmap_components(mupdf_page->ctx, pixmap); - for (unsigned int y = 0; y < fz_pixmap_height(mupdf_page->ctx, pixmap); y++) { - for (unsigned int x = 0; x < fz_pixmap_width(mupdf_page->ctx, pixmap); x++) { - guchar* p = image + y * rowstride + x * components; - p[0] = s[2]; - p[1] = s[1]; - p[2] = s[0]; - s += n; - } - } - - fz_drop_pixmap(mupdf_page->ctx, pixmap); - fz_drop_display_list(mupdf_page->ctx, display_list); - - return ZATHURA_ERROR_OK;; + return pdf_page_render_to_buffer(mupdf_document, mupdf_page, image, rowstride, 4, + page_width, page_height, scalex, scaley); } #endif -- 1.8.3.2
_______________________________________________ zathura mailing list zathura@lists.pwmt.org http://lists.pwmt.org/mailman/listinfo/zathura