diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2023-12-28 19:53:34 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2023-12-28 19:53:34 +0000 |
commit | 5d16663331afd0bc2edaeb2e49042dc219ce9c2f (patch) | |
tree | 476fbb2ab4311d4bb6d65b250825e254a7a2c1ef /converter/ppm/ppmtomitsu.c | |
parent | 42f0bf8e7f1ff88000a3584c265e6f1631662ec4 (diff) | |
download | netpbm-mirror-5d16663331afd0bc2edaeb2e49042dc219ce9c2f.tar.gz netpbm-mirror-5d16663331afd0bc2edaeb2e49042dc219ce9c2f.tar.xz netpbm-mirror-5d16663331afd0bc2edaeb2e49042dc219ce9c2f.zip |
promote Development to Advanced
git-svn-id: http://svn.code.sf.net/p/netpbm/code/advanced@4827 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'converter/ppm/ppmtomitsu.c')
-rw-r--r-- | converter/ppm/ppmtomitsu.c | 175 |
1 files changed, 109 insertions, 66 deletions
diff --git a/converter/ppm/ppmtomitsu.c b/converter/ppm/ppmtomitsu.c index 50b790d6..8fb7cddd 100644 --- a/converter/ppm/ppmtomitsu.c +++ b/converter/ppm/ppmtomitsu.c @@ -20,6 +20,7 @@ ** implied warranty. */ +#include <stdbool.h> #include <assert.h> #include <string.h> #include <stdio.h> @@ -35,28 +36,84 @@ #define HASHSIZE 2048 #define myhash(x) ((PPM_GETR(x)*3 + PPM_GETG(x)*5 + PPM_GETB(x)*7) % HASHSIZE) -typedef struct hashinfo { +typedef struct Hashinfo { pixel color; long flag; - struct hashinfo * next; -} hashinfo; + struct Hashinfo * next; +} Hashinfo; -#define cmd(arg) fputc((arg), stdout) -#define datum(arg) fputc((char)(arg), stdout) -#define data(arg,num) fwrite((arg), sizeof(char), (num), stdout) + + +static struct Mediasize +mediaSize(const char * const media, + bool const dpi300) { + + struct Mediasize medias; + + if (TOUPPER(media[0]) == 'A') { + switch (TOUPPER(media[1])) { + case 'S': + medias = MSize_AS; + break; + case '4': + if (TOUPPER(media[2]) == 'S') + medias = MSize_A4S; + else + medias = MSize_A4; + break; + default: + medias = MSize_A; + } + } else + medias = MSize_User; + + if (dpi300) { + medias.maxcols *= 2; + medias.maxrows *= 2; + } + + return medias; +} static void -check_and_rotate(int const cols, - int const rows, - int const enlarge, - struct mediasize const medias) { +cmd(char const arg) { + + fputc(arg, stdout); +} + + + +static void +datum(unsigned char const arg) { + + fputc(arg, stdout); +} + + + +static void +data(unsigned char * const arg, + size_t const len) { + + fwrite((unsigned char *)arg, 1, len, stdout); +} + + + +static void +checkAndRotate(int const cols, + int const rows, + int const enlarge, + struct Mediasize const medias) { if (cols > rows) { ROTATEIMG(DOROTATE); /* rotate image */ if (enlarge * rows > medias.maxcols || enlarge * cols > medias.maxrows) - pm_error("Image too large, MaxPixels = %u x %u", + pm_error("Image too large (%u x %u). " + "Size of output media: %u x %u", + enlarge*rows, enlarge*cols, medias.maxrows, medias.maxcols); HPIXELS(cols); VPIXELS(rows); @@ -66,7 +123,9 @@ check_and_rotate(int const cols, } else { ROTATEIMG(DONTROTATE); if (enlarge * rows > medias.maxrows || enlarge * cols > medias.maxcols) - pm_error("Image too large, MaxPixels = %u x %u", + pm_error("Image too large (%u x %u). " + "Size of output media: %u x %u", + enlarge*rows, enlarge*cols, medias.maxrows, medias.maxcols); HPIXELS(cols); VPIXELS(rows); @@ -83,7 +142,7 @@ lineputinit(int const cols, int const sharpness, int const enlarge, int const copy, - struct mediasize const medias) { + struct Mediasize const medias) { ONLINE; CLRMEM; MEDIASIZE(medias); @@ -132,7 +191,7 @@ lineputinit(int const cols, default: SHARPNESS(SP_USER); } - check_and_rotate(cols, rows, enlarge, medias); + checkAndRotate(cols, rows, enlarge, medias); DATASTART; } @@ -142,7 +201,7 @@ static void lookuptableinit(int const sharpness, int const enlarge, int const copy, - struct mediasize const medias) { + struct Mediasize const medias) { ONLINE; CLRMEM; @@ -200,10 +259,10 @@ static void lookuptabledata(int const cols, int const rows, int const enlarge, - struct mediasize const medias) { + struct Mediasize const medias) { DONELOOKUPTABLE; - check_and_rotate(cols, rows, enlarge, medias); + checkAndRotate(cols, rows, enlarge, medias); DATASTART; } @@ -215,7 +274,7 @@ frametransferinit(int const cols, int const sharpness, int const enlarge, int const copy, - struct mediasize const medias) { + struct Mediasize const medias) { ONLINE; CLRMEM; @@ -265,7 +324,7 @@ frametransferinit(int const cols, default: SHARPNESS(SP_USER); } - check_and_rotate(cols, rows, enlarge, medias); + checkAndRotate(cols, rows, enlarge, medias); } @@ -273,14 +332,14 @@ frametransferinit(int const cols, static void doLookupTableColors(colorhist_vector const table, unsigned int const nColor, - hashinfo * const colorhashtable) { + Hashinfo * const colorhashtable) { unsigned int colval; for (colval = 0; colval < nColor; ++colval) { - struct hashinfo * const hashchain = + struct Hashinfo * const hashchain = &colorhashtable[myhash((table[colval]).color)]; - struct hashinfo * hashrun; + struct Hashinfo * hashrun; cmd('$'); datum(colval); @@ -310,13 +369,13 @@ doLookupTableColors(colorhist_vector const table, static void doLookupTableGrays(colorhist_vector const table, unsigned int const nColor, - hashinfo * const colorhashtable) { + Hashinfo * const colorhashtable) { unsigned int colval; for (colval = 0; colval < nColor; ++colval) { - struct hashinfo * const hashchain = + struct Hashinfo * const hashchain = &colorhashtable[myhash((table[colval]).color)]; - struct hashinfo * hashrun; + struct Hashinfo * hashrun; cmd('$'); datum(colval); @@ -352,8 +411,8 @@ generateLookupTable(colorhist_vector const table, int const sharpness, int const enlarge, int const copy, - struct mediasize const medias, - hashinfo ** const colorhashtableP) { + struct Mediasize const medias, + Hashinfo ** const colorhashtableP) { /*---------------------------------------------------------------------------- Write to the output file the palette (color lookup table) indicated by 'table' and generate a hash table to use with it: *colorhashtableP. @@ -361,7 +420,7 @@ generateLookupTable(colorhist_vector const table, Also write the various properties 'sharpness', 'enlarge', 'copy', and 'medias' to the output file. -----------------------------------------------------------------------------*/ - hashinfo * colorhashtable; + Hashinfo * colorhashtable; lookuptableinit(sharpness, enlarge, copy, medias); @@ -394,7 +453,7 @@ static void writeColormapRaster(pixel ** const pixels, unsigned int const cols, unsigned int const rows, - hashinfo * const colorhashtable) { + Hashinfo * const colorhashtable) { /*---------------------------------------------------------------------------- Write a colormapped raster: write the pixels pixels[][] (dimensions cols x rows) as indices into the colormap (palette; lookup table) indicated by @@ -407,9 +466,9 @@ writeColormapRaster(pixel ** const pixels, for (col = 0; col < cols; ++col) { pixel * const pixrow = pixels[row]; - struct hashinfo * const hashchain = + struct Hashinfo * const hashchain = &colorhashtable[myhash(pixrow[col])]; - struct hashinfo * p; + struct Hashinfo * p; p = hashchain; while (!PPM_EQUAL((p->color), pixrow[col])) { @@ -429,13 +488,13 @@ useLookupTable(pixel ** const pixels, int const sharpness, int const enlarge, int const copy, - struct mediasize const medias, + struct Mediasize const medias, unsigned int const cols, unsigned int const rows, int const format, unsigned int const nColor) { - hashinfo * colorhashtable; + Hashinfo * colorhashtable; pm_message("found %u colors - using the lookuptable-method", nColor); @@ -523,7 +582,7 @@ useNoLookupTable(pixel ** const pixels, int const sharpness, int const enlarge, int const copy, - struct mediasize const medias, + struct Mediasize const medias, unsigned int const cols, unsigned int const rows, int const format) { @@ -553,7 +612,7 @@ doTiny(FILE * const ifP, int const sharpness, int const enlarge, int const copy, - struct mediasize const medias) { + struct Mediasize const medias) { pixel * pixelrow; unsigned char * redrow; @@ -596,26 +655,28 @@ doTiny(FILE * const ifP, int -main(int argc, char * argv[]) { - FILE * ifP; +main(int argc, const char ** argv) { + + FILE * ifP; int argn; bool dpi300; + bool tiny; int cols, rows, format; pixval maxval; - int sharpness, enlarge, copy, tiny; - struct mediasize medias; + int sharpness, enlarge, copy; + struct Mediasize medias; char media[16]; const char * const usage = "[-sharpness <1-4>] [-enlarge <1-3>] [-media <a,a4,as,a4s>] [-copy <1-9>] [-tiny] [-dpi300] [ppmfile]"; - ppm_init(&argc, argv); + pm_proginit(&argc, argv); - dpi300 = FALSE; + dpi300 = false; argn = 1; sharpness = 32; enlarge = 1; copy = 1; memset(media, '\0', 16); - tiny = FALSE; + tiny = false; /* check for flags */ while (argn < argc && argv[argn][0] == '-' && argv[argn][1] != '\0') { @@ -648,9 +709,9 @@ main(int argc, char * argv[]) { pm_usage(usage); } else if (pm_keymatch(argv[argn], "-dpi300", 2)) - dpi300 = TRUE; + dpi300 = true; else if (pm_keymatch(argv[argn], "-tiny", 2)) - tiny = TRUE; + tiny = true; else pm_usage(usage); ++argn; @@ -666,28 +727,7 @@ main(int argc, char * argv[]) { if (argn != argc) pm_usage(usage); - if (TOUPPER(media[0]) == 'A') - switch (TOUPPER(media[1])) { - case 'S': - medias = MSize_AS; - break; - case '4': - if(TOUPPER(media[2]) == 'S') - medias = MSize_A4S; - else { - medias = MSize_A4; - } - break; - default: - medias = MSize_A; - } - else - medias = MSize_User; - - if (dpi300) { - medias.maxcols *= 2; - medias.maxrows *= 2; - } + medias = mediaSize(media, dpi300); ppm_readppminit(ifP, &cols, &rows, &maxval, &format); @@ -721,3 +761,6 @@ main(int argc, char * argv[]) { pm_close(ifP); return 0; } + + + |