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

Reply via email to