diff --git a/src/a2b.c b/src/a2b.c new file mode 100644 index 0000000..98378df --- /dev/null +++ b/src/a2b.c @@ -0,0 +1,177 @@ +/* +#define GRAVITY_CENTER 0 +#define GRAVITY_EAST 1 +#define GRAVITY_NORTHEAST 2 +#define GRAVITY_NORTH 3 +#define GRAVITY_NORTHWEST 4 +#define GRAVITY_SOUTHEAST 5 +#define GRAVITY_SOUTH 6 +#define GRAVITY_SOUTHWEST 7 +#define GRAVITY_WEST 8 +*/ +#define NUM_GRAVITIES 9 + +/* gravity options for cropped output - center (typical) */ +char *geometry[] = { +"Center", +"East", +"NorthEast", +"North", +"NorthWest", +"SouthEast", +"South", +"SouthWest", +"West", +NULL}; + +char *gravity = "center"; + +/* command line helper function to set ImageMagick geometry for gravity option */ +void SetMagickAspectScript(char *wordptr) +{ + int idx; + + if (wordptr[0] != (char) 0) { + for (idx = 0;idx < NUM_GRAVITIES;idx++) { + if (cmpstr(wordptr,geometry[idx]) == SUCCESS) { + gravity = (char *) &geometry[idx][0]; + return; + } + } + } +} + + +/* args are image file name, type of output 0 or 1 (.bat or .sh), + and whether output is cropped 0 or padded 1 */ +int MakeMagickAspectScript(char *name,int script, int pad) +{ + FILE *fp, *fp2=NULL; + char buf[128], c, d, idfile[256], outfile[256]; + int i, j, status = 1; + float fwidth, fheight; + int width, height, cropwidth, cropheight, xtent; + + /* use image file base name for id file name and batch file or script file name */ + strcpy(idfile,name); + strcpy(outfile,name); + j = 999; + for (i=0;name[i]!=(char)0;i++){ + if (name[i] == '.')j=i; + } + + /* the image file name must have an extension */ + if (j==999) return status; + idfile[j] = outfile[j]=(char)0; + + /* the id file must already exist */ + strcat(idfile,".id"); + fp = fopen(idfile,"r"); + if (fp == NULL) return status; + + if (script == 0) strcat(outfile,".bat"); + else strcat(outfile,".sh"); + + for (;;) { + if (NULL == fgets(buf, 128, fp)) { + fclose(fp); + break; + } + nocr(buf); + /* this parser is really simplistic... it uses the first widthxheight string preceded by a space... + it will probably usually work since we don't usually put widthxheight strings in filenames */ + width = height = 0; + d = (char)0; + for (i=0;buf[i]!=(char)0;i++){ + if (d == (char)32) { + width = atoi((char *)&buf[i]); + } + c = buf[i]; + if (c=='x' && width > 0) { + if (d > (char)47 && d < (char)58) { + height = atoi((char *)&buf[i+1]); + if (height > 0) break; + } + } + d = c; + } + if (width == 0) break; + if (height == 0) break; + if (pad == 0) { + /* cropping (not padding) */ + /* for widescreen images trim both sides, the height remains the same */ + fwidth = (float)1.3334 * height; + cropwidth = (int)fwidth; + if (cropwidth > width) { + /* if the cropping width is not 1/3 greater than the height, this is a portrait image + and must be cropped in the vertical axis only */ + cropwidth = width; + fheight = (float)0.75 * width; + cropheight = (int)fheight; + } + else { + cropheight = height; + } + } + else { + fheight = (float)0.75 * width; + cropheight = (int)fheight; + if (cropheight == height) { + /* if the height is equal to 75% of the width, the output is verbatim (no padding is needed) */ + cropwidth = width; + pad = 0; + } + else if (height < cropheight) { + /* if the height is less than 75% of the width, the output is letterboxed with padding above and below */ + xtent = cropwidth = width; + } + else { + /* if the height is greater than 75% of the width, the output is pillarboxed with padding on the sides */ + cropheight = height; + fwidth = (float)1.3334 * height; + xtent = cropwidth = (int)fwidth; + } + } + fp2 = fopen(outfile,"w"); + if (NULL == fp2) break; + + if (script == 0) { + /* batch file output */ + fprintf(fp2,"@echo off\n"); + if (pad == 0) { + /* %MAGICK% %%f -gravity center -crop 1440x1080+0+0 -define format:BMP %%~nf.bmp */ + fprintf(fp2,"%%1 %%2 -gravity %s -crop %dx%d+0+0 -define format:BMP %%3.bmp\n",gravity,cropwidth,cropheight); + } + else { + /* letterbox */ + /* %MAGICK% %%f -gravity center -background black -extent 1920x1920 -crop 1920x1440+0+0 +repage -define format:BMP %%~nf.bmp */ + /* pillarbox */ + /* %MAGICK% %%f -gravity center -background black -extent 2730x2730 -crop 2730x2048+0+0 +repage -define format:BMP %%~nf.bmp */ + fprintf(fp2, + "%%1 %%2 -gravity %s -background black -extent %dx%d -crop %dx%d+0+0 +repage -define format:BMP %%3.bmp\n", + gravity,xtent,xtent,cropwidth,cropheight); + + } + } + else { + /* shell script output */ + fprintf(fp2,"#!/bin/sh\n"); + if (pad == 0) { + /* $MAGICK $src -gravity center -crop 1440x1080+0+0 -define format:BMP $tgt.bmp */ + fprintf(fp2,"$1 $2 -gravity %s -crop %dx%d+0+0 -define format:BMP $3.bmp\n",gravity,cropwidth,cropheight); + } + else { + fprintf(fp2, + "$1 $2 -gravity %s -background black -extent %dx%d -crop %dx%d+0+0 +repage -define format:BMP $3.bmp\n", + gravity,xtent,xtent,cropwidth,cropheight); + + } + } + status = 0; + } + fclose(fp); + if (NULL != fp2) fclose(fp2); + + return status; +} +