diff options
Diffstat (limited to 'converter/ppm')
-rw-r--r-- | converter/ppm/hpcdtoppm/Makefile | 4 | ||||
-rw-r--r-- | converter/ppm/picttoppm.c | 360 | ||||
-rw-r--r-- | converter/ppm/pjtoppm.c | 215 | ||||
-rw-r--r-- | converter/ppm/ppmtobmp.c | 175 | ||||
-rw-r--r-- | converter/ppm/ppmtomitsu.c | 16 | ||||
-rw-r--r-- | converter/ppm/tgatoppm.c | 291 | ||||
-rw-r--r-- | converter/ppm/xpmtoppm.c | 112 | ||||
-rw-r--r-- | converter/ppm/xvminitoppm.c | 64 |
8 files changed, 650 insertions, 587 deletions
diff --git a/converter/ppm/hpcdtoppm/Makefile b/converter/ppm/hpcdtoppm/Makefile index ddf79ee5..59ba3630 100644 --- a/converter/ppm/hpcdtoppm/Makefile +++ b/converter/ppm/hpcdtoppm/Makefile @@ -14,12 +14,12 @@ MERGE_OBJECTS = include $(SRCDIR)/common.mk -install: install.bin.local +install.bin install.merge: install.bin.local .PHONY: install.bin.local install.bin.local: $(PKGDIR)/bin # In June 2002, pcdovtoppm replaced pcdindex cd $(PKGDIR)/bin ; \ - $(SYMLINK) pcdindex$(EXE) pcdovtoppm$(EXE) + $(SYMLINK) pcdovtoppm$(EXE) pcdindex$(EXE) FORCE: diff --git a/converter/ppm/picttoppm.c b/converter/ppm/picttoppm.c index 8b633725..b8fb8642 100644 --- a/converter/ppm/picttoppm.c +++ b/converter/ppm/picttoppm.c @@ -15,7 +15,7 @@ * University of British Columbia * * - * 2003-02: Handling for DirectBitsRgn opcode (0x9b) added by + * 2003-02: Handling for DirectBitsRgn opcode (0x9b) added by * kabe@sra-tohoku.co.jp. * * 2004-03-27: Several bugs fixed by Steve Summit, scs@eskimo.com. @@ -153,7 +153,7 @@ struct raster { Each pixel is either a palette index or an RGB triple, depending on the format of the associated PICT. - + Each pixel is one byte if the associated PICT has 8 or fewer bits per pixel. If the associated PICT has 16 or 32 bits per pixel, an element herein is 2 or 4 bytes, respectively. @@ -231,7 +231,7 @@ allocateRaster(struct raster * const rasterP, default: pm_error("INTERNAL ERROR: impossible bitsPerPixel value in " "unpackbits(): %u", bitsPerPixel); - } + } if (UINT_MAX / rasterP->rowSize < rasterP->rowCount) pm_error("Arithmetic overflow computing size of %u x %u pixel " "array.", rasterP->rowSize, rasterP->rowCount); @@ -360,7 +360,7 @@ readSignedByte(void) { -static void +static void readShortPoint(struct Point * const p) { p->x = readSignedByte(); p->y = readSignedByte(); @@ -457,15 +457,15 @@ const_name(const struct const_name * const table, for (i = 0; table[i].name; ++i) if (table[i].value == ct) return table[i].name; - + sprintf(numbuf, "? (%u)", ct); return numbuf; } -static void -picComment(Word const type, +static void +picComment(Word const type, int const length) { unsigned int remainingLength; @@ -736,7 +736,7 @@ parseFontLine(const char ** const token, -static int +static int load_fontdir(const char * const dirfile) { /*---------------------------------------------------------------------------- Load the font directory from file named 'dirfile'. Add its contents @@ -744,7 +744,7 @@ load_fontdir(const char * const dirfile) { -----------------------------------------------------------------------------*/ FILE * ifP; unsigned int nFont; - char line[1024]; + char line[1024]; ifP = pm_openr(dirfile); @@ -832,7 +832,7 @@ rectheight(const struct Rect * const r) { static bool -rectsamesize(struct Rect const r1, +rectsamesize(struct Rect const r1, struct Rect const r2) { return r1.right - r1.left == r2.right - r2.left && r1.bottom - r1.top == r2.bottom - r2.top ; @@ -841,8 +841,8 @@ rectsamesize(struct Rect const r1, static void -rectinter(struct Rect const r1, - struct Rect const r2, +rectinter(struct Rect const r1, + struct Rect const r2, struct Rect * const intersectionP) { intersectionP->left = MAX(r1.left, r2.left); @@ -854,8 +854,8 @@ rectinter(struct Rect const r1, static void -rectscale(struct Rect * const r, - double const xscale, +rectscale(struct Rect * const r, + double const xscale, double const yscale) { r->left *= xscale; r->right *= xscale; @@ -886,7 +886,7 @@ addBlitList(blitList * const blitListP, int const mode) { struct blit_info * biP; - + MALLOCVAR(biP); if (biP == NULL) pm_error("out of memory for blit list"); @@ -940,8 +940,8 @@ rgbIsBlack(const struct RGBColor * const colorP) { } -static void -srcCopy(struct RGBColor * const src, +static void +srcCopy(struct RGBColor * const src, struct RGBColor * const dst) { if (rgbIsBlack(src)) @@ -952,8 +952,8 @@ srcCopy(struct RGBColor * const src, -static void -srcOr(struct RGBColor * const src, +static void +srcOr(struct RGBColor * const src, struct RGBColor * const dst) { if (rgbIsBlack(src)) *dst = foreground; @@ -961,8 +961,8 @@ srcOr(struct RGBColor * const src, -static void -srcXor(struct RGBColor * const src, +static void +srcXor(struct RGBColor * const src, struct RGBColor * const dst) { dst->red ^= ~src->red; dst->grn ^= ~src->grn; @@ -971,8 +971,8 @@ srcXor(struct RGBColor * const src, -static void -srcBic(struct RGBColor * const src, +static void +srcBic(struct RGBColor * const src, struct RGBColor * const dst) { if (rgbIsBlack(src)) *dst = background; @@ -980,8 +980,8 @@ srcBic(struct RGBColor * const src, -static void -notSrcCopy(struct RGBColor * const src, +static void +notSrcCopy(struct RGBColor * const src, struct RGBColor * const dst) { if (rgbIsWhite(src)) *dst = foreground; @@ -991,8 +991,8 @@ notSrcCopy(struct RGBColor * const src, -static void -notSrcOr(struct RGBColor * const src, +static void +notSrcOr(struct RGBColor * const src, struct RGBColor * const dst) { if (rgbIsWhite(src)) *dst = foreground; @@ -1000,8 +1000,8 @@ notSrcOr(struct RGBColor * const src, -static void -notSrcBic(struct RGBColor * const src, +static void +notSrcBic(struct RGBColor * const src, struct RGBColor * const dst) { if (rgbIsWhite(src)) *dst = background; @@ -1009,8 +1009,8 @@ notSrcBic(struct RGBColor * const src, -static void -notSrcXor(struct RGBColor * const src, +static void +notSrcXor(struct RGBColor * const src, struct RGBColor * const dst) { dst->red ^= src->red; dst->grn ^= src->grn; @@ -1019,8 +1019,8 @@ notSrcXor(struct RGBColor * const src, -static void -addOver(struct RGBColor * const src, +static void +addOver(struct RGBColor * const src, struct RGBColor * const dst) { dst->red += src->red; dst->grn += src->grn; @@ -1029,8 +1029,8 @@ addOver(struct RGBColor * const src, -static void -addPin(struct RGBColor * const src, +static void +addPin(struct RGBColor * const src, struct RGBColor * const dst) { if ((long)dst->red + (long)src->red > (long)op_color.red) dst->red = op_color.red; @@ -1050,8 +1050,8 @@ addPin(struct RGBColor * const src, -static void -subOver(struct RGBColor * const src, +static void +subOver(struct RGBColor * const src, struct RGBColor * const dst) { dst->red -= src->red; dst->grn -= src->grn; @@ -1063,8 +1063,8 @@ subOver(struct RGBColor * const src, /* or maybe its src - dst; my copy of Inside Mac is unclear */ -static void -subPin(struct RGBColor * const src, +static void +subPin(struct RGBColor * const src, struct RGBColor * const dst) { if ((long)dst->red - (long)src->red < (long)op_color.red) dst->red = op_color.red; @@ -1084,8 +1084,8 @@ subPin(struct RGBColor * const src, -static void -adMax(struct RGBColor * const src, +static void +adMax(struct RGBColor * const src, struct RGBColor * const dst) { if (src->red > dst->red) dst->red = src->red; if (src->grn > dst->grn) dst->grn = src->grn; @@ -1094,8 +1094,8 @@ adMax(struct RGBColor * const src, -static void -adMin(struct RGBColor * const src, +static void +adMin(struct RGBColor * const src, struct RGBColor * const dst) { if (src->red < dst->red) dst->red = src->red; if (src->grn < dst->grn) dst->grn = src->grn; @@ -1104,8 +1104,8 @@ adMin(struct RGBColor * const src, -static void -blend(struct RGBColor * const src, +static void +blend(struct RGBColor * const src, struct RGBColor * const dst) { #define blend_component(cmp) \ ((long)src->cmp * (long)op_color.cmp) / 65536 + \ @@ -1118,8 +1118,8 @@ blend(struct RGBColor * const src, -static void -transparent(struct RGBColor * const src, +static void +transparent(struct RGBColor * const src, struct RGBColor * const dst) { if (src->red != background.red || src->grn != background.grn || @@ -1130,7 +1130,7 @@ transparent(struct RGBColor * const src, -static transfer_func +static transfer_func transfer(int const mode) { switch (mode) { case 0: return srcCopy; @@ -1162,7 +1162,7 @@ transfer(int const mode) { static pixval redepth(pixval const c, pixval const oldMaxval) { - + return ROUNDDIV(c * PPM_MAXMAXVAL, oldMaxval); } @@ -1185,7 +1185,7 @@ decode16(unsigned char * const sixteen) { retval.red = (sixteen[0] & 0x7c) >> 2; retval.grn = (sixteen[0] & 0x03) << 3 | (sixteen[1] & 0xe0) >> 5; retval.blu = (sixteen[1] & 0x1f) >> 0; - + return retval; } @@ -1198,9 +1198,9 @@ doDiffSize(struct Rect const clipsrc, int const xsize, int const ysize, transfer_func const trf, - struct RGBColor * const color_map, + struct RGBColor * const color_map, unsigned char * const src, - int const srcwid, + int const srcwid, struct rgbPlanes const dst, unsigned int const dstwid) { @@ -1275,7 +1275,7 @@ doDiffSize(struct Rect const clipsrc, case 32: { unsigned int const planeSize = srcwid / 4; unsigned int rowNumber; - + for (rowNumber = 0; rowNumber < ysize; ++rowNumber) { unsigned char * const row = &src[rowNumber * srcwid]; unsigned char * const redPlane = &row[planeSize * 0]; @@ -1300,16 +1300,16 @@ doDiffSize(struct Rect const clipsrc, ppm_readppminit(scaled = pm_openr(tempFilename), &cols, &rows, &maxval, &format); row = ppm_allocrow(cols); - /* couldn't hurt to assert cols, rows and maxval... */ + /* couldn't hurt to assert cols, rows and maxval... */ if (trf == NULL) { while (rows-- > 0) { unsigned int i; ppm_readppmrow(scaled, row, cols, maxval, format); for (i = 0, rowp = row; i < cols; ++i, ++rowp) { - *reddst++ = PPM_GETR(*rowp) * 65536L / (maxval + 1); - *grndst++ = PPM_GETG(*rowp) * 65536L / (maxval + 1); - *bludst++ = PPM_GETB(*rowp) * 65536L / (maxval + 1); + *reddst++ = PPM_GETR(*rowp) * 65536L / (maxval + 1); + *grndst++ = PPM_GETG(*rowp) * 65536L / (maxval + 1); + *bludst++ = PPM_GETB(*rowp) * 65536L / (maxval + 1); } reddst += dstadd; grndst += dstadd; @@ -1325,9 +1325,9 @@ doDiffSize(struct Rect const clipsrc, dst_c.red = *reddst; dst_c.grn = *grndst; dst_c.blu = *bludst; - src_c.red = PPM_GETR(*rowp) * 65536L / (maxval + 1); - src_c.grn = PPM_GETG(*rowp) * 65536L / (maxval + 1); - src_c.blu = PPM_GETB(*rowp) * 65536L / (maxval + 1); + src_c.red = PPM_GETR(*rowp) * 65536L / (maxval + 1); + src_c.grn = PPM_GETG(*rowp) * 65536L / (maxval + 1); + src_c.blu = PPM_GETB(*rowp) * 65536L / (maxval + 1); (*trf)(&src_c, &dst_c); *reddst++ = dst_c.red; *grndst++ = dst_c.grn; @@ -1480,7 +1480,7 @@ blitIdempotent(unsigned int const pixSize, unsigned int const ysize, unsigned char * const src, unsigned int const srcwid, - struct RGBColor * const colorMap, + struct RGBColor * const colorMap, struct rgbPlanes const dst, unsigned int const dstwid) { /*---------------------------------------------------------------------------- @@ -1494,7 +1494,7 @@ blitIdempotent(unsigned int const pixSize, switch (pixSize) { case 8: { unsigned int rowNumber; - + for (rowNumber = 0; rowNumber < ysize; ++rowNumber) { unsigned char * const srcrow = &src[rowNumber * srcwid]; unsigned int const dstRowCurs = rowNumber * dstwid; @@ -1554,15 +1554,15 @@ blitIdempotent(unsigned int const pixSize, static void -doBlit(struct Rect const srcRect, - struct Rect const dstRect, - struct Rect const srcBounds, +doBlit(struct Rect const srcRect, + struct Rect const dstRect, + struct Rect const srcBounds, struct raster const srcplane, - struct Rect const dstBounds, + struct Rect const dstBounds, struct rgbPlanes const canvasPlanes, - int const pixSize, - int const dstwid, - struct RGBColor * const color_map, + int const pixSize, + int const dstwid, + struct RGBColor * const color_map, int const mode) { /*---------------------------------------------------------------------------- Transfer some pixels from 'srcplane' to 'canvasPlanes', applying the @@ -1633,16 +1633,16 @@ doBlit(struct Rect const srcRect, static int -blit(struct Rect const srcRect, - struct Rect const srcBounds, +blit(struct Rect const srcRect, + struct Rect const srcBounds, struct raster const srcplane, struct canvas * const canvasP, blitList * const blitListP, - int const pixSize, - struct Rect const dstRect, - struct Rect const dstBounds, - int const dstwid, - struct RGBColor * const color_map, + int const pixSize, + struct Rect const dstRect, + struct Rect const dstBounds, + int const dstwid, + struct RGBColor * const color_map, int const mode) { /*---------------------------------------------------------------------------- 'srcplane' contains the rectangle 'srcBounds' of the image. @@ -1655,7 +1655,7 @@ blit(struct Rect const srcRect, /* I can't tell what the result value of this function is supposed to mean, but I found several return statements that did not set it to anything, - and several calls that examine it. I'm guessing that "1" is the + and several calls that examine it. I'm guessing that "1" is the appropriate thing to return in those cases, so I made it so. -Bryan 00.03.02 */ @@ -1699,7 +1699,7 @@ blit(struct Rect const srcRect, * even only a bit, but that would require even more extra work). */ -static void +static void allocPlanes(unsigned int const width, unsigned int const height, struct rgbPlanes * const planesP) { @@ -1856,7 +1856,7 @@ doBlitList(struct canvas * const canvasP, if (xscale != 1.0 || yscale != 1.0) { struct blit_info * biP; - + for (biP = blitListP->firstP; biP; biP = biP->next) rectscale(&biP->dstRect, xscale, yscale); @@ -2076,7 +2076,7 @@ readColorTable(void) { static void readBytes(FILE * const ifP, - unsigned int const n, + unsigned int const n, unsigned char * const buf) { align += n; @@ -2109,7 +2109,7 @@ expand4Bits(unsigned char * const packed, unsigned char * dst; dst = &expanded[0]; - + for (i = 0; i < packedLen; ++i) { *dst++ = (packed[i] >> 4) & 0x0f; *dst++ = (packed[i] >> 0) & 0x0f; @@ -2122,12 +2122,12 @@ static void expand2Bits(unsigned char * const packed, unsigned char * const expanded, unsigned int const packedLen) { - + unsigned int i; unsigned char * dst; dst = &expanded[0]; - + for (i = 0; i < packedLen; ++i) { *dst++ = (packed[i] >> 6) & 0x03; *dst++ = (packed[i] >> 4) & 0x03; @@ -2147,7 +2147,7 @@ expand1Bit(unsigned char * const packed, unsigned char * dst; dst = &expanded[0]; - + for (i = 0; i < packedLen; ++i) { *dst++ = (packed[i] >> 7) & 0x01; *dst++ = (packed[i] >> 6) & 0x01; @@ -2163,7 +2163,7 @@ expand1Bit(unsigned char * const packed, static void -unpackBuf(unsigned char * const packed, +unpackBuf(unsigned char * const packed, unsigned int const packedLen, int const bitsPerPixel, unsigned char ** const expandedP, @@ -2240,7 +2240,7 @@ unpackUncompressedBits(FILE * const ifP, if (linebuf == NULL) pm_error("can't allocate memory for line buffer"); - for (rowOfRect = 0; rowOfRect < raster.rowCount; ++rowOfRect) { + for (rowOfRect = 0; rowOfRect < raster.rowCount; ++rowOfRect) { unsigned char * bytePixels; unsigned int expandedByteCount; unsigned char * rasterRow; @@ -2324,12 +2324,12 @@ expandRun(unsigned char * const block, "Invalid PICT file."); else { unsigned int const runLength = (block[0] ^ 0xff) + 2; - + unsigned int i; unsigned char * bytePixels; /* Points to static storage */ unsigned int expandedByteCount; unsigned int outputCursor; - + assert(block[0] & 0x80); /* It's a run */ if (verbose > 1) @@ -2349,13 +2349,13 @@ expandRun(unsigned char * const block, That is what I saw in a test image. */ - + if (expandedByteCount * runLength > expandedSize) pm_error("Invalid PICT image. It contains a row with more pixels " "than the width of the rectangle containing it, " "even padded up to a " "multiple of 16 pixels. Use -verbose to see details."); - + outputCursor = 0; for (i = 0; i < runLength; ++i) { unsigned int j; @@ -2407,14 +2407,14 @@ copyPixelGroup(unsigned char * const block, unsigned char * bytePixels; /* Points to static storage */ unsigned int bytePixelLen; unsigned int rasterBytesGenerated; - + assert(blockLimit >= 1); /* block[0] exists */ assert((block[0] & 0x80) == 0); /* It's not a run */ - + if (verbose > 1) pm_message("Block: %u explicit packed %u-byte units", groupLen, pkpixsize); - + unpackBuf(&block[1], groupLen * pkpixsize, bitsPerPixel, &bytePixels, &bytePixelLen); @@ -2432,7 +2432,7 @@ copyPixelGroup(unsigned char * const block, for (i = 0; i < rasterBytesGenerated; ++i) dest[i] = bytePixels[i]; - + *blockLengthP = blockLength; *rasterBytesGeneratedP = rasterBytesGenerated; } @@ -2499,9 +2499,9 @@ interpretCompressedLine(unsigned char * const linebuf, for (lineCursor = 0, rasterCursor = 0; lineCursor < linelen; ) { unsigned int blockLength, rasterBytesGenerated; - + assert(lineCursor <= linelen); - + if (verbose > 2) pm_message("At Byte %u of line, Column %u of row", lineCursor, rasterCursor); @@ -2511,7 +2511,7 @@ interpretCompressedLine(unsigned char * const linebuf, bitsPerPixel, &rowRaster[rasterCursor], rowSize - rasterCursor, &blockLength, &rasterBytesGenerated); - + lineCursor += blockLength; rasterCursor += rasterBytesGenerated; assert(rasterCursor <= rowSize); @@ -2539,7 +2539,7 @@ interpretCompressedLine(unsigned char * const linebuf, Of course, neither 200 nor 250 make any logical sense. In the worst case, you can represent 254 pixels of 8 bpp or less in a 255 byte line. In the worst case, you can represent 127 16bpp pixels in a 255 byte line. - So with 200 being the cutoff, it's actually impossible to represent some + So with 200 being the cutoff, it's actually impossible to represent some 16 bpp images with 200 pixels per row. We have not been able to find an official spec for PICT. @@ -2609,13 +2609,13 @@ unpackCompressedBits(FILE * const ifP, static void unpackbits(FILE * const ifP, struct Rect * const boundsP, - Word const rowBytesArg, + Word const rowBytesArg, int const bitsPerPixel, struct raster * const rasterP) { unsigned int const rectHeight = boundsP->bottom - boundsP->top; unsigned int const rectWidth = boundsP->right - boundsP->left; - + struct raster raster; unsigned int rowBytes; @@ -2624,7 +2624,7 @@ unpackbits(FILE * const ifP, if (verbose) pm_message("rowBytes = %u, bitsPerPixel = %d", rowBytesArg, bitsPerPixel); - + allocateRaster(&raster, rectWidth, rectHeight, bitsPerPixel); rowBytes = rowBytesArg ? rowBytesArg : raster.rowSize; @@ -2762,7 +2762,7 @@ read8x8Pattern(struct Pattern * const pat) { static drawFn BkPat; -static void +static void BkPat(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -2774,7 +2774,7 @@ BkPat(struct canvas * const canvasP, static drawFn PnPat; -static void +static void PnPat(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -2786,7 +2786,7 @@ PnPat(struct canvas * const canvasP, static drawFn FillPat; -static void +static void FillPat(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -2798,7 +2798,7 @@ FillPat(struct canvas * const canvasP, static drawFn PnSize; -static void +static void PnSize(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -2813,7 +2813,7 @@ PnSize(struct canvas * const canvasP, static drawFn PnSize; -static void +static void PnMode(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -2825,13 +2825,13 @@ PnMode(struct canvas * const canvasP, if (verbose) pm_message("pen transfer mode = %s", const_name(transfer_name, pen_mode)); - + pen_trf = transfer(pen_mode); } -static void +static void readRgb(struct RGBColor * const rgb) { rgb->red = readWord(); rgb->grn = readWord(); @@ -2842,14 +2842,14 @@ readRgb(struct RGBColor * const rgb) { static drawFn RGBFgCol; -static void +static void RGBFgCol(struct canvas * const canvasP, blitList * const blitListP, int const version) { readRgb(&foreground); if (verbose) - pm_message("foreground now [%d,%d,%d]", + pm_message("foreground now [%d,%d,%d]", foreground.red, foreground.grn, foreground.blu); } @@ -2857,14 +2857,14 @@ RGBFgCol(struct canvas * const canvasP, static drawFn RGBBkCol; -static void +static void RGBBkCol(struct canvas * const canvasP, blitList * const blitListP, int const version) { readRgb(&background); if (verbose) - pm_message("background now [%d,%d,%d]", + pm_message("background now [%d,%d,%d]", background.red, background.grn, background.blu); } @@ -2872,11 +2872,11 @@ RGBBkCol(struct canvas * const canvasP, #define PIXEL_INDEX(x,y) ((y) - picFrame.top) * rowlen + (x) - picFrame.left -static void +static void draw_pixel(struct canvas * const canvasP, - int const x, - int const y, - struct RGBColor * const clr, + int const x, + int const y, + struct RGBColor * const clr, transfer_func trf) { if (x < clip_rect.left || x >= clip_rect.right || @@ -2889,7 +2889,7 @@ draw_pixel(struct canvas * const canvasP, dst.red = canvasP->planes.red[i]; dst.grn = canvasP->planes.grn[i]; dst.blu = canvasP->planes.blu[i]; - + (*trf)(clr, &dst); canvasP->planes.red[i] = dst.red; @@ -2900,7 +2900,7 @@ draw_pixel(struct canvas * const canvasP, -static void +static void draw_pen_rect(struct canvas * const canvasP, struct Rect * const r) { @@ -2911,7 +2911,7 @@ draw_pen_rect(struct canvas * const canvasP, struct RGBColor dst; i = PIXEL_INDEX(r->left, r->top); /* initial value */ - + for (y = r->top; y < r->bottom; y++) { for (x = r->left; x < r->right; x++) { dst.red = canvasP->planes.red[i]; @@ -2935,9 +2935,9 @@ draw_pen_rect(struct canvas * const canvasP, -static void +static void draw_pen(struct canvas * const canvasP, - int const x, + int const x, int const y) { struct Rect penrect; @@ -2965,11 +2965,11 @@ draw_pen(struct canvas * const canvasP, * * Paul Heckbert 3 Sep 85 */ -static void +static void scan_line(struct canvas * const canvasP, - short const x1, - short const y1, - short const x2, + short const x1, + short const y1, + short const x2, short const y2) { int d, x, y, ax, ay, sx, sy, dx, dy; @@ -3016,7 +3016,7 @@ scan_line(struct canvas * const canvasP, static drawFn Line; -static void +static void Line(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3034,7 +3034,7 @@ Line(struct canvas * const canvasP, static drawFn LineFrom; -static void +static void LineFrom(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3055,7 +3055,7 @@ LineFrom(struct canvas * const canvasP, static drawFn ShortLine; -static void +static void ShortLine(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3067,7 +3067,7 @@ ShortLine(struct canvas * const canvasP, pm_message("(%d,%d) delta (%d, %d)", p1.x, p1.y, current.x, current.y); current.x += p1.x; current.y += p1.y; - + if (!blitListP) scan_line(canvasP, p1.x, p1.y, current.x, current.y); } @@ -3076,7 +3076,7 @@ ShortLine(struct canvas * const canvasP, static drawFn ShortLineFrom; -static void +static void ShortLineFrom(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3096,12 +3096,12 @@ ShortLineFrom(struct canvas * const canvasP, -static void +static void do_paintRect(struct canvas * const canvasP, struct Rect const prect) { struct Rect rect; - + if (verbose) dumpRect("painting", prect); @@ -3114,7 +3114,7 @@ do_paintRect(struct canvas * const canvasP, static drawFn paintRect; -static void +static void paintRect(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3128,7 +3128,7 @@ paintRect(struct canvas * const canvasP, static drawFn paintSameRect; -static void +static void paintSameRect(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3139,7 +3139,7 @@ paintSameRect(struct canvas * const canvasP, -static void +static void do_frameRect(struct canvas * const canvasP, struct Rect const rect) { @@ -3153,7 +3153,7 @@ do_frameRect(struct canvas * const canvasP, draw_pen(canvasP, x, rect.top); draw_pen(canvasP, x, rect.bottom - pen_height); } - + for (y = rect.top; y <= rect.bottom - pen_height ; y += pen_height) { draw_pen(canvasP, rect.left, y); draw_pen(canvasP, rect.right - pen_width, y); @@ -3165,7 +3165,7 @@ do_frameRect(struct canvas * const canvasP, static drawFn frameRect; -static void +static void frameRect(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3179,7 +3179,7 @@ frameRect(struct canvas * const canvasP, static drawFn frameSameRect; -static void +static void frameSameRect(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3192,7 +3192,7 @@ frameSameRect(struct canvas * const canvasP, /* a stupid shell sort - I'm so embarrassed */ -static void +static void poly_sort(int const sort_index, struct Point points[]) { int d, i, j, temp; @@ -3225,9 +3225,9 @@ poly_sort(int const sort_index, struct Point points[]) { /* Watch out for the lack of error checking in the next two functions ... */ -static void +static void scan_poly(struct canvas * const canvasP, - int const np, + int const np, struct Point pts[]) { int dx,dy,dxabs,dyabs,i,scan_index,j,k,px,py; @@ -3253,7 +3253,7 @@ scan_poly(struct canvas * const canvasP, scan_index++; } -#define sign(x) ((x) > 0 ? 1 : ((x)==0 ? 0:(-1)) ) +#define sign(x) ((x) > 0 ? 1 : ((x)==0 ? 0:(-1)) ) old_sdy = sy0 = sign(pts[1].y - pts[0].y); for (j=0; j<np; j++) { @@ -3312,7 +3312,7 @@ scan_poly(struct canvas * const canvasP, if (sy0 + sdy == 0) scan_index--; poly_sort(scan_index, coord); - + toggle = 0; for (i = 0; i < scan_index; i++) { if ((coord[i].y == coord[i+1].y) && (toggle == 0)) @@ -3325,12 +3325,12 @@ scan_poly(struct canvas * const canvasP, toggle = 0; } } - + static drawFn paintPoly; - -static void + +static void paintPoly(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3352,7 +3352,7 @@ paintPoly(struct canvas * const canvasP, static drawFn PnLocHFrac; -static void +static void PnLocHFrac(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3367,7 +3367,7 @@ PnLocHFrac(struct canvas * const canvasP, static drawFn TxMode; -static void +static void TxMode(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3379,7 +3379,7 @@ TxMode(struct canvas * const canvasP, if (verbose) pm_message("text transfer mode = %s", const_name(transfer_name, text_mode)); - + /* ignore the text mask bit 'cause we don't handle it yet */ text_trf = transfer(text_mode & ~64); } @@ -3388,7 +3388,7 @@ TxMode(struct canvas * const canvasP, static drawFn TxFont; -static void +static void TxFont(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3402,7 +3402,7 @@ TxFont(struct canvas * const canvasP, static drawFn TxFace; -static void +static void TxFace(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3416,7 +3416,7 @@ TxFace(struct canvas * const canvasP, static drawFn TxSize; -static void +static void TxSize(struct canvas * const canvasP, blitList * const blitListP, int const version) { @@ -3438,7 +3438,7 @@ skip_text(blitList * const blitListP) { -static int +static int abs_value(int const x) { if (x < 0) return -x; @@ -3448,9 +3448,9 @@ abs_value(int const x) { -static struct font* -get_font(int const font, - int const size, +static struct font* +get_font(int const font, + int const size, int const style) { int closeness, bestcloseness; @@ -3483,8 +3483,8 @@ get_font(int const font, /* This only does 0, 90, 180 and 270 degree rotations */ -static void -rotate(int * const x, +static void +rotate(int * const x, int * const y) { int tmp; @@ -3515,7 +3515,7 @@ rotate(int * const x, static void do_ps_text(struct canvas * const canvasP, - Word const tx, + Word const tx, Word const ty) { int len, width, i, w, h, x, y, rx, ry, o; @@ -3556,7 +3556,7 @@ do_ps_text(struct canvas * const canvasP, for (i = 0; i < len; i++) { if (!(glyph = tfont->glyph[str[i]])) continue; - + y = ty - glyph->height - glyph->y; for (h = 0; h < glyph->height; h++) { for (w = 0; w < glyph->width; w++) { @@ -3585,7 +3585,7 @@ do_ps_text(struct canvas * const canvasP, static void do_text(struct canvas * const canvasP, blitList * const blitListP, - Word const startx, + Word const startx, Word const starty) { if (blitListP) @@ -3608,11 +3608,11 @@ do_text(struct canvas * const canvasP, int dy; int h; for (h = 0, dy = y - glyph->height - glyph->y; - h < glyph->height; + h < glyph->height; ++h, ++dy) { int w; for (w = 0; w < glyph->width; ++w) { - struct RGBColor * const colorP = + struct RGBColor * const colorP = glyph->bmap[h * glyph->width + w] ? &black : &white; draw_pixel(canvasP, @@ -3703,7 +3703,7 @@ DHDVText(struct canvas * const canvasP, static void directBits(struct canvas * const canvasP, blitList * const blitListP, - unsigned int const pictVersion, + unsigned int const pictVersion, bool const skipRegion) { struct pixMap p; @@ -3741,7 +3741,7 @@ directBits(struct canvas * const canvasP, if (verbose) pm_message("transfer mode = %s", const_name(transfer_name, mode)); - if (skipRegion) + if (skipRegion) skip_poly_or_region(canvasP, blitListP, pictVersion); unpackbits(ifp, &p.Bounds, 0, p.pixelSize, &raster); @@ -3784,8 +3784,8 @@ DirectBitsRgn(struct canvas * const canvasP, static void do_pixmap(struct canvas * const canvasP, blitList * const blitListP, - int const version, - Word const rowBytes, + int const version, + Word const rowBytes, int const is_region) { /*---------------------------------------------------------------------------- Do a paletted image. @@ -3841,8 +3841,8 @@ static void do_bitmap(FILE * const ifP, struct canvas * const canvasP, blitList * const blitListP, - int const version, - int const rowBytes, + int const version, + int const rowBytes, int const is_region) { /*---------------------------------------------------------------------------- Do a bitmap. That's one bit per pixel, 0 is white, 1 is black. @@ -3857,7 +3857,7 @@ do_bitmap(FILE * const ifP, /* This raster contains padding on the right to make a multiple of 16 pixels per row. */ - static struct RGBColor color_table[] = { + static struct RGBColor color_table[] = { {65535L, 65535L, 65535L}, {0, 0, 0} }; readRect(&Bounds); @@ -3912,7 +3912,7 @@ static void BitsRegion(struct canvas * const canvasP, blitList * const blitListP, int const version) { - + Word rowBytesWord; bool pixMap; unsigned int rowBytes; @@ -3969,18 +3969,18 @@ static struct opdef const optable[] = { /* 0x1f */ { "OpColor", NA, OpColor, "RGB OpColor for arithmetic modes" }, /* 0x20 */ { "Line", 8, Line, "pnLoc (point), newPt (point)" }, /* 0x21 */ { "LineFrom", 4, LineFrom, "newPt (point)" }, -/* 0x22 */ { "ShortLine", 6, ShortLine, +/* 0x22 */ { "ShortLine", 6, ShortLine, "pnLoc (point, dh, dv (-128 .. 127))" }, /* 0x23 */ { "ShortLineFrom", 2, ShortLineFrom, "dh, dv (-128 .. 127)" }, /* 0x24 */ RESERVED_OP(WORD_LEN), /* 0x25 */ RESERVED_OP(WORD_LEN), /* 0x26 */ RESERVED_OP(WORD_LEN), /* 0x27 */ RESERVED_OP(WORD_LEN), -/* 0x28 */ { "LongText", NA, LongText, +/* 0x28 */ { "LongText", NA, LongText, "txLoc (point), count (0..255), text" }, /* 0x29 */ { "DHText", NA, DHText, "dh (0..255), count (0..255), text" }, /* 0x2a */ { "DVText", NA, DVText, "dv (0..255), count (0..255), text" }, -/* 0x2b */ { "DHDVText", NA, DHDVText, +/* 0x2b */ { "DHDVText", NA, DHDVText, "dh, dv (0..255), count (0..255), text" }, /* 0x2c */ RESERVED_OP(WORD_LEN), /* 0x2d */ RESERVED_OP(WORD_LEN), @@ -4092,23 +4092,23 @@ static struct opdef const optable[] = { /* 0x97 */ RESERVED_OP(WORD_LEN), /* 0x98 */ { "PackBitsRect", NA, BitsRect, "packed copybits, rect clipped" }, /* 0x99 */ { "PackBitsRgn", NA, BitsRegion, "packed copybits, rgn clipped" }, -/* 0x9a */ { "DirectBitsRect", NA, DirectBitsRect, +/* 0x9a */ { "DirectBitsRect", NA, DirectBitsRect, "PixMap, srcRect, dstRect, int copymode, PixData" }, -/* 0x9b */ { "DirectBitsRgn", NA, DirectBitsRgn, +/* 0x9b */ { "DirectBitsRgn", NA, DirectBitsRgn, "PixMap, srcRect, dstRect, int copymode, maskRgn, PixData" }, /* 0x9c */ RESERVED_OP(WORD_LEN), /* 0x9d */ RESERVED_OP(WORD_LEN), /* 0x9e */ RESERVED_OP(WORD_LEN), /* 0x9f */ RESERVED_OP(WORD_LEN), /* 0xa0 */ { "ShortComment", 2, ShortComment, "kind (word)" }, -/* 0xa1 */ { "LongComment", NA, LongComment, +/* 0xa1 */ { "LongComment", NA, LongComment, "kind (word), size (word), data" } }; static void -processOpcode(Word const opcode, +processOpcode(Word const opcode, struct canvas * const canvasP, blitList * const blitListP, unsigned int const version) { @@ -4248,7 +4248,7 @@ interpretPict(FILE * const ofP) { while((opcode = get_op(version)) != 0xff) processOpcode(opcode, &canvas, fullres ? &blitList : NULL, version); - + if (fullres) { if (blitList.unblittableText) pm_message("Warning: text is omitted from the output because " @@ -4272,7 +4272,7 @@ loadDefaultFontDir(void) { int rc; rc = stat("fontdir", &statbuf); - + if (rc == 0) load_fontdir("fontdir"); } diff --git a/converter/ppm/pjtoppm.c b/converter/ppm/pjtoppm.c index 7b694fb3..b8b94f74 100644 --- a/converter/ppm/pjtoppm.c +++ b/converter/ppm/pjtoppm.c @@ -11,65 +11,87 @@ */ #include "ppm.h" +#include "pm_c_util.h" #include "mallocvar.h" static char usage[] = "[paintjetfile]"; -static int egetc ARGS((FILE *fp)); + + +static unsigned int +uintProduct(unsigned int const multiplicand, + unsigned int const multiplier) { + + if (UINT_MAX / multiplier < multiplicand) + pm_error("Airthmetic overflow"); + + return multiplicand * multiplier; +} + + + static int -egetc(fp) - FILE *fp; -{ +egetc(FILE * const ifP) { int c; - if ((c = fgetc(fp)) == -1) + + c = fgetc(ifP); + + if (c == -1) pm_error("unexpected end of file"); - return(c); + + return c; } + + int -main(argc, argv) - int argc; - char *argv[]; -{ +main(int argc, const char ** argv) { + int cmd, val; char buffer[BUFSIZ]; int planes = 3, rows = -1, cols = -1; - int r = 0, c = 0, p = 0, i; unsigned char **image = NULL; int *imlen; - FILE *fp = stdin; + FILE * ifP; int mode; int argn; unsigned char bf[3]; - pixel *pixrow; + pixel * pixrow; + int c; + int row; + int plane; + pm_proginit(&argc, argv); - ppm_init(&argc, argv); argn = 1; if (argn != argc) - fp = pm_openr(argv[argn++]); + ifP = pm_openr(argv[argn++]); else - fp = stdin; + ifP = stdin; if (argn != argc) pm_usage(usage); - while ((c = fgetc(fp)) != -1) { + row = 0; /* initial value */ + plane = 0; /* initial value */ + + while ((c = fgetc(ifP)) != -1) { if (c != '\033') continue; - switch (c = egetc(fp)) { + switch (c = egetc(ifP)) { case 'E': /* reset */ break; - case '*': - cmd = egetc(fp); + case '*': { + unsigned int i; + cmd = egetc(ifP); for (i = 0; i < BUFSIZ; i++) { - if (!isdigit(c = egetc(fp)) && c != '+' && c != '-') + if (!isdigit(c = egetc(ifP)) && c != '+' && c != '-') break; buffer[i] = c; } if (i != 0) { buffer[i] = '\0'; - if (sscanf(buffer, "%d", &val) != 1) + if (sscanf(buffer, "%d", &val) != 1) pm_error("bad value `%s' at <ESC>*%c%c", buffer, cmd, c); } else @@ -100,7 +122,7 @@ main(argc, argv) break; case 'U': /* planes */ planes = val; - if (planes != 3) + if (planes != 3) pm_error("can handle only 3 plane files"); break; case 'A': /* begin raster */ @@ -126,38 +148,33 @@ main(argc, argv) break; case 'V': /* send plane */ case 'W': /* send last plane */ - if (rows == -1 || r >= rows || image == NULL) { - if (rows == -1 || r >= rows) + if (rows == -1 || row >= rows || image == NULL) { + if (rows == -1 || row >= rows) rows += 100; if (image == NULL) { - MALLOCARRAY(image, rows * planes); - MALLOCARRAY(imlen, rows * planes); - } - else { - image = (unsigned char **) - realloc(image, - rows * planes * - sizeof(unsigned char *)); - imlen = (int *) - realloc(imlen, rows * planes * sizeof(int)); + MALLOCARRAY(image, uintProduct(rows, planes)); + MALLOCARRAY(imlen, uintProduct(rows, planes)); + } else { + REALLOCARRAY(image, uintProduct(rows, planes)); + REALLOCARRAY(imlen, uintProduct(rows, planes)); } } if (image == NULL || imlen == NULL) pm_error("out of memory"); - if (p == planes) + if (plane >= planes) pm_error("too many planes"); - cols = cols > val ? cols : val; - imlen[r * planes + p] = val; - MALLOCARRAY(image[r * planes + p], val); - if (image[r * planes + p] == NULL) + cols = MAX(cols, val); + imlen[row * planes + plane] = val; + MALLOCARRAY(image[row * planes + plane], val); + if (image[row * planes + plane] == NULL) pm_error("out of memory"); - if (fread(image[r * planes + p], 1, val, fp) != val) + if (fread(image[row * planes + plane], 1, val, ifP) != val) pm_error("short data"); if (c == 'V') - p++; + ++plane; else { - p = 0; - r++; + plane = 0; + ++row; } break; default: @@ -166,7 +183,7 @@ main(argc, argv) } break; case 'p': /* Position */ - if (p != 0) + if (plane != 0) pm_error("changed position in the middle of " "transferring planes"); switch (c) { @@ -175,15 +192,15 @@ main(argc, argv) break; case 'Y': if (buffer[0] == '+') - val = r + val; + val = row + val; if (buffer[0] == '-') - val = r - val; - for (; val > r; r++) - for (p = 0; p < 3; p++) { - imlen[r * planes + p] = 0; - image[r * planes + p] = NULL; + val = row - val; + for (; val > row; ++row) + for (plane = 0; plane < 3; ++plane) { + imlen[row * planes + plane] = 0; + image[row * planes + plane] = NULL; } - r = val; + row = val; break; default: pm_message("uninmplemented <ESC>*%c%d%c", cmd, val, c); @@ -192,62 +209,80 @@ main(argc, argv) default: pm_message("uninmplemented <ESC>*%c%d%c", cmd, val, c); break; - } - } + } + } /* case */ + } /* switch */ } - pm_close(fp); - rows = r; + pm_close(ifP); + rows = row; if (mode == 1) { - unsigned char *buf; - int newcols = 0; - newcols = 10240; /* It could not be larger that that! */ - cols = 0; - for (r = 0; r < rows; r++) { - if (image[r * planes] == NULL) + int const newcols = 10240; /* It could not be larger that that! */ + unsigned char * buf; + unsigned int row; + + for (row = 0, cols = 0; row < rows; ++row) { + unsigned int plane; + if (image[row * planes] == NULL) continue; - for (p = 0; p < planes; p++) { + for (plane = 0; plane < planes; ++plane) { + unsigned int i; + unsigned int col; MALLOCARRAY(buf, newcols); - if (buf == NULL) + if (buf == NULL) pm_error("out of memory"); - for (i = 0, c = 0; c < imlen[p + r * planes]; c += 2) - for (cmd = image[p + r * planes][c], - val = image[p + r * planes][c+1]; - cmd >= 0 && i < newcols; cmd--, i++) + for (i = 0, col = 0; + col < imlen[plane + row * planes]; + col += 2) + for (cmd = image[plane + row * planes][col], + val = image[plane + row * planes][col+1]; + cmd >= 0 && i < newcols; cmd--, i++) buf[i] = val; - cols = cols > i ? cols : i; - free(image[p + r * planes]); - /* - * This is less than what we have so it realloc should + cols = MAX(cols, i); + free(image[plane + row * planes]); + /* + * This is less than what we have so it realloc should * not return null. Even if it does, tough! We will * lose a line, and probably die on the next line anyway */ - image[p + r * planes] = (unsigned char *) realloc(buf, i); + image[plane + row * planes] = realloc(buf, i); } } cols *= 8; } - - + ppm_writeppminit(stdout, cols, rows, (pixval) 255, 0); pixrow = ppm_allocrow(cols); - for (r = 0; r < rows; r++) { - if (image[r * planes] == NULL) { - for (c = 0; c < cols; c++) - PPM_ASSIGN(pixrow[c], 0, 0, 0); + + for (row = 0; row < rows; ++row) { + if (image[row * planes] == NULL) { + unsigned int col; + for (col = 0; col < cols; ++col) + PPM_ASSIGN(pixrow[col], 0, 0, 0); continue; } - for (cmd = 0, c = 0; c < cols; c += 8, cmd++) - for (i = 0; i < 8 && c + i < cols; i++) { - for (p = 0; p < planes; p++) - if (mode == 0 && cmd >= imlen[r * planes + p]) - bf[p] = 0; - else - bf[p] = (image[r * planes + p][cmd] & - (1 << (7 - i))) ? 255 : 0; - PPM_ASSIGN(pixrow[c + i], bf[0], bf[1], bf[2]); + { + unsigned int col; + unsigned int cmd; + for (cmd = 0, col = 0; col < cols; col += 8, ++cmd) { + unsigned int i; + for (i = 0; i < 8 && col + i < cols; ++i) { + unsigned int plane; + for (plane = 0; plane < planes; ++plane) + if (mode == 0 && cmd >= imlen[row * planes + plane]) + bf[plane] = 0; + else + bf[plane] = (image[row * planes + plane][cmd] & + (1 << (7 - i))) ? 255 : 0; + PPM_ASSIGN(pixrow[col + i], bf[0], bf[1], bf[2]); + } } - ppm_writeppmrow(stdout, pixrow, cols, (pixval) 255, 0); + } + ppm_writeppmrow(stdout, pixrow, cols, 255, 0); } pm_close(stdout); - exit(0); + + return 0; } + + + diff --git a/converter/ppm/ppmtobmp.c b/converter/ppm/ppmtobmp.c index a0de38e3..f89cec8d 100644 --- a/converter/ppm/ppmtobmp.c +++ b/converter/ppm/ppmtobmp.c @@ -94,15 +94,15 @@ parseCommandLine(int argc, const char ** argv, unsigned int windowsSpec, os2Spec, mapfileSpec; unsigned int option_def_index; - + MALLOCARRAY(option_def, 100); option_def_index = 0; /* incremented by OPTENTRY */ OPTENT3('w', "windows", OPT_FLAG, NULL, &windowsSpec, 0); OPTENT3('o', "os2", OPT_FLAG, NULL, &os2Spec, 0); - OPTENT3(0, "bpp", OPT_UINT, &cmdlineP->bpp, + OPTENT3(0, "bpp", OPT_UINT, &cmdlineP->bpp, &cmdlineP->bppSpec, 0); - OPTENT3(0, "mapfile", OPT_STRING, &cmdlineP->mapfile, + OPTENT3(0, "mapfile", OPT_STRING, &cmdlineP->mapfile, &mapfileSpec, 0); opt.opt_table = option_def; @@ -111,18 +111,18 @@ parseCommandLine(int argc, const char ** argv, pm_optParseOptions3(&argc, (char **)argv, opt, sizeof(opt), 0); - if (windowsSpec && os2Spec) + if (windowsSpec && os2Spec) pm_error("Can't specify both -windows and -os2 options."); - else if (windowsSpec) + else if (windowsSpec) cmdlineP->class = BMP_C_WIN_V1; else if (os2Spec) cmdlineP->class = BMP_C_OS2_1x; - else + else cmdlineP->class = BMP_C_WIN_V1; if (cmdlineP->bppSpec) { - if (cmdlineP->bpp != 1 && cmdlineP->bpp != 4 && + if (cmdlineP->bpp != 1 && cmdlineP->bpp != 4 && cmdlineP->bpp != 8 && cmdlineP->bpp != 24) pm_error("Invalid -bpp value specified: %u. The only values valid " "in the BMP format are 1, 4, 8, and 24 bits per pixel", @@ -136,7 +136,7 @@ parseCommandLine(int argc, const char ** argv, cmdlineP->inputFilename = pm_strdup("-"); /* he wants stdin */ else if (argc - 1 == 1) cmdlineP->inputFilename = pm_strdup(argv[1]); - else + else pm_error("Too many arguments. The only argument accepted " "is the input file specificaton"); @@ -155,7 +155,7 @@ freeCommandLine(struct CmdlineInfo const cmdline) { static void putByte(FILE * const fp, unsigned char const v) { - if (putc(v, fp) == EOF) + if (putc(v, fp) == EOF) pm_error("Write of a byte to a file failed."); /* Note: a Solaris/SPARC user reported on 2003.09.29 that the above @@ -170,7 +170,7 @@ putByte(FILE * const fp, unsigned char const v) { static void putShort(FILE * const fp, short const v) { - if (pm_writelittleshort(fp, v) == -1) + if (pm_writelittleshort(fp, v) == -1) pm_error("Write of a halfword to a file failed."); } @@ -188,7 +188,7 @@ putLong(FILE * const fp, long const v) { -----------------------------------------------------------------------------*/ static unsigned int -bmpWriteFileHeader(FILE * const fp, +bmpWriteFileHeader(FILE * const fp, unsigned int const cbSize, unsigned int const offBits) { /*---------------------------------------------------------------------------- @@ -199,28 +199,28 @@ bmpWriteFileHeader(FILE * const fp, /* cbSize */ putLong(fp, cbSize); - + /* xHotSpot */ putShort(fp, 0); - + /* yHotSpot */ putShort(fp, 0); - + /* offBits */ putLong(fp, offBits); assert(BMPlenfileheader() == 14); - + return 14; } static unsigned int -bmpWriteInfoHeader(FILE * const fp, - enum bmpClass const class, - unsigned long const bitcount, - unsigned long const x, +bmpWriteInfoHeader(FILE * const fp, + enum bmpClass const class, + unsigned long const bitcount, + unsigned long const x, unsigned long const y) { /*---------------------------------------------------------------------------- Write the INFO header. @@ -289,10 +289,10 @@ bmpWriteInfoHeader(FILE * const fp, static unsigned int -bmpWriteRgb(FILE * const fp, - enum bmpClass const class, - pixval const R, - pixval const G, +bmpWriteRgb(FILE * const fp, + enum bmpClass const class, + pixval const R, + pixval const G, pixval const B) { /*---------------------------------------------------------------------------- Return the number of bytes written. @@ -325,8 +325,8 @@ bmpWriteRgb(FILE * const fp, static unsigned int -bmpWriteColormap(FILE * const ifP, - enum bmpClass const class, +bmpWriteColormap(FILE * const ifP, + enum bmpClass const class, int const bpp, const ColorMap * const colorMapP) { /*---------------------------------------------------------------------------- @@ -373,10 +373,10 @@ lookupColor(colorhash_table const cht, static void -bmpWriteRow_palette(FILE * const fp, - const pixel * const row, +bmpWriteRow_palette(FILE * const fp, + const pixel * const row, unsigned int const cols, - unsigned short const bpp, + unsigned short const bpp, colorhash_table const cht, unsigned int * const nBytesP) { /*---------------------------------------------------------------------------- @@ -385,7 +385,7 @@ bmpWriteRow_palette(FILE * const fp, Return the number of bytes written as *nBytesP. -----------------------------------------------------------------------------*/ BITSTREAM b; - + b = pm_bitinit(fp, "w"); if (b == NULL) pm_error("Failed to initialize output file for output"); @@ -393,9 +393,9 @@ bmpWriteRow_palette(FILE * const fp, int rc; unsigned int nbyte; unsigned int col; - + nbyte = 0; /* initial value */ - + for (col = 0; col < cols; ++col) { unsigned int colorIndex; int rc; @@ -413,7 +413,7 @@ bmpWriteRow_palette(FILE * const fp, rc = pm_bitfini(b); nbyte += rc; - + /* Make sure we write a multiple of 4 bytes. */ while (nbyte % 4 != 0) { putByte(fp, 0); @@ -426,13 +426,13 @@ bmpWriteRow_palette(FILE * const fp, static void -bmpWriteRow_truecolor(FILE * const fp, - const pixel * const row, +bmpWriteRow_truecolor(FILE * const fp, + const pixel * const row, unsigned long const cols, pixval const maxval, unsigned int * const nBytesP) { /*---------------------------------------------------------------------------- - Write a row of a truecolor BMP image to the file 'fp'. The row is + Write a row of a truecolor BMP image to the file 'fp'. The row is 'row', which is 'cols' columns long. @@ -441,14 +441,14 @@ bmpWriteRow_truecolor(FILE * const fp, /* This works only for 24 bits per pixel. To implement this for the general case (which is only hypothetical -- this program doesn't write any truecolor images except 24 bit and apparently no one - else does either), you would move this function into + else does either), you would move this function into BMPwriterow_palette, which writes arbitrary bit strings. But that would be a lot slower and less robust. */ int nbyte; /* Number of bytes we have written to file so far */ - int col; - + int col; + nbyte = 0; /* initial value */ for (col = 0; col < cols; ++col) { /* We scale to the BMP maxval, which is always 255. */ @@ -465,19 +465,19 @@ bmpWriteRow_truecolor(FILE * const fp, putByte(fp, 0); ++nbyte; } - + *nBytesP = nbyte; } static unsigned int -bmpWriteRaster(FILE * const fp, - unsigned long const cols, +bmpWriteRaster(FILE * const fp, + unsigned long const cols, unsigned long const rows, Colortype const colortype, - unsigned short const cBitCount, - const pixel ** const pixels, + unsigned short const cBitCount, + const pixel ** const pixels, pixval const maxval, colorhash_table const cht) { /*---------------------------------------------------------------------------- @@ -499,9 +499,9 @@ bmpWriteRaster(FILE * const fp, unsigned int nBytesThisRow; if (colortype == PALETTE) - bmpWriteRow_palette(fp, pixels[row], cols, + bmpWriteRow_palette(fp, pixels[row], cols, cBitCount, cht, &nBytesThisRow); - else + else bmpWriteRow_truecolor(fp, pixels[row], cols, maxval, &nBytesThisRow); @@ -516,13 +516,13 @@ bmpWriteRaster(FILE * const fp, static void -bmpEncode(FILE * const ifP, - enum bmpClass const class, +bmpEncode(FILE * const ifP, + enum bmpClass const class, Colortype const colortype, unsigned int const bpp, - int const x, - int const y, - const pixel ** const pixels, + int const x, + int const y, + const pixel ** const pixels, pixval const maxval, const ColorMap * const colorMapP) { /*---------------------------------------------------------------------------- @@ -571,10 +571,10 @@ makeBilevelColorMap(ColorMap * const colorMapP) { static void -bmpEncodePbm(FILE * const ifP, - enum bmpClass const class, - int const cols, - int const rows, +bmpEncodePbm(FILE * const ifP, + enum bmpClass const class, + int const cols, + int const rows, unsigned char ** const bitrow) { /*---------------------------------------------------------------------------- Write a bi-level BMP file of the given class. @@ -591,7 +591,7 @@ bmpEncodePbm(FILE * const ifP, unsigned long nbyte; ColorMap bilevelColorMap; unsigned int row; - + /* colortype == PALETTE */ pm_message("Writing 1 bit per pixel with a black-white palette"); @@ -613,7 +613,7 @@ bmpEncodePbm(FILE * const ifP, if (bytesWritten != packedBytes){ if (feof(ifP)) pm_error("End of file writing row %u of BMP raster.", row); - else + else pm_error("Error writing BMP raster. Errno=%d (%s)", errno, strerror(errno)); } else @@ -659,7 +659,7 @@ minBmpBitsForColorCount(unsigned int const colorCount) { implement and other bpp's have in fact been seen to confuse viewers. There is an extended BMP format that has 16 bpp too, but this program doesn't know how to generate that - (see Bmptopnm.c, though). + (see Bmptopnm.c, though). */ if (minbits == 1) return 1; @@ -704,7 +704,7 @@ getMapFile(const char * const mapFileName, MAXCOLORS, cols * rows); count = 0; /* initial value */ - + for (row = 0; row < rows; ++row) { unsigned int col; for (col = 0; col < cols; ++col) { @@ -732,15 +732,15 @@ getMapFile(const char * const mapFileName, static void -analyzeColors(const pixel ** const pixels, - int const cols, - int const rows, - pixval const maxval, +analyzeColors(const pixel ** const pixels, + int const cols, + int const rows, + pixval const maxval, unsigned int * const minimumBppP, ColorMap * const colorMapP) { /*---------------------------------------------------------------------------- Look at the colors in the image 'pixels' and compute values to use in - representing those colors in a BMP image. + representing those colors in a BMP image. First of all, count the distinct colors. Return as *minimumBppP the minimum number of bits per pixel it will take to represent all @@ -762,7 +762,7 @@ analyzeColors(const pixel ** const pixels, int colorCount; pm_message("analyzing colors..."); - chv = ppm_computecolorhist((pixel**)pixels, cols, rows, MAXCOLORS, + chv = ppm_computecolorhist((pixel**)pixels, cols, rows, MAXCOLORS, &colorCount); colorMapP->count = colorCount; if (chv == NULL) { @@ -785,7 +785,7 @@ analyzeColors(const pixel ** const pixels, mapEntryP->grn = (pixval) PPM_GETG(chv[i].color) * 255 / maxval; mapEntryP->blu = (pixval) PPM_GETB(chv[i].color) * 255 / maxval; } - + /* And make a hash table for fast lookup. */ colorMapP->cht = ppm_colorhisttocolorhash(chv, colorMapP->count); ppm_freecolorhist(chv); @@ -798,7 +798,7 @@ static void chooseColortypeBpp(bool const userRequestsBpp, unsigned int const requestedBpp, unsigned int const minimumBpp, - Colortype * const colortypeP, + Colortype * const colortypeP, unsigned int * const bitsPerPixelP) { /*---------------------------------------------------------------------------- Determine whether the BMP raster should contain RGB values or palette @@ -832,12 +832,12 @@ chooseColortypeBpp(bool const userRequestsBpp, *bitsPerPixelP = requestedBpp; } - assert(*bitsPerPixelP == 1 || - *bitsPerPixelP == 4 || - *bitsPerPixelP == 8 || + assert(*bitsPerPixelP == 1 || + *bitsPerPixelP == 4 || + *bitsPerPixelP == 8 || *bitsPerPixelP == 24); - if (*bitsPerPixelP > 8) + if (*bitsPerPixelP > 8) *colortypeP = TRUECOLOR; else { *colortypeP = PALETTE; @@ -853,7 +853,7 @@ doPbm(FILE * const ifP, int const format, enum bmpClass const class, FILE * const ofP) { - + /* We read the raster directly from the input with pbm_readpbmrow_packed(). The raster format is almost identical, except that BMP specifies rows to be zero-filled to @@ -864,7 +864,7 @@ doPbm(FILE * const ifP, int const adjustedCols = (cols+31) /32 * 32; int const packedBytes = adjustedCols /8; - unsigned char ** bitrow; + unsigned char ** bitrow; unsigned int row; bitrow = pbm_allocarray_packed(adjustedCols, rows); @@ -877,15 +877,15 @@ doPbm(FILE * const ifP, thisRow[packedBytes-2] = 0x00; thisRow[packedBytes-3] = 0x00; thisRow[packedBytes-4] = 0x00; - + pbm_readpbmrow_packed(ifP, thisRow, cols, format); { unsigned int i; - for (i = 0; i < colChars; ++i) + for (i = 0; i < colChars; ++i) thisRow[i] = ~thisRow[i]; /* flip all pixels */ } - /* This may seem unnecessary, because the color palette + /* This may seem unnecessary, because the color palette (RGB[] in bmpEncodePbm) can be inverted for the same effect. However we take this precaution, for there is indication that some BMP viewers may get confused with that. @@ -896,7 +896,7 @@ doPbm(FILE * const ifP, } bmpEncodePbm(ofP, class, cols, rows, bitrow); -} +} @@ -920,27 +920,27 @@ doPgmPpm(FILE * const ifP, unsigned int bitsPerPixel; Colortype colortype; unsigned int row; - + pixel ** pixels; ColorMap colorMap; - + pixels = ppm_allocarray(cols, rows); - + for (row = 0; row < rows; ++row) ppm_readppmrow(ifP, pixels[row], cols, maxval, ppmFormat); - + if (mapFileName) getMapFile(mapFileName, &minimumBpp, &colorMap); else - analyzeColors((const pixel**)pixels, cols, rows, maxval, + analyzeColors((const pixel**)pixels, cols, rows, maxval, &minimumBpp, &colorMap); - + chooseColortypeBpp(userRequestsBpp, requestedBpp, minimumBpp, &colortype, &bitsPerPixel); - + bmpEncode(ofP, class, colortype, bitsPerPixel, cols, rows, (const pixel**)pixels, maxval, &colorMap); - + freeColorMap(&colorMap); ppm_freearray(pixels, rows); @@ -964,10 +964,11 @@ main(int argc, parseCommandLine(argc, argv, &cmdline); ifP = pm_openr(cmdline.inputFilename); - + ppm_readppminit(ifP, &cols, &rows, &maxval, &ppmFormat); - - if (PPM_FORMAT_TYPE(ppmFormat) == PBM_TYPE) + + if ((PPM_FORMAT_TYPE(ppmFormat) == PBM_TYPE) && + (!cmdline.bppSpec || cmdline.bpp == 1)) doPbm(ifP, cols, rows, ppmFormat, cmdline.class, stdout); else doPgmPpm(ifP, cols, rows, maxval, ppmFormat, diff --git a/converter/ppm/ppmtomitsu.c b/converter/ppm/ppmtomitsu.c index e59f09b3..5b0b3245 100644 --- a/converter/ppm/ppmtomitsu.c +++ b/converter/ppm/ppmtomitsu.c @@ -274,7 +274,7 @@ static void doLookupTableColors(colorhist_vector const table, unsigned int const nColor, hashinfo * const colorhashtable) { - + unsigned int colval; for (colval = 0; colval < nColor; ++colval) { struct hashinfo * const hashchain = @@ -287,7 +287,7 @@ doLookupTableColors(colorhist_vector const table, datum(PPM_GETR((table[colval]).color)); datum(PPM_GETG((table[colval]).color)); datum(PPM_GETB((table[colval]).color)); - + hashrun = hashchain; /* start at beginning of chain */ if (hashrun->flag == -1) { @@ -323,7 +323,7 @@ doLookupTableGrays(colorhist_vector const table, datum(PPM_GETB((table[colval]).color)); datum(PPM_GETB((table[colval]).color)); datum(PPM_GETB((table[colval]).color)); - + hashrun = hashchain; /* start at beginning of chain */ if (hashrun->flag == -1) { @@ -410,7 +410,7 @@ writeColormapRaster(pixel ** const pixels, struct hashinfo * const hashchain = &colorhashtable[myhash(pixrow[col])]; struct hashinfo * p; - + p = hashchain; while (!PPM_EQUAL((p->color), pixrow[col])) { assert(p->next); @@ -554,7 +554,7 @@ doTiny(FILE * const ifP, int const enlarge, int const copy, struct mediasize const medias) { - + pixel * pixelrow; unsigned char * redrow; unsigned char * grnrow; @@ -653,7 +653,7 @@ main(int argc, char * argv[]) { tiny = TRUE; else pm_usage(usage); - ++argn; + ++argn; } if (argn < argc) { @@ -690,7 +690,7 @@ main(int argc, char * argv[]) { } ppm_readppminit(ifP, &cols, &rows, &maxval, &format); - + if (tiny) { doTiny(ifP, cols, rows, maxval, format, sharpness, enlarge, copy, medias); @@ -707,7 +707,7 @@ main(int argc, char * argv[]) { /* first check wether we can use the lut transfer */ - table = ppm_computecolorhist(pixels, cols, rows, MAXLUTCOL+1, + table = ppm_computecolorhist(pixels, cols, rows, MAXLUTCOL+1, &nColor); if (table) useLookupTable(pixels, table, sharpness, enlarge, copy, medias, diff --git a/converter/ppm/tgatoppm.c b/converter/ppm/tgatoppm.c index 3660e646..662f741b 100644 --- a/converter/ppm/tgatoppm.c +++ b/converter/ppm/tgatoppm.c @@ -30,7 +30,6 @@ static int mapped, rlencoded; static pixel ColorMap[MAXCOLORS]; static gray AlphaMap[MAXCOLORS]; -static int RLE_count = 0, RLE_flag = 0; struct cmdlineInfo { /* All the information the user supplied in the command line, @@ -79,14 +78,14 @@ parseCommandLine(int argc, char ** argv, cmdlineP->input_filename = "-"; /* he wants stdin */ else if (argc - 1 == 1) cmdlineP->input_filename = strdup(argv[1]); - else + else pm_error("Too many arguments. The only argument accepted " "is the input file specification"); if (alpha_spec && streq(cmdlineP->alpha_filename, "-")) cmdlineP->alpha_stdout = 1; - else + else cmdlineP->alpha_stdout = 0; if (!alpha_spec) @@ -103,89 +102,111 @@ getbyte(FILE * const ifP) { if ( fread( (char*) &c, 1, 1, ifP ) != 1 ) pm_error( "EOF / read error" ); - + return c; } +static int RLE_count = 0, RLE_flag = 0; + + + static void -get_pixel(FILE * const ifP, pixel * dest, int Size, gray *alpha_p) { +handleRun(FILE * const ifP, + bool * const repeatP) { + + if (rlencoded) { + if (RLE_count == 0) { + /* Have to restart run. */ + unsigned char i; + i = getbyte(ifP); + RLE_flag = (i & 0x80); + if (RLE_flag == 0) { + /* Stream of unencoded pixels. */ + RLE_count = i + 1; + } else { + /* Single pixel replicated. */ + RLE_count = i - 127; + } + /* Decrement count & get pixel. */ + --RLE_count; + *repeatP = false; + } else { + /* Have already read count & (at least) first pixel. */ + --RLE_count; + if (RLE_flag != 0) { + /* Replicated pixels. */ + *repeatP = true; + } else + *repeatP = false; + } + } else + *repeatP = false; +} - static pixval Red, Grn, Blu; - static pixval Alpha; - unsigned char j, k; + + +static void +getPixel(FILE * const ifP, + pixel * const dest, + int const size, + gray * const alphaP) { + + static pixval red, grn, blu; + static pixval alpha; static unsigned int l; + unsigned char j, k; + bool repeat; + /* Next pixel is just a repeat (from an encoded run) */ - /* Check if run length encoded. */ - if ( rlencoded ) - { - if ( RLE_count == 0 ) - { /* Have to restart run. */ - unsigned char i; - i = getbyte( ifP ); - RLE_flag = ( i & 0x80 ); - if ( RLE_flag == 0 ) - /* Stream of unencoded pixels. */ - RLE_count = i + 1; - else - /* Single pixel replicated. */ - RLE_count = i - 127; - /* Decrement count & get pixel. */ - --RLE_count; - } - else - { /* Have already read count & (at least) first pixel. */ - --RLE_count; - if ( RLE_flag != 0 ) - /* Replicated pixels. */ - goto PixEncode; - } - } - /* Read appropriate number of bytes, break into RGB. */ - switch ( Size ) - { - case 8: /* Grayscale, read and triplicate. */ - Red = Grn = Blu = l = getbyte( ifP ); - Alpha = 0; - break; - - case 16: /* 5 bits each of red green and blue. */ - case 15: /* Watch byte order. */ - j = getbyte( ifP ); - k = getbyte( ifP ); - l = ( (unsigned int) k << 8 ) + j; - Red = ( k & 0x7C ) >> 2; - Grn = ( ( k & 0x03 ) << 3 ) + ( ( j & 0xE0 ) >> 5 ); - Blu = j & 0x1F; - Alpha = 0; - break; - - case 32: /* 8 bits each of blue, green, red, and alpha */ - case 24: /* 8 bits each of blue, green, and red. */ - Blu = getbyte( ifP ); - Grn = getbyte( ifP ); - Red = getbyte( ifP ); - if ( Size == 32 ) - Alpha = getbyte( ifP ); - else - Alpha = 0; - l = 0; - break; + handleRun(ifP, &repeat); - default: - pm_error( "unknown pixel size (#2) - %d", Size ); - } + if (repeat) { + /* Use red, grn, blu, alpha, and l from prior call to getPixel */ + } else { + /* Read appropriate number of bytes, break into RGB. */ + switch (size) { + case 8: /* Grayscale, read and triplicate. */ + red = grn = blu = l = getbyte(ifP); + alpha = 0; + break; -PixEncode: - if ( mapped ) { + case 16: /* 5 bits each of red green and blue. */ + case 15: /* Watch byte order. */ + j = getbyte(ifP); + k = getbyte(ifP); + l = ((unsigned int)k << 8) + j; + red = (k & 0x7C) >> 2; + grn = ((k & 0x03) << 3) + ((j & 0xE0) >> 5); + blu = j & 0x1F; + alpha = 0; + break; + + case 32: /* 8 bits each of blue, green, red, and alpha */ + case 24: /* 8 bits each of blue, green, and red. */ + blu = getbyte(ifP); + grn = getbyte(ifP); + red = getbyte(ifP); + if (size == 32) + alpha = getbyte(ifP); + else + alpha = 0; + l = 0; + break; + + default: + pm_error("unknown pixel size (#2) - %d", size); + } + } + if (mapped) { *dest = ColorMap[l]; - *alpha_p = AlphaMap[l]; + *alphaP = AlphaMap[l]; } else { - PPM_ASSIGN( *dest, Red, Grn, Blu ); - *alpha_p = Alpha; - } + PPM_ASSIGN(*dest, red, grn, blu); + *alphaP = alpha; } +} @@ -217,7 +238,7 @@ readtga(FILE * const ifP, struct ImageHeader * tgaP) { tgaP->Rsrvd = ( flags & 0x10 ) >> 4; tgaP->OrgBit = ( flags & 0x20 ) >> 5; tgaP->IntrLve = ( flags & 0xc0 ) >> 6; - + if ( tgaP->IdLength != 0 ) fread( junk, 1, (int) tgaP->IdLength, ifP ); } @@ -231,14 +252,14 @@ get_map_entry(FILE * const ifP, pixel * Value, int Size, gray * Alpha) { /* Read appropriate number of bytes, break into rgb & put in map. */ switch ( Size ) - { - case 8: /* Grayscale, read and triplicate. */ + { + case 8: /* Grayscale, read and triplicate. */ r = g = b = getbyte( ifP ); a = 0; break; - - case 16: /* 5 bits each of red green and blue. */ - case 15: /* Watch for byte order. */ + + case 16: /* 5 bits each of red green and blue. */ + case 15: /* Watch for byte order. */ j = getbyte( ifP ); k = getbyte( ifP ); r = ( k & 0x7C ) >> 2; @@ -246,21 +267,21 @@ get_map_entry(FILE * const ifP, pixel * Value, int Size, gray * Alpha) { b = j & 0x1F; a = 0; break; - - case 32: /* 8 bits each of blue, green, red, and alpha */ - case 24: /* 8 bits each of blue green and red. */ + + case 32: /* 8 bits each of blue, green, red, and alpha */ + case 24: /* 8 bits each of blue green and red. */ b = getbyte( ifP ); g = getbyte( ifP ); r = getbyte( ifP ); if ( Size == 32 ) a = getbyte( ifP ); - else + else a = 0; break; - - default: + + default: pm_error( "unknown colormap pixel size (#2) - %d", Size ); - } + } PPM_ASSIGN( *Value, r, g, b ); *Alpha = a; } @@ -326,84 +347,89 @@ main(int argc, char * argv[]) { if (cmdline.alpha_stdout) alpha_file = stdout; - else if (cmdline.alpha_filename == NULL) + else if (cmdline.alpha_filename == NULL) alpha_file = NULL; else alpha_file = pm_openw(cmdline.alpha_filename); - - if (cmdline.alpha_stdout) + + if (cmdline.alpha_stdout) imageout_file = NULL; else imageout_file = stdout; - + /* Read the Targa file header. */ readtga(ifP, &tga_head); - if (cmdline.headerdump) + if (cmdline.headerdump) dumpHeader(tga_head); rows = ((int) tga_head.Height_lo) + ((int) tga_head.Height_hi) * 256; cols = ((int) tga_head.Width_lo) + ((int) tga_head.Width_hi) * 256; switch (tga_head.ImgType) { - case TGA_Map: - case TGA_RGB: - case TGA_Mono: - case TGA_RLEMap: - case TGA_RLERGB: - case TGA_RLEMono: + case TGA_Map: + case TGA_RGB: + case TGA_Mono: + case TGA_RLEMap: + case TGA_RLERGB: + case TGA_RLEMono: + break; + case TGA_CompMap: + case TGA_CompMap4: + pm_error("Targa image type %d (compressed color-mapped data). " + "Cannot handle this format.", tga_head.ImgType); break; - default: + default: pm_error("unknown Targa image type %d", tga_head.ImgType); - } - + } + if (tga_head.ImgType == TGA_Map || tga_head.ImgType == TGA_RLEMap || tga_head.ImgType == TGA_CompMap || tga_head.ImgType == TGA_CompMap4) - { /* Color-mapped image */ + { /* Color-mapped image */ if (tga_head.CoMapType != 1) - pm_error( + pm_error( "mapped image (type %d) with color map type != 1", tga_head.ImgType ); mapped = true; /* Figure maxval from CoSize. */ switch (tga_head.CoSize) { - case 8: - case 24: - case 32: + case 8: + case 24: + case 32: maxval = 255; break; - case 15: - case 16: + case 15: + case 16: maxval = 31; break; - default: - pm_error( - "unknown colormap pixel size - %d", tga_head.CoSize ); - } - } else { + default: + pm_error( + "unknown colormap pixel size - %d", tga_head.CoSize ); + } + } else { /* Not colormap, so figure maxval from PixelSize. */ mapped = false; switch ( tga_head.PixelSize ) { - case 8: - case 24: - case 32: + case 8: + case 24: + case 32: maxval = 255; break; - - case 15: - case 16: + + case 15: + case 16: maxval = 31; break; - - default: + + default: pm_error("unknown pixel size - %d", tga_head.PixelSize); - } - } - + } + } + /* If required, read the color map information. */ if ( tga_head.CoMapType != 0 ) { unsigned int i; @@ -416,7 +442,7 @@ main(int argc, char * argv[]) { for (i = temp1; i < (temp1 + temp2); ++i) get_map_entry(ifP, &ColorMap[i], (int) tga_head.CoSize, &AlphaMap[i]); - } + } /* Check run-length encoding. */ if (tga_head.ImgType == TGA_RLEMap || @@ -425,7 +451,7 @@ main(int argc, char * argv[]) { rlencoded = 1; else rlencoded = 0; - + /* Read the Targa file body and convert to portable format. */ pixels = ppm_allocarray( cols, rows ); alpha = pgm_allocarray( cols, rows ); @@ -437,10 +463,10 @@ main(int argc, char * argv[]) { realrow = truerow; if (tga_head.OrgBit == 0) realrow = rows - realrow - 1; - + for (col = 0; col < cols; ++col) - get_pixel(ifP, &(pixels[realrow][col]), (int) tga_head.PixelSize, - &(alpha[realrow][col])); + getPixel(ifP, &(pixels[realrow][col]), (int) tga_head.PixelSize, + &(alpha[realrow][col])); if (tga_head.IntrLve == TGA_IL_Four) truerow += 4; else if (tga_head.IntrLve == TGA_IL_Two) @@ -449,17 +475,20 @@ main(int argc, char * argv[]) { ++truerow; if (truerow >= rows) truerow = ++baserow; - } + } pm_close(ifP); - - if (imageout_file) + + if (imageout_file) ppm_writeppm(imageout_file, pixels, cols, rows, (pixval) maxval, 0); if (alpha_file) pgm_writepgm(alpha_file, alpha, cols, rows, (pixval) maxval, 0); - if (imageout_file) + if (imageout_file) pm_close(imageout_file); if (alpha_file) pm_close(alpha_file); return 0; } + + + diff --git a/converter/ppm/xpmtoppm.c b/converter/ppm/xpmtoppm.c index 9471ec7c..46101a09 100644 --- a/converter/ppm/xpmtoppm.c +++ b/converter/ppm/xpmtoppm.c @@ -82,14 +82,14 @@ parseCommandLine(int argc, char ** argv, cmdlineP->input_filespec = NULL; /* he wants stdin */ else if (argc - 1 == 1) cmdlineP->input_filespec = strdup(argv[1]); - else + else pm_error("Too many arguments. The only argument accepted\n" "is the input file specification"); - if (cmdlineP->alpha_filename && + if (cmdlineP->alpha_filename && streq(cmdlineP->alpha_filename, "-")) cmdlineP->alpha_stdout = TRUE; - else + else cmdlineP->alpha_stdout = FALSE; } @@ -224,7 +224,7 @@ entryMatch(struct ColorNameHashTableEntry const entry, { unsigned int i; - + for (i = 0; i < size; ++i) { if (name[i] != entry.colorName[i]) return false; @@ -272,7 +272,7 @@ hash_find(const ColorNameHash * const hashP, for (i = initialIndex; !entryMatch(hashP->table[i], name, hashP->nameSize); bumpIndex(&i, hashP->size, initialIndex)); - + *entryPP = &hashP->table[i]; } @@ -358,7 +358,7 @@ getLine(char * const line, If 'backup' is true, the "next line" is the previously read line, i.e. the one in that one-line buffer. Otherwise, the "next line" is the next - line from the real file. After reading the backed up line, we reset + line from the real file. After reading the backed up line, we reset 'backup' to false. Return the line as a null terminated string in *line, which is an @@ -371,7 +371,7 @@ getLine(char * const line, "which is out of bounds"); if (backup) { - strncpy(line, lastInputLine, size); + strncpy(line, lastInputLine, size); backup = FALSE; } else { if (fgets(line, size, stream) == NULL) @@ -398,7 +398,7 @@ getword(char * const output, char ** const cursorP) { strncpy(output, t1, t2 - t1); output[t2 - t1] = '\0'; *cursorP = t2; -} +} @@ -438,7 +438,7 @@ validateColorName(const char * const name, static void interpretXpm3ColorTableLine(char const line[], - unsigned int const seqNum, + unsigned int const seqNum, unsigned int const charsPerPixel, ColorNameHash * const hashP) { /*---------------------------------------------------------------------------- @@ -458,22 +458,22 @@ interpretXpm3ColorTableLine(char const line[], -----------------------------------------------------------------------------*/ /* Note: this code seems to allow for multi-word color specifications, but I'm not aware that such are legal. Ultimately, ppm_parsecolor() - interprets the name, and I believe it takes only single word + interprets the name, and I believe it takes only single word color specifications. -Bryan 2001.05.06. */ - char str2[MAX_LINE+1]; + char str2[MAX_LINE+1]; char * t1; char * t2; int endOfEntry; /* boolean */ - + unsigned int curkey, key, highkey; /* current color key */ - bool lastwaskey; + bool lastwaskey; /* The last token we processes was a key, and we have processed at least one token. */ char curbuf[BUFSIZ]; /* current buffer */ bool isTransparent; - + const char * colorName; /* The 0-3 character name this color map line gives the color (i.e. the name that the raster uses). This is NOT NUL-terminated. @@ -485,20 +485,20 @@ interpretXpm3ColorTableLine(char const line[], if (t1 == NULL) pm_error("A line that is supposed to be an entry in the color " "table does not start with a quote. The line is '%s'. " - "It is the %uth entry in the color table.", + "It is the %uth entry in the color table.", line, seqNum); else ++t1; /* Points now to first color number character */ - + validateColorName(t1, charsPerPixel); colorName = t1; t1 += charsPerPixel; /* - * read color keys and values + * read color keys and values */ - curkey = 0; + curkey = 0; highkey = 1; lastwaskey = FALSE; t2 = t1; @@ -512,8 +512,8 @@ interpretXpm3ColorTableLine(char const line[], /* See if the word we got is a valid key (and get its key number if so) */ - for (key = 1; - key <= NKEYS && !streq(xpmColorKeys[key - 1], str2); + for (key = 1; + key <= NKEYS && !streq(xpmColorKeys[key - 1], str2); key++); isKey = (key <= NKEYS); @@ -521,21 +521,21 @@ interpretXpm3ColorTableLine(char const line[], /* This word is a color specification (or "none" for transparent). */ - if (!curkey) + if (!curkey) pm_error("Missing color key token in color table line " "'%s' before '%s'.", line, str2); - if (!lastwaskey) + if (!lastwaskey) strcat(curbuf, " "); /* append space */ - if ( (strneq(str2, "None", 4)) + if ( (strneq(str2, "None", 4)) || (strneq(str2, "none", 4)) ) { /* This entry identifies the transparent color number */ strcat(curbuf, "#000000"); /* Make it black */ isTransparent = TRUE; - } else + } else strcat(curbuf, str2); /* append buf */ lastwaskey = FALSE; - } else { - /* This word is a key. So we've seen the last of the + } else { + /* This word is a key. So we've seen the last of the info for the previous key, and we must either put it in the color map or ignore it if we already have a higher color form in the colormap for this colormap entry. @@ -561,7 +561,7 @@ interpretXpm3ColorTableLine(char const line[], addToColorMap(hashP, colorName, curbuf, isTransparent); highkey = curkey; } - if (highkey == 1) + if (highkey == 1) pm_error("C error scanning color table"); } @@ -588,10 +588,10 @@ readV3ColorTable(FILE * const ifP, /* skip the comment line if any */ if (strneq(line, "/*", 2)) getLine(line, sizeof(line), ifP); - + interpretXpm3ColorTableLine(line, seqNum, charsPerPixel, colorNameHashP); - + } *colorNameHashPP = colorNameHashP; } @@ -601,7 +601,7 @@ readV3ColorTable(FILE * const ifP, static void readXpm3Header(FILE * const ifP, unsigned int * const widthP, - unsigned int * const heightP, + unsigned int * const heightP, unsigned int * const charsPerPixelP, ColorNameHash ** const colorNameHashPP) { /*---------------------------------------------------------------------------- @@ -620,14 +620,14 @@ readXpm3Header(FILE * const ifP, -----------------------------------------------------------------------------*/ char line[MAX_LINE+1]; const char * xpm3_signature = "/* XPM */"; - + unsigned int width, height; unsigned int nColors; unsigned int charsPerPixel; /* Read the XPM signature comment */ getLine(line, sizeof(line), ifP); - if (!strneq(line, xpm3_signature, strlen(xpm3_signature))) + if (!strneq(line, xpm3_signature, strlen(xpm3_signature))) pm_error("Apparent XPM 3 file does not start with '/* XPM */'. " "First line is '%s'", xpm3_signature); @@ -716,7 +716,7 @@ readV1ColorTable(FILE * const ifP, static void readXpm1Header(FILE * const ifP, unsigned int * const widthP, - unsigned int * const heightP, + unsigned int * const heightP, unsigned int * const charsPerPixelP, ColorNameHash ** const colorNameHashPP) { /*---------------------------------------------------------------------------- @@ -724,11 +724,11 @@ readXpm1Header(FILE * const ifP, getLine() stream is presently positioned to the beginning of the file and it is a Version 1 XPM file. Leave the stream positioned after the header. - + Return the information from the header the same as for readXpm3Header. -----------------------------------------------------------------------------*/ int format, v; - bool processedStaticChar; + bool processedStaticChar; /* We have read up to and interpreted the "static char..." line */ char * t1; unsigned int nColors; @@ -876,7 +876,7 @@ convertRow(char const line[], "'%s'. Ignoring this line.", line); } else { unsigned int col; - + ++lineCursor; /* Skip to first character after quote */ /* Handle pixels until a close quote, eol, or we've returned all @@ -890,7 +890,7 @@ convertRow(char const line[], alpharow[col] = hash_isTransparent(colorNameHashP, lineCursor) ? PBM_BLACK : PBM_WHITE; - + lineCursor += charsPerPixel; } if (*lineCursor != '"') @@ -903,7 +903,7 @@ convertRow(char const line[], static void convertRaster(FILE * const ifP, unsigned int const cols, - unsigned int const rows, + unsigned int const rows, unsigned int const charsPerPixel, const ColorNameHash * const colorNameHashP, FILE * const imageOutFileP, @@ -928,7 +928,7 @@ convertRaster(FILE * const ifP, bool haveLine; for (haveLine = false; !haveLine; ) { - getLine(line, sizeof(line), ifP); + getLine(line, sizeof(line), ifP); if (strneq(line, "/*", 2)) { /* It's a comment. Ignore it. */ @@ -939,22 +939,22 @@ convertRaster(FILE * const ifP, pixrow, alpharow); if (imageOutFileP) - ppm_writeppmrow(imageOutFileP, + ppm_writeppmrow(imageOutFileP, pixrow, cols, PPM_MAXMAXVAL, 0); - if (alphaOutFileP) - pbm_writepbmrow(alphaOutFileP, alpharow, cols, 0); + if (alphaOutFileP) + pbm_writepbmrow(alphaOutFileP, alpharow, cols, 0); } pbm_freerow(alpharow); ppm_freerow(pixrow); } - + static void readXpmHeader(FILE * const ifP, unsigned int * const widthP, - unsigned int * const heightP, + unsigned int * const heightP, unsigned int * const charsPerPixelP, ColorNameHash ** const colorNameHashPP) { /*---------------------------------------------------------------------------- @@ -974,7 +974,7 @@ readXpmHeader(FILE * const ifP, /* Read the header line */ getLine(line, sizeof(line), ifP); backup = TRUE; /* back up so next read reads this line again */ - + rc = sscanf(line, "/* %s */", str1); if (rc == 1 && strneq(str1, "XPM", 3)) { /* It's an XPM version 3 file */ @@ -987,7 +987,7 @@ readXpmHeader(FILE * const ifP, *heightP = height; *charsPerPixelP = charsPerPixel; } - + int @@ -1008,20 +1008,20 @@ main(int argc, char *argv[]) { verbose = cmdline.verbose; - if ( cmdline.input_filespec != NULL ) + if ( cmdline.input_filespec != NULL ) ifP = pm_openr( cmdline.input_filespec); else ifP = stdin; if (cmdline.alpha_stdout) alphaOutFileP = stdout; - else if (cmdline.alpha_filename == NULL) + else if (cmdline.alpha_filename == NULL) alphaOutFileP = NULL; else { alphaOutFileP = pm_openw(cmdline.alpha_filename); } - if (cmdline.alpha_stdout) + if (cmdline.alpha_stdout) imageOutFileP = NULL; else imageOutFileP = stdout; @@ -1036,7 +1036,7 @@ main(int argc, char *argv[]) { convertRaster(ifP, cols, rows, charsPerPixel, colorNameHashP, imageOutFileP, alphaOutFileP); - + pm_close(ifP); if (imageOutFileP) pm_close(imageOutFileP); @@ -1044,7 +1044,7 @@ main(int argc, char *argv[]) { pm_close(alphaOutFileP); hash_destroy(colorNameHashP); - + return 0; } @@ -1066,17 +1066,17 @@ main(int argc, char *argv[]) { ** Tue Apr 9 1991 ** ** Rainer Sinkwitz sinkwitz@ifi.unizh.ch - 21 Nov 91: -** - Bug fix, no advance of read ptr, would not read -** colors like "ac c black" because it would find +** - Bug fix, no advance of read ptr, would not read +** colors like "ac c black" because it would find ** the "c" of "ac" and then had problems with "c" ** as color. -** +** ** - Now understands multiword X11 color names -** +** ** - Now reads multiple color keys. Takes the color ** of the hightest available key. Lines no longer need ** to begin with key 'c'. -** +** ** - expanded line buffer to from 500 to 2048 for bigger files */ diff --git a/converter/ppm/xvminitoppm.c b/converter/ppm/xvminitoppm.c index d76bea87..ad207ae9 100644 --- a/converter/ppm/xvminitoppm.c +++ b/converter/ppm/xvminitoppm.c @@ -13,12 +13,13 @@ #include <assert.h> #include <string.h> #include <errno.h> +#include <stdbool.h> #include "pm_c_util.h" #include "nstring.h" +#include "pm.h" #include "ppm.h" -#define BUFSIZE 256 typedef struct xvPalette { @@ -53,25 +54,6 @@ parseCommandLine(int const argc, static void -getLine(FILE * const ifP, - char * const buf, - size_t const size) { - - char * rc; - - rc = fgets(buf, size, ifP); - if (rc == NULL) { - if (ferror(ifP)) - pm_error("read error. fgets() failed, errno=%d (%s)", - errno, strerror(errno)); - else - pm_error("unexpected EOF"); - } -} - - - -static void makeXvPalette(xvPalette * const xvPaletteP) { unsigned int paletteIndex; @@ -101,37 +83,53 @@ readXvHeader(FILE * const ifP, unsigned int * const colsP, unsigned int * const rowsP, unsigned int * const maxvalP) { - - char buf[256]; + + char * buf; + size_t bufferSz; + int eof; + size_t lineLen; unsigned int cols, rows, maxval; int rc; bool endOfComments; - - getLine(ifP, buf, sizeof(buf)); - if (!strneq(buf, "P7 332", 6)) + buf = NULL; /* initial value */ + bufferSz = 0; /* initial value */ + + pm_getline(ifP, &buf, &bufferSz, &eof, &lineLen); + + if (eof || !strneq(buf, "P7 332", 6)) pm_error("Input is not a XV thumbnail picture. It does not " "begin with the characters 'P7 332'."); - endOfComments = FALSE; - while (!endOfComments) { - getLine(ifP, buf, sizeof(buf)); + for (endOfComments = false; !endOfComments; ) { + int eof; + size_t lineLen; + pm_getline(ifP, &buf, &bufferSz, &eof, &lineLen); + if (eof) + pm_error("EOF before #END_OF_COMMENTS line"); if (strneq(buf, "#END_OF_COMMENTS", 16)) - endOfComments = TRUE; + endOfComments = true; else if (strneq(buf, "#BUILTIN", 8)) pm_error("This program does not know how to " "convert builtin XV thumbnail pictures"); } - getLine(ifP, buf, sizeof(buf)); + pm_getline(ifP, &buf, &bufferSz, &eof, &lineLen); + if (eof) + pm_error("EOF where cols/rows/maxval line expected"); + rc = sscanf(buf, "%u %u %u", &cols, &rows, &maxval); if (rc != 3) pm_error("error parsing dimension info '%s'. " "It does not consist of 3 decimal numbers.", buf); if (maxval != 255) pm_error("bogus XV thumbnail maxval %u. Should be 255", maxval); + *colsP = cols; *rowsP = rows; *maxvalP = maxval; + + if (buf) + free(buf); } @@ -166,7 +164,7 @@ writePpm(FILE * const ifP, else { unsigned int const paletteIndex = byte; assert(byte >= 0); - + PPM_ASSIGN(pixrow[col], xvPaletteP->red[paletteIndex], xvPaletteP->grn[paletteIndex], @@ -181,7 +179,7 @@ writePpm(FILE * const ifP, -int +int main(int argc, char * argv[]) { @@ -190,7 +188,7 @@ main(int argc, unsigned int cols, rows; pixval maxval; xvPalette xvPalette; - + ppm_init(&argc, argv); parseCommandLine(argc, argv, &cmdline); |