summaryrefslogtreecommitdiff
path: root/apps/mudraw.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2012-03-12 17:09:09 +0000
committerRobin Watts <robin.watts@artifex.com>2012-03-12 17:09:09 +0000
commitcb2441e8ed1136dc85a9cd02f733035277be43b2 (patch)
tree91196a652a6c4072303b2f7afe35ff8895d2fb78 /apps/mudraw.c
parent5060043a33b32dfdd8ffacc88e8ca05b5e8271a9 (diff)
downloadmupdf-cb2441e8ed1136dc85a9cd02f733035277be43b2.tar.xz
Add -w, -h and -f options to mudraw.c
Exact width or height values can now be specified to mudraw for output bitmaps. If both are specified the the largest scaling consistent with the aspect ratio not exceeding the given width or height is used, unless the -f flag is specified too, in which case the aspect ratio is ignored and the output 'fits' exactly.
Diffstat (limited to 'apps/mudraw.c')
-rw-r--r--apps/mudraw.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/apps/mudraw.c b/apps/mudraw.c
index ecade0a0..e74f3081 100644
--- a/apps/mudraw.c
+++ b/apps/mudraw.c
@@ -25,6 +25,9 @@ static int uselist = 1;
static int alphabits = 8;
static float gamma_value = 1;
static int invert = 0;
+static int width = 0;
+static int height = 0;
+static int fit = 0;
static fz_colorspace *colorspace;
static char *filename;
@@ -43,6 +46,9 @@ static void usage(void)
"\t\tsupported formats: pgm, ppm, pam, png, pbm\n"
"\t-p -\tpassword\n"
"\t-r -\tresolution in dpi (default: 72)\n"
+ "\t-w -\twidth (in pixels)\n"
+ "\t-h -\theight (in pixels)\n"
+ "\t-f -\tif both -w and -h are used then fit exactly\n"
"\t-a\tsave alpha channel (only pam and png)\n"
"\t-b -\tnumber of bits of antialiasing (0 to 8)\n"
"\t-g\trender in grayscale\n"
@@ -197,7 +203,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
{
float zoom;
fz_matrix ctm;
- fz_rect bounds;
+ fz_rect bounds, bounds2;
fz_bbox bbox;
fz_pixmap *pix = NULL;
@@ -207,7 +213,27 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
zoom = resolution / 72;
ctm = fz_scale(zoom, zoom);
ctm = fz_concat(ctm, fz_rotate(rotation));
- bbox = fz_round_rect(fz_transform_rect(ctm, bounds));
+ bounds2 = fz_transform_rect(ctm, bounds);
+ if (width || height)
+ {
+ float scalex = width/(bounds2.x1-bounds2.x0);
+ float scaley = height/(bounds2.y1-bounds2.y0);
+
+ if (width == 0)
+ scalex = scaley;
+ if (height == 0)
+ scaley = scalex;
+ if (!fit)
+ {
+ if (scalex > scaley)
+ scalex = scaley;
+ else
+ scaley = scalex;
+ }
+ ctm = fz_concat(ctm, fz_scale(scalex, scaley));
+ bounds2 = fz_transform_rect(ctm, bounds);
+ }
+ bbox = fz_round_rect(bounds2);
/* TODO: banded rendering and multi-page ppm */
@@ -376,7 +402,7 @@ int main(int argc, char **argv)
fz_var(doc);
- while ((c = fz_getopt(argc, argv, "lo:p:r:R:ab:dgmtx5G:I")) != -1)
+ while ((c = fz_getopt(argc, argv, "lo:p:r:R:ab:dgmtx5G:Iw:h:f")) != -1)
{
switch (c)
{
@@ -394,6 +420,9 @@ int main(int argc, char **argv)
case 'g': grayscale++; break;
case 'd': uselist = 0; break;
case 'G': gamma_value = atof(fz_optarg); break;
+ case 'w': width = atof(fz_optarg); break;
+ case 'h': height = atof(fz_optarg); break;
+ case 'f': fit = 1; break;
case 'I': invert++; break;
default: usage(); break;
}