[PATCH 09/10] Minor fixes based on reviewer feedback (memory leaks, removed TextPage instance).

Stefan Thomas thomas at txtbear.com
Fri Jul 16 11:53:22 PDT 2010


---
 utils/pdftocairo.cc |   37 +++++++++++++------------------------
 1 files changed, 13 insertions(+), 24 deletions(-)

diff --git a/utils/pdftocairo.cc b/utils/pdftocairo.cc
index 8e5db15..dd9ef41 100644
--- a/utils/pdftocairo.cc
+++ b/utils/pdftocairo.cc
@@ -135,7 +135,7 @@ static const ArgDesc argDesc[] = {
 };
 
 
-static void format_output_filename(char *outFile, char *outRoot,
+static void format_output_filename(char *outFile, const char *outRoot,
            int pg_num_len, int pg)
 {
   if (!outRoot) outRoot = "cairoout";
@@ -164,7 +164,7 @@ static cairo_surface_t *start_page(char *outFile, int w, int h,
   if (png) {
     surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w*x_res/72.0, h*y_res/72.0);
   } else if (jpg) {
-    surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, w*x_res/72.0, h*y_res/72.0);
+    surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w*x_res/72.0, h*y_res/72.0);
   } else if (ps) {
     surface = cairo_ps_surface_create(outFile, w, h);
   } else if (pdf) {
@@ -205,6 +205,9 @@ static void end_page_jpeg(cairo_surface_t *surface, char *outFile)
     p += stride;
 	}
   writer->close();
+  
+  delete writer;
+  delete[] row;
 }
 
 static void end_page(cairo_surface_t *surface, char *outFile)
@@ -227,7 +230,6 @@ static int render_page(CairoOutputDev *output_dev, PDFDoc *doc,
 {
   cairo_t *cr;
   cairo_status_t status;
-  TextPage *text = NULL;
 
   if (w == 0) w = (int)ceil(pg_w);
   if (h == 0) h = (int)ceil(pg_h);
@@ -243,17 +245,6 @@ static int render_page(CairoOutputDev *output_dev, PDFDoc *doc,
   if (!printing)
     cairo_scale (cr, x_res/72.0, y_res/72.0);
 
-  // JPEGs are non-transparent, so we need a white background
-  if (jpg) {
-    cairo_rectangle(cr, 0, 0, w, h);
-    cairo_set_source_rgb(cr, 1, 1, 1);
-    cairo_fill(cr);
-  }
-  
-  text = new TextPage(gFalse);
-  if (!printing)
-    output_dev->setTextPage (text);
-
   /* NOTE: instead of passing -1 we should/could use cairo_clip_extents()
    * to get a bounding box */
   cairo_save (cr);
@@ -266,8 +257,8 @@ static int render_page(CairoOutputDev *output_dev, PDFDoc *doc,
   cairo_restore(cr);
 
   output_dev->setCairo(NULL);
-  output_dev->setTextPage(NULL);
 
+  // Add a white background
   if (!printing) {
     cairo_save(cr);
     cairo_set_operator(cr, CAIRO_OPERATOR_DEST_OVER);
@@ -281,9 +272,6 @@ static int render_page(CairoOutputDev *output_dev, PDFDoc *doc,
     fprintf(stderr, "cairo error: %s\n", cairo_status_to_string (status));
   cairo_destroy (cr);
 
-  if (text != NULL)
-    text->decRefCnt();
-
   return 0;
 }
 
@@ -296,7 +284,7 @@ int main(int argc, char *argv[]) {
   GBool ok;
   int exitCode;
   int pg, pg_num_len;
-  double pg_w, pg_h, tmp;
+  double pg_w, pg_h;
   char *p;
   CairoOutputDev *output_dev;
   cairo_surface_t *surface;
@@ -420,12 +408,12 @@ int main(int argc, char *argv[]) {
     render_page(output_dev, doc, surface, printing, pg,
 		x, y, w, h, pg_w, pg_h, x_resolution, y_resolution);
     end_page(surface, outFile);
+    cairo_surface_finish(surface);
+    status = cairo_surface_status(surface);
+    if (status)
+      fprintf(stderr, "cairo error: %s\n", cairo_status_to_string(status));
+    cairo_surface_destroy(surface);
   }
-  cairo_surface_finish(surface);
-  status = cairo_surface_status(surface);
-  if (status)
-    fprintf(stderr, "cairo error: %s\n", cairo_status_to_string(status));
-  cairo_surface_destroy(surface);
   delete output_dev;
 
   exitCode = 0;
@@ -434,6 +422,7 @@ int main(int argc, char *argv[]) {
  err1:
   delete doc;
   delete globalParams;
+  if (outRoot) free(outRoot);
  err0:
 
   // check for memory leaks
-- 
1.7.0.4




More information about the poppler mailing list