From ee250e7490cbb3550fed22fdb98b7152cce20b72 Mon Sep 17 00:00:00 2001 From: giraffedata Date: Sat, 29 Dec 2018 16:32:28 +0000 Subject: Promote current Development release as Advanced git-svn-id: http://svn.code.sf.net/p/netpbm/code/advanced@3468 9d0c8265-081b-0410-96cb-a4ca84ce46f8 --- converter/pbm/Makefile | 8 +- converter/pbm/pbmtoln03.c | 211 +++++++++++++++++---------------- converter/pbm/pbmtomacp.c | 6 +- converter/pbm/pbmtoppa/pbm.c | 273 ++++++++++++++++++++++++++----------------- 4 files changed, 289 insertions(+), 209 deletions(-) (limited to 'converter/pbm') diff --git a/converter/pbm/Makefile b/converter/pbm/Makefile index b74bbb68..352b73de 100644 --- a/converter/pbm/Makefile +++ b/converter/pbm/Makefile @@ -38,6 +38,8 @@ OBJECTS = $(BINARIES:%=%.o) $(EXTRA_OBJECTS) MERGEBINARIES = $(BINARIES) MERGE_OBJECTS = $(MERGEBINARIES:%=%.o2) $(EXTRA_OBJECTS) +HAVE_MERGE_COMPAT=YES + SUBDIRS=pbmtoppa .PHONY: all @@ -74,7 +76,7 @@ thinkjettopbm.c:%.c:%.c1 $(SRCDIR)/lib/util/lexheader grep -v "^[[:space:]]*int yywrap(void);" \ >$@ -install.bin: install.bin.local +install.bin install.merge: install.bin.local .PHONY: install.bin.local install.bin.local: $(PKGDIR)/bin # Remember that $(SYMLINK) might just be a copy command. @@ -82,6 +84,10 @@ install.bin.local: $(PKGDIR)/bin cd $(PKGDIR)/bin ; \ $(SYMLINK) pbmtosunicon$(EXE) pbmtoicon$(EXE) +mergecomptrylist: + cat /dev/null >$@ + echo "TRY(\"pbmtoicon\", main_pbmtosunicon);" >>$@ + thisdirclean: localclean .PHONY: localclean localclean: diff --git a/converter/pbm/pbmtoln03.c b/converter/pbm/pbmtoln03.c index f7cf53c7..235429cd 100644 --- a/converter/pbm/pbmtoln03.c +++ b/converter/pbm/pbmtoln03.c @@ -40,116 +40,130 @@ work. */ #include -#include "pbm.h" - -FILE *input ; - -#ifndef print -#define print(s) fputs (s, stdout) -#define fprint(f, s) fputs (s, f) -#endif +#include "mallocvar.h" +#include "pbm.h" -static void -output_sixel_record (unsigned char * record, int width) { - int i, j, k ; - unsigned char last_char ; - int start_repeat = 0 ; - int repeated ; - char repeated_str[16] ; - char *p ; - /* Do RLE */ - last_char = record[0] ; - j = 0 ; +static void +outputSixelRecord(unsigned char * const record, + unsigned int const width) { - /* This will make the following loop complete */ - record[width] = '\0' ; + unsigned int i, j; + unsigned char lastChar; + int startRepeat; + char repeatedStr[16]; - for (i = 1 ; i <= width ; i++) { + /* Do RLE */ + lastChar = record[0]; + j = 0; - repeated = i - start_repeat ; + /* This will make the following loop complete */ + record[width] = '\0' ; - if (record[i] != last_char || repeated >= 32766) { + for (i = 1, startRepeat = 0; i <= width; ++i) { + unsigned int const repeated = i - startRepeat; - /* Repeat has ended */ + if (record[i] != lastChar || repeated >= 32766) { - if (repeated > 3) { + /* Repeat has ended */ - /* Do an encoding */ - record[j++] = '!' ; - sprintf (repeated_str, "%d", i - start_repeat) ; - for (p = repeated_str ; *p ; p++) - record[j++] = *p ; - record[j++] = last_char ; } + if (repeated > 3) { + /* Do an encoding */ + char * p; + record[j++] = '!' ; + sprintf(repeatedStr, "%u", i - startRepeat); + for (p = repeatedStr; *p; ++p) + record[j++] = *p; + record[j++] = lastChar; + } else { + unsigned int k; - else { - for (k = 0 ; k < repeated ; k++) - record[j++] = last_char ; } + for (k = 0; k < repeated; ++k) + record[j++] = lastChar; + } - start_repeat = i ; - last_char = record[i] ; } - } + startRepeat = i ; + lastChar = record[i]; + } + } - fwrite ((char *) record, j, 1, stdout) ; - putchar ('-') ; /* DECGNL (graphics new-line) */ - putchar ('\n') ; - } + fwrite((char *) record, j, 1, stdout) ; + putchar('-') ; /* DECGNL (graphics new-line) */ + putchar('\n') ; +} -static void -convert (int width, int height, int format) { - - int i ; - unsigned char *sixel ; /* A row of sixels */ - int sixel_row ; - - bit *row = pbm_allocrow (width) ; - - sixel = (unsigned char *) malloc (width + 2) ; - - sixel_row = 0 ; - while (height--) { - pbm_readpbmrow (input, row, width, format) ; - switch (sixel_row) { - case 0 : - for (i = 0 ; i < width ; i++) - sixel[i] = row[i] ; - break ; - case 1 : - for (i = 0 ; i < width ; i++) - sixel[i] += row[i] << 1 ; - break ; - case 2 : - for (i = 0 ; i < width ; i++) - sixel[i] += row[i] << 2 ; - break ; - case 3 : - for (i = 0 ; i < width ; i++) - sixel[i] += row[i] << 3 ; - break ; - case 4 : - for (i = 0 ; i < width ; i++) - sixel[i] += row[i] << 4 ; - break ; - case 5 : - for (i = 0 ; i < width ; i++) - sixel[i] += (row[i] << 5) + 077 ; - output_sixel_record (sixel, width) ; - break ; } - if (sixel_row == 5) - sixel_row = 0 ; - else - sixel_row++ ; - } - if (sixel_row > 0) { - /* Incomplete sixel record needs to be output */ - for (i = 0 ; i < width ; i++) - sixel[i] += 077 ; - output_sixel_record (sixel, width) ; } - } +static void +convert(FILE * const ifP, + unsigned int const width, + unsigned int const height, + unsigned int const format) { + + unsigned char * sixel; /* A row of sixels */ + unsigned int sixelRow; + bit * bitrow; + unsigned int remainingHeight; + + bitrow = pbm_allocrow(width); + + MALLOCARRAY(sixel, width + 2); + if (!sixel) + pm_error("Unable to allocation %u bytes for a row buffer", width + 2); + + for (remainingHeight = height, sixelRow = 0; + remainingHeight > 0; + --remainingHeight) { + + unsigned int i; + + pbm_readpbmrow(ifP, bitrow, width, format); + + switch (sixelRow) { + case 0 : + for (i = 0; i < width; ++i) + sixel[i] = bitrow[i] ; + break ; + case 1 : + for (i = 0; i < width; ++i) + sixel[i] += bitrow[i] << 1; + break ; + case 2 : + for (i = 0; i < width; ++i) + sixel[i] += bitrow[i] << 2; + break ; + case 3 : + for (i = 0; i < width; ++i) + sixel[i] += bitrow[i] << 3; + break ; + case 4 : + for (i = 0; i < width; ++i) + sixel[i] += bitrow[i] << 4; + break ; + case 5 : + for (i = 0; i < width; ++i) + sixel[i] += (bitrow[i] << 5) + 077; + outputSixelRecord(sixel, width); + break ; } + if (sixelRow == 5) + sixelRow = 0; + else + ++sixelRow; + } + + if (sixelRow > 0) { + /* Incomplete sixel record needs to be output */ + unsigned int i; + for (i = 0; i < width; ++i) + sixel[i] += 077; + outputSixelRecord(sixel, width); + } + + pbm_freerow(bitrow); + free(sixel); +} @@ -169,6 +183,7 @@ main (int argc, char **argv) { const char *opt_bottom_margin = "3400"; const char *opt_form_length = opt_bottom_margin; + FILE * ifP; int width, height, format ; pbm_init (&argc_copy, argv_copy) ; @@ -210,16 +225,16 @@ main (int argc, char **argv) { } if( argn < argc ) { - input = pm_openr( argv[argn] ); + ifP = pm_openr( argv[argn] ); argn++; } else - input = stdin; + ifP = stdin; if( argn != argc ) pm_usage(usage); - pbm_readpbminit (input, &width, &height, &format) ; + pbm_readpbminit (ifP, &width, &height, &format) ; /* * In explanation of the sequence below: @@ -241,10 +256,10 @@ main (int argc, char **argv) { opt_form_length); /* Convert data */ - convert (width, height, format) ; + convert (ifP, width, height, format) ; /* Terminate sixel data */ - print ("\033\\\n") ; + puts ("\033\\") ; /* If the program failed, it previously aborted with nonzero completion code, via various function calls. diff --git a/converter/pbm/pbmtomacp.c b/converter/pbm/pbmtomacp.c index df5cbb0c..e02f5559 100644 --- a/converter/pbm/pbmtomacp.c +++ b/converter/pbm/pbmtomacp.c @@ -177,7 +177,7 @@ calculateCropPad(struct CmdlineInfo const cmdline, pm_message("Specified -bottom value %u is beyond edge of " "input image", cmdline.bottom); - bottom = MIN3(cmdline.bottom, rows - 1, top + MACP_ROWS - 1); + bottom = MIN3(cmdline.bottom, rows - 1, top + MACP_ROWS - 1); } else bottom = MIN(rows - 1, top + MACP_ROWS - 1); @@ -234,7 +234,7 @@ writeMacpRowUnpacked(const bit * const imageBits, char const marginByte = 0x00; /* White bits for margin */ unsigned int const rightMarginCharCt = MACP_COLCHARS - leftMarginCharCt - imageColCharCt; - + unsigned int i; fputc(MACP_COLCHARS - 1, ofP); @@ -361,7 +361,7 @@ encodeRowsWithShift(bit * const bitrow, for (row = 0; row < cropPad.imageHeight; ++row) { pbm_readpbmrow_bitoffset(ifP, bitrow, inCols, format, offset); - + /* Trim off fractional margin portion in first byte of image data */ if (leftTrim > 0) { bitrow[startChar] <<= leftTrim; diff --git a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c index 2f8a42b1..ae36e0d2 100644 --- a/converter/pbm/pbmtoppa/pbm.c +++ b/converter/pbm/pbmtoppa/pbm.c @@ -11,126 +11,185 @@ #include #include #include +#include +#include "pm.h" +#include "nstring.h" #include "ppapbm.h" -int make_pbm_stat(pbm_stat* pbm,FILE* fptr) -{ - char line[1024]; - - pbm->fptr=fptr; - pbm->version=none; - pbm->current_line=0; - pbm->unread = 0; +int +make_pbm_stat(pbm_stat * const pbmStatP, + FILE * const ifP) { + + char line[1024]; + char * rc; + int retval; + + pbmStatP->fptr = ifP; + pbmStatP->version = none; + pbmStatP->current_line = 0; + pbmStatP->unread = 0; + + rc = fgets(line, 1024, ifP); + if (rc == NULL) + retval = 0; + else { + line[strlen(line)-1] = 0; + + if (streq(line,"P1")) + pbmStatP->version=P1; + if (streq(line,"P4")) + pbmStatP->version=P4; + + if (pbmStatP->version == none) { + pm_message("unknown PBM magic '%s'", line); + retval = 0; + } else { + do { + char * rc; + rc = fgets(line, 1024, ifP); + if (rc == NULL) + return 0; + } while (line[0] == '#'); + { + int rc; + rc = sscanf(line, "%d %d", + &pbmStatP->width, &pbmStatP->height); + if (rc != 2) + retval = 0; + else { + if (pbmStatP->width < 0) { + pm_message("Image has negative width"); + retval = 0; + } else if (pbmStatP->width > INT_MAX/2) { + pm_message("Uncomputeably large width: %d", + pbmStatP->width); + retval = 0; + } else if (pbmStatP->height < 0) { + pm_message("Image has negative height"); + retval = 0; + } else if (pbmStatP->height > INT_MAX/2) { + pm_message("Uncomputeably large height: %d", + pbmStatP->height); + retval = 0; + } else + retval = 1; + } + } + } + } + return retval; +} - if (fgets (line, 1024, fptr) == NULL) - return 0; - line[strlen(line)-1] = 0; - if(!strcmp(line,"P1")) pbm->version=P1; - if(!strcmp(line,"P4")) pbm->version=P4; - if(pbm->version == none) - { - fprintf(stderr,"pbm_readheader(): unknown PBM magic '%s'\n",line); - return 0; - } - do - if (fgets (line, 1024, fptr) == NULL) - return 0; - while (line[0] == '#'); +static int +getbytes(FILE * const ifP, + unsigned int const width, + unsigned char * const data) { + + unsigned char mask; + unsigned char acc; + unsigned char * place; + unsigned int num; + int retval; + + if (width == 0) + retval = 0; + else { + for (mask = 0x80, acc = 0, num = 0, place = data; num < width; ) { + switch (getc(ifP)) { + case EOF: + return 0; + case '1': + acc |= mask; + /* fall through */ + case '0': + mask >>= 1; + ++num; + if (mask == 0x00) { /* if (num % 8 == 0) */ + *place++ = acc; + acc = 0; + mask = 0x80; + } + } + } + if (width % 8 != 0) + *place = acc; + + retval = 1; + } + return retval; +} - if (2 != sscanf (line, "%d %d", &pbm->width, &pbm->height)) - return 0; - return 1; -} -static int getbytes(FILE *fptr,int width,unsigned char* data) -{ - unsigned char mask,acc,*place; - int num; - - if(!width) return 0; - for(mask=0x80, acc=0, num=0, place=data; num>=1; - num++; - if(!mask) /* if(num%8 == 0) */ - { - *place++ = acc; - acc=0; - mask=0x80; - } +int +pbm_readline(pbm_stat * const pbmStatP, + unsigned char * const data) { +/*---------------------------------------------------------------------------- + Read a single line into data which must be at least (pbmStatP->width+7)/8 + bytes of storage. +-----------------------------------------------------------------------------*/ + int retval; + + if (pbmStatP->current_line >= pbmStatP->height) + retval = 0; + else { + if (pbmStatP->unread) { + memcpy(data, pbmStatP->revdata, (pbmStatP->width+7)/8); + ++pbmStatP->current_line; + pbmStatP->unread = 0; + free(pbmStatP->revdata); + pbmStatP->revdata = NULL; + retval = 1; + } else { + switch (pbmStatP->version) { + case P1: + if (getbytes(pbmStatP->fptr, pbmStatP->width, data)) { + pbmStatP->current_line++; + retval = 1; + } else + retval = 0; + break; + case P4: { + int tmp, tmp2; + tmp = (pbmStatP->width+7)/8; + tmp2 = fread(data,1,tmp,pbmStatP->fptr); + if (tmp2 == tmp) { + ++pbmStatP->current_line; + retval = 1; + } else { + pm_message("error reading line data (%d)", tmp2); + retval = 0; + } + } break; + + default: + pm_message("unknown PBM version"); + retval = 0; + } + } } - } - if(width%8) - *place=acc; - return 1; + return retval; } -/* Reads a single line into data which must be at least (pbm->width+7)/8 - bytes of storage */ -int pbm_readline(pbm_stat* pbm,unsigned char* data) -{ - int tmp,tmp2; - - if(pbm->current_line >= pbm->height) return 0; - - if (pbm->unread) - { - memcpy (data, pbm->revdata, (pbm->width+7)/8); - pbm->current_line++; - pbm->unread = 0; - free (pbm->revdata); - pbm->revdata = NULL; - return 1; - } - switch(pbm->version) - { - case P1: - if(getbytes(pbm->fptr,pbm->width,data)) - { - pbm->current_line++; - return 1; - } - return 0; - - case P4: - tmp=(pbm->width+7)/8; - tmp2=fread(data,1,tmp,pbm->fptr); - if(tmp2 == tmp) - { - pbm->current_line++; - return 1; - } - fprintf(stderr,"pbm_readline(): error reading line data (%d)\n",tmp2); - return 0; - default: - fprintf(stderr,"pbm_readline(): unknown PBM version\n"); - return 0; - } -} +void +pbm_unreadline(pbm_stat * const pbmStatP, + void * const data) { +/*---------------------------------------------------------------------------- + Push a line back into the buffer; we read too much! +-----------------------------------------------------------------------------*/ + /* can store only one line in the unread buffer */ -/* push a line back into the buffer; we read too much! */ -void pbm_unreadline (pbm_stat *pbm, void *data) -{ - /* can only store one line in the unread buffer */ - if (pbm->unread) - return; - - pbm->unread = 1; - pbm->revdata = malloc ((pbm->width+7)/8); - memcpy (pbm->revdata, data, (pbm->width+7)/8); - pbm->current_line--; + if (!pbmStatP->unread) { + pbmStatP->unread = 1; + pbmStatP->revdata = malloc ((pbmStatP->width+7)/8); + memcpy(pbmStatP->revdata, data, (pbmStatP->width+7)/8); + --pbmStatP->current_line; + } } + + -- cgit 1.4.1