diff options
Diffstat (limited to 'converter/other')
-rw-r--r-- | converter/other/Makefile | 2 | ||||
-rw-r--r-- | converter/other/pamtohtmltbl.c | 105 | ||||
-rw-r--r-- | converter/other/pamtompfont.c | 179 | ||||
-rw-r--r-- | converter/other/pamtotga.c | 2 | ||||
-rw-r--r-- | converter/other/pamtouil.c | 56 | ||||
-rw-r--r-- | converter/other/pnmtopclxl.c | 2 |
6 files changed, 275 insertions, 71 deletions
diff --git a/converter/other/Makefile b/converter/other/Makefile index 3e2c2faa..3a6bb2af 100644 --- a/converter/other/Makefile +++ b/converter/other/Makefile @@ -80,7 +80,7 @@ endif PORTBINARIES = bmptopnm fitstopnm \ gemtopnm giftopnm hdifftopam infotopam \ pamtodjvurle pamtofits pamtogif \ - pamtohdiff pamtohtmltbl pamtooctaveimg \ + pamtohdiff pamtohtmltbl pamtompfont pamtooctaveimg \ pamtopam pamtopfm pamtopnm pamtouil \ pamtoxvmini \ pbmtopgm pfmtopam \ diff --git a/converter/other/pamtohtmltbl.c b/converter/other/pamtohtmltbl.c index 0afbfea0..70aa3b2d 100644 --- a/converter/other/pamtohtmltbl.c +++ b/converter/other/pamtohtmltbl.c @@ -2,16 +2,16 @@ #include <stdlib.h> #include <string.h> -#include "pam.h" -#include "shhopt.h" #include "mallocvar.h" +#include "shhopt.h" +#include "pam.h" struct cmdlineInfo { /* All the information the user supplied in the command line, in a form easy for the program to use. */ - const char *inputFilespec; /* '-' if stdin */ - const char *transparent; /* NULL if none */ + const char * inputFileName; /* '-' if stdin */ + const char * transparent; /* NULL if none */ unsigned int verbose; }; @@ -19,8 +19,8 @@ struct cmdlineInfo { static void -parseCommandLine ( int argc, char ** argv, - struct cmdlineInfo *cmdlineP ) { +parseCommandLine(int argc, char ** argv, + struct cmdlineInfo * const cmdlineP) { /*---------------------------------------------------------------------------- parse program command line described in Unix standard form by argc and argv. Return the information in the options as *cmdlineP. @@ -31,7 +31,7 @@ parseCommandLine ( int argc, char ** argv, Note that the strings we return are stored in the storage that was passed to us as the argv array. We also trash *argv. -----------------------------------------------------------------------------*/ - optEntry *option_def = malloc(100*sizeof(optEntry)); + optEntry * option_def; /* Instructions to optParseOptions3 on how to parse our options. */ optStruct3 opt; @@ -40,6 +40,8 @@ parseCommandLine ( int argc, char ** argv, unsigned int transparentSpec; + MALLOCARRAY_NOFAIL(option_def, 100); + option_def_index = 0; /* incremented by OPTENT3 */ OPTENT3(0, "verbose", OPT_FLAG, NULL, &cmdlineP->verbose, 0 ); @@ -58,9 +60,9 @@ parseCommandLine ( int argc, char ** argv, cmdlineP->transparent = NULL; if (argc-1 < 1) - cmdlineP->inputFilespec = "-"; + cmdlineP->inputFileName = "-"; else if (argc-1 == 1) - cmdlineP->inputFilespec = argv[1]; + cmdlineP->inputFileName = argv[1]; else pm_error("Too many arguments. Program takes at most one argument: " "input file name"); @@ -135,31 +137,30 @@ findSameColorRectangle(struct pam * const pamP, mx=0; my=0; cnx = pamP->width - col; cny = pamP->height - row; - for (i=0; (!mx)||(!my); i++) { + for (i = 0; !mx || !my; ++i) { int j; - /*fprintf(stderr,"\n[%d]",i);*/ - for (j=0; j<=i; j++) { + for (j = 0; j <= i; ++j) { if (!my) { - if (i>=cny) - my=cny; - else - if (((!mx) || (j<mx)) && (j < cnx)) { - /*fprintf(stderr,"%d/%d ",j,i);*/ + if (i >= cny) + my = cny; + else { + if ((!mx || j < mx) && (j < cnx)) { if (!pnm_tupleequal(pamP, tuples[row+i][col+j], rectangleColor)) my = i; } + } } if (!mx) { - if (i>=cnx) - mx=cnx; - else - if (((!my) || (j<my)) && (j < cny)) { - /*fprintf(stderr,"%d/%d ",i,j);*/ + if (i >= cnx) + mx = cnx; + else { + if ((!my || (j < my)) && (j < cny)) { if (!pnm_tupleequal(pamP, tuples[row+j][col+i], rectangleColor)) mx = i; } + } } } } @@ -170,7 +171,8 @@ findSameColorRectangle(struct pam * const pamP, static bool ** -allocOutputtedArray(unsigned int const width, unsigned int const height) { +allocOutputtedArray(unsigned int const width, + unsigned int const height) { bool ** outputted; unsigned int row; @@ -180,15 +182,9 @@ allocOutputtedArray(unsigned int const width, unsigned int const height) { pm_error("Unable to allocate space for 'outputted' array"); for (row = 0; row < height; ++row) { - unsigned int col; - MALLOCARRAY(outputted[row], width); if (outputted[row] == NULL) pm_error("Unable to allocate space for 'outputted' array"); - - for (col = 0; col < width ; ++col) - outputted[row][col] = FALSE; - } return outputted; } @@ -196,7 +192,8 @@ allocOutputtedArray(unsigned int const width, unsigned int const height) { static void -freeOutputtedArray(bool ** const outputted, unsigned int const height) { +freeOutputtedArray(bool ** const outputted, + unsigned int const height) { unsigned int row; @@ -206,13 +203,40 @@ freeOutputtedArray(bool ** const outputted, unsigned int const height) { + static void -markOutputted(bool ** const outputted, +markNotOutputted(bool ** const outputted, + unsigned int const upperLeftCol, + unsigned int const upperLeftRow, + unsigned int const width, + unsigned int const height) { +/*---------------------------------------------------------------------------- + Mark every pixel in the specified rectangle as not having been output + yet. +-----------------------------------------------------------------------------*/ + unsigned int const lowerRightCol = upperLeftCol + width; + unsigned int const lowerRightRow = upperLeftRow + height; + unsigned int row; + + for (row = upperLeftRow; row < lowerRightRow; ++row) { + unsigned int col; + for (col = upperLeftCol; col < lowerRightCol; ++col) + outputted[row][col] = FALSE; + } +} + + + +static void +markOutputted(bool ** const outputted, unsigned int const upperLeftCol, unsigned int const upperLeftRow, unsigned int const width, unsigned int const height) { - +/*---------------------------------------------------------------------------- + Mark every pixel in the specified rectangle as having been output + already. +-----------------------------------------------------------------------------*/ unsigned int const lowerRightCol = upperLeftCol + width; unsigned int const lowerRightRow = upperLeftRow + height; unsigned int row; @@ -232,16 +256,19 @@ main(int argc, char **argv) { FILE * ifP; struct pam inpam; tuple ** tuples; - int row; + unsigned int row; unsigned int rectWidth, rectHeight; bool ** outputted; + /* Two dimensional array. outputted[ROW][COL] means the pixel + at row ROW, column COL has already been outputted. + */ tuple transparentColor; pnm_init(&argc, argv); parseCommandLine(argc, argv, &cmdline); - ifP = pm_openr(cmdline.inputFilespec); + ifP = pm_openr(cmdline.inputFileName); tuples = pnm_readpam(ifP, &inpam, PAM_STRUCT_SIZE(tuple_type)); @@ -259,8 +286,12 @@ main(int argc, char **argv) { printf("<TABLE WIDTH=%d HEIGHT=%d BORDER=0 CELLSPACING=0 CELLPADDING=0>\n", inpam.width, inpam.height); + + markNotOutputted(outputted, 0, 0, inpam.width, inpam.height); + /* No pixel has been outputted yet */ + for (row = 0; row < inpam.height; ++row) { - int col; + unsigned int col; printf("<TR>\n"); pripix(&inpam, tuples[row][0], 1, 1, transparentColor); markOutputted(outputted, 0, row, 1, 1); @@ -270,7 +301,7 @@ main(int argc, char **argv) { findSameColorRectangle(&inpam, tuples, row, col, &rectWidth, &rectHeight); if (cmdline.verbose) - pm_message("[%d/%d] [%d/%d]", + pm_message("[%u/%u] [%u/%u]", col, row, rectWidth, rectHeight); pripix(&inpam, tuples[row][col], rectWidth, rectHeight, transparentColor); @@ -286,5 +317,5 @@ main(int argc, char **argv) { pnm_freepamarray(tuples, &inpam); freeOutputtedArray(outputted, inpam.height); - exit(0); + return 0; } diff --git a/converter/other/pamtompfont.c b/converter/other/pamtompfont.c new file mode 100644 index 00000000..b8d11aea --- /dev/null +++ b/converter/other/pamtompfont.c @@ -0,0 +1,179 @@ +/*---------------------------------------------------------------------------- + pamtompfont +------------------------------------------------------------------------------ + Part of the Netpbm package. + + Convert a PAM image to an Mplayer bitmap font. + + It is obvious that this format was designed to be an image format and + adopted by Mplayer for it's fonts (before Mplayer got the ability to + use Freetype to read standard font formats such as TrueType). But + I have no idea what the format was originally. + + In the Mplayer font subset of the format, the image is always grayscale + (one byte per pixel) with no palette. + + By Bryan Henderson, San Jose CA 2008.05.18 + + Contributed to the public domain by its author. +-----------------------------------------------------------------------------*/ + +#include <string.h> +#include <assert.h> + +#include "mallocvar.h" +#include "shhopt.h" +#include "pm.h" +#include "pam.h" + +struct cmdlineInfo { + /* All the information the user supplied in the command line, + in a form easy for the program to use. + */ + const char * inputFilename; +}; + + +static void +parseCommandLine(int argc, char ** argv, + struct cmdlineInfo *cmdlineP) { +/*---------------------------------------------------------------------------- + Note that the file spec array we return is stored in the storage that + was passed to us as the argv array. +-----------------------------------------------------------------------------*/ + optEntry *option_def; + /* Instructions to OptParseOptions3 on how to parse our options. + */ + optStruct3 opt; + + unsigned int option_def_index; + + MALLOCARRAY_NOFAIL(option_def, 100); + + option_def_index = 0; /* incremented by OPTENTRY */ + + opt.opt_table = option_def; + opt.short_allowed = FALSE; /* We have no short (old-fashioned) options */ + opt.allowNegNum = FALSE; /* We have no parms that are negative numbers */ + + optParseOptions3(&argc, argv, opt, sizeof(opt), 0); + /* Uses and sets argc, argv, and some of *cmdlineP and others. */ + + if (argc-1 == 0) + cmdlineP->inputFilename = "-"; + else if (argc-1 != 1) + pm_error("Program takes zero or one argument (filename). You " + "specified %d", argc-1); + else + cmdlineP->inputFilename = argv[1]; +} + + + +static void +validateInput(struct pam * const inpamP) { + + /* The image format does provide for RGB images, but Mplayer doesn't + understand that format (and doesn't even recognize it as something + it doesn't understand) + */ + + if (inpamP->depth != 1) + pm_error("Input must have depth 1. This image's depth is %u", + inpamP->depth); +} + + + +static void +writeMpFontHeader(FILE * const ofP, + struct pam * const inpamP) { +/*---------------------------------------------------------------------------- + Write the 32 byte header. +-----------------------------------------------------------------------------*/ + fwrite("mhwanh", 1, 6, ofP); /* Signature */ + + fputc(0, ofP); /* pad */ + fputc(0, ofP); /* pad */ + + /* Write the old 16 bit width field. Zero means use the 32 bit one + below instead. + */ + pm_writebigshort(ofP, 0); + + /* Height */ + pm_writebigshort(ofP, inpamP->height); + + /* Number of colors in palette. Zero means not paletted image */ + pm_writebigshort(ofP, 0); + + { + unsigned int i; + for (i = 0; i < 14; ++i) + fputc(0, ofP); /* pad */ + } + /* Width */ + pm_writebiglong(ofP, inpamP->width); +} + + + +static void +convertRaster(struct pam * const inpamP, + FILE * const ofP) { + + tuple * tuplerow; + unsigned char * outrow; + unsigned int row; + + assert(inpamP->depth == 1); + + tuplerow = pnm_allocpamrow(inpamP); + + MALLOCARRAY(outrow, inpamP->width); + + if (outrow == NULL) + pm_error("Unable to allocate space for a %u-column output buffer", + inpamP->width); + + for (row = 0; row < inpamP->height; ++row) { + unsigned int col; + + pnm_readpamrow(inpamP, tuplerow); + + for (col = 0; col < inpamP->width; ++col) { + outrow[col] = + pnm_scalesample(tuplerow[col][0], inpamP->maxval, 255); + } + + fwrite(outrow, 1, inpamP->width, ofP); + } + free(outrow); + pnm_freepamrow(tuplerow); +} + + + +int +main(int argc, char *argv[]) { + + struct cmdlineInfo cmdline; + FILE * ifP; + struct pam inpam; /* Input PAM image */ + + pnm_init(&argc, argv); + + parseCommandLine(argc, argv, &cmdline); + + ifP = pm_openr(cmdline.inputFilename); + + pnm_readpaminit(ifP, &inpam, PAM_STRUCT_SIZE(tuple_type)); + + validateInput(&inpam); + + writeMpFontHeader(stdout, &inpam); + + convertRaster(&inpam, stdout); + + return 0; +} diff --git a/converter/other/pamtotga.c b/converter/other/pamtotga.c index 6c8769ed..addd2d91 100644 --- a/converter/other/pamtotga.c +++ b/converter/other/pamtotga.c @@ -270,7 +270,7 @@ computeRunlengths(struct pam * const pamP, static void computeOutName(struct cmdlineInfo const cmdline, - const char ** const outNameP) { + const char ** const outNameP) { char * workarea; diff --git a/converter/other/pamtouil.c b/converter/other/pamtouil.c index 8a80c901..3e67da7d 100644 --- a/converter/other/pamtouil.c +++ b/converter/other/pamtouil.c @@ -34,18 +34,18 @@ struct cmdlineInfo { /* All the information the user supplied in the command line, in a form easy for the program to use. */ - const char *inputFilespec; /* Filespecs of input files */ - char *outname; /* output filename, less "_icon" */ + const char * inputFilespec; /* Filespecs of input files */ + char * outname; /* output filename, less "_icon" */ unsigned int verbose; }; typedef struct { /* character-pixel mapping */ - const char* cixel; /* character string printed for pixel */ - const char* rgbname; /* ascii rgb color, either mnemonic or #rgb value */ - const char* uilname; /* same, with spaces replaced by underbars */ - bool transparent; + const char * cixel; /* character string printed for pixel */ + const char * rgbname; /* ascii rgb color, either mnemonic or #rgb value */ + const char * uilname; /* same, with spaces replaced by underbars */ + bool transparent; } cixel_map; @@ -154,7 +154,8 @@ genNumstr(int const number, static const char * -uilName(const char * const rgbname, bool const transparent) { +uilName(const char * const rgbname, + bool const transparent) { /*---------------------------------------------------------------------------- Return a string in newly malloc'ed storage which is an appropriate color name for the UIL palette. It is the same as the rgb name, @@ -200,8 +201,8 @@ genCmap(struct pam * const pamP, unsigned int colorIndex; { /* Figure out how many characters per pixel we'll be using. - ** Don't want to be forced to link with libm.a, so using a - ** division loop rather than a log function. + Don't want to be forced to link with libm.a, so using a + division loop rather than a log function. */ unsigned int i; for (*charsppP = 0, i = ncolors; i > 0; ++(*charsppP)) @@ -209,7 +210,7 @@ genCmap(struct pam * const pamP, } /* Generate the character-pixel string and the rgb name for each colormap - ** entry. + entry. */ for (colorIndex = 0; colorIndex < ncolors; ++colorIndex) { bool nameAlreadyInCmap; @@ -247,12 +248,12 @@ genCmap(struct pam * const pamP, /* Make the entry a cross-reference to the earlier entry */ cmap[colorIndex].uilname = NULL; cmap[colorIndex].rgbname = NULL; - cmap[colorIndex].cixel = cmap[indexOfName].cixel; + cmap[colorIndex].cixel = cmap[indexOfName].cixel; } else { cmap[colorIndex].uilname = uilName(colorname, transparent); cmap[colorIndex].rgbname = strdup(colorname); if (cmap[colorIndex].rgbname == NULL) - pm_error( "out of memory allocating color name" ); + pm_error("out of memory allocating color name"); cmap[colorIndex].transparent = transparent; @@ -329,15 +330,16 @@ writeRaster(struct pam * const pamP, unsigned int const ncolors, tuplehash const cht, unsigned int const charspp) { - - int row; - /* Write out the ascii character-pixel image. */ +/*---------------------------------------------------------------------------- + Write out the ascii character-pixel image. +-----------------------------------------------------------------------------*/ + unsigned int row; printf("\n"); printf("%s_icon : exported icon( color_table = %s_rgb,\n", outname, outname); for (row = 0; row < pamP->height; ++row) { - int col; + unsigned int col; printf(" '"); for (col = 0; col < pamP->width; ++col) { @@ -360,27 +362,19 @@ writeRaster(struct pam * const pamP, } -static void -freeString(const char * const s) { -/*---------------------------------------------------------------------------- - This is just free(), but with type checking for const char *. ------------------------------------------------------------------------------*/ - free((void *)s); -} - - static void -freeCmap(cixel_map cmap[], unsigned int const ncolors) { +freeCmap(cixel_map const cmap[], + unsigned int const ncolors) { - int i; + unsigned int i; for (i = 0; i < ncolors; ++i) { cixel_map const cmapEntry = cmap[i]; if (cmapEntry.uilname) - freeString(cmapEntry.uilname); + strfree(cmapEntry.uilname); if (cmapEntry.rgbname) - freeString(cmapEntry.rgbname); + strfree(cmapEntry.rgbname); } } @@ -391,8 +385,8 @@ main(int argc, char *argv[]) { struct cmdlineInfo cmdline; struct pam pam; /* Input PAM image */ - FILE* ifP; - tuple** tuples; + FILE * ifP; + tuple ** tuples; unsigned int ncolors; tuplehash cht; tupletable chv; diff --git a/converter/other/pnmtopclxl.c b/converter/other/pnmtopclxl.c index 0737bf15..9819ebe4 100644 --- a/converter/other/pnmtopclxl.c +++ b/converter/other/pnmtopclxl.c @@ -178,7 +178,7 @@ parseCommandLine(int argc, char ** argv, cmdlineP->sourceP->name = "-"; cmdlineP->sourceP->next = NULL; } else { - int i; + unsigned int i; InputSource ** nextLinkP; nextLinkP = &cmdlineP->sourceP; |