diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2008-12-28 19:13:20 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2008-12-28 19:13:20 +0000 |
commit | 86f29c0eb54d03d4a5c8703cf8386ee5cb7a95c5 (patch) | |
tree | 3b30fd23aa36e1c8d7b55bf6663ceeaf5c6b5c8f /converter/other | |
parent | a2f8752d2bd1379f7bbe422027c041925802f029 (diff) | |
download | netpbm-mirror-86f29c0eb54d03d4a5c8703cf8386ee5cb7a95c5.tar.gz netpbm-mirror-86f29c0eb54d03d4a5c8703cf8386ee5cb7a95c5.tar.xz netpbm-mirror-86f29c0eb54d03d4a5c8703cf8386ee5cb7a95c5.zip |
Release 10.45.0 - rebase to current trunk
git-svn-id: http://svn.code.sf.net/p/netpbm/code/advanced@801 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'converter/other')
24 files changed, 454 insertions, 388 deletions
diff --git a/converter/other/Makefile b/converter/other/Makefile index 032bb916..61272ab0 100644 --- a/converter/other/Makefile +++ b/converter/other/Makefile @@ -5,7 +5,7 @@ endif SUBDIR = converter/other VPATH=.:$(SRCDIR)/$(SUBDIR) -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk ifeq ($(shell xml2-config --version),) XML2_LIBS=NONE @@ -134,7 +134,7 @@ SCRIPTS = anytopnm pnmtoplainpnm .PHONY: all all: $(BINARIES) $(SUBDIRS:%=%/all) -include $(SRCDIR)/Makefile.common +include $(SRCDIR)/common.mk ifeq ($(NEED_RUNTIME_PATH),Y) LIBOPTR = -runtime diff --git a/converter/other/cameratopam/Makefile b/converter/other/cameratopam/Makefile index cd38705b..20a95aa2 100644 --- a/converter/other/cameratopam/Makefile +++ b/converter/other/cameratopam/Makefile @@ -13,7 +13,7 @@ ifneq ($(JPEGLIB),NONE) endif endif -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk .PHONY: all @@ -28,7 +28,7 @@ BINARIES = cameratopam MERGEBINARIES = SCRIPTS = -include $(SRCDIR)/Makefile.common +include $(SRCDIR)/common.mk cameratopam: $(OBJECTS) $(NETPBMLIB) $(LIBOPT) $(LD) -o $@ \ diff --git a/converter/other/dithers.h b/converter/other/dithers.h deleted file mode 100644 index 1ced833d..00000000 --- a/converter/other/dithers.h +++ /dev/null @@ -1,91 +0,0 @@ -#ifndef DITHERS_H_INCLUDED -#define DITHERS_H_INCLUDED - -/* -** dithers.h -** -** Here are some dithering matrices. They are all taken from "Digital -** Halftoning" by Robert Ulichney, MIT Press, ISBN 0-262-21009-6. -*/ - - -#if 0 -/* -** Order-6 ordered dithering matrix. Note that smaller ordered dithers -** have no advantage over larger ones, so use dither8 instead. -*/ -static int dither6[8][8] = { - { 1, 59, 15, 55, 2, 56, 12, 52 }, - { 33, 17, 47, 31, 34, 18, 44, 28 }, - { 9, 49, 5, 63, 10, 50, 6, 60 }, - { 41, 25, 37, 21, 42, 26, 38, 22 }, - { 3, 57, 13, 53, 0, 58, 14, 54 }, - { 35, 19, 45, 29, 32, 16, 46, 30 }, - { 11, 51, 7, 61, 8, 48, 4, 62 }, - { 43, 27, 39, 23, 40, 24, 36, 20 } - }; -#endif - -/* Order-8 ordered dithering matrix. */ -static int dither8[16][16] = { - { 1,235, 59,219, 15,231, 55,215, 2,232, 56,216, 12,228, 52,212}, - { 129, 65,187,123,143, 79,183,119,130, 66,184,120,140, 76,180,116}, - { 33,193, 17,251, 47,207, 31,247, 34,194, 18,248, 44,204, 28,244}, - { 161, 97,145, 81,175,111,159, 95,162, 98,146, 82,172,108,156, 92}, - { 9,225, 49,209, 5,239, 63,223, 10,226, 50,210, 6,236, 60,220}, - { 137, 73,177,113,133, 69,191,127,138, 74,178,114,134, 70,188,124}, - { 41,201, 25,241, 37,197, 21,255, 42,202, 26,242, 38,198, 22,252}, - { 169,105,153, 89,165,101,149, 85,170,106,154, 90,166,102,150, 86}, - { 3,233, 57,217, 13,229, 53,213, 0,234, 58,218, 14,230, 54,214}, - { 131, 67,185,121,141, 77,181,117,128, 64,186,122,142, 78,182,118}, - { 35,195, 19,249, 45,205, 29,245, 32,192, 16,250, 46,206, 30,246}, - { 163, 99,147, 83,173,109,157, 93,160, 96,144, 80,174,110,158, 94}, - { 11,227, 51,211, 7,237, 61,221, 8,224, 48,208, 4,238, 62,222}, - { 139, 75,179,115,135, 71,189,125,136, 72,176,112,132, 68,190,126}, - { 43,203, 27,243, 39,199, 23,253, 40,200, 24,240, 36,196, 20,254}, - { 171,107,155, 91,167,103,151, 87,168,104,152, 88,164,100,148, 84} -}; - -/* Order-3 clustered dithering matrix. */ -static int cluster3[6][6] = { - { 9,11,10, 8, 6, 7}, - { 12,17,16, 5, 0, 1}, - { 13,14,15, 4, 3, 2}, - { 8, 6, 7, 9,11,10}, - { 5, 0, 1,12,17,16}, - { 4, 3, 2,13,14,15} -}; - -/* Order-4 clustered dithering matrix. */ -static int cluster4[8][8] = { - { 18,20,19,16,13,11,12,15}, - { 27,28,29,22, 4, 3, 2, 9}, - { 26,31,30,21, 5, 0, 1,10}, - { 23,25,24,17, 8, 6, 7,14}, - { 13,11,12,15,18,20,19,16}, - { 4, 3, 2, 9,27,28,29,22}, - { 5, 0, 1,10,26,31,30,21}, - { 8, 6, 7,14,23,25,24,17} -}; - -/* Order-8 clustered dithering matrix. */ -static int cluster8[16][16] = { - { 64, 69, 77, 87, 86, 76, 68, 67, 63, 58, 50, 40, 41, 51, 59, 60}, - { 70, 94,100,109,108, 99, 93, 75, 57, 33, 27, 18, 19, 28, 34, 52}, - { 78,101,114,116,115,112, 98, 83, 49, 26, 13, 11, 12, 15, 29, 44}, - { 88,110,123,124,125,118,107, 85, 39, 17, 4, 3, 2, 9, 20, 42}, - { 89,111,122,127,126,117,106, 84, 38, 16, 5, 0, 1, 10, 21, 43}, - { 79,102,119,121,120,113, 97, 82, 48, 25, 8, 6, 7, 14, 30, 45}, - { 71, 95,103,104,105, 96, 92, 74, 56, 32, 24, 23, 22, 31, 35, 53}, - { 65, 72, 80, 90, 91, 81, 73, 66, 62, 55, 47, 37, 36, 46, 54, 61}, - { 63, 58, 50, 40, 41, 51, 59, 60, 64, 69, 77, 87, 86, 76, 68, 67}, - { 57, 33, 27, 18, 19, 28, 34, 52, 70, 94,100,109,108, 99, 93, 75}, - { 49, 26, 13, 11, 12, 15, 29, 44, 78,101,114,116,115,112, 98, 83}, - { 39, 17, 4, 3, 2, 9, 20, 42, 88,110,123,124,125,118,107, 85}, - { 38, 16, 5, 0, 1, 10, 21, 43, 89,111,122,127,126,117,106, 84}, - { 48, 25, 8, 6, 7, 14, 30, 45, 79,102,119,121,120,113, 97, 82}, - { 56, 32, 24, 23, 22, 31, 35, 53, 71, 95,103,104,105, 96, 92, 74}, - { 62, 55, 47, 37, 36, 46, 54, 61, 65, 72, 80, 90, 91, 81, 73, 66} -}; - -#endif diff --git a/converter/other/fiasco/Makefile b/converter/other/fiasco/Makefile index 26b1b4b8..16221d77 100644 --- a/converter/other/fiasco/Makefile +++ b/converter/other/fiasco/Makefile @@ -5,7 +5,7 @@ endif SUBDIR = converter/other/fiasco VPATH=.:$(SRCDIR)/$(SUBDIR) -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk COMP_INCLUDES = \ -I$(SRCDIR)/$(SUBDIR)/codec -I$(SRCDIR)/$(SUBDIR)/input \ @@ -32,7 +32,7 @@ MERGE_OBJECTS = $(BINARIES:%=%.o2) $(COMMON_OBJECTS) $(FIASCOLIBS) SUBDIRS = codec input output lib -include $(SRCDIR)/Makefile.common +include $(SRCDIR)/common.mk $(BINARIES):%:%.o $(COMMON_OBJECTS) $(FIASCOLIBS) $(NETPBMLIB) \ $(LIBOPT) diff --git a/converter/other/fiasco/codec/Makefile b/converter/other/fiasco/codec/Makefile index c5f94c28..e3b2a112 100644 --- a/converter/other/fiasco/codec/Makefile +++ b/converter/other/fiasco/codec/Makefile @@ -6,7 +6,7 @@ FIASCOSUBDIR = converter/other/fiasco SUBDIR = $(FIASCOSUBDIR)/codec VPATH=.:$(SRCDIR)/$(SUBDIR) -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk COMP_INCLUDES = -I$(SRCDIR)/$(FIASCOSUBDIR) -I$(SRCDIR)/$(FIASCOSUBDIR)/lib \ -I$(SRCDIR)/$(FIASCOSUBDIR)/input -I$(SRCDIR)/$(FIASCOSUBDIR)/output @@ -19,7 +19,7 @@ MERGE_OBJECTS = $(OBJECTS) all: libfiasco_codec.a -include $(SRCDIR)/Makefile.common +include $(SRCDIR)/common.mk libfiasco_codec.a: $(OBJECTS) $(AR) -rc $@ $(OBJECTS) diff --git a/converter/other/fiasco/input/Makefile b/converter/other/fiasco/input/Makefile index 6cd8e34b..2f8749f6 100644 --- a/converter/other/fiasco/input/Makefile +++ b/converter/other/fiasco/input/Makefile @@ -7,7 +7,7 @@ SUBDIR = $(FIASCOSUBDIR)/input BUILDDIR = ../../../.. VPATH=.:$(SRCDIR)/$(SUBDIR) -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk OBJECTS = basis.o matrices.o mc.o nd.o read.o tree.o weights.o @@ -18,7 +18,7 @@ COMP_INCLUDES = -I$(SRCDIR)/$(FIASCOSUBDIR) -I$(SRCDIR)/$(FIASCOSUBDIR)/lib \ all: libfiasco_input.a -include $(SRCDIR)/Makefile.common +include $(SRCDIR)/common.mk libfiasco_input.a: $(OBJECTS) $(AR) -rc $@ $(OBJECTS) diff --git a/converter/other/fiasco/lib/Makefile b/converter/other/fiasco/lib/Makefile index bd129016..801fd24e 100644 --- a/converter/other/fiasco/lib/Makefile +++ b/converter/other/fiasco/lib/Makefile @@ -6,7 +6,7 @@ FIASCOSUBDIR = converter/other/fiasco SUBDIR = $(FIASCOSUBDIR)/lib VPATH=.:$(SRCDIR)/$(SUBDIR) -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk OBJECTS = \ arith.o \ @@ -25,7 +25,7 @@ COMP_INCLUDES = -I$(SRCDIR)/$(FIASCOSUBDIR) all: libfiasco_lib.a -include $(SRCDIR)/Makefile.common +include $(SRCDIR)/common.mk libfiasco_lib.a: $(OBJECTS) $(AR) -rc $@ $(OBJECTS) diff --git a/converter/other/fiasco/output/Makefile b/converter/other/fiasco/output/Makefile index fc1d4155..26b6d924 100644 --- a/converter/other/fiasco/output/Makefile +++ b/converter/other/fiasco/output/Makefile @@ -6,7 +6,7 @@ FIASCOSUBDIR = converter/other/fiasco SUBDIR = $(FIASCOSUBDIR)/output VPATH=.:$(SRCDIR)/$(SUBDIR) -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk OBJECTS = matrices.o mc.o nd.o tree.o weights.o write.o @@ -19,7 +19,7 @@ COMP_INCLUDES = \ all: libfiasco_output.a -include $(SRCDIR)/Makefile.common +include $(SRCDIR)/common.mk libfiasco_output.a: $(OBJECTS) $(AR) -rc $@ $(OBJECTS) diff --git a/converter/other/fitstopnm.c b/converter/other/fitstopnm.c index 86bdfbb8..9df47be3 100644 --- a/converter/other/fitstopnm.c +++ b/converter/other/fitstopnm.c @@ -30,6 +30,12 @@ ** disabled min max scanning when reading from stdin. */ +/* + The official specification of FITS format (which is for more than + just visual images) is at + ftp://legacy.gsfc.nasa.gov/fits_info/fits_office/fits_standard.pdf +*/ + #include <string.h> #include <float.h> @@ -507,6 +513,13 @@ convertPgmRaster(FILE * const ifP, double const datamin, xel ** const xels) { + /* Note: the FITS specification does not give the association between + file position and image position (i.e. is the first pixel in the + file the top left, bottom left, etc.). We use the common sense, + popular order of row major, top to bottom, left to right. This + has been the case and accepted since 1989, but in 2008, we discovered + that Gimp and ImageMagick do bottom to top. + */ unsigned int image; pm_message("writing PGM file"); diff --git a/converter/other/jbig/Makefile b/converter/other/jbig/Makefile index 3b87d1cc..b5f4e14a 100644 --- a/converter/other/jbig/Makefile +++ b/converter/other/jbig/Makefile @@ -5,7 +5,7 @@ endif SUBDIR = converter/other/jbig VPATH=.:$(SRCDIR)/$(SUBDIR) -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk LIBJBIG_OBJECTS = jbig.o jbig_tab.o @@ -33,7 +33,7 @@ MERGE_OBJECTS = $(BINARIES:%=%.o2) $(LIBJBIG_OBJECTS) all: $(BINARIES) -include $(SRCDIR)/Makefile.common +include $(SRCDIR)/common.mk $(BINARIES): %: %.o $(JBIGLIB_DEP) $(NETPBMLIB) $(LIBOPT) $(LD) -o $@ $< \ diff --git a/converter/other/jpeg2000/Makefile b/converter/other/jpeg2000/Makefile index af8be82c..f4fee87f 100644 --- a/converter/other/jpeg2000/Makefile +++ b/converter/other/jpeg2000/Makefile @@ -7,7 +7,7 @@ VPATH=.:$(SRCDIR)/$(SUBDIR) SUBDIRS = libjasper -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk EXTERN_INCLUDES = ifneq ($(JASPERHDR_DIR),NONE) @@ -55,7 +55,7 @@ MERGEBINARIES = $(BINARIES) .PHONY: all all: $(BINARIES) -include $(SRCDIR)/Makefile.common +include $(SRCDIR)/common.mk LIBOPTS = $(shell $(LIBOPT) $(NETPBMLIB) $(JASPERLIB_USE)) diff --git a/converter/other/jpeg2000/libjasper/Makefile b/converter/other/jpeg2000/libjasper/Makefile index ad4fbd8f..34d1860a 100644 --- a/converter/other/jpeg2000/libjasper/Makefile +++ b/converter/other/jpeg2000/libjasper/Makefile @@ -5,7 +5,7 @@ endif SUBDIR = converter/other/jpeg2000/libjasper VPATH=.:$(SRCDIR)/$(SUBDIR) -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk SUBDIRS = base jp2 jpc LIB_OBJECTS = @@ -17,7 +17,7 @@ JASPERSRCDIR = $(SRCDIR)/$(SUBDIR) all: libjasper.a -include $(SRCDIR)/$(SUBDIR)/Makefile.common +include $(SRCDIR)/$(SUBDIR)/common.mk # We cheat a bit here -- the real dependencies are all the .o files listed # in the part list, but since we don't know what those are, we just do a diff --git a/converter/other/jpeg2000/libjasper/base/Makefile b/converter/other/jpeg2000/libjasper/base/Makefile index 0ee65b5e..ad84f043 100644 --- a/converter/other/jpeg2000/libjasper/base/Makefile +++ b/converter/other/jpeg2000/libjasper/base/Makefile @@ -7,7 +7,7 @@ VPATH=.:$(SRCDIR)/$(SUBDIR) JASPERSRCDIR=$(SRCDIR)/$(SUBDIR)/.. -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk LIB_OBJECTS = jas_debug.o jas_getopt.o jas_image.o jas_init.o \ jas_malloc.o jas_seq.o jas_stream.o jas_string.o \ @@ -17,5 +17,5 @@ MERGE_OBJECTS = all: partlist $(LIB_OBJECTS) -include $(JASPERSRCDIR)/Makefile.common +include $(JASPERSRCDIR)/common.mk diff --git a/converter/other/jpeg2000/libjasper/Makefile.common b/converter/other/jpeg2000/libjasper/common.mk index af82401a..687a9f3f 100644 --- a/converter/other/jpeg2000/libjasper/Makefile.common +++ b/converter/other/jpeg2000/libjasper/common.mk @@ -1,4 +1,3 @@ -# -*-makefile-*- <-- an Emacs control # This is common rules for the libjasper subdirectories. # # Set the following variables before including this: @@ -19,7 +18,7 @@ $(SUBDIRS:%=%/partlist): %/partlist: $(CURDIR)/% $(MAKE) -C $(dir $@) -f $(SRCDIR)/$(SUBDIR)/$(dir $@)Makefile \ SRCDIR=$(SRCDIR) BUILDDIR=$(BUILDDIR) $(notdir $@) -include $(SRCDIR)/Makefile.common +include $(SRCDIR)/common.mk INCLUDES = -I$(JASPERSRCDIR)/include -Iimportinc diff --git a/converter/other/jpeg2000/libjasper/jp2/Makefile b/converter/other/jpeg2000/libjasper/jp2/Makefile index 254b7f56..65838cc2 100644 --- a/converter/other/jpeg2000/libjasper/jp2/Makefile +++ b/converter/other/jpeg2000/libjasper/jp2/Makefile @@ -7,7 +7,7 @@ VPATH=.:$(SRCDIR)/$(SUBDIR) JASPERSRCDIR=$(SRCDIR)/$(SUBDIR)/.. -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk LIB_OBJECTS = jp2_cod.o jp2_dec.o jp2_enc.o @@ -15,5 +15,5 @@ MERGE_OBJECTS = all: partlist $(LIB_OBJECTS) -include $(JASPERSRCDIR)/Makefile.common +include $(JASPERSRCDIR)/common.mk diff --git a/converter/other/jpeg2000/libjasper/jpc/Makefile b/converter/other/jpeg2000/libjasper/jpc/Makefile index e176bd48..ffc4c64f 100644 --- a/converter/other/jpeg2000/libjasper/jpc/Makefile +++ b/converter/other/jpeg2000/libjasper/jpc/Makefile @@ -7,7 +7,7 @@ VPATH=.:$(SRCDIR)/$(SUBDIR) JASPERSRCDIR=$(SRCDIR)/$(SUBDIR)/.. -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk LIB_OBJECTS = jpc_bs.o jpc_cs.o jpc_dec.o jpc_enc.o \ jpc_math.o jpc_mct.o jpc_mqcod.o jpc_mqdec.o jpc_mqenc.o \ @@ -18,5 +18,5 @@ MERGE_OBJECTS = all: partlist $(LIB_OBJECTS) -include $(JASPERSRCDIR)/Makefile.common +include $(JASPERSRCDIR)/common.mk diff --git a/converter/other/pamtofits.c b/converter/other/pamtofits.c index 04b43c35..7a71ff56 100644 --- a/converter/other/pamtofits.c +++ b/converter/other/pamtofits.c @@ -20,6 +20,12 @@ ** in the FITS header, but do not cause the data to be rescaled. */ +/* + The official specification of FITS format (which is for more than + just visual images) is at + ftp://legacy.gsfc.nasa.gov/fits_info/fits_office/fits_standard.pdf +*/ + #include <assert.h> #include <string.h> #include <stdio.h> @@ -201,6 +207,14 @@ writeRaster(struct pam * const pamP, unsigned int const bitpix, int const offset) { + /* Note: the FITS specification does not give the association between + file position and image position (i.e. is the first pixel in the + file the top left, bottom left, etc.). We use the common sense, + popular order of row major, top to bottom, left to right. This + has been the case and accepted since 1989, but in 2008, we discovered + that Gimp and ImageMagick do bottom to top. + */ + unsigned int plane; for (plane = 0; plane < pamP->depth; ++plane) { diff --git a/converter/other/pamtosvg/Makefile b/converter/other/pamtosvg/Makefile index ba03fd68..8b033020 100644 --- a/converter/other/pamtosvg/Makefile +++ b/converter/other/pamtosvg/Makefile @@ -5,7 +5,7 @@ endif SUBDIR = converter/other/pamtosvg VPATH=.:$(SRCDIR)/$(SUBDIR) -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk BINARIES = pamtosvg @@ -47,7 +47,7 @@ MERGEBINARIES = $(BINARIES) all: $(BINARIES) -include $(SRCDIR)/Makefile.common +include $(SRCDIR)/common.mk pamtosvg: $(PAMTOSVG_OBJECTS) $(NETPBMLIB) $(LIBOPT) $(LD) -o $@ $(PAMTOSVG_OBJECTS) \ diff --git a/converter/other/pgmtopbm.c b/converter/other/pgmtopbm.c index 36b39017..34cc2c91 100644 --- a/converter/other/pgmtopbm.c +++ b/converter/other/pgmtopbm.c @@ -347,6 +347,10 @@ struct converter { +/*============================================================================= + Converter: fs +=============================================================================*/ + unsigned int const fs_scale = 1024; unsigned int const half_fs_scale = 512; @@ -469,6 +473,10 @@ createFsConverter(unsigned int const cols, +/*============================================================================= + Converter: thresh +=============================================================================*/ + struct threshState { gray threshval; }; @@ -522,16 +530,28 @@ createThreshConverter(unsigned int const cols, +/*============================================================================= + Converter: dither8 +=============================================================================*/ + +struct dither8State { + int dither8[16][16]; +}; + + + static void dither8ConvertRow(struct converter * const converterP, unsigned int const row, gray grayrow[], bit bitrow[]) { + struct dither8State * const stateP = converterP->stateP; + unsigned int col; for (col = 0; col < converterP->cols; ++col) - if (grayrow[col] > dither8[row % 16][col % 16]) + if (grayrow[col] > stateP->dither8[row % 16][col % 16]) bitrow[col] = PBM_WHITE; else bitrow[col] = PBM_BLACK; @@ -539,29 +559,47 @@ dither8ConvertRow(struct converter * const converterP, +static void +dither8Destroy(struct converter * const converterP) { + + struct dither8State * const stateP = converterP->stateP; + + free(stateP); +} + + + static struct converter createDither8Converter(unsigned int const cols, gray const maxval) { struct converter converter; + struct dither8State * stateP; unsigned int row; + MALLOCVAR_NOFAIL(stateP); + converter.cols = cols; converter.convertRow = &dither8ConvertRow; - converter.destroy = NULL; + converter.destroy = dither8Destroy; + converter.stateP = stateP; /* Scale dither matrix. */ for (row = 0; row < 16; ++row) { unsigned int col; for (col = 0; col < 16; ++col) - dither8[row][col] = dither8[row][col] * maxval / 256; + stateP->dither8[row][col] = dither8[row][col] * maxval / 256; } return converter; } +/*============================================================================= + Converter: cluster +=============================================================================*/ + struct clusterState { unsigned int radius; int ** clusterMatrix; diff --git a/converter/other/pnmtoddif.c b/converter/other/pnmtoddif.c index b80fba4f..ae8c8524 100644 --- a/converter/other/pnmtoddif.c +++ b/converter/other/pnmtoddif.c @@ -1,14 +1,4 @@ /* - * $Log: pnmtoddif.c,v $ - * Revision 1.6 1993/01/25 08:14:06 neideck - * Placed into public use form. - * - * Revision 1.5 1992/12/02 08:15:18 neideck - * Added RCS id. - * - */ - -/* * Author: Burkhard Neidecker-Lutz * Digital CEC Karlsruhe * neideck@nestvx.enet.dec.com @@ -31,6 +21,8 @@ */ #include <string.h> + +#include "mallocvar.h" #include "pnm.h" /* The structure we use to convey all sorts of "magic" data to the DDIF */ @@ -414,21 +406,181 @@ write_trailer(FILE * file) -int main(int argc, char *argv[]) -{ + +static void +convertPbmRaster(FILE * const ifP, + int const format, + unsigned int const cols, + unsigned int const rows, + FILE * const ofP, + unsigned int const bytesPerLine, + unsigned char * const data) { + + bit * const pixels = pbm_allocrow(cols); + + unsigned int row; + + for (row = 0; row < rows; ++row) { + unsigned int col; + unsigned int k; + unsigned int mask; + unsigned char * p; + size_t bytesWritten; + + pbm_readpbmrow(ifP, pixels, cols, format); + + mask = 0x00; + p = &data[0]; + for (col = 0, k = 0; col < cols; ++col) { + if (pixels[col] == PBM_BLACK) + mask |= 1 << k; + if (k == 7) { + *p++ = mask; + mask = 0x00; + k = 0; + } else + ++k; + } + if (k != 7) + /* Flush the rest of the column */ + *p = mask; + + bytesWritten = fwrite(data, 1, bytesPerLine, ofP); + if (bytesWritten != bytesPerLine) + pm_error("File write error on Row %u", row); + } + + pbm_freerow(pixels); +} + + + +static void +convertPgmRaster(FILE * const ifP, + int const format, + xelval const maxval, + unsigned int const cols, + unsigned int const rows, + FILE * const ofP, + unsigned int const bytesPerLine, + unsigned char * const data) { + + gray * const pixels = pgm_allocrow(cols); + + unsigned int row; + + for (row = 0; row < rows; ++row) { + unsigned char * p; + unsigned int col; + size_t bytesWritten; + + p = &data[0]; + + pgm_readpgmrow(ifP, pixels, cols, maxval, format); + + for (col = 0; col < cols; ++col) + *p++ = (unsigned char) pixels[col]; + + bytesWritten = fwrite(data, 1, bytesPerLine, ofP); + if (bytesWritten != bytesPerLine) + pm_error("File write error on Row %u", row); + } + pgm_freerow(pixels); +} + + + + +static void +convertPpmRaster(FILE * const ifP, + int const format, + xelval const maxval, + unsigned int const cols, + unsigned int const rows, + FILE * const ofP, + unsigned int const bytesPerLine, + unsigned char * const data) { + + pixel * const pixels = ppm_allocrow(cols); + + unsigned int row; + + for (row = 0; row < rows; ++row) { + unsigned char * p; + unsigned int col; + size_t bytesWritten; + + p = &data[0]; + + ppm_readppmrow(ifP, pixels, cols, maxval, format); + + for (col = 0; col < cols; ++col) { + *p++ = PPM_GETR(pixels[col]); + *p++ = PPM_GETG(pixels[col]); + *p++ = PPM_GETB(pixels[col]); + } + bytesWritten = fwrite(data, 1, bytesPerLine, ofP); + if (bytesWritten != bytesPerLine) + pm_error("File write error on Row %u", row); + } + ppm_freerow(pixels); +} + + + +static void +convertRaster(FILE * const ifP, + int const format, + xelval const maxval, + unsigned int const cols, + unsigned int const rows, + FILE * const ofP, + unsigned int const bytesPerLine) { + + unsigned char * data; + unsigned char * p; + + MALLOCARRAY(data, bytesPerLine); + + if (data == NULL) + pm_error("Couldn't allocate %u-byte line buffer", bytesPerLine); + + p = data; /* initial value */ + + switch (PNM_FORMAT_TYPE(format)) { + case PBM_TYPE: + convertPbmRaster(ifP, format, cols, rows, ofP, bytesPerLine, data); + break; + case PGM_TYPE: + convertPgmRaster(ifP, format, maxval, cols, rows, ofP, bytesPerLine, + data); + break; + case PPM_TYPE: + convertPpmRaster(ifP, format, maxval, cols, rows, ofP, bytesPerLine, + data); + break; + default: + pm_error("INTERNAL ERROR: impossible format value"); + } + + free(data); +} + + + +int +main(int argc, char *argv[]) { FILE *ifd; - FILE *ofd; + FILE *ofd; int rows, cols; xelval maxval; int format; const char * const usage = "[-resolution x y] [pnmfile [ddiffile]]"; - int i, j; char *outfile; int argn; int hor_resolution = 75; int ver_resolution = 75; imageparams ip; - unsigned char *data, *p; pnm_init(&argc, argv); @@ -512,90 +664,10 @@ int main(int argc, char *argv[]) exit(1); } - if (!(p = data = (unsigned char*) malloc(ip.bytes_per_line))) { - perror("allocating line buffer"); - exit(1); - } - - switch (PNM_FORMAT_TYPE(format)) { - case PBM_TYPE: - { - bit *pixels; - int mask; - int k; - - pixels = pbm_allocrow(cols); - - for (i = 0; i < rows; i++) { - pbm_readpbmrow(ifd, pixels, cols, format); - mask = 0; - p = data; - for (j = 0, k = 0; j < cols; j++) { - if (pixels[j] == PBM_BLACK) { - mask |= 1 << k; - } - if (k == 7) { - *p++ = mask; - mask = 0; - k = 0; - } else { - k++; - } - } - if (k != 7) { /* Flush the rest of the column */ - *p = mask; - } - if (fwrite(data,1,ip.bytes_per_line,ofd) != ip.bytes_per_line) { - perror("Writing image data\n"); - exit(1); - } - } - } - break; - case PGM_TYPE: - { - gray *pixels = pgm_allocrow(cols); - - for (i = 0; i < rows; i++) { - p = data; - pgm_readpgmrow(ifd, pixels, cols, maxval, format); - for (j = 0; j < cols; j++) { - *p++ = (unsigned char) pixels[j]; - } - if (fwrite(data,1,ip.bytes_per_line,ofd) != ip.bytes_per_line) { - perror("Writing image data\n"); - exit(1); - } - } - pgm_freerow(pixels); - } - break; - case PPM_TYPE: - { - pixel *pixels = ppm_allocrow(cols); - - for (i = 0; i < rows; i++) { - p = data; - ppm_readppmrow(ifd, pixels, cols, maxval, format); - for (j = 0; j < cols; j++) { - *p++ = PPM_GETR(pixels[j]); - *p++ = PPM_GETG(pixels[j]); - *p++ = PPM_GETB(pixels[j]); - } - if (fwrite(data,1,ip.bytes_per_line,ofd) != ip.bytes_per_line) { - perror("Writing image data\n"); - exit(1); - } - } - ppm_freerow(pixels); - } - break; - } + convertRaster(ifd, format, maxval, cols, rows, ofd, ip.bytes_per_line); pm_close(ifd); - free(data); - if (!write_trailer(ofd)) { perror("Writing trailer"); exit(1); diff --git a/converter/other/pnmtojpeg.c b/converter/other/pnmtojpeg.c index eb57bcc5..3110542d 100644 --- a/converter/other/pnmtojpeg.c +++ b/converter/other/pnmtojpeg.c @@ -435,49 +435,56 @@ text_getc (FILE * file) static boolean -read_text_integer (FILE * file, long * result, int * termchar) -/* Read an unsigned decimal integer from a file, store it in result */ -/* Reads one trailing character after the integer; returns it in termchar */ -{ - register int ch; - register long val; +readTextInteger(FILE * const fileP, + long * const resultP, + int * const termcharP) { +/*---------------------------------------------------------------------------- + Read the next unsigned decimal integer from file 'fileP', skipping + white space as necessary. Return it as *resultP. + + Also read one character after the integer and return it as *termcharP. + + If there is no character after the integer, return *termcharP == EOF. + + Iff the next thing in the file is not a valid unsigned decimal integer, + return FALSE. +-----------------------------------------------------------------------------*/ + int ch; + boolean retval; /* Skip any leading whitespace, detect EOF */ do { - ch = text_getc(file); - if (ch == EOF) { - *termchar = ch; - return FALSE; - } + ch = text_getc(fileP); } while (isspace(ch)); - if (! isdigit(ch)) { - *termchar = ch; - return FALSE; - } - - val = ch - '0'; - while ((ch = text_getc(file)) != EOF) { - if (! isdigit(ch)) - break; - val *= 10; - val += ch - '0'; + if (!isdigit(ch)) + retval = FALSE; + else { + long val; + val = ch - '0'; /* initial value */ + while ((ch = text_getc(fileP)) != EOF) { + if (! isdigit(ch)) + break; + val *= 10; + val += ch - '0'; + } + *resultP = val; + retval = TRUE; } - *result = val; - *termchar = ch; - return TRUE; + *termcharP = ch; + return retval; } static boolean read_scan_integer (FILE * file, long * result, int * termchar) -/* Variant of read_text_integer that always looks for a non-space termchar; +/* Variant of readTextInteger that always looks for a non-space termchar; * this simplifies parsing of punctuation in scan scripts. */ { register int ch; - if (! read_text_integer(file, result, termchar)) + if (! readTextInteger(file, result, termchar)) return FALSE; ch = *termchar; while (ch != EOF && isspace(ch)) @@ -625,45 +632,59 @@ read_quant_tables (j_compress_ptr cinfo, char * filename, */ { FILE * fp; - int tblno, i, termchar; - long val; - unsigned int table[DCTSIZE2]; + boolean retval; - if ((fp = fopen(filename, "rb")) == NULL) { + fp = fopen(filename, "rb"); + if (fp == NULL) { pm_message("Can't open table file %s", filename); - return FALSE; - } - tblno = 0; - - while (read_text_integer(fp, &val, &termchar)) { - /* read 1st element of table */ - if (tblno >= NUM_QUANT_TBLS) { - pm_message("Too many tables in file %s", filename); - fclose(fp); - return FALSE; - } - table[0] = (unsigned int) val; - for (i = 1; i < DCTSIZE2; i++) { - if (! read_text_integer(fp, &val, &termchar)) { - pm_message("Invalid table data in file %s", filename); - fclose(fp); - return FALSE; + retval = FALSE; + } else { + boolean eof, error; + unsigned int tblno; + + for (tblno = 0, eof = FALSE, error = FALSE; !eof && !error; ++tblno) { + long val; + int termchar; + boolean gotOne; + + gotOne = readTextInteger(fp, &val, &termchar); + if (gotOne) { + /* read 1st element of table */ + if (tblno >= NUM_QUANT_TBLS) { + pm_message("Too many tables in file %s", filename); + error = TRUE; + } else { + unsigned int table[DCTSIZE2]; + unsigned int i; + + table[0] = (unsigned int) val; + for (i = 1; i < DCTSIZE2 && !error; ++i) { + if (! readTextInteger(fp, &val, &termchar)) { + pm_message("Invalid table data in file %s", + filename); + error = TRUE; + } else + table[i] = (unsigned int) val; + } + if (!error) + jpeg_add_quant_table( + cinfo, tblno, table, scale_factor, force_baseline); + } + } else { + if (termchar == EOF) + eof = TRUE; + else { + pm_message("Non-numeric data in file %s", filename); + error = TRUE; + } } - table[i] = (unsigned int) val; } - jpeg_add_quant_table(cinfo, tblno, table, scale_factor, - force_baseline); - tblno++; - } - if (termchar != EOF) { - pm_message("Non-numeric data in file %s", filename); fclose(fp); - return FALSE; + retval = !error; } - - fclose(fp); - return TRUE; + + return retval; } @@ -1082,7 +1103,7 @@ main(int argc, /* Close files, if we opened them */ if (input_file != stdin) - fclose(input_file); + pm_close(input_file); /* Program may have exited with non-zero completion code via various function calls above. diff --git a/converter/other/pnmtopalm/Makefile b/converter/other/pnmtopalm/Makefile index ebfa3573..7f99f95a 100644 --- a/converter/other/pnmtopalm/Makefile +++ b/converter/other/pnmtopalm/Makefile @@ -5,7 +5,7 @@ endif SUBDIR = converter/other/pnmtopalm VPATH=.:$(SRCDIR)/$(SUBDIR) -include $(BUILDDIR)/Makefile.config +include $(BUILDDIR)/config.mk BINARIES = palmtopnm pnmtopalm SCRIPTS = @@ -16,7 +16,7 @@ DATAFILES = palmcolor8.map palmgray1.map palmgray2.map palmgray4.map all: $(BINARIES) -include $(SRCDIR)/Makefile.common +include $(SRCDIR)/common.mk LIBOPTS = $(shell $(LIBOPT) $(NETPBMLIB)) diff --git a/converter/other/pnmtorle.c b/converter/other/pnmtorle.c index 8c6dc589..180b144f 100644 --- a/converter/other/pnmtorle.c +++ b/converter/other/pnmtorle.c @@ -59,8 +59,8 @@ static gray maxval; * Read the pnm image file header. */ static void -read_pnm_header() -{ +read_pnm_header(void) { + pnm_readpnminit(fp, &width, &height, &maxval, &format); switch (format) { case PBM_FORMAT: @@ -87,12 +87,12 @@ read_pnm_header() if (do_alpha) VPRINTF(stderr, "Computing alpha channel...\n"); } -/*----------------------------------------------------------------------------- - * Write the rle image file header. - */ + + + static void -write_rle_header() -{ +write_rle_header(void) { + hdr.xmin = 0; hdr.xmax = width-1; hdr.ymin = 0; @@ -120,102 +120,107 @@ write_rle_header() } rle_put_setup(&hdr); } -/*----------------------------------------------------------------------------- - * Write the rle data portion of the file. - */ + + + static void -write_rle_data() -{ - register int x; - register int scan; - register xel *xelrow, *pP; - rle_pixel ***scanlines, **scanline; -/* - * Allocate some memory. - */ - /*xelrow = pnm_allowcrow(width);*/ - xelrow = (xel*) pm_allocrow( width, sizeof(xel) ); +write_rle_data(void) { + + unsigned int scan; + xel * xelrow; + rle_pixel *** scanlines; + + MALLOCARRAY(xelrow, width); MALLOCARRAY(scanlines, height); - RLE_CHECK_ALLOC( hdr.cmd, scanlines, "scanline pointers" ); - for ( scan = 0; scan < height; scan++ ) - RLE_CHECK_ALLOC( hdr.cmd, (rle_row_alloc(&hdr, &scanlines[scan]) >= 0), - "pixel memory" ); -/* - * Loop through the pnm files image window, read data and flip vertically. - */ + RLE_CHECK_ALLOC(hdr.cmd, scanlines, "scanline pointers"); + + for (scan = 0; scan < height; ++scan) { + int rc; + rc = rle_row_alloc(&hdr, &scanlines[scan]); + RLE_CHECK_ALLOC(hdr.cmd, rc >= 0, "pixel memory"); + } + /* Loop through the pnm files image window, read data and flip vertically. + */ switch (format) { case PBM_FORMAT: - case RPBM_FORMAT: - for (scan = 0; scan < height; scan++) { - scanline = scanlines[height - scan - 1]; + case RPBM_FORMAT: { + unsigned int scan; + for (scan = 0; scan < height; ++scan) { + rle_pixel ** const scanline = scanlines[height - scan - 1]; + unsigned int col; pnm_readpnmrow(fp, xelrow, width, maxval, format); - for (x = 0, pP = xelrow; x < width; x++, pP++) { - scanline[RLE_RED][x] = (PNM_GET1(*pP) ? 255 : 0); - if (do_alpha) { - scanline[RLE_ALPHA][x] = scanline[RLE_RED][x]; - } + for (col = 0; col < width; ++col) { + scanline[RLE_RED][col] = PNM_GET1(xelrow[col]) ? 255 : 0; + if (do_alpha) + scanline[RLE_ALPHA][col] = scanline[RLE_RED][col]; } } - break; + } break; case PGM_FORMAT: - case RPGM_FORMAT: - for (scan = 0; scan < height; scan++) { - scanline = scanlines[height - scan - 1]; + case RPGM_FORMAT: { + unsigned int scan; + for (scan = 0; scan < height; ++scan) { + rle_pixel ** const scanline = scanlines[height - scan - 1]; + unsigned int col; pnm_readpnmrow(fp, xelrow, width, maxval, format); - for (x = 0, pP = xelrow; x < width; x++, pP++) { - scanline[RLE_RED][x] = PNM_GET1(*pP); - if (do_alpha) { - scanline[RLE_ALPHA][x] = (scanline[RLE_RED][x] ? 255 : 0); - } + for (col = 0; col < width; ++col) { + scanline[RLE_RED][col] = PNM_GET1(xelrow[col]); + if (do_alpha) + scanline[RLE_ALPHA][col] = + scanline[RLE_RED][col] ? 255 : 0; } } - break; + } break; case PPM_FORMAT: - case RPPM_FORMAT: + case RPPM_FORMAT: { + unsigned int scan; for (scan = 0; scan < height; scan++) { - scanline = scanlines[height - scan - 1]; + rle_pixel ** const scanline = scanlines[height - scan - 1]; + unsigned int col; pnm_readpnmrow(fp, xelrow, width, maxval, format); - for (x = 0, pP = xelrow; x < width; x++, pP++) { - scanline[RLE_RED][x] = PPM_GETR(*pP); - scanline[RLE_GREEN][x] = PPM_GETG(*pP); - scanline[RLE_BLUE][x] = PPM_GETB(*pP); - if (do_alpha) { - scanline[RLE_ALPHA][x] = (scanline[RLE_RED][x] || - scanline[RLE_GREEN][x] || - scanline[RLE_BLUE][x] ? 255 : 0); - } + for (col = 0; col < width; ++col) { + scanline[RLE_RED][col] = PPM_GETR(xelrow[col]); + scanline[RLE_GREEN][col] = PPM_GETG(xelrow[col]); + scanline[RLE_BLUE][col] = PPM_GETB(xelrow[col]); + if (do_alpha) + scanline[RLE_ALPHA][col] = + (scanline[RLE_RED][col] || + scanline[RLE_GREEN][col] || + scanline[RLE_BLUE][col] ? 255 : 0); } } - break; + } break; } -/* - * Write out data in URT order (bottom to top). - */ - for ( scan = 0; scan < height; scan++ ) { + /* Write out data in URT order (bottom to top). */ + for (scan = 0; scan < height; ++scan) rle_putrow(scanlines[scan], width, &hdr); - rle_row_free( &hdr, scanlines[scan] ); - } - free( scanlines ); + + for (scan = 0; scan < height; ++scan) + rle_row_free(&hdr, scanlines[scan]); + free(scanlines); + free(xelrow); VPRINTF(stderr, "Done -- write eof to RLE data.\n"); rle_puteof(&hdr); } + + int -main(argc, argv) - int argc; - char **argv; -{ - char *pnmname = NULL, *outname = NULL; - static char filename[BUFSIZ]; - int oflag, c; +main(int argc, char ** argv) { + + const char * pnmname; + const char * outname; + static char filename[BUFSIZ]; + int oflag; pnm_init(&argc, argv); -/* - * Get those options. - */ + pnmname = NULL; /* initial value */ + outname = NULL; /* initial value */ + + /* Get those options. */ if (!scanargs(argc,argv, "% v%- h%- a%- o%-outfile!s pnmfile%s\n(\ \tConvert a PNM file to URT RLE format.\n\ @@ -229,39 +234,34 @@ main(argc, argv) &pnmname)) exit(-1); - hdr = *rle_hdr_init( (rle_hdr *)NULL ); - rle_names( &hdr, cmd_name( argv ), outname, 0 ); -/* - * Open the file. - */ + hdr = *rle_hdr_init(NULL); + rle_names(&hdr, cmd_name(argv), outname, 0); + + /* Open the file. */ if (pnmname == NULL) { strcpy(filename, "stdin"); - fp = stdin; - } - else { + fp = pm_openr("-"); + } else { strcpy(filename, pnmname); fp = pm_openr(filename); } hdr.rle_file = rle_open_f( hdr.cmd, outname, "wb" ); - while ( (c = getc( fp )) != EOF ) { - ungetc( c, fp ); -/* - * Read the PPM file header. - */ + + if (header) read_pnm_header(); - if (header) - break; -/* - * Write the rle file header. - */ - rle_addhist(argv, (rle_hdr *)NULL, &hdr); - write_rle_header(); -/* - * Write the rle file data. - */ - write_rle_data(); + else { + int eof; + for (eof = 0; !eof; ) { + read_pnm_header(); + rle_addhist(argv, NULL, &hdr); + write_rle_header(); + write_rle_data(); + + pnm_nextimage(fp, &eof); + } } - fclose(fp); + pm_close(fp); + return 0; } diff --git a/converter/other/svgtopam.c b/converter/other/svgtopam.c index 56825a4e..5e276f6c 100644 --- a/converter/other/svgtopam.c +++ b/converter/other/svgtopam.c @@ -18,12 +18,12 @@ Implementation notes: - We've seen a version of <libxml/xmlreader.h> that does not - define type 'xmlReaderTypes'. The system claimed to have - Libxml2 2.6.16 installed, but another system that makes that - claim _does_ have 'xmlReaderTypes' defined, so I don't know what - version actually has the problem. - + A look at Libxml2 Subversion source code change history says the type + 'xmlReaderTypes' was added (in <libxml/xmlreader.h>) in 2.5.9. But a MacOS + 10.3.9 user reports in April 2007 that he has 2.6.16 installed and it + doesn't have xmlReaderTypes. Another MacOS user reported that in December + 2008. Apparently that OS has a broken libxml2 installation. + ============================================================================*/ #define _BSD_SOURCE /* Make sure strdup() is in <string.h> */ |