swfrender currently scales output 1:1 from the source .swf. 
Assuming that the source swf file is produced by pdf2swf, the swf size is 
actually translated from the original paper size at 1 pt == 1 px, and so the 
overall PDF -> PNG rendering is done at 72dpi. 

I need to render the output images at higher DPI (e.g. for computer display I'd 
like 100-150dpi), so I've added a -r option that scales the output image based 
on a ratio of the target resolution to 72dpi (e.g. 100DPI == 1.388 scale). 

This is slightly weird given that SWF and PNG both have pixel sizes, so it only 
make sense if you assume a pdf2swf generation of the SWF, so I'm not 100% sure 
this fits with the purpose of swfrender (although it does seem to assume a 
pdf2swf generate input). 

cheers 
tim 
From d476c08237990b0ef8af3e32fd109c3ac9253fc6 Mon Sep 17 00:00:00 2001
From: timw <[email protected]>
Date: Mon, 6 Aug 2012 11:17:48 +1200
Subject: [PATCH] Add resolution base scaling to swfrender using a -r
 parameter to specify the desired output DPI.

This relies on assuming that production of swf via pdf2swf uses a 72dpi resolution (e.g. it maps one pt in the input document to one px in the swf), and so a DPI based resolution for the output image can be translated to a scaling factor.
---
 src/swfrender.c |   20 ++++++++++++++++++--
 1 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/swfrender.c b/src/swfrender.c
index ff1e063..dafb6de 100644
--- a/src/swfrender.c
+++ b/src/swfrender.c
@@ -16,6 +16,7 @@ static struct options_t options[] = {
 {"h", "help"},
 {"o", "output"},
 {"p", "pages"},
+{"r", "resolution"},
 {"l", "legacy"},
 {"V", "version"},
 {"X", "width"},
@@ -31,6 +32,7 @@ static char*pagerange = 0;
 
 static int width = 0;
 static int height = 0;
+static int resolution = 0;
 
 typedef struct _parameter {
     const char*name;
@@ -57,6 +59,9 @@ int args_callback_option(char*name,char*val)
     } else if(!strcmp(name, "p")) {
 	pagerange = val;
 	return 1;
+    } else if(!strcmp(name, "r")) {
+    resolution = atoi(val);
+	return 1;
     } else if(!strcmp(name, "s")) {
 	char*s = strdup(val);
 	char*c = strchr(s, '=');
@@ -99,6 +104,7 @@ void args_callback_usage(char *name)
     printf("-l , --legacy                  Use old rendering framework\n");
     printf("-o , --output                  Output file, suffixed for multiple pages (default: output.png)\n");
     printf("-p , --pages range             Render pages in specified range e.g. 9 or 1-20 or 1,4-6,9-11 (default: all pages)\n");
+    printf("-r , --resolution dpi          Scale width and height to a specific DPI resolution, assuming input is 1px per pt (default: 72)\n");
     printf("-X , --width width             Scale output to specific width (proportional unless height specified)\n");
     printf("-Y , --height height           Scale output to specific height (proportional unless width specified)\n");
     printf("\n");
@@ -126,6 +132,11 @@ int main(int argn, char*argv[])
         fprintf(stderr, "You must supply a filename.\n");
         return 1;
     }
+    
+    if (resolution && (width || height)) {
+        fprintf(stderr, "Height/width cannot be specified with resolution.\n");
+        return 1;
+    }
 
     if(!ng) {
         fi = open(filename, O_RDONLY|O_BINARY);
@@ -186,8 +197,13 @@ int main(int argn, char*argv[])
                     if(quantize) {
                         dev->setparameter(dev, "palette", "1");
                     }
-                if(width || height) {
-                    dev = gfxdevice_rescale_new(dev, width, height, 0);
+                if(width || height || resolution) {
+                    double scale = 0.0;
+                    if (resolution) {
+                        /* Assume input is generated by pdf2swf at 72dpi (1px == 1pt) */
+                        scale = resolution / 72.0;
+                    }
+                    dev = gfxdevice_rescale_new(dev, width, height, scale);
                 }
                 for(p=params;p;p=p->next) {
                     dev->setparameter(dev, p->name, p->value);
-- 
1.7.9

---------------
SWFTools-common is a self-managed list. To subscribe/unsubscribe, or amend an 
existing subscription, please kindly point your favourite web browser 
at:<http://lists.nongnu.org/mailman/listinfo/swftools-common>

Reply via email to