summaryrefslogtreecommitdiff
path: root/tiff/tools
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhosting.net>2015-11-06 07:14:47 +0100
committerJörg Frings-Fürst <debian@jff-webhosting.net>2015-11-06 07:14:47 +0100
commitd479dd1aab1c1cb907932c6595b0ef33523fc797 (patch)
treead7d454b9edaae3d8892d84cd8f8ef5c2697b79b /tiff/tools
parent9491825ddff7a294d1f49061bae7044e426aeb2e (diff)
Imported Upstream version 1.8.3upstream/1.8.3
Diffstat (limited to 'tiff/tools')
-rwxr-xr-xtiff/tools/Jamfile20
-rwxr-xr-xtiff/tools/Makefile.am145
-rwxr-xr-xtiff/tools/Makefile.in996
-rwxr-xr-xtiff/tools/Makefile.vc52
-rwxr-xr-xtiff/tools/bmp2tiff.c869
-rwxr-xr-xtiff/tools/fax2ps.c454
-rwxr-xr-xtiff/tools/fax2tiff.c469
-rwxr-xr-xtiff/tools/gif2tiff.c548
-rwxr-xr-xtiff/tools/pal2rgb.c435
-rwxr-xr-xtiff/tools/ppm2tiff.c395
-rwxr-xr-xtiff/tools/ras2tiff.c316
-rwxr-xr-xtiff/tools/rasterfile.h42
-rwxr-xr-xtiff/tools/raw2tiff.c651
-rwxr-xr-xtiff/tools/rgb2ycbcr.c391
-rwxr-xr-xtiff/tools/sgi2tiff.c335
-rwxr-xr-xtiff/tools/sgisv.c316
-rwxr-xr-xtiff/tools/thumbnail.c689
-rwxr-xr-xtiff/tools/tiff2bw.c476
-rwxr-xr-xtiff/tools/tiff2pdf.c5467
-rwxr-xr-xtiff/tools/tiff2ps.c3082
-rwxr-xr-xtiff/tools/tiff2rgba.c541
-rwxr-xr-xtiff/tools/tiffcmp.c657
-rwxr-xr-xtiff/tools/tiffcp.c1870
-rwxr-xr-xtiff/tools/tiffcrop.c9091
-rwxr-xr-xtiff/tools/tiffdither.c334
-rwxr-xr-xtiff/tools/tiffdump.c895
-rwxr-xr-xtiff/tools/tiffgt.c470
-rwxr-xr-xtiff/tools/tiffinfo.c472
-rwxr-xr-xtiff/tools/tiffmedian.c906
-rwxr-xr-xtiff/tools/tiffset.c356
-rwxr-xr-xtiff/tools/tiffsplit.c303
-rwxr-xr-xtiff/tools/ycbcr.c168
32 files changed, 0 insertions, 32211 deletions
diff --git a/tiff/tools/Jamfile b/tiff/tools/Jamfile
deleted file mode 100755
index 99f1307..0000000
--- a/tiff/tools/Jamfile
+++ /dev/null
@@ -1,20 +0,0 @@
-
-PREF_CCFLAGS += $(CCOPTFLAG) ; # Turn optimisation on
-#PREF_CCFLAGS += $(CCDEBUGFLAG) ; # Debugging flags
-PREF_LINKFLAGS += $(LINKDEBUGFLAG) ;
-
-HDRS = .. ../libtiff ;
-
-LINKLIBS = ../libtiff ../libport ../$(JPEGLIB) ;
-
-Main tiffcp : tiffcp.c ;
-
-Main tiff2bw : tiff2bw.c ;
-
-Main tiffset : tiffset.c ;
-
-Main tiffdump : tiffdump.c ;
-
-Main tiffinfo : tiffinfo.c ;
-
-Main tiffsplit : tiffsplit.c ;
diff --git a/tiff/tools/Makefile.am b/tiff/tools/Makefile.am
deleted file mode 100755
index 6497f2d..0000000
--- a/tiff/tools/Makefile.am
+++ /dev/null
@@ -1,145 +0,0 @@
-# Tag Image File Format (TIFF) Software
-#
-# Copyright (C) 2004, Andrey Kiselev <dron@ak4719.spb.edu>
-#
-# Permission to use, copy, modify, distribute, and sell this software and
-# its documentation for any purpose is hereby granted without fee, provided
-# that (i) the above copyright notices and this permission notice appear in
-# all copies of the software and related documentation, and (ii) the names of
-# Sam Leffler and Silicon Graphics may not be used in any advertising or
-# publicity relating to the software without the specific, prior written
-# permission of Sam Leffler and Silicon Graphics.
-#
-# THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
-# WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-#
-# IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
-# ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
-# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-# WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
-# LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-# OF THIS SOFTWARE.
-
-# Process this file with automake to produce Makefile.in.
-
-LIBPORT = $(top_builddir)/port/libport.la
-LIBTIFF = $(top_builddir)/libtiff/libtiff.la
-
-EXTRA_DIST = Makefile.vc
-
-bin_PROGRAMS = \
- bmp2tiff \
- fax2ps \
- fax2tiff \
- gif2tiff \
- pal2rgb \
- ppm2tiff \
- ras2tiff \
- raw2tiff \
- rgb2ycbcr \
- thumbnail \
- tiff2bw \
- tiff2pdf \
- tiff2ps \
- tiff2rgba \
- tiffcmp \
- tiffcp \
- tiffcrop \
- tiffdither \
- tiffdump \
- tiffinfo \
- tiffmedian \
- tiffset \
- tiffsplit
-if HAVE_OPENGL
-bin_PROGRAMS += tiffgt
-endif
-
-EXTRA_PROGRAMS = sgi2tiff sgisv ycbcr
-
-if HAVE_RPATH
-AM_LDFLAGS = $(LIBDIR)
-endif
-
-bmp2tiff_SOURCES = bmp2tiff.c
-bmp2tiff_LDADD = $(LIBTIFF) $(LIBPORT)
-
-fax2ps_SOURCES = fax2ps.c
-fax2ps_LDADD = $(LIBTIFF) $(LIBPORT)
-
-fax2tiff_SOURCES = fax2tiff.c
-fax2tiff_LDADD = $(LIBTIFF) $(LIBPORT)
-
-gif2tiff_SOURCES = gif2tiff.c
-gif2tiff_LDADD = $(LIBTIFF) $(LIBPORT)
-
-pal2rgb_SOURCES = pal2rgb.c
-pal2rgb_LDADD = $(LIBTIFF) $(LIBPORT)
-
-ppm2tiff_SOURCES = ppm2tiff.c
-ppm2tiff_LDADD = $(LIBTIFF) $(LIBPORT)
-
-ras2tiff_SOURCES = ras2tiff.c rasterfile.h
-ras2tiff_LDADD = $(LIBTIFF) $(LIBPORT)
-
-raw2tiff_SOURCES = raw2tiff.c
-raw2tiff_LDADD = $(LIBTIFF) $(LIBPORT)
-
-rgb2ycbcr_SOURCES = rgb2ycbcr.c
-rgb2ycbcr_LDADD = $(LIBTIFF) $(LIBPORT)
-
-thumbnail_SOURCES = thumbnail.c
-thumbnail_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiff2bw_SOURCES = tiff2bw.c
-tiff2bw_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiff2pdf_SOURCES = tiff2pdf.c
-tiff2pdf_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiff2ps_SOURCES = tiff2ps.c
-tiff2ps_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiff2rgba_SOURCES = tiff2rgba.c
-tiff2rgba_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiffcmp_SOURCES = tiffcmp.c
-tiffcmp_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiffcp_SOURCES = tiffcp.c
-tiffcp_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiffcrop_SOURCES = tiffcrop.c
-tiffcrop_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiffdither_SOURCES = tiffdither.c
-tiffdither_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiffdump_SOURCES = tiffdump.c
-tiffdump_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiffinfo_SOURCES = tiffinfo.c
-tiffinfo_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiffmedian_SOURCES = tiffmedian.c
-tiffmedian_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiffset_SOURCES = tiffset.c
-tiffset_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiffsplit_SOURCES = tiffsplit.c
-tiffsplit_LDADD = $(LIBTIFF) $(LIBPORT)
-
-tiffgt_SOURCES = tiffgt.c
-tiffgt_CFLAGS = $(CFLAGS) $(GLUT_CFLAGS) $(AM_CFLAGS)
-tiffgt_LDADD = $(LIBTIFF) $(LIBPORT) $(X_LIBS) $(GLUT_LIBS)
-
-AM_CPPFLAGS = -I$(top_srcdir)/libtiff
-
-echo:
- (echo $(CFLAGS))
- (echo $(tiffgt_CFLAGS))
- (echo $(GL_CFLAGS))
- (echo $(GLU_CFLAGS))
- (echo $(GLUT_CFLAGS))
diff --git a/tiff/tools/Makefile.in b/tiff/tools/Makefile.in
deleted file mode 100755
index 8be3c66..0000000
--- a/tiff/tools/Makefile.in
+++ /dev/null
@@ -1,996 +0,0 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# Tag Image File Format (TIFF) Software
-#
-# Copyright (C) 2004, Andrey Kiselev <dron@ak4719.spb.edu>
-#
-# Permission to use, copy, modify, distribute, and sell this software and
-# its documentation for any purpose is hereby granted without fee, provided
-# that (i) the above copyright notices and this permission notice appear in
-# all copies of the software and related documentation, and (ii) the names of
-# Sam Leffler and Silicon Graphics may not be used in any advertising or
-# publicity relating to the software without the specific, prior written
-# permission of Sam Leffler and Silicon Graphics.
-#
-# THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
-# WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-#
-# IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
-# ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
-# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-# WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
-# LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-# OF THIS SOFTWARE.
-
-# Process this file with automake to produce Makefile.in.
-
-VPATH = @srcdir@
-am__is_gnu_make = { \
- if test -z '$(MAKELEVEL)'; then \
- false; \
- elif test -n '$(MAKE_HOST)'; then \
- true; \
- elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
- true; \
- else \
- false; \
- fi; \
-}
-am__make_running_with_option = \
- case $${target_option-} in \
- ?) ;; \
- *) echo "am__make_running_with_option: internal error: invalid" \
- "target option '$${target_option-}' specified" >&2; \
- exit 1;; \
- esac; \
- has_opt=no; \
- sane_makeflags=$$MAKEFLAGS; \
- if $(am__is_gnu_make); then \
- sane_makeflags=$$MFLAGS; \
- else \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- bs=\\; \
- sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
- | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
- esac; \
- fi; \
- skip_next=no; \
- strip_trailopt () \
- { \
- flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
- }; \
- for flg in $$sane_makeflags; do \
- test $$skip_next = yes && { skip_next=no; continue; }; \
- case $$flg in \
- *=*|--*) continue;; \
- -*I) strip_trailopt 'I'; skip_next=yes;; \
- -*I?*) strip_trailopt 'I';; \
- -*O) strip_trailopt 'O'; skip_next=yes;; \
- -*O?*) strip_trailopt 'O';; \
- -*l) strip_trailopt 'l'; skip_next=yes;; \
- -*l?*) strip_trailopt 'l';; \
- -[dEDm]) skip_next=yes;; \
- -[JT]) skip_next=yes;; \
- esac; \
- case $$flg in \
- *$$target_option*) has_opt=yes; break;; \
- esac; \
- done; \
- test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-bin_PROGRAMS = bmp2tiff$(EXEEXT) fax2ps$(EXEEXT) fax2tiff$(EXEEXT) \
- gif2tiff$(EXEEXT) pal2rgb$(EXEEXT) ppm2tiff$(EXEEXT) \
- ras2tiff$(EXEEXT) raw2tiff$(EXEEXT) rgb2ycbcr$(EXEEXT) \
- thumbnail$(EXEEXT) tiff2bw$(EXEEXT) tiff2pdf$(EXEEXT) \
- tiff2ps$(EXEEXT) tiff2rgba$(EXEEXT) tiffcmp$(EXEEXT) \
- tiffcp$(EXEEXT) tiffcrop$(EXEEXT) tiffdither$(EXEEXT) \
- tiffdump$(EXEEXT) tiffinfo$(EXEEXT) tiffmedian$(EXEEXT) \
- tiffset$(EXEEXT) tiffsplit$(EXEEXT) $(am__EXEEXT_1)
-@HAVE_OPENGL_TRUE@am__append_1 = tiffgt
-EXTRA_PROGRAMS = sgi2tiff$(EXEEXT) sgisv$(EXEEXT) ycbcr$(EXEEXT)
-subdir = tools
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
- $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
- $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \
- $(top_builddir)/libtiff/tiffconf.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-@HAVE_OPENGL_TRUE@am__EXEEXT_1 = tiffgt$(EXEEXT)
-am__installdirs = "$(DESTDIR)$(bindir)"
-PROGRAMS = $(bin_PROGRAMS)
-am_bmp2tiff_OBJECTS = bmp2tiff.$(OBJEXT)
-bmp2tiff_OBJECTS = $(am_bmp2tiff_OBJECTS)
-bmp2tiff_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-AM_V_lt = $(am__v_lt_@AM_V@)
-am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
-am__v_lt_0 = --silent
-am__v_lt_1 =
-am_fax2ps_OBJECTS = fax2ps.$(OBJEXT)
-fax2ps_OBJECTS = $(am_fax2ps_OBJECTS)
-fax2ps_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_fax2tiff_OBJECTS = fax2tiff.$(OBJEXT)
-fax2tiff_OBJECTS = $(am_fax2tiff_OBJECTS)
-fax2tiff_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_gif2tiff_OBJECTS = gif2tiff.$(OBJEXT)
-gif2tiff_OBJECTS = $(am_gif2tiff_OBJECTS)
-gif2tiff_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_pal2rgb_OBJECTS = pal2rgb.$(OBJEXT)
-pal2rgb_OBJECTS = $(am_pal2rgb_OBJECTS)
-pal2rgb_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_ppm2tiff_OBJECTS = ppm2tiff.$(OBJEXT)
-ppm2tiff_OBJECTS = $(am_ppm2tiff_OBJECTS)
-ppm2tiff_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_ras2tiff_OBJECTS = ras2tiff.$(OBJEXT)
-ras2tiff_OBJECTS = $(am_ras2tiff_OBJECTS)
-ras2tiff_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_raw2tiff_OBJECTS = raw2tiff.$(OBJEXT)
-raw2tiff_OBJECTS = $(am_raw2tiff_OBJECTS)
-raw2tiff_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_rgb2ycbcr_OBJECTS = rgb2ycbcr.$(OBJEXT)
-rgb2ycbcr_OBJECTS = $(am_rgb2ycbcr_OBJECTS)
-rgb2ycbcr_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-sgi2tiff_SOURCES = sgi2tiff.c
-sgi2tiff_OBJECTS = sgi2tiff.$(OBJEXT)
-sgi2tiff_LDADD = $(LDADD)
-sgisv_SOURCES = sgisv.c
-sgisv_OBJECTS = sgisv.$(OBJEXT)
-sgisv_LDADD = $(LDADD)
-am_thumbnail_OBJECTS = thumbnail.$(OBJEXT)
-thumbnail_OBJECTS = $(am_thumbnail_OBJECTS)
-thumbnail_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_tiff2bw_OBJECTS = tiff2bw.$(OBJEXT)
-tiff2bw_OBJECTS = $(am_tiff2bw_OBJECTS)
-tiff2bw_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_tiff2pdf_OBJECTS = tiff2pdf.$(OBJEXT)
-tiff2pdf_OBJECTS = $(am_tiff2pdf_OBJECTS)
-tiff2pdf_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_tiff2ps_OBJECTS = tiff2ps.$(OBJEXT)
-tiff2ps_OBJECTS = $(am_tiff2ps_OBJECTS)
-tiff2ps_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_tiff2rgba_OBJECTS = tiff2rgba.$(OBJEXT)
-tiff2rgba_OBJECTS = $(am_tiff2rgba_OBJECTS)
-tiff2rgba_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_tiffcmp_OBJECTS = tiffcmp.$(OBJEXT)
-tiffcmp_OBJECTS = $(am_tiffcmp_OBJECTS)
-tiffcmp_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_tiffcp_OBJECTS = tiffcp.$(OBJEXT)
-tiffcp_OBJECTS = $(am_tiffcp_OBJECTS)
-tiffcp_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_tiffcrop_OBJECTS = tiffcrop.$(OBJEXT)
-tiffcrop_OBJECTS = $(am_tiffcrop_OBJECTS)
-tiffcrop_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_tiffdither_OBJECTS = tiffdither.$(OBJEXT)
-tiffdither_OBJECTS = $(am_tiffdither_OBJECTS)
-tiffdither_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_tiffdump_OBJECTS = tiffdump.$(OBJEXT)
-tiffdump_OBJECTS = $(am_tiffdump_OBJECTS)
-tiffdump_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_tiffgt_OBJECTS = tiffgt-tiffgt.$(OBJEXT)
-tiffgt_OBJECTS = $(am_tiffgt_OBJECTS)
-am__DEPENDENCIES_1 =
-tiffgt_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
-tiffgt_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CCLD) $(tiffgt_CFLAGS) $(CFLAGS) \
- $(AM_LDFLAGS) $(LDFLAGS) -o $@
-am_tiffinfo_OBJECTS = tiffinfo.$(OBJEXT)
-tiffinfo_OBJECTS = $(am_tiffinfo_OBJECTS)
-tiffinfo_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_tiffmedian_OBJECTS = tiffmedian.$(OBJEXT)
-tiffmedian_OBJECTS = $(am_tiffmedian_OBJECTS)
-tiffmedian_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_tiffset_OBJECTS = tiffset.$(OBJEXT)
-tiffset_OBJECTS = $(am_tiffset_OBJECTS)
-tiffset_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-am_tiffsplit_OBJECTS = tiffsplit.$(OBJEXT)
-tiffsplit_OBJECTS = $(am_tiffsplit_OBJECTS)
-tiffsplit_DEPENDENCIES = $(LIBTIFF) $(LIBPORT)
-ycbcr_SOURCES = ycbcr.c
-ycbcr_OBJECTS = ycbcr.$(OBJEXT)
-ycbcr_LDADD = $(LDADD)
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
-am__v_GEN_1 =
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 =
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/libtiff
-depcomp = $(SHELL) $(top_srcdir)/config/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
- $(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_@AM_V@)
-am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
-am__v_CC_1 =
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
- $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_@AM_V@)
-am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
-am__v_CCLD_1 =
-SOURCES = $(bmp2tiff_SOURCES) $(fax2ps_SOURCES) $(fax2tiff_SOURCES) \
- $(gif2tiff_SOURCES) $(pal2rgb_SOURCES) $(ppm2tiff_SOURCES) \
- $(ras2tiff_SOURCES) $(raw2tiff_SOURCES) $(rgb2ycbcr_SOURCES) \
- sgi2tiff.c sgisv.c $(thumbnail_SOURCES) $(tiff2bw_SOURCES) \
- $(tiff2pdf_SOURCES) $(tiff2ps_SOURCES) $(tiff2rgba_SOURCES) \
- $(tiffcmp_SOURCES) $(tiffcp_SOURCES) $(tiffcrop_SOURCES) \
- $(tiffdither_SOURCES) $(tiffdump_SOURCES) $(tiffgt_SOURCES) \
- $(tiffinfo_SOURCES) $(tiffmedian_SOURCES) $(tiffset_SOURCES) \
- $(tiffsplit_SOURCES) ycbcr.c
-DIST_SOURCES = $(bmp2tiff_SOURCES) $(fax2ps_SOURCES) \
- $(fax2tiff_SOURCES) $(gif2tiff_SOURCES) $(pal2rgb_SOURCES) \
- $(ppm2tiff_SOURCES) $(ras2tiff_SOURCES) $(raw2tiff_SOURCES) \
- $(rgb2ycbcr_SOURCES) sgi2tiff.c sgisv.c $(thumbnail_SOURCES) \
- $(tiff2bw_SOURCES) $(tiff2pdf_SOURCES) $(tiff2ps_SOURCES) \
- $(tiff2rgba_SOURCES) $(tiffcmp_SOURCES) $(tiffcp_SOURCES) \
- $(tiffcrop_SOURCES) $(tiffdither_SOURCES) $(tiffdump_SOURCES) \
- $(tiffgt_SOURCES) $(tiffinfo_SOURCES) $(tiffmedian_SOURCES) \
- $(tiffset_SOURCES) $(tiffsplit_SOURCES) ycbcr.c
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates. Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
- BEGIN { nonempty = 0; } \
- { items[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique. This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
- list='$(am__tagged_files)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
-am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/config/depcomp \
- $(top_srcdir)/config/mkinstalldirs
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GLUT_CFLAGS = @GLUT_CFLAGS@
-GLUT_LIBS = @GLUT_LIBS@
-GLU_CFLAGS = @GLU_CFLAGS@
-GLU_LIBS = @GLU_LIBS@
-GL_CFLAGS = @GL_CFLAGS@
-GL_LIBS = @GL_LIBS@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBDIR = @LIBDIR@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@
-LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@
-LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@
-LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@
-LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@
-LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@
-LIBTIFF_VERSION = @LIBTIFF_VERSION@
-LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PTHREAD_CC = @PTHREAD_CC@
-PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
-PTHREAD_LIBS = @PTHREAD_LIBS@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XMKMF = @XMKMF@
-X_CFLAGS = @X_CFLAGS@
-X_EXTRA_LIBS = @X_EXTRA_LIBS@
-X_LIBS = @X_LIBS@
-X_PRE_LIBS = @X_PRE_LIBS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-ax_pthread_config = @ax_pthread_config@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-tiff_libs_private = @tiff_libs_private@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-LIBPORT = $(top_builddir)/port/libport.la
-LIBTIFF = $(top_builddir)/libtiff/libtiff.la
-EXTRA_DIST = Makefile.vc
-@HAVE_RPATH_TRUE@AM_LDFLAGS = $(LIBDIR)
-bmp2tiff_SOURCES = bmp2tiff.c
-bmp2tiff_LDADD = $(LIBTIFF) $(LIBPORT)
-fax2ps_SOURCES = fax2ps.c
-fax2ps_LDADD = $(LIBTIFF) $(LIBPORT)
-fax2tiff_SOURCES = fax2tiff.c
-fax2tiff_LDADD = $(LIBTIFF) $(LIBPORT)
-gif2tiff_SOURCES = gif2tiff.c
-gif2tiff_LDADD = $(LIBTIFF) $(LIBPORT)
-pal2rgb_SOURCES = pal2rgb.c
-pal2rgb_LDADD = $(LIBTIFF) $(LIBPORT)
-ppm2tiff_SOURCES = ppm2tiff.c
-ppm2tiff_LDADD = $(LIBTIFF) $(LIBPORT)
-ras2tiff_SOURCES = ras2tiff.c rasterfile.h
-ras2tiff_LDADD = $(LIBTIFF) $(LIBPORT)
-raw2tiff_SOURCES = raw2tiff.c
-raw2tiff_LDADD = $(LIBTIFF) $(LIBPORT)
-rgb2ycbcr_SOURCES = rgb2ycbcr.c
-rgb2ycbcr_LDADD = $(LIBTIFF) $(LIBPORT)
-thumbnail_SOURCES = thumbnail.c
-thumbnail_LDADD = $(LIBTIFF) $(LIBPORT)
-tiff2bw_SOURCES = tiff2bw.c
-tiff2bw_LDADD = $(LIBTIFF) $(LIBPORT)
-tiff2pdf_SOURCES = tiff2pdf.c
-tiff2pdf_LDADD = $(LIBTIFF) $(LIBPORT)
-tiff2ps_SOURCES = tiff2ps.c
-tiff2ps_LDADD = $(LIBTIFF) $(LIBPORT)
-tiff2rgba_SOURCES = tiff2rgba.c
-tiff2rgba_LDADD = $(LIBTIFF) $(LIBPORT)
-tiffcmp_SOURCES = tiffcmp.c
-tiffcmp_LDADD = $(LIBTIFF) $(LIBPORT)
-tiffcp_SOURCES = tiffcp.c
-tiffcp_LDADD = $(LIBTIFF) $(LIBPORT)
-tiffcrop_SOURCES = tiffcrop.c
-tiffcrop_LDADD = $(LIBTIFF) $(LIBPORT)
-tiffdither_SOURCES = tiffdither.c
-tiffdither_LDADD = $(LIBTIFF) $(LIBPORT)
-tiffdump_SOURCES = tiffdump.c
-tiffdump_LDADD = $(LIBTIFF) $(LIBPORT)
-tiffinfo_SOURCES = tiffinfo.c
-tiffinfo_LDADD = $(LIBTIFF) $(LIBPORT)
-tiffmedian_SOURCES = tiffmedian.c
-tiffmedian_LDADD = $(LIBTIFF) $(LIBPORT)
-tiffset_SOURCES = tiffset.c
-tiffset_LDADD = $(LIBTIFF) $(LIBPORT)
-tiffsplit_SOURCES = tiffsplit.c
-tiffsplit_LDADD = $(LIBTIFF) $(LIBPORT)
-tiffgt_SOURCES = tiffgt.c
-tiffgt_CFLAGS = $(CFLAGS) $(GLUT_CFLAGS) $(AM_CFLAGS)
-tiffgt_LDADD = $(LIBTIFF) $(LIBPORT) $(X_LIBS) $(GLUT_LIBS)
-AM_CPPFLAGS = -I$(top_srcdir)/libtiff
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
- && { if test -f $@; then exit 0; else break; fi; }; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --foreign tools/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
- esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-install-binPROGRAMS: $(bin_PROGRAMS)
- @$(NORMAL_INSTALL)
- @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
- fi; \
- for p in $$list; do echo "$$p $$p"; done | \
- sed 's/$(EXEEXT)$$//' | \
- while read p p1; do if test -f $$p \
- || test -f $$p1 \
- ; then echo "$$p"; echo "$$p"; else :; fi; \
- done | \
- sed -e 'p;s,.*/,,;n;h' \
- -e 's|.*|.|' \
- -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
- sed 'N;N;N;s,\n, ,g' | \
- $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
- { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
- if ($$2 == $$4) files[d] = files[d] " " $$1; \
- else { print "f", $$3 "/" $$4, $$1; } } \
- END { for (d in files) print "f", d, files[d] }' | \
- while read type dir files; do \
- if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
- test -z "$$files" || { \
- echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
- $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
- } \
- ; done
-
-uninstall-binPROGRAMS:
- @$(NORMAL_UNINSTALL)
- @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
- files=`for p in $$list; do echo "$$p"; done | \
- sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
- -e 's/$$/$(EXEEXT)/' \
- `; \
- test -n "$$list" || exit 0; \
- echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(bindir)" && rm -f $$files
-
-clean-binPROGRAMS:
- @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
- echo " rm -f" $$list; \
- rm -f $$list || exit $$?; \
- test -n "$(EXEEXT)" || exit 0; \
- list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f" $$list; \
- rm -f $$list
-
-bmp2tiff$(EXEEXT): $(bmp2tiff_OBJECTS) $(bmp2tiff_DEPENDENCIES) $(EXTRA_bmp2tiff_DEPENDENCIES)
- @rm -f bmp2tiff$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(bmp2tiff_OBJECTS) $(bmp2tiff_LDADD) $(LIBS)
-
-fax2ps$(EXEEXT): $(fax2ps_OBJECTS) $(fax2ps_DEPENDENCIES) $(EXTRA_fax2ps_DEPENDENCIES)
- @rm -f fax2ps$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(fax2ps_OBJECTS) $(fax2ps_LDADD) $(LIBS)
-
-fax2tiff$(EXEEXT): $(fax2tiff_OBJECTS) $(fax2tiff_DEPENDENCIES) $(EXTRA_fax2tiff_DEPENDENCIES)
- @rm -f fax2tiff$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(fax2tiff_OBJECTS) $(fax2tiff_LDADD) $(LIBS)
-
-gif2tiff$(EXEEXT): $(gif2tiff_OBJECTS) $(gif2tiff_DEPENDENCIES) $(EXTRA_gif2tiff_DEPENDENCIES)
- @rm -f gif2tiff$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(gif2tiff_OBJECTS) $(gif2tiff_LDADD) $(LIBS)
-
-pal2rgb$(EXEEXT): $(pal2rgb_OBJECTS) $(pal2rgb_DEPENDENCIES) $(EXTRA_pal2rgb_DEPENDENCIES)
- @rm -f pal2rgb$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(pal2rgb_OBJECTS) $(pal2rgb_LDADD) $(LIBS)
-
-ppm2tiff$(EXEEXT): $(ppm2tiff_OBJECTS) $(ppm2tiff_DEPENDENCIES) $(EXTRA_ppm2tiff_DEPENDENCIES)
- @rm -f ppm2tiff$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(ppm2tiff_OBJECTS) $(ppm2tiff_LDADD) $(LIBS)
-
-ras2tiff$(EXEEXT): $(ras2tiff_OBJECTS) $(ras2tiff_DEPENDENCIES) $(EXTRA_ras2tiff_DEPENDENCIES)
- @rm -f ras2tiff$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(ras2tiff_OBJECTS) $(ras2tiff_LDADD) $(LIBS)
-
-raw2tiff$(EXEEXT): $(raw2tiff_OBJECTS) $(raw2tiff_DEPENDENCIES) $(EXTRA_raw2tiff_DEPENDENCIES)
- @rm -f raw2tiff$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(raw2tiff_OBJECTS) $(raw2tiff_LDADD) $(LIBS)
-
-rgb2ycbcr$(EXEEXT): $(rgb2ycbcr_OBJECTS) $(rgb2ycbcr_DEPENDENCIES) $(EXTRA_rgb2ycbcr_DEPENDENCIES)
- @rm -f rgb2ycbcr$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(rgb2ycbcr_OBJECTS) $(rgb2ycbcr_LDADD) $(LIBS)
-
-sgi2tiff$(EXEEXT): $(sgi2tiff_OBJECTS) $(sgi2tiff_DEPENDENCIES) $(EXTRA_sgi2tiff_DEPENDENCIES)
- @rm -f sgi2tiff$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(sgi2tiff_OBJECTS) $(sgi2tiff_LDADD) $(LIBS)
-
-sgisv$(EXEEXT): $(sgisv_OBJECTS) $(sgisv_DEPENDENCIES) $(EXTRA_sgisv_DEPENDENCIES)
- @rm -f sgisv$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(sgisv_OBJECTS) $(sgisv_LDADD) $(LIBS)
-
-thumbnail$(EXEEXT): $(thumbnail_OBJECTS) $(thumbnail_DEPENDENCIES) $(EXTRA_thumbnail_DEPENDENCIES)
- @rm -f thumbnail$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(thumbnail_OBJECTS) $(thumbnail_LDADD) $(LIBS)
-
-tiff2bw$(EXEEXT): $(tiff2bw_OBJECTS) $(tiff2bw_DEPENDENCIES) $(EXTRA_tiff2bw_DEPENDENCIES)
- @rm -f tiff2bw$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(tiff2bw_OBJECTS) $(tiff2bw_LDADD) $(LIBS)
-
-tiff2pdf$(EXEEXT): $(tiff2pdf_OBJECTS) $(tiff2pdf_DEPENDENCIES) $(EXTRA_tiff2pdf_DEPENDENCIES)
- @rm -f tiff2pdf$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(tiff2pdf_OBJECTS) $(tiff2pdf_LDADD) $(LIBS)
-
-tiff2ps$(EXEEXT): $(tiff2ps_OBJECTS) $(tiff2ps_DEPENDENCIES) $(EXTRA_tiff2ps_DEPENDENCIES)
- @rm -f tiff2ps$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(tiff2ps_OBJECTS) $(tiff2ps_LDADD) $(LIBS)
-
-tiff2rgba$(EXEEXT): $(tiff2rgba_OBJECTS) $(tiff2rgba_DEPENDENCIES) $(EXTRA_tiff2rgba_DEPENDENCIES)
- @rm -f tiff2rgba$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(tiff2rgba_OBJECTS) $(tiff2rgba_LDADD) $(LIBS)
-
-tiffcmp$(EXEEXT): $(tiffcmp_OBJECTS) $(tiffcmp_DEPENDENCIES) $(EXTRA_tiffcmp_DEPENDENCIES)
- @rm -f tiffcmp$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(tiffcmp_OBJECTS) $(tiffcmp_LDADD) $(LIBS)
-
-tiffcp$(EXEEXT): $(tiffcp_OBJECTS) $(tiffcp_DEPENDENCIES) $(EXTRA_tiffcp_DEPENDENCIES)
- @rm -f tiffcp$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(tiffcp_OBJECTS) $(tiffcp_LDADD) $(LIBS)
-
-tiffcrop$(EXEEXT): $(tiffcrop_OBJECTS) $(tiffcrop_DEPENDENCIES) $(EXTRA_tiffcrop_DEPENDENCIES)
- @rm -f tiffcrop$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(tiffcrop_OBJECTS) $(tiffcrop_LDADD) $(LIBS)
-
-tiffdither$(EXEEXT): $(tiffdither_OBJECTS) $(tiffdither_DEPENDENCIES) $(EXTRA_tiffdither_DEPENDENCIES)
- @rm -f tiffdither$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(tiffdither_OBJECTS) $(tiffdither_LDADD) $(LIBS)
-
-tiffdump$(EXEEXT): $(tiffdump_OBJECTS) $(tiffdump_DEPENDENCIES) $(EXTRA_tiffdump_DEPENDENCIES)
- @rm -f tiffdump$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(tiffdump_OBJECTS) $(tiffdump_LDADD) $(LIBS)
-
-tiffgt$(EXEEXT): $(tiffgt_OBJECTS) $(tiffgt_DEPENDENCIES) $(EXTRA_tiffgt_DEPENDENCIES)
- @rm -f tiffgt$(EXEEXT)
- $(AM_V_CCLD)$(tiffgt_LINK) $(tiffgt_OBJECTS) $(tiffgt_LDADD) $(LIBS)
-
-tiffinfo$(EXEEXT): $(tiffinfo_OBJECTS) $(tiffinfo_DEPENDENCIES) $(EXTRA_tiffinfo_DEPENDENCIES)
- @rm -f tiffinfo$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(tiffinfo_OBJECTS) $(tiffinfo_LDADD) $(LIBS)
-
-tiffmedian$(EXEEXT): $(tiffmedian_OBJECTS) $(tiffmedian_DEPENDENCIES) $(EXTRA_tiffmedian_DEPENDENCIES)
- @rm -f tiffmedian$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(tiffmedian_OBJECTS) $(tiffmedian_LDADD) $(LIBS)
-
-tiffset$(EXEEXT): $(tiffset_OBJECTS) $(tiffset_DEPENDENCIES) $(EXTRA_tiffset_DEPENDENCIES)
- @rm -f tiffset$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(tiffset_OBJECTS) $(tiffset_LDADD) $(LIBS)
-
-tiffsplit$(EXEEXT): $(tiffsplit_OBJECTS) $(tiffsplit_DEPENDENCIES) $(EXTRA_tiffsplit_DEPENDENCIES)
- @rm -f tiffsplit$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(tiffsplit_OBJECTS) $(tiffsplit_LDADD) $(LIBS)
-
-ycbcr$(EXEEXT): $(ycbcr_OBJECTS) $(ycbcr_DEPENDENCIES) $(EXTRA_ycbcr_DEPENDENCIES)
- @rm -f ycbcr$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(ycbcr_OBJECTS) $(ycbcr_LDADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bmp2tiff.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fax2ps.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fax2tiff.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gif2tiff.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pal2rgb.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppm2tiff.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ras2tiff.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/raw2tiff.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rgb2ycbcr.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgi2tiff.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgisv.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thumbnail.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiff2bw.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiff2pdf.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiff2ps.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiff2rgba.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffcmp.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffcp.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffcrop.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffdither.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffdump.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffgt-tiffgt.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffinfo.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffmedian.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffset.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffsplit.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ycbcr.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
-
-.c.obj:
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
-
-tiffgt-tiffgt.o: tiffgt.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tiffgt_CFLAGS) $(CFLAGS) -MT tiffgt-tiffgt.o -MD -MP -MF $(DEPDIR)/tiffgt-tiffgt.Tpo -c -o tiffgt-tiffgt.o `test -f 'tiffgt.c' || echo '$(srcdir)/'`tiffgt.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tiffgt-tiffgt.Tpo $(DEPDIR)/tiffgt-tiffgt.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tiffgt.c' object='tiffgt-tiffgt.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tiffgt_CFLAGS) $(CFLAGS) -c -o tiffgt-tiffgt.o `test -f 'tiffgt.c' || echo '$(srcdir)/'`tiffgt.c
-
-tiffgt-tiffgt.obj: tiffgt.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tiffgt_CFLAGS) $(CFLAGS) -MT tiffgt-tiffgt.obj -MD -MP -MF $(DEPDIR)/tiffgt-tiffgt.Tpo -c -o tiffgt-tiffgt.obj `if test -f 'tiffgt.c'; then $(CYGPATH_W) 'tiffgt.c'; else $(CYGPATH_W) '$(srcdir)/tiffgt.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tiffgt-tiffgt.Tpo $(DEPDIR)/tiffgt-tiffgt.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tiffgt.c' object='tiffgt-tiffgt.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tiffgt_CFLAGS) $(CFLAGS) -c -o tiffgt-tiffgt.obj `if test -f 'tiffgt.c'; then $(CYGPATH_W) 'tiffgt.c'; else $(CYGPATH_W) '$(srcdir)/tiffgt.c'; fi`
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-ID: $(am__tagged_files)
- $(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-am
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
- set x; \
- here=`pwd`; \
- $(am__define_uniq_tagged_files); \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: ctags-am
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
- $(am__define_uniq_tagged_files); \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-am
-
-cscopelist-am: $(am__tagged_files)
- list='$(am__tagged_files)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS)
-installdirs:
- for dir in "$(DESTDIR)$(bindir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -rf ./$(DEPDIR)
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am: install-binPROGRAMS
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -rf ./$(DEPDIR)
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
- clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
- ctags ctags-am distclean distclean-compile distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-binPROGRAMS \
- install-data install-data-am install-dvi install-dvi-am \
- install-exec install-exec-am install-html install-html-am \
- install-info install-info-am install-man install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- installcheck installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-compile \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am uninstall-binPROGRAMS
-
-.PRECIOUS: Makefile
-
-
-echo:
- (echo $(CFLAGS))
- (echo $(tiffgt_CFLAGS))
- (echo $(GL_CFLAGS))
- (echo $(GLU_CFLAGS))
- (echo $(GLUT_CFLAGS))
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/tiff/tools/Makefile.vc b/tiff/tools/Makefile.vc
deleted file mode 100755
index c8d69cd..0000000
--- a/tiff/tools/Makefile.vc
+++ /dev/null
@@ -1,52 +0,0 @@
-# $Id: Makefile.vc,v 1.15 2009-01-22 20:53:07 fwarmerdam Exp $
-#
-# Copyright (C) 2004, Andrey Kiselev <dron@ak4719.spb.edu>
-#
-# Permission to use, copy, modify, distribute, and sell this software and
-# its documentation for any purpose is hereby granted without fee, provided
-# that (i) the above copyright notices and this permission notice appear in
-# all copies of the software and related documentation, and (ii) the names of
-# Sam Leffler and Silicon Graphics may not be used in any advertising or
-# publicity relating to the software without the specific, prior written
-# permission of Sam Leffler and Silicon Graphics.
-#
-# THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
-# WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-#
-# IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
-# ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
-# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-# WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
-# LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-# OF THIS SOFTWARE.
-#
-# Makefile for MS Visual C and Watcom C compilers.
-#
-# To build:
-# C:\libtiff\tools> nmake /f makefile.vc
-
-!INCLUDE ..\nmake.opt
-
-TARGETS = bmp2tiff.exe tiffinfo.exe tiffdump.exe fax2tiff.exe \
- fax2ps.exe gif2tiff.exe pal2rgb.exe ppm2tiff.exe \
- rgb2ycbcr.exe thumbnail.exe ras2tiff.exe raw2tiff.exe \
- tiff2bw.exe tiff2rgba.exe tiff2pdf.exe tiff2ps.exe \
- tiffcmp.exe tiffcp.exe tiffcrop.exe tiffdither.exe \
- tiffmedian.exe tiffset.exe tiffsplit.exe
-
-INCL = -I..\libtiff -I..\port -DNEED_LIBPORT
-LIBS = $(LIBS) ..\port\libport.lib ..\libtiff\libtiff.lib
-
-default: $(TARGETS)
-
-.c.exe:
- $(CC) $(CFLAGS) $*.c $(EXTRA_OBJ) $(LIBS)
-
-tiffgt.exe:
- $(CC) $(CFLAGS) tiffgt.c $(EXTRA_OBJ) $(LIBS)
-
-clean:
- -del *.exe
- -del *.exe.manifest
- -del *.obj
diff --git a/tiff/tools/bmp2tiff.c b/tiff/tools/bmp2tiff.c
deleted file mode 100755
index 48fcdc2..0000000
--- a/tiff/tools/bmp2tiff.c
+++ /dev/null
@@ -1,869 +0,0 @@
-/* $Id: bmp2tiff.c,v 1.24 2014-12-21 15:15:32 erouault Exp $
- *
- * Project: libtiff tools
- * Purpose: Convert Windows BMP files in TIFF.
- * Author: Andrey Kiselev, dron@ak4719.spb.edu
- *
- ******************************************************************************
- * Copyright (c) 2004, Andrey Kiselev <dron@ak4719.spb.edu>
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_IO_H
-# include <io.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffio.h"
-
-#ifndef O_BINARY
-# define O_BINARY 0
-#endif
-
-enum BMPType
-{
- BMPT_WIN4, /* BMP used in Windows 3.0/NT 3.51/95 */
- BMPT_WIN5, /* BMP used in Windows NT 4.0/98/Me/2000/XP */
- BMPT_OS21, /* BMP used in OS/2 PM 1.x */
- BMPT_OS22 /* BMP used in OS/2 PM 2.x */
-};
-
-/*
- * Bitmap file consists of a BMPFileHeader structure followed by a
- * BMPInfoHeader structure. An array of BMPColorEntry structures (also called
- * a colour table) follows the bitmap information header structure. The colour
- * table is followed by a second array of indexes into the colour table (the
- * actual bitmap data). Data may be comressed, for 4-bpp and 8-bpp used RLE
- * compression.
- *
- * +---------------------+
- * | BMPFileHeader |
- * +---------------------+
- * | BMPInfoHeader |
- * +---------------------+
- * | BMPColorEntry array |
- * +---------------------+
- * | Colour-index array |
- * +---------------------+
- *
- * All numbers stored in Intel order with least significant byte first.
- */
-
-enum BMPComprMethod
-{
- BMPC_RGB = 0L, /* Uncompressed */
- BMPC_RLE8 = 1L, /* RLE for 8 bpp images */
- BMPC_RLE4 = 2L, /* RLE for 4 bpp images */
- BMPC_BITFIELDS = 3L, /* Bitmap is not compressed and the colour table
- * consists of three DWORD color masks that specify
- * the red, green, and blue components of each
- * pixel. This is valid when used with
- * 16- and 32-bpp bitmaps. */
- BMPC_JPEG = 4L, /* Indicates that the image is a JPEG image. */
- BMPC_PNG = 5L /* Indicates that the image is a PNG image. */
-};
-
-enum BMPLCSType /* Type of logical color space. */
-{
- BMPLT_CALIBRATED_RGB = 0, /* This value indicates that endpoints and
- * gamma values are given in the appropriate
- * fields. */
- BMPLT_DEVICE_RGB = 1,
- BMPLT_DEVICE_CMYK = 2
-};
-
-typedef struct
-{
- int32 iCIEX;
- int32 iCIEY;
- int32 iCIEZ;
-} BMPCIEXYZ;
-
-typedef struct /* This structure contains the x, y, and z */
-{ /* coordinates of the three colors that */
- /* correspond */
- BMPCIEXYZ iCIERed; /* to the red, green, and blue endpoints for */
- BMPCIEXYZ iCIEGreen; /* a specified logical color space. */
- BMPCIEXYZ iCIEBlue;
-} BMPCIEXYZTriple;
-
-typedef struct
-{
- char bType[2]; /* Signature "BM" */
- uint32 iSize; /* Size in bytes of the bitmap file. Should
- * always be ignored while reading because
- * of error in Windows 3.0 SDK's description
- * of this field */
- uint16 iReserved1; /* Reserved, set as 0 */
- uint16 iReserved2; /* Reserved, set as 0 */
- uint32 iOffBits; /* Offset of the image from file start in bytes */
-} BMPFileHeader;
-
-/* File header size in bytes: */
-const int BFH_SIZE = 14;
-
-typedef struct
-{
- uint32 iSize; /* Size of BMPInfoHeader structure in bytes.
- * Should be used to determine start of the
- * colour table */
- int32 iWidth; /* Image width */
- int32 iHeight; /* Image height. If positive, image has bottom
- * left origin, if negative --- top left. */
- int16 iPlanes; /* Number of image planes (must be set to 1) */
- int16 iBitCount; /* Number of bits per pixel (1, 4, 8, 16, 24
- * or 32). If 0 then the number of bits per
- * pixel is specified or is implied by the
- * JPEG or PNG format. */
- uint32 iCompression; /* Compression method */
- uint32 iSizeImage; /* Size of uncomressed image in bytes. May
- * be 0 for BMPC_RGB bitmaps. If iCompression
- * is BI_JPEG or BI_PNG, iSizeImage indicates
- * the size of the JPEG or PNG image buffer. */
- int32 iXPelsPerMeter; /* X resolution, pixels per meter (0 if not used) */
- int32 iYPelsPerMeter; /* Y resolution, pixels per meter (0 if not used) */
- uint32 iClrUsed; /* Size of colour table. If 0, iBitCount should
- * be used to calculate this value
- * (1<<iBitCount). This value should be
- * unsigned for proper shifting. */
- int32 iClrImportant; /* Number of important colours. If 0, all
- * colours are required */
-
- /*
- * Fields above should be used for bitmaps, compatible with Windows NT 3.51
- * and earlier. Windows 98/Me, Windows 2000/XP introduces additional fields:
- */
-
- int32 iRedMask; /* Colour mask that specifies the red component
- * of each pixel, valid only if iCompression
- * is set to BI_BITFIELDS. */
- int32 iGreenMask; /* The same for green component */
- int32 iBlueMask; /* The same for blue component */
- int32 iAlphaMask; /* Colour mask that specifies the alpha
- * component of each pixel. */
- uint32 iCSType; /* Colour space of the DIB. */
- BMPCIEXYZTriple sEndpoints; /* This member is ignored unless the iCSType
- * member specifies BMPLT_CALIBRATED_RGB. */
- int32 iGammaRed; /* Toned response curve for red. This member
- * is ignored unless color values are
- * calibrated RGB values and iCSType is set to
- * BMPLT_CALIBRATED_RGB. Specified
- * in 16^16 format. */
- int32 iGammaGreen; /* Toned response curve for green. */
- int32 iGammaBlue; /* Toned response curve for blue. */
-} BMPInfoHeader;
-
-/*
- * Info header size in bytes:
- */
-const unsigned int BIH_WIN4SIZE = 40; /* for BMPT_WIN4 */
-const unsigned int BIH_WIN5SIZE = 57; /* for BMPT_WIN5 */
-const unsigned int BIH_OS21SIZE = 12; /* for BMPT_OS21 */
-const unsigned int BIH_OS22SIZE = 64; /* for BMPT_OS22 */
-
-/*
- * We will use plain byte array instead of this structure, but declaration
- * provided for reference
- */
-typedef struct
-{
- char bBlue;
- char bGreen;
- char bRed;
- char bReserved; /* Must be 0 */
-} BMPColorEntry;
-
-static uint16 compression = (uint16) -1;
-static int jpegcolormode = JPEGCOLORMODE_RGB;
-static int quality = 75; /* JPEG quality */
-static uint16 predictor = 0;
-
-static void usage(void);
-static int processCompressOptions(char*);
-static void rearrangePixels(char *, uint32, uint32);
-
-int
-main(int argc, char* argv[])
-{
- uint32 width, length;
- uint16 nbands = 1; /* number of bands in input image */
- uint16 depth = 8; /* bits per pixel in input image */
- uint32 rowsperstrip = (uint32) -1;
- uint16 photometric = PHOTOMETRIC_MINISBLACK;
- int fd = 0;
- struct stat instat;
- char *outfilename = NULL, *infilename = NULL;
- TIFF *out = NULL;
-
- BMPFileHeader file_hdr;
- BMPInfoHeader info_hdr;
- int bmp_type;
- uint32 clr_tbl_size, n_clr_elems = 3;
- unsigned char *clr_tbl;
- unsigned short *red_tbl = NULL, *green_tbl = NULL, *blue_tbl = NULL;
- uint32 row, clr;
-
- int c;
- extern int optind;
- extern char* optarg;
-
- while ((c = getopt(argc, argv, "c:r:o:h")) != -1) {
- switch (c) {
- case 'c': /* compression scheme */
- if (!processCompressOptions(optarg))
- usage();
- break;
- case 'r': /* rows/strip */
- rowsperstrip = atoi(optarg);
- break;
- case 'o':
- outfilename = optarg;
- break;
- case 'h':
- usage();
- default:
- break;
- }
- }
-
- if (argc - optind < 2)
- usage();
-
- if (outfilename == NULL)
- outfilename = argv[argc-1];
- out = TIFFOpen(outfilename, "w");
- if (out == NULL) {
- TIFFError(infilename, "Cannot open file %s for output",
- outfilename);
- goto bad3;
- }
-
-
- while (optind < argc-1) {
- infilename = argv[optind];
- optind++;
-
- fd = open(infilename, O_RDONLY|O_BINARY, 0);
- if (fd < 0) {
- TIFFError(infilename, "Cannot open input file");
- return -1;
- }
-
- read(fd, file_hdr.bType, 2);
- if(file_hdr.bType[0] != 'B' || file_hdr.bType[1] != 'M') {
- TIFFError(infilename, "File is not BMP");
- goto bad;
- }
-
-/* -------------------------------------------------------------------- */
-/* Read the BMPFileHeader. We need iOffBits value only */
-/* -------------------------------------------------------------------- */
- lseek(fd, 10, SEEK_SET);
- read(fd, &file_hdr.iOffBits, 4);
-#ifdef WORDS_BIGENDIAN
- TIFFSwabLong(&file_hdr.iOffBits);
-#endif
- fstat(fd, &instat);
- file_hdr.iSize = instat.st_size;
-
-/* -------------------------------------------------------------------- */
-/* Read the BMPInfoHeader. */
-/* -------------------------------------------------------------------- */
-
- lseek(fd, BFH_SIZE, SEEK_SET);
- read(fd, &info_hdr.iSize, 4);
-#ifdef WORDS_BIGENDIAN
- TIFFSwabLong(&info_hdr.iSize);
-#endif
-
- if (info_hdr.iSize == BIH_WIN4SIZE)
- bmp_type = BMPT_WIN4;
- else if (info_hdr.iSize == BIH_OS21SIZE)
- bmp_type = BMPT_OS21;
- else if (info_hdr.iSize == BIH_OS22SIZE
- || info_hdr.iSize == 16)
- bmp_type = BMPT_OS22;
- else
- bmp_type = BMPT_WIN5;
-
- if (bmp_type == BMPT_WIN4
- || bmp_type == BMPT_WIN5
- || bmp_type == BMPT_OS22) {
- read(fd, &info_hdr.iWidth, 4);
- read(fd, &info_hdr.iHeight, 4);
- read(fd, &info_hdr.iPlanes, 2);
- read(fd, &info_hdr.iBitCount, 2);
- read(fd, &info_hdr.iCompression, 4);
- read(fd, &info_hdr.iSizeImage, 4);
- read(fd, &info_hdr.iXPelsPerMeter, 4);
- read(fd, &info_hdr.iYPelsPerMeter, 4);
- read(fd, &info_hdr.iClrUsed, 4);
- read(fd, &info_hdr.iClrImportant, 4);
-#ifdef WORDS_BIGENDIAN
- TIFFSwabLong((uint32*) &info_hdr.iWidth);
- TIFFSwabLong((uint32*) &info_hdr.iHeight);
- TIFFSwabShort((uint16*) &info_hdr.iPlanes);
- TIFFSwabShort((uint16*) &info_hdr.iBitCount);
- TIFFSwabLong((uint32*) &info_hdr.iCompression);
- TIFFSwabLong((uint32*) &info_hdr.iSizeImage);
- TIFFSwabLong((uint32*) &info_hdr.iXPelsPerMeter);
- TIFFSwabLong((uint32*) &info_hdr.iYPelsPerMeter);
- TIFFSwabLong((uint32*) &info_hdr.iClrUsed);
- TIFFSwabLong((uint32*) &info_hdr.iClrImportant);
-#endif
- n_clr_elems = 4;
- }
-
- if (bmp_type == BMPT_OS22) {
- /*
- * FIXME: different info in different documents
- * regarding this!
- */
- n_clr_elems = 3;
- }
-
- if (bmp_type == BMPT_OS21) {
- int16 iShort;
-
- read(fd, &iShort, 2);
-#ifdef WORDS_BIGENDIAN
- TIFFSwabShort((uint16*) &iShort);
-#endif
- info_hdr.iWidth = iShort;
- read(fd, &iShort, 2);
-#ifdef WORDS_BIGENDIAN
- TIFFSwabShort((uint16*) &iShort);
-#endif
- info_hdr.iHeight = iShort;
- read(fd, &iShort, 2);
-#ifdef WORDS_BIGENDIAN
- TIFFSwabShort((uint16*) &iShort);
-#endif
- info_hdr.iPlanes = iShort;
- read(fd, &iShort, 2);
-#ifdef WORDS_BIGENDIAN
- TIFFSwabShort((uint16*) &iShort);
-#endif
- info_hdr.iBitCount = iShort;
- info_hdr.iCompression = BMPC_RGB;
- n_clr_elems = 3;
- }
-
- if (info_hdr.iBitCount != 1 && info_hdr.iBitCount != 4 &&
- info_hdr.iBitCount != 8 && info_hdr.iBitCount != 16 &&
- info_hdr.iBitCount != 24 && info_hdr.iBitCount != 32) {
- TIFFError(infilename,
- "Cannot process BMP file with bit count %d",
- info_hdr.iBitCount);
- close(fd);
- return 0;
- }
-
- width = info_hdr.iWidth;
- length = (info_hdr.iHeight > 0) ? info_hdr.iHeight : -info_hdr.iHeight;
- if( width <= 0 || length <= 0 )
- {
- TIFFError(infilename,
- "Invalid dimensions of BMP file" );
- close(fd);
- return -1;
- }
-
- switch (info_hdr.iBitCount)
- {
- case 1:
- case 4:
- case 8:
- nbands = 1;
- depth = info_hdr.iBitCount;
- photometric = PHOTOMETRIC_PALETTE;
- /* Allocate memory for colour table and read it. */
- if (info_hdr.iClrUsed)
- clr_tbl_size =
- ((uint32)(1<<depth)<info_hdr.iClrUsed)
- ? (uint32) (1 << depth)
- : info_hdr.iClrUsed;
- else
- clr_tbl_size = 1 << depth;
- clr_tbl = (unsigned char *)
- _TIFFmalloc(n_clr_elems * clr_tbl_size);
- if (!clr_tbl) {
- TIFFError(infilename,
- "Can't allocate space for color table");
- goto bad;
- }
-
- lseek(fd, BFH_SIZE + info_hdr.iSize, SEEK_SET);
- read(fd, clr_tbl, n_clr_elems * clr_tbl_size);
-
- red_tbl = (unsigned short*)
- _TIFFmalloc(((tmsize_t)1)<<depth * sizeof(unsigned short));
- if (!red_tbl) {
- TIFFError(infilename,
- "Can't allocate space for red component table");
- _TIFFfree(clr_tbl);
- goto bad1;
- }
- green_tbl = (unsigned short*)
- _TIFFmalloc(((tmsize_t)1)<<depth * sizeof(unsigned short));
- if (!green_tbl) {
- TIFFError(infilename,
- "Can't allocate space for green component table");
- _TIFFfree(clr_tbl);
- goto bad2;
- }
- blue_tbl = (unsigned short*)
- _TIFFmalloc(((tmsize_t)1)<<depth * sizeof(unsigned short));
- if (!blue_tbl) {
- TIFFError(infilename,
- "Can't allocate space for blue component table");
- _TIFFfree(clr_tbl);
- goto bad3;
- }
-
- for(clr = 0; clr < clr_tbl_size; clr++) {
- red_tbl[clr] = 257*clr_tbl[clr*n_clr_elems+2];
- green_tbl[clr] = 257*clr_tbl[clr*n_clr_elems+1];
- blue_tbl[clr] = 257*clr_tbl[clr*n_clr_elems];
- }
-
- _TIFFfree(clr_tbl);
- break;
- case 16:
- case 24:
- nbands = 3;
- depth = info_hdr.iBitCount / nbands;
- photometric = PHOTOMETRIC_RGB;
- break;
- case 32:
- nbands = 3;
- depth = 8;
- photometric = PHOTOMETRIC_RGB;
- break;
- default:
- break;
- }
-
-/* -------------------------------------------------------------------- */
-/* Create output file. */
-/* -------------------------------------------------------------------- */
-
- TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width);
- TIFFSetField(out, TIFFTAG_IMAGELENGTH, length);
- TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, nbands);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, depth);
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric);
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP,
- TIFFDefaultStripSize(out, rowsperstrip));
-
- if (red_tbl && green_tbl && blue_tbl) {
- TIFFSetField(out, TIFFTAG_COLORMAP,
- red_tbl, green_tbl, blue_tbl);
- }
-
- if (compression == (uint16) -1)
- compression = COMPRESSION_PACKBITS;
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- switch (compression) {
- case COMPRESSION_JPEG:
- if (photometric == PHOTOMETRIC_RGB
- && jpegcolormode == JPEGCOLORMODE_RGB)
- photometric = PHOTOMETRIC_YCBCR;
- TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality);
- TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode);
- break;
- case COMPRESSION_LZW:
- case COMPRESSION_DEFLATE:
- if (predictor != 0)
- TIFFSetField(out, TIFFTAG_PREDICTOR, predictor);
- break;
- }
-
-/* -------------------------------------------------------------------- */
-/* Read uncompressed image data. */
-/* -------------------------------------------------------------------- */
-
- if (info_hdr.iCompression == BMPC_RGB) {
- uint32 offset, size;
- char *scanbuf;
-
- /* XXX: Avoid integer overflow. We can calculate size
- * in one step using
- *
- * size = ((width * info_hdr.iBitCount + 31) & ~31) / 8
- *
- * formulae, but we should check for overflow
- * conditions during calculation.
- */
- size = width * info_hdr.iBitCount + 31;
- if (!width || !info_hdr.iBitCount
- || (size - 31) / info_hdr.iBitCount != width ) {
- TIFFError(infilename,
- "Wrong image parameters; can't "
- "allocate space for scanline buffer");
- goto bad3;
- }
- size = (size & ~31) / 8;
-
- scanbuf = (char *) _TIFFmalloc(size);
- if (!scanbuf) {
- TIFFError(infilename,
- "Can't allocate space for scanline buffer");
- goto bad3;
- }
-
- for (row = 0; row < length; row++) {
- if (info_hdr.iHeight > 0)
- offset = file_hdr.iOffBits+(length-row-1)*size;
- else
- offset = file_hdr.iOffBits + row * size;
- if (lseek(fd, offset, SEEK_SET) == (off_t)-1) {
- TIFFError(infilename,
- "scanline %lu: Seek error",
- (unsigned long) row);
- break;
- }
-
- if (read(fd, scanbuf, size) < 0) {
- TIFFError(infilename,
- "scanline %lu: Read error",
- (unsigned long) row);
- break;
- }
-
- rearrangePixels(scanbuf, width, info_hdr.iBitCount);
-
- if (TIFFWriteScanline(out, scanbuf, row, 0)<0) {
- TIFFError(infilename,
- "scanline %lu: Write error",
- (unsigned long) row);
- break;
- }
- }
-
- _TIFFfree(scanbuf);
-
-/* -------------------------------------------------------------------- */
-/* Read compressed image data. */
-/* -------------------------------------------------------------------- */
-
- } else if ( info_hdr.iCompression == BMPC_RLE8
- || info_hdr.iCompression == BMPC_RLE4 ) {
- uint32 i, j, k, runlength;
- uint32 compr_size, uncompr_size;
- unsigned char *comprbuf;
- unsigned char *uncomprbuf;
-
- compr_size = file_hdr.iSize - file_hdr.iOffBits;
- uncompr_size = width * length;
- /* Detect int overflow */
- if( uncompr_size / width != length )
- {
- TIFFError(infilename,
- "Invalid dimensions of BMP file" );
- close(fd);
- return -1;
- }
- comprbuf = (unsigned char *) _TIFFmalloc( compr_size );
- if (!comprbuf) {
- TIFFError(infilename,
- "Can't allocate space for compressed scanline buffer");
- goto bad3;
- }
- uncomprbuf = (unsigned char *)_TIFFmalloc(uncompr_size);
- if (!uncomprbuf) {
- TIFFError(infilename,
- "Can't allocate space for uncompressed scanline buffer");
- goto bad3;
- }
-
- lseek(fd, file_hdr.iOffBits, SEEK_SET);
- read(fd, comprbuf, compr_size);
- i = 0;
- j = 0;
- if (info_hdr.iBitCount == 8) { /* RLE8 */
- while(j < uncompr_size && i < compr_size) {
- if ( comprbuf[i] ) {
- runlength = comprbuf[i++];
- while( runlength > 0
- && j < uncompr_size
- && i < compr_size ) {
- uncomprbuf[j++] = comprbuf[i];
- runlength--;
- }
- i++;
- } else {
- i++;
- if (comprbuf[i] == 0) /* Next scanline */
- i++;
- else if (comprbuf[i] == 1) /* End of image */
- break;
- else if (comprbuf[i] == 2) { /* Move to... */
- i++;
- if (i < compr_size - 1) {
- j+=comprbuf[i]+comprbuf[i+1]*width;
- i += 2;
- }
- else
- break;
- } else { /* Absolute mode */
- runlength = comprbuf[i++];
- for (k = 0; k < runlength && j < uncompr_size && i < compr_size; k++)
- uncomprbuf[j++] = comprbuf[i++];
- if ( k & 0x01 )
- i++;
- }
- }
- }
- }
- else { /* RLE4 */
- while( j < uncompr_size && i < compr_size ) {
- if ( comprbuf[i] ) {
- runlength = comprbuf[i++];
- while( runlength > 0 && j < uncompr_size && i < compr_size ) {
- if ( runlength & 0x01 )
- uncomprbuf[j++] = (comprbuf[i] & 0xF0) >> 4;
- else
- uncomprbuf[j++] = comprbuf[i] & 0x0F;
- runlength--;
- }
- i++;
- } else {
- i++;
- if (comprbuf[i] == 0) /* Next scanline */
- i++;
- else if (comprbuf[i] == 1) /* End of image */
- break;
- else if (comprbuf[i] == 2) { /* Move to... */
- i++;
- if (i < compr_size - 1) {
- j+=comprbuf[i]+comprbuf[i+1]*width;
- i += 2;
- }
- else
- break;
- } else { /* Absolute mode */
- runlength = comprbuf[i++];
- for (k = 0; k < runlength && j < uncompr_size && i < compr_size; k++) {
- if (k & 0x01)
- uncomprbuf[j++] = comprbuf[i++] & 0x0F;
- else
- uncomprbuf[j++] = (comprbuf[i] & 0xF0) >> 4;
- }
- if (k & 0x01)
- i++;
- }
- }
- }
- }
-
- _TIFFfree(comprbuf);
-
- for (row = 0; row < length; row++) {
- if (TIFFWriteScanline(out,
- uncomprbuf + (length - row - 1) * width,
- row, 0) < 0) {
- TIFFError(infilename,
- "scanline %lu: Write error.\n",
- (unsigned long) row);
- }
- }
-
- _TIFFfree(uncomprbuf);
- }
- TIFFWriteDirectory(out);
- if (blue_tbl) {
- _TIFFfree(blue_tbl);
- blue_tbl=NULL;
- }
- if (green_tbl) {
- _TIFFfree(green_tbl);
- green_tbl=NULL;
- }
- if (red_tbl) {
- _TIFFfree(red_tbl);
- red_tbl=NULL;
- }
- }
-
-bad3:
- if (blue_tbl)
- _TIFFfree(blue_tbl);
-bad2:
- if (green_tbl)
- _TIFFfree(green_tbl);
-bad1:
- if (red_tbl)
- _TIFFfree(red_tbl);
-bad:
- close(fd);
-
- if (out)
- TIFFClose(out);
- return 0;
-}
-
-/*
- * Image data in BMP file stored in BGR (or ABGR) format. We should rearrange
- * pixels to RGB (RGBA) format.
- */
-static void
-rearrangePixels(char *buf, uint32 width, uint32 bit_count)
-{
- char tmp;
- uint32 i;
-
- switch(bit_count) {
- case 16: /* FIXME: need a sample file */
- break;
- case 24:
- for (i = 0; i < width; i++, buf += 3) {
- tmp = *buf;
- *buf = *(buf + 2);
- *(buf + 2) = tmp;
- }
- break;
- case 32:
- {
- char *buf1 = buf;
-
- for (i = 0; i < width; i++, buf += 4) {
- tmp = *buf;
- *buf1++ = *(buf + 2);
- *buf1++ = *(buf + 1);
- *buf1++ = tmp;
- }
- }
- break;
- default:
- break;
- }
-}
-
-static int
-processCompressOptions(char* opt)
-{
- if (strcmp(opt, "none") == 0)
- compression = COMPRESSION_NONE;
- else if (strcmp(opt, "packbits") == 0)
- compression = COMPRESSION_PACKBITS;
- else if (strncmp(opt, "jpeg", 4) == 0) {
- char* cp = strchr(opt, ':');
-
- compression = COMPRESSION_JPEG;
- while( cp )
- {
- if (isdigit((int)cp[1]))
- quality = atoi(cp+1);
- else if (cp[1] == 'r' )
- jpegcolormode = JPEGCOLORMODE_RAW;
- else
- usage();
-
- cp = strchr(cp+1,':');
- }
- } else if (strncmp(opt, "lzw", 3) == 0) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_LZW;
- } else if (strncmp(opt, "zip", 3) == 0) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_DEFLATE;
- } else
- return (0);
- return (1);
-}
-
-static char* stuff[] = {
-"bmp2tiff --- convert Windows BMP files to TIFF",
-"usage: bmp2tiff [options] input.bmp [input2.bmp ...] output.tif",
-"where options are:",
-" -r # make each strip have no more than # rows",
-"",
-" -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding",
-" -c zip[:opts] compress output with deflate encoding",
-" -c jpeg[:opts]compress output with JPEG encoding",
-" -c packbits compress output with packbits encoding",
-" -c none use no compression algorithm on output",
-"",
-"JPEG options:",
-" # set compression quality level (0-100, default 75)",
-" r output color image as RGB rather than YCbCr",
-"For example, -c jpeg:r:50 to get JPEG-encoded RGB data with 50% comp. quality",
-"",
-"LZW and deflate options:",
-" # set predictor value",
-"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing",
-" -o out.tif write output to out.tif",
-" -h this help message",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/fax2ps.c b/tiff/tools/fax2ps.c
deleted file mode 100755
index 14dac71..0000000
--- a/tiff/tools/fax2ps.c
+++ /dev/null
@@ -1,454 +0,0 @@
-/* $Id: fax2ps.c,v 1.28 2014-11-20 16:47:21 erouault Exp $" */
-
-/*
- * Copyright (c) 1991-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-#include "tif_config.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-#include <time.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#ifdef HAVE_IO_H
-# include <io.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffio.h"
-
-float defxres = 204.; /* default x resolution (pixels/inch) */
-float defyres = 98.; /* default y resolution (lines/inch) */
-const float half = 0.5;
-const float points = 72.0;
-float pageWidth = 0; /* image page width (inches) */
-float pageHeight = 0; /* image page length (inches) */
-int scaleToPage = 0; /* if true, scale raster to page dimensions */
-int totalPages = 0; /* total # pages printed */
-int row; /* current output row */
-int maxline = 512; /* max output line of PostScript */
-
-/*
- * Turn a bit-mapped scanline into the appropriate sequence
- * of PostScript characters to be rendered.
- *
- * Original version written by Bret D. Whissel,
- * Florida State University Meteorology Department
- * March 13-15, 1995.
- */
-static void
-printruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx)
-{
- static struct {
- char white, black;
- unsigned short width;
- } WBarr[] = {
- { 'd', 'n', 512 }, { 'e', 'o', 256 }, { 'f', 'p', 128 },
- { 'g', 'q', 64 }, { 'h', 'r', 32 }, { 'i', 's', 16 },
- { 'j', 't', 8 }, { 'k', 'u', 4 }, { 'l', 'v', 2 },
- { 'm', 'w', 1 }
- };
- static char* svalue =
- " !\"#$&'*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abc";
- int colormode = 1; /* 0 for white, 1 for black */
- uint32 runlength = 0;
- int n = maxline;
- uint32 x = 0;
- int l;
-
- (void) buf;
- printf("%d m(", row++);
- while (runs < erun) {
- if (runlength <= 0) {
- colormode ^= 1;
- runlength = *runs++;
- if (x+runlength > lastx)
- runlength = runs[-1] = lastx-x;
- x += runlength;
- if (!colormode && runs == erun)
- break; /* don't bother printing the final white run */
- }
- /*
- * If a runlength is greater than 6 pixels, then spit out
- * black or white characters until the runlength drops to
- * 6 or less. Once a runlength is <= 6, then combine black
- * and white runlengths until a 6-pixel pattern is obtained.
- * Then write out the special character. Six-pixel patterns
- * were selected since 64 patterns is the largest power of
- * two less than the 92 "easily printable" PostScript
- * characters (i.e., no escape codes or octal chars).
- */
- l = 0;
- while (runlength > 6) { /* Run is greater than six... */
- if (runlength >= WBarr[l].width) {
- if (n == 0) {
- putchar('\n');
- n = maxline;
- }
- putchar(colormode ? WBarr[l].black : WBarr[l].white), n--;
- runlength -= WBarr[l].width;
- } else
- l++;
- }
- while (runlength > 0 && runlength <= 6) {
- uint32 bitsleft = 6;
- int t = 0;
- while (bitsleft) {
- if (runlength <= bitsleft) {
- if (colormode)
- t |= ((1 << runlength)-1) << (bitsleft-runlength);
- bitsleft -= runlength;
- runlength = 0;
- if (bitsleft) {
- if (runs >= erun)
- break;
- colormode ^= 1;
- runlength = *runs++;
- if (x+runlength > lastx)
- runlength = runs[-1] = lastx-x;
- x += runlength;
- }
- } else { /* runlength exceeds bits left */
- if (colormode)
- t |= ((1 << bitsleft)-1);
- runlength -= bitsleft;
- bitsleft = 0;
- }
- }
- if (n == 0) {
- putchar('\n');
- n = maxline;
- }
- putchar(svalue[t]), n--;
- }
- }
- printf(")s\n");
-}
-
-/*
- * Create a special PostScript font for printing FAX documents. By taking
- * advantage of the font-cacheing mechanism, a substantial speed-up in
- * rendering time is realized.
- */
-static void
-emitFont(FILE* fd)
-{
- static const char* fontPrologue[] = {
- "/newfont 10 dict def newfont begin /FontType 3 def /FontMatrix [1",
- "0 0 1 0 0] def /FontBBox [0 0 512 1] def /Encoding 256 array def",
- "0 1 31{Encoding exch /255 put}for 120 1 255{Encoding exch /255",
- "put}for Encoding 37 /255 put Encoding 40 /255 put Encoding 41 /255",
- "put Encoding 92 /255 put /count 0 def /ls{Encoding exch count 3",
- "string cvs cvn put /count count 1 add def}def 32 1 36{ls}for",
- "38 1 39{ls}for 42 1 91{ls}for 93 1 99{ls}for /count 100",
- "def 100 1 119{ls}for /CharDict 5 dict def CharDict begin /white",
- "{dup 255 eq{pop}{1 dict begin 100 sub neg 512 exch bitshift",
- "/cw exch def cw 0 0 0 cw 1 setcachedevice end}ifelse}def /black",
- "{dup 255 eq{pop}{1 dict begin 110 sub neg 512 exch bitshift",
- "/cw exch def cw 0 0 0 cw 1 setcachedevice 0 0 moveto cw 0 rlineto",
- "0 1 rlineto cw neg 0 rlineto closepath fill end}ifelse}def /numbuild",
- "{dup 255 eq{pop}{6 0 0 0 6 1 setcachedevice 0 1 5{0 moveto",
- "dup 32 and 32 eq{1 0 rlineto 0 1 rlineto -1 0 rlineto closepath",
- "fill newpath}if 1 bitshift}for pop}ifelse}def /.notdef {}",
- "def /255 {}def end /BuildChar{exch begin dup 110 ge{Encoding",
- "exch get 3 string cvs cvi CharDict /black get}{dup 100 ge {Encoding",
- "exch get 3 string cvs cvi CharDict /white get}{Encoding exch get",
- "3 string cvs cvi CharDict /numbuild get}ifelse}ifelse exec end",
- "}def end /Bitfont newfont definefont 1 scalefont setfont",
- NULL
- };
- int i;
- for (i = 0; fontPrologue[i] != NULL; i++)
- fprintf(fd, "%s\n", fontPrologue[i]);
-}
-
-void
-printTIF(TIFF* tif, uint16 pageNumber)
-{
- uint32 w, h;
- uint16 unit, compression;
- float xres, yres, scale = 1.0;
- tstrip_t s, ns;
- time_t creation_time;
-
- TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
- TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);
- if (!TIFFGetField(tif, TIFFTAG_COMPRESSION, &compression)
- || compression < COMPRESSION_CCITTRLE
- || compression > COMPRESSION_CCITT_T6)
- return;
- if (!TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres) || !xres) {
- TIFFWarning(TIFFFileName(tif),
- "No x-resolution, assuming %g dpi", defxres);
- xres = defxres;
- }
- if (!TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres) || !yres) {
- TIFFWarning(TIFFFileName(tif),
- "No y-resolution, assuming %g lpi", defyres);
- yres = defyres; /* XXX */
- }
- if (TIFFGetField(tif, TIFFTAG_RESOLUTIONUNIT, &unit) &&
- unit == RESUNIT_CENTIMETER) {
- xres *= 2.54F;
- yres *= 2.54F;
- }
- if (pageWidth == 0)
- pageWidth = w / xres;
- if (pageHeight == 0)
- pageHeight = h / yres;
-
- printf("%%!PS-Adobe-3.0\n");
- printf("%%%%Creator: fax2ps\n");
-#ifdef notdef
- printf("%%%%Title: %s\n", file);
-#endif
- creation_time = time(0);
- printf("%%%%CreationDate: %s", ctime(&creation_time));
- printf("%%%%Origin: 0 0\n");
- printf("%%%%BoundingBox: 0 0 %u %u\n",
- (int)(pageWidth * points), (int)(pageHeight * points)); /* XXX */
- printf("%%%%Pages: (atend)\n");
- printf("%%%%EndComments\n");
- printf("%%%%BeginProlog\n");
- emitFont(stdout);
- printf("/d{bind def}def\n"); /* bind and def proc */
- printf("/m{0 exch moveto}d\n");
- printf("/s{show}d\n");
- printf("/p{showpage}d \n"); /* end page */
- printf("%%%%EndProlog\n");
- printf("%%%%Page: \"%u\" %u\n", pageNumber, pageNumber);
- printf("/$pageTop save def gsave\n");
- if (scaleToPage)
- scale = pageHeight / (h/yres) < pageWidth / (w/xres) ?
- pageHeight / (h/yres) : pageWidth / (w/xres);
- printf("%g %g translate\n",
- points * (pageWidth - scale*w/xres) * half,
- points * (scale*h/yres + (pageHeight - scale*h/yres) * half));
- printf("%g %g scale\n", points/xres*scale, -points/yres*scale);
- printf("0 setgray\n");
- TIFFSetField(tif, TIFFTAG_FAXFILLFUNC, printruns);
- ns = TIFFNumberOfStrips(tif);
- row = 0;
- for (s = 0; s < ns; s++)
- (void) TIFFReadEncodedStrip(tif, s, (tdata_t) NULL, (tsize_t) -1);
- printf("p\n");
- printf("grestore $pageTop restore\n");
- totalPages++;
-}
-
-#define GetPageNumber(tif) \
-TIFFGetField(tif, TIFFTAG_PAGENUMBER, &pn, &ptotal)
-
-int
-findPage(TIFF* tif, uint16 pageNumber)
-{
- uint16 pn = (uint16) -1;
- uint16 ptotal = (uint16) -1;
- if (GetPageNumber(tif)) {
- while (pn != (pageNumber-1) && TIFFReadDirectory(tif) && GetPageNumber(tif))
- ;
- return (pn == (pageNumber-1));
- } else
- return (TIFFSetDirectory(tif, (tdir_t)(pageNumber-1)));
-}
-
-void
-fax2ps(TIFF* tif, uint16 npages, uint16* pages, char* filename)
-{
- if (npages > 0) {
- uint16 pn, ptotal;
- int i;
-
- if (!GetPageNumber(tif))
- fprintf(stderr, "%s: No page numbers, counting directories.\n",
- filename);
- for (i = 0; i < npages; i++) {
- if (findPage(tif, pages[i]))
- printTIF(tif, pages[i]);
- else
- fprintf(stderr, "%s: No page number %d\n", filename, pages[i]);
- }
- } else {
- uint16 pageNumber = 0;
- do
- printTIF(tif, pageNumber++);
- while (TIFFReadDirectory(tif));
- }
-}
-
-#undef GetPageNumber
-
-static int
-pcompar(const void* va, const void* vb)
-{
- const int* pa = (const int*) va;
- const int* pb = (const int*) vb;
- return (*pa - *pb);
-}
-
-static void usage(int code);
-
-int
-main(int argc, char** argv)
-{
- extern int optind;
- extern char* optarg;
- uint16 *pages = NULL, npages = 0, pageNumber;
- int c, dowarnings = 0; /* if 1, enable library warnings */
- TIFF* tif;
-
- while ((c = getopt(argc, argv, "l:p:x:y:W:H:wS")) != -1)
- switch (c) {
- case 'H': /* page height */
- pageHeight = (float)atof(optarg);
- break;
- case 'S': /* scale to page */
- scaleToPage = 1;
- break;
- case 'W': /* page width */
- pageWidth = (float)atof(optarg);
- break;
- case 'p': /* print specific page */
- pageNumber = (uint16)atoi(optarg);
- if (pages)
- pages = (uint16*) realloc(pages, (npages+1)*sizeof(uint16));
- else
- pages = (uint16*) malloc(sizeof(uint16));
- if( pages == NULL )
- {
- fprintf(stderr, "Out of memory\n");
- exit(-1);
- }
- pages[npages++] = pageNumber;
- break;
- case 'w':
- dowarnings = 1;
- break;
- case 'x':
- defxres = (float)atof(optarg);
- break;
- case 'y':
- defyres = (float)atof(optarg);
- break;
- case 'l':
- maxline = atoi(optarg);
- break;
- case '?':
- usage(-1);
- }
- if (npages > 0)
- qsort(pages, npages, sizeof(uint16), pcompar);
- if (!dowarnings)
- TIFFSetWarningHandler(0);
- if (optind < argc) {
- do {
- tif = TIFFOpen(argv[optind], "r");
- if (tif) {
- fax2ps(tif, npages, pages, argv[optind]);
- TIFFClose(tif);
- } else
- fprintf(stderr, "%s: Can not open, or not a TIFF file.\n",
- argv[optind]);
- } while (++optind < argc);
- } else {
- int n;
- FILE* fd;
- char buf[16*1024];
-
- fd = tmpfile();
- if (fd == NULL) {
- fprintf(stderr, "Could not obtain temporary file.\n");
- exit(-2);
- }
-#if defined(HAVE_SETMODE) && defined(O_BINARY)
- setmode(fileno(stdin), O_BINARY);
-#endif
- while ((n = read(fileno(stdin), buf, sizeof (buf))) > 0)
- write(fileno(fd), buf, n);
- lseek(fileno(fd), 0, SEEK_SET);
-#if defined(_WIN32) && defined(USE_WIN32_FILEIO)
- tif = TIFFFdOpen(_get_osfhandle(fileno(fd)), "temp", "r");
-#else
- tif = TIFFFdOpen(fileno(fd), "temp", "r");
-#endif
- if (tif) {
- fax2ps(tif, npages, pages, "<stdin>");
- TIFFClose(tif);
- } else
- fprintf(stderr, "Can not open, or not a TIFF file.\n");
- fclose(fd);
- }
- printf("%%%%Trailer\n");
- printf("%%%%Pages: %u\n", totalPages);
- printf("%%%%EOF\n");
-
- return (0);
-}
-
-char* stuff[] = {
-"usage: fax2ps [options] [input.tif ...]",
-"where options are:",
-" -w suppress warning messages",
-" -l chars set maximum output line length for generated PostScript",
-" -p page# select page to print (can use multiple times)",
-" -x xres set default horizontal resolution of input data (dpi)",
-" -y yres set default vertical resolution of input data (lpi)",
-" -S scale output to page size",
-" -W width set output page width (inches), default is 8.5",
-" -H height set output page height (inches), default is 11",
-NULL
-};
-
-static void
-usage(int code)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(code);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/fax2tiff.c b/tiff/tools/fax2tiff.c
deleted file mode 100755
index 8881e5f..0000000
--- a/tiff/tools/fax2tiff.c
+++ /dev/null
@@ -1,469 +0,0 @@
-/* $Id: fax2tiff.c,v 1.22 2010-03-10 18:56:49 bfriesen Exp $ */
-
-/*
- * Copyright (c) 1990-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-/*
- * Convert a CCITT Group 3 or 4 FAX file to TIFF Group 3 or 4 format.
- */
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h> /* should have atof & getopt */
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#ifdef HAVE_IO_H
-# include <io.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffiop.h"
-
-#ifndef EXIT_SUCCESS
-# define EXIT_SUCCESS 0
-#endif
-#ifndef EXIT_FAILURE
-# define EXIT_FAILURE 1
-#endif
-
-#define TIFFhowmany8(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3)
-
-TIFF *faxTIFF;
-char *rowbuf;
-char *refbuf;
-
-uint32 xsize = 1728;
-int verbose;
-int stretch;
-uint16 badfaxrun;
-uint32 badfaxlines;
-
-int copyFaxFile(TIFF* tifin, TIFF* tifout);
-static void usage(void);
-
-int
-main(int argc, char* argv[])
-{
- FILE *in;
- TIFF *out = NULL;
- TIFFErrorHandler whandler = NULL;
- int compression_in = COMPRESSION_CCITTFAX3;
- int compression_out = COMPRESSION_CCITTFAX3;
- int fillorder_in = FILLORDER_LSB2MSB;
- int fillorder_out = FILLORDER_LSB2MSB;
- uint32 group3options_in = 0; /* 1d-encoded */
- uint32 group3options_out = 0; /* 1d-encoded */
- uint32 group4options_in = 0; /* compressed */
- uint32 group4options_out = 0; /* compressed */
- uint32 defrowsperstrip = (uint32) 0;
- uint32 rowsperstrip;
- int photometric_in = PHOTOMETRIC_MINISWHITE;
- int photometric_out = PHOTOMETRIC_MINISWHITE;
- int mode = FAXMODE_CLASSF;
- int rows;
- int c;
- int pn, npages;
- float resY = 196.0;
- extern int optind;
- extern char* optarg;
-
-
- while ((c = getopt(argc, argv, "R:X:o:1234ABLMPUW5678abcflmprsuvwz?")) != -1)
- switch (c) {
- /* input-related options */
- case '3': /* input is g3-encoded */
- compression_in = COMPRESSION_CCITTFAX3;
- break;
- case '4': /* input is g4-encoded */
- compression_in = COMPRESSION_CCITTFAX4;
- break;
- case 'U': /* input is uncompressed (g3 and g4) */
- group3options_in |= GROUP3OPT_UNCOMPRESSED;
- group4options_in |= GROUP4OPT_UNCOMPRESSED;
- break;
- case '1': /* input is 1d-encoded (g3 only) */
- group3options_in &= ~GROUP3OPT_2DENCODING;
- break;
- case '2': /* input is 2d-encoded (g3 only) */
- group3options_in |= GROUP3OPT_2DENCODING;
- break;
- case 'P': /* input has not-aligned EOL (g3 only) */
- group3options_in &= ~GROUP3OPT_FILLBITS;
- break;
- case 'A': /* input has aligned EOL (g3 only) */
- group3options_in |= GROUP3OPT_FILLBITS;
- break;
- case 'W': /* input has 0 mean white */
- photometric_in = PHOTOMETRIC_MINISWHITE;
- break;
- case 'B': /* input has 0 mean black */
- photometric_in = PHOTOMETRIC_MINISBLACK;
- break;
- case 'L': /* input has lsb-to-msb fillorder */
- fillorder_in = FILLORDER_LSB2MSB;
- break;
- case 'M': /* input has msb-to-lsb fillorder */
- fillorder_in = FILLORDER_MSB2LSB;
- break;
- case 'R': /* input resolution */
- resY = (float) atof(optarg);
- break;
- case 'X': /* input width */
- xsize = (uint32) atoi(optarg);
- break;
-
- /* output-related options */
- case '7': /* generate g3-encoded output */
- compression_out = COMPRESSION_CCITTFAX3;
- break;
- case '8': /* generate g4-encoded output */
- compression_out = COMPRESSION_CCITTFAX4;
- break;
- case 'u': /* generate uncompressed output (g3 and g4) */
- group3options_out |= GROUP3OPT_UNCOMPRESSED;
- group4options_out |= GROUP4OPT_UNCOMPRESSED;
- break;
- case '5': /* generate 1d-encoded output (g3 only) */
- group3options_out &= ~GROUP3OPT_2DENCODING;
- break;
- case '6': /* generate 2d-encoded output (g3 only) */
- group3options_out |= GROUP3OPT_2DENCODING;
- break;
- case 'c': /* generate "classic" g3 format */
- mode = FAXMODE_CLASSIC;
- break;
- case 'f': /* generate Class F format */
- mode = FAXMODE_CLASSF;
- break;
- case 'm': /* output's fillorder is msb-to-lsb */
- fillorder_out = FILLORDER_MSB2LSB;
- break;
- case 'l': /* output's fillorder is lsb-to-msb */
- fillorder_out = FILLORDER_LSB2MSB;
- break;
- case 'o':
- out = TIFFOpen(optarg, "w");
- if (out == NULL) {
- fprintf(stderr,
- "%s: Can not create or open %s\n",
- argv[0], optarg);
- return EXIT_FAILURE;
- }
- break;
- case 'a': /* generate EOL-aligned output (g3 only) */
- group3options_out |= GROUP3OPT_FILLBITS;
- break;
- case 'p': /* generate not EOL-aligned output (g3 only) */
- group3options_out &= ~GROUP3OPT_FILLBITS;
- break;
- case 'r': /* rows/strip */
- defrowsperstrip = atol(optarg);
- break;
- case 's': /* stretch image by dup'ng scanlines */
- stretch = 1;
- break;
- case 'w': /* undocumented -- for testing */
- photometric_out = PHOTOMETRIC_MINISWHITE;
- break;
- case 'b': /* undocumented -- for testing */
- photometric_out = PHOTOMETRIC_MINISBLACK;
- break;
- case 'z': /* undocumented -- for testing */
- compression_out = COMPRESSION_LZW;
- break;
- case 'v': /* -v for info */
- verbose++;
- break;
- case '?':
- usage();
- /*NOTREACHED*/
- }
- npages = argc - optind;
- if (npages < 1)
- usage();
-
- rowbuf = _TIFFmalloc(TIFFhowmany8(xsize));
- refbuf = _TIFFmalloc(TIFFhowmany8(xsize));
- if (rowbuf == NULL || refbuf == NULL) {
- fprintf(stderr, "%s: Not enough memory\n", argv[0]);
- return (EXIT_FAILURE);
- }
-
- if (out == NULL) {
- out = TIFFOpen("fax.tif", "w");
- if (out == NULL) {
- fprintf(stderr, "%s: Can not create fax.tif\n",
- argv[0]);
- return (EXIT_FAILURE);
- }
- }
-
- faxTIFF = TIFFClientOpen("(FakeInput)", "w",
- /* TIFFClientOpen() fails if we don't set existing value here */
- TIFFClientdata(out),
- TIFFGetReadProc(out), TIFFGetWriteProc(out),
- TIFFGetSeekProc(out), TIFFGetCloseProc(out),
- TIFFGetSizeProc(out), TIFFGetMapFileProc(out),
- TIFFGetUnmapFileProc(out));
- if (faxTIFF == NULL) {
- fprintf(stderr, "%s: Can not create fake input file\n",
- argv[0]);
- return (EXIT_FAILURE);
- }
- TIFFSetMode(faxTIFF, O_RDONLY);
- TIFFSetField(faxTIFF, TIFFTAG_IMAGEWIDTH, xsize);
- TIFFSetField(faxTIFF, TIFFTAG_SAMPLESPERPIXEL, 1);
- TIFFSetField(faxTIFF, TIFFTAG_BITSPERSAMPLE, 1);
- TIFFSetField(faxTIFF, TIFFTAG_FILLORDER, fillorder_in);
- TIFFSetField(faxTIFF, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- TIFFSetField(faxTIFF, TIFFTAG_PHOTOMETRIC, photometric_in);
- TIFFSetField(faxTIFF, TIFFTAG_YRESOLUTION, resY);
- TIFFSetField(faxTIFF, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH);
-
- /* NB: this must be done after directory info is setup */
- TIFFSetField(faxTIFF, TIFFTAG_COMPRESSION, compression_in);
- if (compression_in == COMPRESSION_CCITTFAX3)
- TIFFSetField(faxTIFF, TIFFTAG_GROUP3OPTIONS, group3options_in);
- else if (compression_in == COMPRESSION_CCITTFAX4)
- TIFFSetField(faxTIFF, TIFFTAG_GROUP4OPTIONS, group4options_in);
- for (pn = 0; optind < argc; pn++, optind++) {
- in = fopen(argv[optind], "rb");
- if (in == NULL) {
- fprintf(stderr,
- "%s: %s: Can not open\n", argv[0], argv[optind]);
- continue;
- }
-#if defined(_WIN32) && defined(USE_WIN32_FILEIO)
- TIFFSetClientdata(faxTIFF, (thandle_t)_get_osfhandle(fileno(in)));
-#else
- TIFFSetClientdata(faxTIFF, (thandle_t)fileno(in));
-#endif
- TIFFSetFileName(faxTIFF, (const char*)argv[optind]);
- TIFFSetField(out, TIFFTAG_IMAGEWIDTH, xsize);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 1);
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression_out);
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric_out);
- TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 1);
- switch (compression_out) {
- /* g3 */
- case COMPRESSION_CCITTFAX3:
- TIFFSetField(out, TIFFTAG_GROUP3OPTIONS,
- group3options_out);
- TIFFSetField(out, TIFFTAG_FAXMODE, mode);
- rowsperstrip =
- (defrowsperstrip)?defrowsperstrip:(uint32)-1L;
- break;
-
- /* g4 */
- case COMPRESSION_CCITTFAX4:
- TIFFSetField(out, TIFFTAG_GROUP4OPTIONS,
- group4options_out);
- TIFFSetField(out, TIFFTAG_FAXMODE, mode);
- rowsperstrip =
- (defrowsperstrip)?defrowsperstrip:(uint32)-1L;
- break;
-
- default:
- rowsperstrip = (defrowsperstrip) ?
- defrowsperstrip : TIFFDefaultStripSize(out, 0);
- }
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- TIFFSetField(out, TIFFTAG_FILLORDER, fillorder_out);
- TIFFSetField(out, TIFFTAG_SOFTWARE, "fax2tiff");
- TIFFSetField(out, TIFFTAG_XRESOLUTION, 204.0);
- if (!stretch) {
- TIFFGetField(faxTIFF, TIFFTAG_YRESOLUTION, &resY);
- TIFFSetField(out, TIFFTAG_YRESOLUTION, resY);
- } else
- TIFFSetField(out, TIFFTAG_YRESOLUTION, 196.);
- TIFFSetField(out, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH);
- TIFFSetField(out, TIFFTAG_PAGENUMBER, pn, npages);
-
- if (!verbose)
- whandler = TIFFSetWarningHandler(NULL);
- rows = copyFaxFile(faxTIFF, out);
- fclose(in);
- if (!verbose)
- (void) TIFFSetWarningHandler(whandler);
-
- TIFFSetField(out, TIFFTAG_IMAGELENGTH, rows);
-
- if (verbose) {
- fprintf(stderr, "%s:\n", argv[optind]);
- fprintf(stderr, "%d rows in input\n", rows);
- fprintf(stderr, "%ld total bad rows\n",
- (long) badfaxlines);
- fprintf(stderr, "%d max consecutive bad rows\n", badfaxrun);
- }
- if (compression_out == COMPRESSION_CCITTFAX3 &&
- mode == FAXMODE_CLASSF) {
- TIFFSetField(out, TIFFTAG_BADFAXLINES, badfaxlines);
- TIFFSetField(out, TIFFTAG_CLEANFAXDATA, badfaxlines ?
- CLEANFAXDATA_REGENERATED : CLEANFAXDATA_CLEAN);
- TIFFSetField(out, TIFFTAG_CONSECUTIVEBADFAXLINES, badfaxrun);
- }
- TIFFWriteDirectory(out);
- }
- TIFFClose(out);
- _TIFFfree(rowbuf);
- _TIFFfree(refbuf);
- return (EXIT_SUCCESS);
-}
-
-int
-copyFaxFile(TIFF* tifin, TIFF* tifout)
-{
- uint32 row;
- uint32 linesize = TIFFhowmany8(xsize);
- uint16 badrun;
- int ok;
-
- tifin->tif_rawdatasize = (tmsize_t)TIFFGetFileSize(tifin);
- tifin->tif_rawdata = _TIFFmalloc(tifin->tif_rawdatasize);
- if (tifin->tif_rawdata == NULL) {
- TIFFError(tifin->tif_name, "Not enough memory");
- return (0);
- }
- if (!ReadOK(tifin, tifin->tif_rawdata, tifin->tif_rawdatasize)) {
- TIFFError(tifin->tif_name, "Read error at scanline 0");
- return (0);
- }
- tifin->tif_rawcp = tifin->tif_rawdata;
- tifin->tif_rawcc = tifin->tif_rawdatasize;
-
- (*tifin->tif_setupdecode)(tifin);
- (*tifin->tif_predecode)(tifin, (tsample_t) 0);
- tifin->tif_row = 0;
- badfaxlines = 0;
- badfaxrun = 0;
-
- _TIFFmemset(refbuf, 0, linesize);
- row = 0;
- badrun = 0; /* current run of bad lines */
- while (tifin->tif_rawcc > 0) {
- ok = (*tifin->tif_decoderow)(tifin, (tdata_t) rowbuf,
- linesize, 0);
- if (!ok) {
- badfaxlines++;
- badrun++;
- /* regenerate line from previous good line */
- _TIFFmemcpy(rowbuf, refbuf, linesize);
- } else {
- if (badrun > badfaxrun)
- badfaxrun = badrun;
- badrun = 0;
- _TIFFmemcpy(refbuf, rowbuf, linesize);
- }
- tifin->tif_row++;
-
- if (TIFFWriteScanline(tifout, rowbuf, row, 0) < 0) {
- fprintf(stderr, "%s: Write error at row %ld.\n",
- tifout->tif_name, (long) row);
- break;
- }
- row++;
- if (stretch) {
- if (TIFFWriteScanline(tifout, rowbuf, row, 0) < 0) {
- fprintf(stderr, "%s: Write error at row %ld.\n",
- tifout->tif_name, (long) row);
- break;
- }
- row++;
- }
- }
- if (badrun > badfaxrun)
- badfaxrun = badrun;
- _TIFFfree(tifin->tif_rawdata);
- return (row);
-}
-
-char* stuff[] = {
-"usage: fax2tiff [options] input.raw...",
-"where options are:",
-" -3 input data is G3-encoded [default]",
-" -4 input data is G4-encoded",
-" -U input data is uncompressed (G3 or G4)",
-" -1 input data is 1D-encoded (G3 only) [default]",
-" -2 input data is 2D-encoded (G3 only)",
-" -P input is not EOL-aligned (G3 only) [default]",
-" -A input is EOL-aligned (G3 only)",
-" -M input data has MSB2LSB bit order",
-" -L input data has LSB2MSB bit order [default]",
-" -B input data has min 0 means black",
-" -W input data has min 0 means white [default]",
-" -R # input data has # resolution (lines/inch) [default is 196]",
-" -X # input data has # width [default is 1728]",
-"",
-" -o out.tif write output to out.tif",
-" -7 generate G3-encoded output [default]",
-" -8 generate G4-encoded output",
-" -u generate uncompressed output (G3 or G4)",
-" -5 generate 1D-encoded output (G3 only)",
-" -6 generate 2D-encoded output (G3 only) [default]",
-" -p generate not EOL-aligned output (G3 only)",
-" -a generate EOL-aligned output (G3 only) [default]",
-" -c generate \"classic\" TIFF format",
-" -f generate TIFF Class F (TIFF/F) format [default]",
-" -m output fill order is MSB2LSB",
-" -l output fill order is LSB2MSB [default]",
-" -r # make each strip have no more than # rows",
-" -s stretch image by duplicating scanlines",
-" -v print information about conversion work",
-" -z generate LZW compressed output",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(EXIT_FAILURE);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/gif2tiff.c b/tiff/tools/gif2tiff.c
deleted file mode 100755
index 91439f7..0000000
--- a/tiff/tools/gif2tiff.c
+++ /dev/null
@@ -1,548 +0,0 @@
-/* $Id: gif2tiff.c,v 1.16 2014-11-20 16:47:21 erouault Exp $ */
-
-/*
- * Copyright (c) 1990-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-/*
- * convert a GIF file into a TIFF file.
- * based on Paul Haeberli's fromgif program which in turn is
- * based on a GIF file reader by Marcel J.E. Mol March 23 1989
- *
- * if input is 320 by 200 pixel aspect is probably 1.2
- * if input is 640 350 pixel aspect is probably 1.37
- *
- */
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffio.h"
-
-#define GIFGAMMA (1.5) /* smaller makes output img brighter */
-#define IMAX 0xffff /* max intensity value */
-#define EXTRAFUDGE 128 /* some people write BAD .gif files */
-
-#define streq(a,b) (strcmp(a,b) == 0)
-#define strneq(a,b,n) (strncmp(a,b,n) == 0)
-
-unsigned short gamtab[256];
-
-void
-makegamtab(float gam)
-{
- int i;
-
- for(i=0; i<256; i++)
- gamtab[i] = (unsigned short) (IMAX*pow(i/255.0,gam)+0.5);
-}
-
-char* stuff[] = {
-"usage: gif2tiff [options] input.gif output.tif",
-"where options are:",
-" -r # make each strip have no more than # rows",
-"",
-" -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding",
-" -c zip[:opts] compress output with deflate encoding",
-" -c packbits compress output with packbits encoding",
-" -c none use no compression algorithm on output",
-"",
-"LZW and deflate options:",
-" # set predictor value",
-"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-#define COLSIZE 256
-
-unsigned char *stackp;
-unsigned int prefix[4096];
-unsigned char suffix[4096];
-unsigned char stack[4096];
-int datasize,codesize,codemask; /* Decoder working variables */
-int clear,eoi; /* Special code values */
-int avail, oldcode;
-
-FILE *infile;
-int global; /* Is there a global color map? */
-int globalbits; /* Number of bits of global colors */
-unsigned char globalmap[COLSIZE][3];/* RGB values for global color map */
-unsigned char *raster; /* Decoded image data */
-unsigned long width, height;
-unsigned short red[COLSIZE];
-unsigned short green[COLSIZE];
-unsigned short blue[COLSIZE];
-char *filename, *imagename;
-
-static uint16 compression = COMPRESSION_PACKBITS;
-static uint16 predictor = 0;
-static uint32 rowsperstrip = (uint32) -1;
-static int processCompressOptions(char*);
-
-int convert(void);
-int checksignature(void);
-void readscreen(void);
-int readgifimage(char*);
-void readextension(void);
-int readraster(void);
-int process(int, unsigned char**);
-void initcolors(unsigned char [COLSIZE][3], int);
-void rasterize(int, char*);
-
-int
-main(int argc, char* argv[])
-{
- extern int optind;
- extern char *optarg;
- int c, status;
-
- while ((c = getopt(argc, argv, "c:r:")) != -1)
- switch (c) {
- case 'c': /* compression scheme */
- if (!processCompressOptions(optarg))
- usage();
- break;
- case 'r': /* rows/strip */
- rowsperstrip = atoi(optarg);
- break;
- case '?':
- usage();
- /*NOTREACHED*/
- }
- if (argc - optind != 2)
- usage();
-
- makegamtab(GIFGAMMA);
- filename = argv[optind];
- imagename = argv[optind+1];
- if ((infile = fopen(imagename, "rb")) != NULL) {
- int c;
- fclose(infile);
- printf("overwrite %s? ", imagename); fflush(stdout);
- c = getc(stdin);
- if (c != 'y' && c != 'Y')
- return (1);
- }
- if ((infile = fopen(filename, "rb")) == NULL) {
- perror(filename);
- return (1);
- }
- status = convert();
- fclose(infile);
- return (status);
-}
-
-static int
-processCompressOptions(char* opt)
-{
- if (streq(opt, "none"))
- compression = COMPRESSION_NONE;
- else if (streq(opt, "packbits"))
- compression = COMPRESSION_PACKBITS;
- else if (strneq(opt, "lzw", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_LZW;
- } else if (strneq(opt, "zip", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_DEFLATE;
- } else
- return (0);
- return (1);
-}
-
-int
-convert(void)
-{
- int ch;
- char* mode = "w";
-
- if (!checksignature())
- return (-1);
- readscreen();
- while ((ch = getc(infile)) != ';' && ch != EOF) {
- switch (ch) {
- case '\0': break; /* this kludge for non-standard files */
- case ',': if (!readgifimage(mode))
- return (-1);
- mode = "a"; /* subsequent images append */
- break;
- case '!': readextension();
- break;
- default: fprintf(stderr, "illegal GIF block type\n");
- return (-1);
- }
- }
- return (0);
-}
-
-int
-checksignature(void)
-{
- char buf[6];
-
- fread(buf,1,6,infile);
- if (strncmp(buf,"GIF",3)) {
- fprintf(stderr, "file is not a GIF file\n");
- return 0;
- }
- if (strncmp(&buf[3],"87a",3)) {
- fprintf(stderr, "unknown GIF version number\n");
- return 0;
- }
- return 1;
-}
-
-/*
- * readscreen -
- * Get information which is global to all the images stored
- * in the file
- */
-void
-readscreen(void)
-{
- unsigned char buf[7];
-
- fread(buf,1,7,infile);
- global = buf[4] & 0x80;
- if (global) {
- globalbits = (buf[4] & 0x07) + 1;
- fread(globalmap,3,((size_t)1)<<globalbits,infile);
- }
-}
-
-int
-readgifimage(char* mode)
-{
- unsigned char buf[9];
- int local, interleaved;
- unsigned char localmap[256][3];
- int localbits;
- int status;
-
- if (fread(buf, 1, 9, infile) == 0) {
- perror(filename);
- return (0);
- }
- width = buf[4] + (buf[5] << 8);
- height = buf[6] + (buf[7] << 8);
- local = buf[8] & 0x80;
- interleaved = buf[8] & 0x40;
- if (width == 0 || height == 0 || width > 2000000000 / height) {
- fprintf(stderr, "Invalid value of width or height\n");
- return(0);
- }
- if (local == 0 && global == 0) {
- fprintf(stderr, "no colormap present for image\n");
- return (0);
- }
-
- if ((raster = (unsigned char*) _TIFFmalloc(width*height+EXTRAFUDGE)) == NULL) {
- fprintf(stderr, "not enough memory for image\n");
- return (0);
- }
- if (local) {
- localbits = (buf[8] & 0x7) + 1;
-
- fprintf(stderr, " local colors: %d\n", 1<<localbits);
-
- fread(localmap, 3, ((size_t)1)<<localbits, infile);
- initcolors(localmap, 1<<localbits);
- } else if (global) {
- initcolors(globalmap, 1<<globalbits);
- }
- if ((status = readraster()))
- rasterize(interleaved, mode);
- _TIFFfree(raster);
- return status;
-}
-
-/*
- * readextension -
- * Read a GIF extension block (and do nothing with it).
- *
- */
-void
-readextension(void)
-{
- int count;
- char buf[255];
-
- (void) getc(infile);
- while ((count = getc(infile)) && count <= 255)
- fread(buf, 1, count, infile);
-}
-
-/*
- * readraster -
- * Decode a raster image
- *
- */
-int
-readraster(void)
-{
- unsigned char *fill = raster;
- unsigned char buf[255];
- register int bits=0;
- register unsigned long datum=0;
- register unsigned char *ch;
- register int count, code;
- int status = 1;
-
- datasize = getc(infile);
- if (datasize > 12)
- return 0;
- clear = 1 << datasize;
- eoi = clear + 1;
- avail = clear + 2;
- oldcode = -1;
- codesize = datasize + 1;
- codemask = (1 << codesize) - 1;
- for (code = 0; code < clear; code++) {
- prefix[code] = 0;
- suffix[code] = code;
- }
- stackp = stack;
- for (count = getc(infile); count > 0 && count <= 255; count = getc(infile)) {
- fread(buf,1,count,infile);
- for (ch=buf; count-- > 0; ch++) {
- datum += (unsigned long) *ch << bits;
- bits += 8;
- while (bits >= codesize) {
- code = datum & codemask;
- datum >>= codesize;
- bits -= codesize;
- if (code == eoi) { /* This kludge put in */
- goto exitloop; /* because some GIF files*/
- } /* aren't standard */
- if (!process(code, &fill)) {
- status = 0;
- goto exitloop;
- }
- }
- }
- if (fill >= raster + width*height) {
- fprintf(stderr, "raster full before eoi code\n");
- break;
- }
- }
-exitloop:
- if (fill != raster + width*height) {
- fprintf(stderr, "warning: wrong rastersize: %ld bytes\n",
- (long) (fill-raster));
- fprintf(stderr, " instead of %ld bytes\n",
- (long) width*height);
- }
- return status;
-}
-
-/*
- * process -
- * Process a compression code. "clear" resets the code table.
- * Otherwise make a new code table entry, and output the bytes
- * associated with the code.
- */
-int
-process(register int code, unsigned char** fill)
-{
- int incode;
- static unsigned char firstchar;
-
- if (code == clear) {
- codesize = datasize + 1;
- codemask = (1 << codesize) - 1;
- avail = clear + 2;
- oldcode = -1;
- return 1;
- }
-
- if (oldcode == -1) {
- if (code >= clear) {
- fprintf(stderr, "bad input: code=%d is larger than clear=%d\n",code, clear);
- return 0;
- }
- if (*fill >= raster + width*height) {
- fprintf(stderr, "raster full before eoi code\n");
- return 0;
- }
- *(*fill)++ = suffix[code];
- firstchar = oldcode = code;
- return 1;
- }
- if (code > avail) {
- fprintf(stderr, "code %d too large for %d\n", code, avail);
- return 0;
- }
-
- incode = code;
- if (code == avail) { /* the first code is always < avail */
- *stackp++ = firstchar;
- code = oldcode;
- }
- while (code > clear) {
- *stackp++ = suffix[code];
- code = prefix[code];
- }
-
- *stackp++ = firstchar = suffix[code];
- prefix[avail] = oldcode;
- suffix[avail] = firstchar;
- avail++;
-
- if (((avail & codemask) == 0) && (avail < 4096)) {
- codesize++;
- codemask += avail;
- }
- oldcode = incode;
- do {
- if (*fill >= raster + width*height) {
- fprintf(stderr, "raster full before eoi code\n");
- return 0;
- }
- *(*fill)++ = *--stackp;
- } while (stackp > stack);
- return 1;
-}
-
-/*
- * initcolors -
- * Convert a color map (local or global) to arrays with R, G and B
- * values.
- *
- */
-void
-initcolors(unsigned char colormap[COLSIZE][3], int ncolors)
-{
- register int i;
-
- for (i = 0; i < ncolors; i++) {
- red[i] = gamtab[colormap[i][0]];
- green[i] = gamtab[colormap[i][1]];
- blue[i] = gamtab[colormap[i][2]];
- }
-}
-
-void
-rasterize(int interleaved, char* mode)
-{
- register unsigned long row;
- unsigned char *newras;
- unsigned char *ras;
- TIFF *tif;
- tstrip_t strip;
- tsize_t stripsize;
-
- if ((newras = (unsigned char*) _TIFFmalloc(width*height+EXTRAFUDGE)) == NULL) {
- fprintf(stderr, "not enough memory for image\n");
- return;
- }
-#define DRAWSEGMENT(offset, step) { \
- for (row = offset; row < height; row += step) { \
- _TIFFmemcpy(newras + row*width, ras, width);\
- ras += width; \
- } \
- }
- ras = raster;
- if (interleaved) {
- DRAWSEGMENT(0, 8);
- DRAWSEGMENT(4, 8);
- DRAWSEGMENT(2, 4);
- DRAWSEGMENT(1, 2);
- } else
- DRAWSEGMENT(0, 1);
-#undef DRAWSEGMENT
-
- tif = TIFFOpen(imagename, mode);
- if (!tif) {
- TIFFError(imagename,"Can not open output image");
- exit(-1);
- }
- TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, (uint32) width);
- TIFFSetField(tif, TIFFTAG_IMAGELENGTH, (uint32) height);
- TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE);
- TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
- TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
- TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP,
- rowsperstrip = TIFFDefaultStripSize(tif, rowsperstrip));
- TIFFSetField(tif, TIFFTAG_COMPRESSION, compression);
- switch (compression) {
- case COMPRESSION_LZW:
- case COMPRESSION_DEFLATE:
- if (predictor != 0)
- TIFFSetField(tif, TIFFTAG_PREDICTOR, predictor);
- break;
- }
- TIFFSetField(tif, TIFFTAG_COLORMAP, red, green, blue);
- TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
- strip = 0;
- stripsize = TIFFStripSize(tif);
- for (row=0; row<height; row += rowsperstrip) {
- if (rowsperstrip > height-row) {
- rowsperstrip = height-row;
- stripsize = TIFFVStripSize(tif, rowsperstrip);
- }
- if (TIFFWriteEncodedStrip(tif, strip, newras+row*width, stripsize) < 0)
- break;
- strip++;
- }
- TIFFClose(tif);
-
- _TIFFfree(newras);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/pal2rgb.c b/tiff/tools/pal2rgb.c
deleted file mode 100755
index c724717..0000000
--- a/tiff/tools/pal2rgb.c
+++ /dev/null
@@ -1,435 +0,0 @@
-/* $Id: pal2rgb.c,v 1.14 2014-12-21 20:04:31 erouault Exp $ */
-
-/*
- * Copyright (c) 1988-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffio.h"
-
-#define streq(a,b) (strcmp(a,b) == 0)
-#define strneq(a,b,n) (strncmp(a,b,n) == 0)
-
-static void usage(void);
-static void cpTags(TIFF* in, TIFF* out);
-
-static int
-checkcmap(int n, uint16* r, uint16* g, uint16* b)
-{
- while (n-- > 0)
- if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256)
- return (16);
- fprintf(stderr, "Warning, assuming 8-bit colormap.\n");
- return (8);
-}
-
-#define CopyField(tag, v) \
- if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v)
-#define CopyField3(tag, v1, v2, v3) \
- if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3)
-
-static uint16 compression = (uint16) -1;
-static uint16 predictor = 0;
-static int quality = 75; /* JPEG quality */
-static int jpegcolormode = JPEGCOLORMODE_RGB;
-static int processCompressOptions(char*);
-
-int
-main(int argc, char* argv[])
-{
- uint16 bitspersample, shortv;
- uint32 imagewidth, imagelength;
- uint16 config = PLANARCONFIG_CONTIG;
- uint32 rowsperstrip = (uint32) -1;
- uint16 photometric = PHOTOMETRIC_RGB;
- uint16 *rmap, *gmap, *bmap;
- uint32 row;
- int cmap = -1;
- TIFF *in, *out;
- int c;
- extern int optind;
- extern char* optarg;
-
- while ((c = getopt(argc, argv, "C:c:p:r:")) != -1)
- switch (c) {
- case 'C': /* force colormap interpretation */
- cmap = atoi(optarg);
- break;
- case 'c': /* compression scheme */
- if (!processCompressOptions(optarg))
- usage();
- break;
- case 'p': /* planar configuration */
- if (streq(optarg, "separate"))
- config = PLANARCONFIG_SEPARATE;
- else if (streq(optarg, "contig"))
- config = PLANARCONFIG_CONTIG;
- else
- usage();
- break;
- case 'r': /* rows/strip */
- rowsperstrip = atoi(optarg);
- break;
- case '?':
- usage();
- /*NOTREACHED*/
- }
- if (argc - optind != 2)
- usage();
- in = TIFFOpen(argv[optind], "r");
- if (in == NULL)
- return (-1);
- if (!TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &shortv) ||
- shortv != PHOTOMETRIC_PALETTE) {
- fprintf(stderr, "%s: Expecting a palette image.\n",
- argv[optind]);
- return (-1);
- }
- if (!TIFFGetField(in, TIFFTAG_COLORMAP, &rmap, &gmap, &bmap)) {
- fprintf(stderr,
- "%s: No colormap (not a valid palette image).\n",
- argv[optind]);
- return (-1);
- }
- bitspersample = 0;
- TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bitspersample);
- if (bitspersample != 8) {
- fprintf(stderr, "%s: Sorry, can only handle 8-bit images.\n",
- argv[optind]);
- return (-1);
- }
- out = TIFFOpen(argv[optind+1], "w");
- if (out == NULL)
- return (-2);
- cpTags(in, out);
- TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &imagewidth);
- TIFFGetField(in, TIFFTAG_IMAGELENGTH, &imagelength);
- if (compression != (uint16)-1)
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- else
- TIFFGetField(in, TIFFTAG_COMPRESSION, &compression);
- switch (compression) {
- case COMPRESSION_JPEG:
- if (jpegcolormode == JPEGCOLORMODE_RGB)
- photometric = PHOTOMETRIC_YCBCR;
- else
- photometric = PHOTOMETRIC_RGB;
- TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality);
- TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode);
- break;
- case COMPRESSION_LZW:
- case COMPRESSION_DEFLATE:
- if (predictor != 0)
- TIFFSetField(out, TIFFTAG_PREDICTOR, predictor);
- break;
- }
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 3);
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, config);
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP,
- rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip));
- (void) TIFFGetField(in, TIFFTAG_PLANARCONFIG, &shortv);
- if (cmap == -1)
- cmap = checkcmap(1<<bitspersample, rmap, gmap, bmap);
- if (cmap == 16) {
- /*
- * Convert 16-bit colormap to 8-bit.
- */
- int i;
-
- for (i = (1<<bitspersample)-1; i >= 0; i--) {
-#define CVT(x) (((x) * 255) / ((1L<<16)-1))
- rmap[i] = CVT(rmap[i]);
- gmap[i] = CVT(gmap[i]);
- bmap[i] = CVT(bmap[i]);
- }
- }
- { unsigned char *ibuf, *obuf;
- register unsigned char* pp;
- register uint32 x;
- ibuf = (unsigned char*)_TIFFmalloc(TIFFScanlineSize(in));
- obuf = (unsigned char*)_TIFFmalloc(TIFFScanlineSize(out));
- switch (config) {
- case PLANARCONFIG_CONTIG:
- for (row = 0; row < imagelength; row++) {
- if (!TIFFReadScanline(in, ibuf, row, 0))
- goto done;
- pp = obuf;
- for (x = 0; x < imagewidth; x++) {
- *pp++ = (unsigned char) rmap[ibuf[x]];
- *pp++ = (unsigned char) gmap[ibuf[x]];
- *pp++ = (unsigned char) bmap[ibuf[x]];
- }
- if (!TIFFWriteScanline(out, obuf, row, 0))
- goto done;
- }
- break;
- case PLANARCONFIG_SEPARATE:
- for (row = 0; row < imagelength; row++) {
- if (!TIFFReadScanline(in, ibuf, row, 0))
- goto done;
- for (pp = obuf, x = 0; x < imagewidth; x++)
- *pp++ = (unsigned char) rmap[ibuf[x]];
- if (!TIFFWriteScanline(out, obuf, row, 0))
- goto done;
- for (pp = obuf, x = 0; x < imagewidth; x++)
- *pp++ = (unsigned char) gmap[ibuf[x]];
- if (!TIFFWriteScanline(out, obuf, row, 0))
- goto done;
- for (pp = obuf, x = 0; x < imagewidth; x++)
- *pp++ = (unsigned char) bmap[ibuf[x]];
- if (!TIFFWriteScanline(out, obuf, row, 0))
- goto done;
- }
- break;
- }
- _TIFFfree(ibuf);
- _TIFFfree(obuf);
- }
-done:
- (void) TIFFClose(in);
- (void) TIFFClose(out);
- return (0);
-}
-
-static int
-processCompressOptions(char* opt)
-{
- if (streq(opt, "none"))
- compression = COMPRESSION_NONE;
- else if (streq(opt, "packbits"))
- compression = COMPRESSION_PACKBITS;
- else if (strneq(opt, "jpeg", 4)) {
- char* cp = strchr(opt, ':');
-
- compression = COMPRESSION_JPEG;
- while( cp )
- {
- if (isdigit((int)cp[1]))
- quality = atoi(cp+1);
- else if (cp[1] == 'r' )
- jpegcolormode = JPEGCOLORMODE_RAW;
- else
- usage();
-
- cp = strchr(cp+1,':');
- }
- } else if (strneq(opt, "lzw", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_LZW;
- } else if (strneq(opt, "zip", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_DEFLATE;
- } else
- return (0);
- return (1);
-}
-
-#define CopyField(tag, v) \
- if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v)
-#define CopyField2(tag, v1, v2) \
- if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2)
-#define CopyField3(tag, v1, v2, v3) \
- if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3)
-#define CopyField4(tag, v1, v2, v3, v4) \
- if (TIFFGetField(in, tag, &v1, &v2, &v3, &v4)) TIFFSetField(out, tag, v1, v2, v3, v4)
-
-static void
-cpTag(TIFF* in, TIFF* out, uint16 tag, uint16 count, TIFFDataType type)
-{
- switch (type) {
- case TIFF_SHORT:
- if (count == 1) {
- uint16 shortv;
- CopyField(tag, shortv);
- } else if (count == 2) {
- uint16 shortv1, shortv2;
- CopyField2(tag, shortv1, shortv2);
- } else if (count == 4) {
- uint16 *tr, *tg, *tb, *ta;
- CopyField4(tag, tr, tg, tb, ta);
- } else if (count == (uint16) -1) {
- uint16 shortv1;
- uint16* shortav;
- CopyField2(tag, shortv1, shortav);
- }
- break;
- case TIFF_LONG:
- { uint32 longv;
- CopyField(tag, longv);
- }
- break;
- case TIFF_RATIONAL:
- if (count == 1) {
- float floatv;
- CopyField(tag, floatv);
- } else if (count == (uint16) -1) {
- float* floatav;
- CopyField(tag, floatav);
- }
- break;
- case TIFF_ASCII:
- { char* stringv;
- CopyField(tag, stringv);
- }
- break;
- case TIFF_DOUBLE:
- if (count == 1) {
- double doublev;
- CopyField(tag, doublev);
- } else if (count == (uint16) -1) {
- double* doubleav;
- CopyField(tag, doubleav);
- }
- break;
- default:
- TIFFError(TIFFFileName(in),
- "Data type %d is not supported, tag %d skipped.",
- tag, type);
- }
-}
-
-#undef CopyField4
-#undef CopyField3
-#undef CopyField2
-#undef CopyField
-
-static struct cpTag {
- uint16 tag;
- uint16 count;
- TIFFDataType type;
-} tags[] = {
- { TIFFTAG_IMAGEWIDTH, 1, TIFF_LONG },
- { TIFFTAG_IMAGELENGTH, 1, TIFF_LONG },
- { TIFFTAG_BITSPERSAMPLE, 1, TIFF_SHORT },
- { TIFFTAG_COMPRESSION, 1, TIFF_SHORT },
- { TIFFTAG_FILLORDER, 1, TIFF_SHORT },
- { TIFFTAG_ROWSPERSTRIP, 1, TIFF_LONG },
- { TIFFTAG_GROUP3OPTIONS, 1, TIFF_LONG },
- { TIFFTAG_SUBFILETYPE, 1, TIFF_LONG },
- { TIFFTAG_THRESHHOLDING, 1, TIFF_SHORT },
- { TIFFTAG_DOCUMENTNAME, 1, TIFF_ASCII },
- { TIFFTAG_IMAGEDESCRIPTION, 1, TIFF_ASCII },
- { TIFFTAG_MAKE, 1, TIFF_ASCII },
- { TIFFTAG_MODEL, 1, TIFF_ASCII },
- { TIFFTAG_ORIENTATION, 1, TIFF_SHORT },
- { TIFFTAG_MINSAMPLEVALUE, 1, TIFF_SHORT },
- { TIFFTAG_MAXSAMPLEVALUE, 1, TIFF_SHORT },
- { TIFFTAG_XRESOLUTION, 1, TIFF_RATIONAL },
- { TIFFTAG_YRESOLUTION, 1, TIFF_RATIONAL },
- { TIFFTAG_PAGENAME, 1, TIFF_ASCII },
- { TIFFTAG_XPOSITION, 1, TIFF_RATIONAL },
- { TIFFTAG_YPOSITION, 1, TIFF_RATIONAL },
- { TIFFTAG_GROUP4OPTIONS, 1, TIFF_LONG },
- { TIFFTAG_RESOLUTIONUNIT, 1, TIFF_SHORT },
- { TIFFTAG_PAGENUMBER, 2, TIFF_SHORT },
- { TIFFTAG_SOFTWARE, 1, TIFF_ASCII },
- { TIFFTAG_DATETIME, 1, TIFF_ASCII },
- { TIFFTAG_ARTIST, 1, TIFF_ASCII },
- { TIFFTAG_HOSTCOMPUTER, 1, TIFF_ASCII },
- { TIFFTAG_WHITEPOINT, 2, TIFF_RATIONAL },
- { TIFFTAG_PRIMARYCHROMATICITIES, (uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_HALFTONEHINTS, 2, TIFF_SHORT },
- { TIFFTAG_BADFAXLINES, 1, TIFF_LONG },
- { TIFFTAG_CLEANFAXDATA, 1, TIFF_SHORT },
- { TIFFTAG_CONSECUTIVEBADFAXLINES, 1, TIFF_LONG },
- { TIFFTAG_INKSET, 1, TIFF_SHORT },
- /*{ TIFFTAG_INKNAMES, 1, TIFF_ASCII },*/ /* Needs much more complicated logic. See tiffcp */
- { TIFFTAG_DOTRANGE, 2, TIFF_SHORT },
- { TIFFTAG_TARGETPRINTER, 1, TIFF_ASCII },
- { TIFFTAG_SAMPLEFORMAT, 1, TIFF_SHORT },
- { TIFFTAG_YCBCRCOEFFICIENTS, (uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_YCBCRSUBSAMPLING, 2, TIFF_SHORT },
- { TIFFTAG_YCBCRPOSITIONING, 1, TIFF_SHORT },
- { TIFFTAG_REFERENCEBLACKWHITE, (uint16) -1,TIFF_RATIONAL },
-};
-#define NTAGS (sizeof (tags) / sizeof (tags[0]))
-
-static void
-cpTags(TIFF* in, TIFF* out)
-{
- struct cpTag *p;
- for (p = tags; p < &tags[NTAGS]; p++)
- cpTag(in, out, p->tag, p->count, p->type);
-}
-#undef NTAGS
-
-char* stuff[] = {
-"usage: pal2rgb [options] input.tif output.tif",
-"where options are:",
-" -p contig pack samples contiguously (e.g. RGBRGB...)",
-" -p separate store samples separately (e.g. RRR...GGG...BBB...)",
-" -r # make each strip have no more than # rows",
-" -C 8 assume 8-bit colormap values (instead of 16-bit)",
-" -C 16 assume 16-bit colormap values",
-"",
-" -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding",
-" -c zip[:opts] compress output with deflate encoding",
-" -c packbits compress output with packbits encoding",
-" -c none use no compression algorithm on output",
-"",
-"LZW and deflate options:",
-" # set predictor value",
-"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/ppm2tiff.c b/tiff/tools/ppm2tiff.c
deleted file mode 100755
index 70f74be..0000000
--- a/tiff/tools/ppm2tiff.c
+++ /dev/null
@@ -1,395 +0,0 @@
-/* $Id: ppm2tiff.c,v 1.18 2012-12-10 18:19:11 tgl Exp $ */
-
-/*
- * Copyright (c) 1991-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#ifdef HAVE_IO_H
-# include <io.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffio.h"
-
-#ifndef HAVE_GETOPT
-extern int getopt(int, char**, char*);
-#endif
-
-#define streq(a,b) (strcmp(a,b) == 0)
-#define strneq(a,b,n) (strncmp(a,b,n) == 0)
-
-static uint16 compression = COMPRESSION_PACKBITS;
-static uint16 predictor = 0;
-static int quality = 75; /* JPEG quality */
-static int jpegcolormode = JPEGCOLORMODE_RGB;
-static uint32 g3opts;
-
-static void usage(void);
-static int processCompressOptions(char*);
-
-static void
-BadPPM(char* file)
-{
- fprintf(stderr, "%s: Not a PPM file.\n", file);
- exit(-2);
-}
-
-static tmsize_t
-multiply_ms(tmsize_t m1, tmsize_t m2)
-{
- tmsize_t bytes = m1 * m2;
-
- if (m1 && bytes / m1 != m2)
- bytes = 0;
-
- return bytes;
-}
-
-int
-main(int argc, char* argv[])
-{
- uint16 photometric = 0;
- uint32 rowsperstrip = (uint32) -1;
- double resolution = -1;
- unsigned char *buf = NULL;
- tmsize_t linebytes = 0;
- uint16 spp = 1;
- uint16 bpp = 8;
- TIFF *out;
- FILE *in;
- unsigned int w, h, prec, row;
- char *infile;
- int c;
- extern int optind;
- extern char* optarg;
- tmsize_t scanline_size;
-
- if (argc < 2) {
- fprintf(stderr, "%s: Too few arguments\n", argv[0]);
- usage();
- }
- while ((c = getopt(argc, argv, "c:r:R:")) != -1)
- switch (c) {
- case 'c': /* compression scheme */
- if (!processCompressOptions(optarg))
- usage();
- break;
- case 'r': /* rows/strip */
- rowsperstrip = atoi(optarg);
- break;
- case 'R': /* resolution */
- resolution = atof(optarg);
- break;
- case '?':
- usage();
- /*NOTREACHED*/
- }
-
- if (optind + 2 < argc) {
- fprintf(stderr, "%s: Too many arguments\n", argv[0]);
- usage();
- }
-
- /*
- * If only one file is specified, read input from
- * stdin; otherwise usage is: ppm2tiff input output.
- */
- if (argc - optind > 1) {
- infile = argv[optind++];
- in = fopen(infile, "rb");
- if (in == NULL) {
- fprintf(stderr, "%s: Can not open.\n", infile);
- return (-1);
- }
- } else {
- infile = "<stdin>";
- in = stdin;
-#if defined(HAVE_SETMODE) && defined(O_BINARY)
- setmode(fileno(stdin), O_BINARY);
-#endif
- }
-
- if (fgetc(in) != 'P')
- BadPPM(infile);
- switch (fgetc(in)) {
- case '4': /* it's a PBM file */
- bpp = 1;
- spp = 1;
- photometric = PHOTOMETRIC_MINISWHITE;
- break;
- case '5': /* it's a PGM file */
- bpp = 8;
- spp = 1;
- photometric = PHOTOMETRIC_MINISBLACK;
- break;
- case '6': /* it's a PPM file */
- bpp = 8;
- spp = 3;
- photometric = PHOTOMETRIC_RGB;
- if (compression == COMPRESSION_JPEG &&
- jpegcolormode == JPEGCOLORMODE_RGB)
- photometric = PHOTOMETRIC_YCBCR;
- break;
- default:
- BadPPM(infile);
- }
-
- /* Parse header */
- while(1) {
- if (feof(in))
- BadPPM(infile);
- c = fgetc(in);
- /* Skip whitespaces (blanks, TABs, CRs, LFs) */
- if (strchr(" \t\r\n", c))
- continue;
-
- /* Check for comment line */
- if (c == '#') {
- do {
- c = fgetc(in);
- } while(!(strchr("\r\n", c) || feof(in)));
- continue;
- }
-
- ungetc(c, in);
- break;
- }
- switch (bpp) {
- case 1:
- if (fscanf(in, " %u %u", &w, &h) != 2)
- BadPPM(infile);
- if (fgetc(in) != '\n')
- BadPPM(infile);
- break;
- case 8:
- if (fscanf(in, " %u %u %u", &w, &h, &prec) != 3)
- BadPPM(infile);
- if (fgetc(in) != '\n' || prec != 255)
- BadPPM(infile);
- break;
- }
- out = TIFFOpen(argv[optind], "w");
- if (out == NULL)
- return (-4);
- TIFFSetField(out, TIFFTAG_IMAGEWIDTH, (uint32) w);
- TIFFSetField(out, TIFFTAG_IMAGELENGTH, (uint32) h);
- TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, spp);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, bpp);
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric);
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- switch (compression) {
- case COMPRESSION_JPEG:
- TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality);
- TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode);
- break;
- case COMPRESSION_LZW:
- case COMPRESSION_DEFLATE:
- if (predictor != 0)
- TIFFSetField(out, TIFFTAG_PREDICTOR, predictor);
- break;
- case COMPRESSION_CCITTFAX3:
- TIFFSetField(out, TIFFTAG_GROUP3OPTIONS, g3opts);
- break;
- }
- switch (bpp) {
- case 1:
- /* if round-up overflows, result will be zero, OK */
- linebytes = (multiply_ms(spp, w) + (8 - 1)) / 8;
- if (rowsperstrip == (uint32) -1) {
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, h);
- } else {
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP,
- TIFFDefaultStripSize(out, rowsperstrip));
- }
- break;
- case 8:
- linebytes = multiply_ms(spp, w);
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP,
- TIFFDefaultStripSize(out, rowsperstrip));
- break;
- }
- if (linebytes == 0) {
- fprintf(stderr, "%s: scanline size overflow\n", infile);
- (void) TIFFClose(out);
- exit(-2);
- }
- scanline_size = TIFFScanlineSize(out);
- if (scanline_size == 0) {
- /* overflow - TIFFScanlineSize already printed a message */
- (void) TIFFClose(out);
- exit(-2);
- }
- if (scanline_size < linebytes)
- buf = (unsigned char *)_TIFFmalloc(linebytes);
- else
- buf = (unsigned char *)_TIFFmalloc(scanline_size);
- if (buf == NULL) {
- fprintf(stderr, "%s: Not enough memory\n", infile);
- (void) TIFFClose(out);
- exit(-2);
- }
- if (resolution > 0) {
- TIFFSetField(out, TIFFTAG_XRESOLUTION, resolution);
- TIFFSetField(out, TIFFTAG_YRESOLUTION, resolution);
- TIFFSetField(out, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH);
- }
- for (row = 0; row < h; row++) {
- if (fread(buf, linebytes, 1, in) != 1) {
- fprintf(stderr, "%s: scanline %lu: Read error.\n",
- infile, (unsigned long) row);
- break;
- }
- if (TIFFWriteScanline(out, buf, row, 0) < 0)
- break;
- }
- (void) TIFFClose(out);
- if (buf)
- _TIFFfree(buf);
- return (0);
-}
-
-static void
-processG3Options(char* cp)
-{
- g3opts = 0;
- if( (cp = strchr(cp, ':')) ) {
- do {
- cp++;
- if (strneq(cp, "1d", 2))
- g3opts &= ~GROUP3OPT_2DENCODING;
- else if (strneq(cp, "2d", 2))
- g3opts |= GROUP3OPT_2DENCODING;
- else if (strneq(cp, "fill", 4))
- g3opts |= GROUP3OPT_FILLBITS;
- else
- usage();
- } while( (cp = strchr(cp, ':')) );
- }
-}
-
-static int
-processCompressOptions(char* opt)
-{
- if (streq(opt, "none"))
- compression = COMPRESSION_NONE;
- else if (streq(opt, "packbits"))
- compression = COMPRESSION_PACKBITS;
- else if (strneq(opt, "jpeg", 4)) {
- char* cp = strchr(opt, ':');
-
- compression = COMPRESSION_JPEG;
- while (cp)
- {
- if (isdigit((int)cp[1]))
- quality = atoi(cp+1);
- else if (cp[1] == 'r' )
- jpegcolormode = JPEGCOLORMODE_RAW;
- else
- usage();
-
- cp = strchr(cp+1,':');
- }
- } else if (strneq(opt, "g3", 2)) {
- processG3Options(opt);
- compression = COMPRESSION_CCITTFAX3;
- } else if (streq(opt, "g4")) {
- compression = COMPRESSION_CCITTFAX4;
- } else if (strneq(opt, "lzw", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_LZW;
- } else if (strneq(opt, "zip", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_DEFLATE;
- } else
- return (0);
- return (1);
-}
-
-char* stuff[] = {
-"usage: ppm2tiff [options] input.ppm output.tif",
-"where options are:",
-" -r # make each strip have no more than # rows",
-" -R # set x&y resolution (dpi)",
-"",
-" -c jpeg[:opts] compress output with JPEG encoding",
-" -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding",
-" -c zip[:opts] compress output with deflate encoding",
-" -c packbits compress output with packbits encoding (the default)",
-" -c g3[:opts] compress output with CCITT Group 3 encoding",
-" -c g4 compress output with CCITT Group 4 encoding",
-" -c none use no compression algorithm on output",
-"",
-"JPEG options:",
-" # set compression quality level (0-100, default 75)",
-" r output color image as RGB rather than YCbCr",
-"LZW and deflate options:",
-" # set predictor value",
-"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/ras2tiff.c b/tiff/tools/ras2tiff.c
deleted file mode 100755
index ec8a071..0000000
--- a/tiff/tools/ras2tiff.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/* $Id: ras2tiff.c,v 1.18 2010-03-10 18:56:49 bfriesen Exp $ */
-
-/*
- * Copyright (c) 1988-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "rasterfile.h"
-#include "tiffio.h"
-
-#ifndef howmany
-#define howmany(x, y) (((x)+((y)-1))/(y))
-#endif
-#define streq(a,b) (strcmp(a,b) == 0)
-#define strneq(a,b,n) (strncmp(a,b,n) == 0)
-
-static uint16 compression = (uint16) -1;
-static int jpegcolormode = JPEGCOLORMODE_RGB;
-static int quality = 75; /* JPEG quality */
-static uint16 predictor = 0;
-
-static void usage(void);
-static int processCompressOptions(char*);
-
-int
-main(int argc, char* argv[])
-{
- unsigned char* buf;
- long row;
- tsize_t linebytes, scanline;
- TIFF *out;
- FILE *in;
- struct rasterfile h;
- uint16 photometric;
- uint16 config = PLANARCONFIG_CONTIG;
- uint32 rowsperstrip = (uint32) -1;
- int c;
- extern int optind;
- extern char* optarg;
-
- while ((c = getopt(argc, argv, "c:r:h")) != -1)
- switch (c) {
- case 'c': /* compression scheme */
- if (!processCompressOptions(optarg))
- usage();
- break;
- case 'r': /* rows/strip */
- rowsperstrip = atoi(optarg);
- break;
- case 'h':
- usage();
- /*NOTREACHED*/
- }
- if (argc - optind != 2)
- usage();
- in = fopen(argv[optind], "rb");
- if (in == NULL) {
- fprintf(stderr, "%s: Can not open.\n", argv[optind]);
- return (-1);
- }
- if (fread(&h, sizeof (h), 1, in) != 1) {
- fprintf(stderr, "%s: Can not read header.\n", argv[optind]);
- fclose(in);
- return (-2);
- }
- if (strcmp(h.ras_magic, RAS_MAGIC) == 0) {
-#ifndef WORDS_BIGENDIAN
- TIFFSwabLong((uint32 *)&h.ras_width);
- TIFFSwabLong((uint32 *)&h.ras_height);
- TIFFSwabLong((uint32 *)&h.ras_depth);
- TIFFSwabLong((uint32 *)&h.ras_length);
- TIFFSwabLong((uint32 *)&h.ras_type);
- TIFFSwabLong((uint32 *)&h.ras_maptype);
- TIFFSwabLong((uint32 *)&h.ras_maplength);
-#endif
- } else if (strcmp(h.ras_magic, RAS_MAGIC_INV) == 0) {
-#ifdef WORDS_BIGENDIAN
- TIFFSwabLong((uint32 *)&h.ras_width);
- TIFFSwabLong((uint32 *)&h.ras_height);
- TIFFSwabLong((uint32 *)&h.ras_depth);
- TIFFSwabLong((uint32 *)&h.ras_length);
- TIFFSwabLong((uint32 *)&h.ras_type);
- TIFFSwabLong((uint32 *)&h.ras_maptype);
- TIFFSwabLong((uint32 *)&h.ras_maplength);
-#endif
- } else {
- fprintf(stderr, "%s: Not a rasterfile.\n", argv[optind]);
- fclose(in);
- return (-3);
- }
- out = TIFFOpen(argv[optind+1], "w");
- if (out == NULL)
- {
- fclose(in);
- return (-4);
- }
- TIFFSetField(out, TIFFTAG_IMAGEWIDTH, (uint32) h.ras_width);
- TIFFSetField(out, TIFFTAG_IMAGELENGTH, (uint32) h.ras_height);
- TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, h.ras_depth > 8 ? 3 : 1);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, h.ras_depth > 1 ? 8 : 1);
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, config);
- if (h.ras_maptype != RMT_NONE) {
- uint16* red;
- register uint16* map;
- register int i, j;
- int mapsize;
-
- buf = (unsigned char *)_TIFFmalloc(h.ras_maplength);
- if (buf == NULL) {
- fprintf(stderr, "No space to read in colormap.\n");
- return (-5);
- }
- if (fread(buf, h.ras_maplength, 1, in) != 1) {
- fprintf(stderr, "%s: Read error on colormap.\n",
- argv[optind]);
- return (-6);
- }
- mapsize = 1<<h.ras_depth;
- if (h.ras_maplength > mapsize*3) {
- fprintf(stderr,
- "%s: Huh, %ld colormap entries, should be %d?\n",
- argv[optind], h.ras_maplength, mapsize*3);
- return (-7);
- }
- red = (uint16*)_TIFFmalloc(mapsize * 3 * sizeof (uint16));
- if (red == NULL) {
- fprintf(stderr, "No space for colormap.\n");
- return (-8);
- }
- map = red;
- for (j = 0; j < 3; j++) {
-#define SCALE(x) (((x)*((1L<<16)-1))/255)
- for (i = h.ras_maplength/3; i-- > 0;)
- *map++ = SCALE(*buf++);
- if ((i = h.ras_maplength/3) < mapsize) {
- i = mapsize - i;
- _TIFFmemset(map, 0, i*sizeof (uint16));
- map += i;
- }
- }
- TIFFSetField(out, TIFFTAG_COLORMAP,
- red, red + mapsize, red + 2*mapsize);
- photometric = PHOTOMETRIC_PALETTE;
- if (compression == (uint16) -1)
- compression = COMPRESSION_PACKBITS;
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- } else {
- /* XXX this is bogus... */
- photometric = h.ras_depth == 24 ?
- PHOTOMETRIC_RGB : PHOTOMETRIC_MINISBLACK;
- if (compression == (uint16) -1)
- compression = COMPRESSION_LZW;
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- }
- switch (compression) {
- case COMPRESSION_JPEG:
- if (photometric == PHOTOMETRIC_RGB && jpegcolormode == JPEGCOLORMODE_RGB)
- photometric = PHOTOMETRIC_YCBCR;
- TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality);
- TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode);
- break;
- case COMPRESSION_LZW:
- case COMPRESSION_DEFLATE:
- if (predictor != 0)
- TIFFSetField(out, TIFFTAG_PREDICTOR, predictor);
- break;
- }
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric);
- linebytes = ((h.ras_depth*h.ras_width+15) >> 3) &~ 1;
- scanline = TIFFScanlineSize(out);
- if (scanline > linebytes) {
- buf = (unsigned char *)_TIFFmalloc(scanline);
- _TIFFmemset(buf+linebytes, 0, scanline-linebytes);
- } else
- buf = (unsigned char *)_TIFFmalloc(linebytes);
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP,
- TIFFDefaultStripSize(out, rowsperstrip));
- for (row = 0; row < h.ras_height; row++) {
- if (fread(buf, linebytes, 1, in) != 1) {
- fprintf(stderr, "%s: scanline %ld: Read error.\n",
- argv[optind], row);
- break;
- }
- if (h.ras_type == RT_STANDARD && h.ras_depth == 24) {
- tsize_t cc = h.ras_width;
- unsigned char* cp = buf;
-#define SWAP(a,b) { unsigned char t = (a); (a) = (b); (b) = t; }
- do {
- SWAP(cp[0], cp[2]);
- cp += 3;
- } while (--cc);
- }
- if (TIFFWriteScanline(out, buf, row, 0) < 0)
- break;
- }
- (void) TIFFClose(out);
- fclose(in);
- return (0);
-}
-
-static int
-processCompressOptions(char* opt)
-{
- if (streq(opt, "none"))
- compression = COMPRESSION_NONE;
- else if (streq(opt, "packbits"))
- compression = COMPRESSION_PACKBITS;
- else if (strneq(opt, "jpeg", 4)) {
- char* cp = strchr(opt, ':');
-
- compression = COMPRESSION_JPEG;
- while( cp )
- {
- if (isdigit((int)cp[1]))
- quality = atoi(cp+1);
- else if (cp[1] == 'r' )
- jpegcolormode = JPEGCOLORMODE_RAW;
- else
- usage();
-
- cp = strchr(cp+1,':');
- }
- } else if (strneq(opt, "lzw", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_LZW;
- } else if (strneq(opt, "zip", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_DEFLATE;
- } else
- return (0);
- return (1);
-}
-
-char* stuff[] = {
-"usage: ras2tiff [options] input.ras output.tif",
-"where options are:",
-" -r # make each strip have no more than # rows",
-"",
-" -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding",
-" -c zip[:opts] compress output with deflate encoding",
-" -c jpeg[:opts] compress output with JPEG encoding",
-" -c packbits compress output with packbits encoding",
-" -c none use no compression algorithm on output",
-"",
-"JPEG options:",
-" # set compression quality level (0-100, default 75)",
-" r output color image as RGB rather than YCbCr",
-"For example, -c jpeg:r:50 to get JPEG-encoded RGB data with 50% comp. quality",
-"",
-"LZW and deflate options:",
-" # set predictor value",
-"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing",
-" -h this help message",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/rasterfile.h b/tiff/tools/rasterfile.h
deleted file mode 100755
index 7fb33db..0000000
--- a/tiff/tools/rasterfile.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* $Header: /cvs/maptools/cvsroot/libtiff/tools/rasterfile.h,v 1.3 2003-11-12 19:14:33 dron Exp $ */
-
-/*
- * Description of header for files containing raster images
- */
-struct rasterfile {
- char ras_magic[4]; /* magic number */
- long ras_width; /* width (pixels) of image */
- long ras_height; /* height (pixels) of image */
- long ras_depth; /* depth (1, 8, or 24 bits) of pixel */
- long ras_length; /* length (bytes) of image */
- long ras_type; /* type of file; see RT_* below */
- long ras_maptype; /* type of colormap; see RMT_* below */
- long ras_maplength; /* length (bytes) of following map */
- /* color map follows for ras_maplength bytes, followed by image */
-};
-#define RAS_MAGIC "\x59\xa6\x6a\x95"
-#define RAS_MAGIC_INV "\x95\x6a\xa6\x59"
-
- /* Sun supported ras_type's */
-#define RT_OLD 0 /* Raw pixrect image in 68000 byte order */
-#define RT_STANDARD 1 /* Raw pixrect image in 68000 byte order */
-#define RT_BYTE_ENCODED 2 /* Run-length compression of bytes */
-#define RT_EXPERIMENTAL 0xffff /* Reserved for testing */
-
- /* Sun registered ras_maptype's */
-#define RMT_RAW 2
- /* Sun supported ras_maptype's */
-#define RMT_NONE 0 /* ras_maplength is expected to be 0 */
-#define RMT_EQUAL_RGB 1 /* red[ras_maplength/3],green[],blue[] */
-
-/*
- * NOTES:
- * Each line of the image is rounded out to a multiple of 16 bits.
- * This corresponds to the rounding convention used by the memory pixrect
- * package (/usr/include/pixrect/memvar.h) of the SunWindows system.
- * The ras_encoding field (always set to 0 by Sun's supported software)
- * was renamed to ras_length in release 2.0. As a result, rasterfiles
- * of type 0 generated by the old software claim to have 0 length; for
- * compatibility, code reading rasterfiles must be prepared to compute the
- * true length from the width, height, and depth fields.
- */
diff --git a/tiff/tools/raw2tiff.c b/tiff/tools/raw2tiff.c
deleted file mode 100755
index 9ab980e..0000000
--- a/tiff/tools/raw2tiff.c
+++ /dev/null
@@ -1,651 +0,0 @@
-/* $Id: raw2tiff.c,v 1.25 2010-03-10 18:56:49 bfriesen Exp $
- *
- * Project: libtiff tools
- * Purpose: Convert raw byte sequences in TIFF images
- * Author: Andrey Kiselev, dron@ak4719.spb.edu
- *
- ******************************************************************************
- * Copyright (c) 2002, Andrey Kiselev <dron@ak4719.spb.edu>
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <math.h>
-#include <ctype.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_IO_H
-# include <io.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffio.h"
-
-#ifndef HAVE_GETOPT
-extern int getopt(int, char**, char*);
-#endif
-
-#ifndef O_BINARY
-# define O_BINARY 0
-#endif
-
-typedef enum {
- PIXEL,
- BAND
-} InterleavingType;
-
-static uint16 compression = (uint16) -1;
-static int jpegcolormode = JPEGCOLORMODE_RGB;
-static int quality = 75; /* JPEG quality */
-static uint16 predictor = 0;
-
-static void swapBytesInScanline(void *, uint32, TIFFDataType);
-static int guessSize(int, TIFFDataType, off_t, uint32, int,
- uint32 *, uint32 *);
-static double correlation(void *, void *, uint32, TIFFDataType);
-static void usage(void);
-static int processCompressOptions(char*);
-
-int
-main(int argc, char* argv[])
-{
- uint32 width = 0, length = 0, linebytes, bufsize;
- uint32 nbands = 1; /* number of bands in input image*/
- off_t hdr_size = 0; /* size of the header to skip */
- TIFFDataType dtype = TIFF_BYTE;
- int16 depth = 1; /* bytes per pixel in input image */
- int swab = 0; /* byte swapping flag */
- InterleavingType interleaving = 0; /* interleaving type flag */
- uint32 rowsperstrip = (uint32) -1;
- uint16 photometric = PHOTOMETRIC_MINISBLACK;
- uint16 config = PLANARCONFIG_CONTIG;
- uint16 fillorder = FILLORDER_LSB2MSB;
- int fd;
- char *outfilename = NULL;
- TIFF *out;
-
- uint32 row, col, band;
- int c;
- unsigned char *buf = NULL, *buf1 = NULL;
- extern int optind;
- extern char* optarg;
-
- while ((c = getopt(argc, argv, "c:r:H:w:l:b:d:LMp:si:o:h")) != -1) {
- switch (c) {
- case 'c': /* compression scheme */
- if (!processCompressOptions(optarg))
- usage();
- break;
- case 'r': /* rows/strip */
- rowsperstrip = atoi(optarg);
- break;
- case 'H': /* size of input image file header */
- hdr_size = atoi(optarg);
- break;
- case 'w': /* input image width */
- width = atoi(optarg);
- break;
- case 'l': /* input image length */
- length = atoi(optarg);
- break;
- case 'b': /* number of bands in input image */
- nbands = atoi(optarg);
- break;
- case 'd': /* type of samples in input image */
- if (strncmp(optarg, "byte", 4) == 0)
- dtype = TIFF_BYTE;
- else if (strncmp(optarg, "short", 5) == 0)
- dtype = TIFF_SHORT;
- else if (strncmp(optarg, "long", 4) == 0)
- dtype = TIFF_LONG;
- else if (strncmp(optarg, "sbyte", 5) == 0)
- dtype = TIFF_SBYTE;
- else if (strncmp(optarg, "sshort", 6) == 0)
- dtype = TIFF_SSHORT;
- else if (strncmp(optarg, "slong", 5) == 0)
- dtype = TIFF_SLONG;
- else if (strncmp(optarg, "float", 5) == 0)
- dtype = TIFF_FLOAT;
- else if (strncmp(optarg, "double", 6) == 0)
- dtype = TIFF_DOUBLE;
- else
- dtype = TIFF_BYTE;
- depth = TIFFDataWidth(dtype);
- break;
- case 'L': /* input has lsb-to-msb fillorder */
- fillorder = FILLORDER_LSB2MSB;
- break;
- case 'M': /* input has msb-to-lsb fillorder */
- fillorder = FILLORDER_MSB2LSB;
- break;
- case 'p': /* photometric interpretation */
- if (strncmp(optarg, "miniswhite", 10) == 0)
- photometric = PHOTOMETRIC_MINISWHITE;
- else if (strncmp(optarg, "minisblack", 10) == 0)
- photometric = PHOTOMETRIC_MINISBLACK;
- else if (strncmp(optarg, "rgb", 3) == 0)
- photometric = PHOTOMETRIC_RGB;
- else if (strncmp(optarg, "cmyk", 4) == 0)
- photometric = PHOTOMETRIC_SEPARATED;
- else if (strncmp(optarg, "ycbcr", 5) == 0)
- photometric = PHOTOMETRIC_YCBCR;
- else if (strncmp(optarg, "cielab", 6) == 0)
- photometric = PHOTOMETRIC_CIELAB;
- else if (strncmp(optarg, "icclab", 6) == 0)
- photometric = PHOTOMETRIC_ICCLAB;
- else if (strncmp(optarg, "itulab", 6) == 0)
- photometric = PHOTOMETRIC_ITULAB;
- else
- photometric = PHOTOMETRIC_MINISBLACK;
- break;
- case 's': /* do we need to swap bytes? */
- swab = 1;
- break;
- case 'i': /* type of interleaving */
- if (strncmp(optarg, "pixel", 4) == 0)
- interleaving = PIXEL;
- else if (strncmp(optarg, "band", 6) == 0)
- interleaving = BAND;
- else
- interleaving = 0;
- break;
- case 'o':
- outfilename = optarg;
- break;
- case 'h':
- usage();
- default:
- break;
- }
- }
-
- if (argc - optind < 2)
- usage();
-
- fd = open(argv[optind], O_RDONLY|O_BINARY, 0);
- if (fd < 0) {
- fprintf(stderr, "%s: %s: Cannot open input file.\n",
- argv[0], argv[optind]);
- return (-1);
- }
-
- if (guessSize(fd, dtype, hdr_size, nbands, swab, &width, &length) < 0)
- return 1;
-
- if (outfilename == NULL)
- outfilename = argv[optind+1];
- out = TIFFOpen(outfilename, "w");
- if (out == NULL) {
- fprintf(stderr, "%s: %s: Cannot open file for output.\n",
- argv[0], outfilename);
- return (-1);
- }
- TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width);
- TIFFSetField(out, TIFFTAG_IMAGELENGTH, length);
- TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, nbands);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, depth * 8);
- TIFFSetField(out, TIFFTAG_FILLORDER, fillorder);
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, config);
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric);
- switch (dtype) {
- case TIFF_BYTE:
- case TIFF_SHORT:
- case TIFF_LONG:
- TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
- break;
- case TIFF_SBYTE:
- case TIFF_SSHORT:
- case TIFF_SLONG:
- TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT);
- break;
- case TIFF_FLOAT:
- case TIFF_DOUBLE:
- TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);
- break;
- default:
- TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_VOID);
- break;
- }
- if (compression == (uint16) -1)
- compression = COMPRESSION_PACKBITS;
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- switch (compression) {
- case COMPRESSION_JPEG:
- if (photometric == PHOTOMETRIC_RGB
- && jpegcolormode == JPEGCOLORMODE_RGB)
- photometric = PHOTOMETRIC_YCBCR;
- TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality);
- TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode);
- break;
- case COMPRESSION_LZW:
- case COMPRESSION_DEFLATE:
- if (predictor != 0)
- TIFFSetField(out, TIFFTAG_PREDICTOR, predictor);
- break;
- }
- switch(interleaving) {
- case BAND: /* band interleaved data */
- linebytes = width * depth;
- buf = (unsigned char *)_TIFFmalloc(linebytes);
- break;
- case PIXEL: /* pixel interleaved data */
- default:
- linebytes = width * nbands * depth;
- break;
- }
- bufsize = width * nbands * depth;
- buf1 = (unsigned char *)_TIFFmalloc(bufsize);
-
- rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip);
- if (rowsperstrip > length) {
- rowsperstrip = length;
- }
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip );
-
- lseek(fd, hdr_size, SEEK_SET); /* Skip the file header */
- for (row = 0; row < length; row++) {
- switch(interleaving) {
- case BAND: /* band interleaved data */
- for (band = 0; band < nbands; band++) {
- lseek(fd,
- hdr_size + (length*band+row)*linebytes,
- SEEK_SET);
- if (read(fd, buf, linebytes) < 0) {
- fprintf(stderr,
- "%s: %s: scanline %lu: Read error.\n",
- argv[0], argv[optind],
- (unsigned long) row);
- break;
- }
- if (swab) /* Swap bytes if needed */
- swapBytesInScanline(buf, width, dtype);
- for (col = 0; col < width; col++)
- memcpy(buf1 + (col*nbands+band)*depth,
- buf + col * depth, depth);
- }
- break;
- case PIXEL: /* pixel interleaved data */
- default:
- if (read(fd, buf1, bufsize) < 0) {
- fprintf(stderr,
- "%s: %s: scanline %lu: Read error.\n",
- argv[0], argv[optind],
- (unsigned long) row);
- break;
- }
- if (swab) /* Swap bytes if needed */
- swapBytesInScanline(buf1, width, dtype);
- break;
- }
-
- if (TIFFWriteScanline(out, buf1, row, 0) < 0) {
- fprintf(stderr, "%s: %s: scanline %lu: Write error.\n",
- argv[0], outfilename, (unsigned long) row);
- break;
- }
- }
- if (buf)
- _TIFFfree(buf);
- if (buf1)
- _TIFFfree(buf1);
- TIFFClose(out);
- return (0);
-}
-
-static void
-swapBytesInScanline(void *buf, uint32 width, TIFFDataType dtype)
-{
- switch (dtype) {
- case TIFF_SHORT:
- case TIFF_SSHORT:
- TIFFSwabArrayOfShort((uint16*)buf,
- (unsigned long)width);
- break;
- case TIFF_LONG:
- case TIFF_SLONG:
- TIFFSwabArrayOfLong((uint32*)buf,
- (unsigned long)width);
- break;
- /* case TIFF_FLOAT: */ /* FIXME */
- case TIFF_DOUBLE:
- TIFFSwabArrayOfDouble((double*)buf,
- (unsigned long)width);
- break;
- default:
- break;
- }
-}
-
-static int
-guessSize(int fd, TIFFDataType dtype, off_t hdr_size, uint32 nbands,
- int swab, uint32 *width, uint32 *length)
-{
- const float longt = 40.0; /* maximum possible height/width ratio */
- char *buf1, *buf2;
- struct stat filestat;
- uint32 w, h, scanlinesize, imagesize;
- uint32 depth = TIFFDataWidth(dtype);
- float cor_coef = 0, tmp;
-
- fstat(fd, &filestat);
-
- if (filestat.st_size < hdr_size) {
- fprintf(stderr, "Too large header size specified.\n");
- return -1;
- }
-
- imagesize = (filestat.st_size - hdr_size) / nbands / depth;
-
- if (*width != 0 && *length == 0) {
- fprintf(stderr, "Image height is not specified.\n");
-
- *length = imagesize / *width;
-
- fprintf(stderr, "Height is guessed as %lu.\n",
- (unsigned long)*length);
-
- return 1;
- } else if (*width == 0 && *length != 0) {
- fprintf(stderr, "Image width is not specified.\n");
-
- *width = imagesize / *length;
-
- fprintf(stderr, "Width is guessed as %lu.\n",
- (unsigned long)*width);
-
- return 1;
- } else if (*width == 0 && *length == 0) {
- fprintf(stderr, "Image width and height are not specified.\n");
-
- for (w = (uint32) sqrt(imagesize / longt);
- w < sqrt(imagesize * longt);
- w++) {
- if (imagesize % w == 0) {
- scanlinesize = w * depth;
- buf1 = _TIFFmalloc(scanlinesize);
- buf2 = _TIFFmalloc(scanlinesize);
- h = imagesize / w;
- lseek(fd, hdr_size + (int)(h/2)*scanlinesize,
- SEEK_SET);
- read(fd, buf1, scanlinesize);
- read(fd, buf2, scanlinesize);
- if (swab) {
- swapBytesInScanline(buf1, w, dtype);
- swapBytesInScanline(buf2, w, dtype);
- }
- tmp = (float) fabs(correlation(buf1, buf2,
- w, dtype));
- if (tmp > cor_coef) {
- cor_coef = tmp;
- *width = w, *length = h;
- }
-
- _TIFFfree(buf1);
- _TIFFfree(buf2);
- }
- }
-
- fprintf(stderr,
- "Width is guessed as %lu, height is guessed as %lu.\n",
- (unsigned long)*width, (unsigned long)*length);
-
- return 1;
- } else {
- if (filestat.st_size<(off_t)(hdr_size+(*width)*(*length)*nbands*depth)) {
- fprintf(stderr, "Input file too small.\n");
- return -1;
- }
- }
-
- return 1;
-}
-
-/* Calculate correlation coefficient between two numeric vectors */
-static double
-correlation(void *buf1, void *buf2, uint32 n_elem, TIFFDataType dtype)
-{
- double X, Y, M1 = 0.0, M2 = 0.0, D1 = 0.0, D2 = 0.0, K = 0.0;
- uint32 i;
-
- switch (dtype) {
- case TIFF_BYTE:
- default:
- for (i = 0; i < n_elem; i++) {
- X = ((unsigned char *)buf1)[i];
- Y = ((unsigned char *)buf2)[i];
- M1 += X, M2 += Y;
- D1 += X * X, D2 += Y * Y;
- K += X * Y;
- }
- break;
- case TIFF_SBYTE:
- for (i = 0; i < n_elem; i++) {
- X = ((signed char *)buf1)[i];
- Y = ((signed char *)buf2)[i];
- M1 += X, M2 += Y;
- D1 += X * X, D2 += Y * Y;
- K += X * Y;
- }
- break;
- case TIFF_SHORT:
- for (i = 0; i < n_elem; i++) {
- X = ((uint16 *)buf1)[i];
- Y = ((uint16 *)buf2)[i];
- M1 += X, M2 += Y;
- D1 += X * X, D2 += Y * Y;
- K += X * Y;
- }
- break;
- case TIFF_SSHORT:
- for (i = 0; i < n_elem; i++) {
- X = ((int16 *)buf1)[i];
- Y = ((int16 *)buf2)[i];
- M1 += X, M2 += Y;
- D1 += X * X, D2 += Y * Y;
- K += X * Y;
- }
- break;
- case TIFF_LONG:
- for (i = 0; i < n_elem; i++) {
- X = ((uint32 *)buf1)[i];
- Y = ((uint32 *)buf2)[i];
- M1 += X, M2 += Y;
- D1 += X * X, D2 += Y * Y;
- K += X * Y;
- }
- break;
- case TIFF_SLONG:
- for (i = 0; i < n_elem; i++) {
- X = ((int32 *)buf1)[i];
- Y = ((int32 *)buf2)[i];
- M1 += X, M2 += Y;
- D1 += X * X, D2 += Y * Y;
- K += X * Y;
- }
- break;
- case TIFF_FLOAT:
- for (i = 0; i < n_elem; i++) {
- X = ((float *)buf1)[i];
- Y = ((float *)buf2)[i];
- M1 += X, M2 += Y;
- D1 += X * X, D2 += Y * Y;
- K += X * Y;
- }
- break;
- case TIFF_DOUBLE:
- for (i = 0; i < n_elem; i++) {
- X = ((double *)buf1)[i];
- Y = ((double *)buf2)[i];
- M1 += X, M2 += Y;
- D1 += X * X, D2 += Y * Y;
- K += X * Y;
- }
- break;
- }
-
- M1 /= n_elem;
- M2 /= n_elem;
- D1 -= M1 * M1 * n_elem;
- D2 -= M2 * M2 * n_elem;
- K = (K - M1 * M2 * n_elem) / sqrt(D1 * D2);
-
- return K;
-}
-
-static int
-processCompressOptions(char* opt)
-{
- if (strcmp(opt, "none") == 0)
- compression = COMPRESSION_NONE;
- else if (strcmp(opt, "packbits") == 0)
- compression = COMPRESSION_PACKBITS;
- else if (strncmp(opt, "jpeg", 4) == 0) {
- char* cp = strchr(opt, ':');
-
- compression = COMPRESSION_JPEG;
- while( cp )
- {
- if (isdigit((int)cp[1]))
- quality = atoi(cp+1);
- else if (cp[1] == 'r' )
- jpegcolormode = JPEGCOLORMODE_RAW;
- else
- usage();
-
- cp = strchr(cp+1,':');
- }
- } else if (strncmp(opt, "lzw", 3) == 0) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_LZW;
- } else if (strncmp(opt, "zip", 3) == 0) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_DEFLATE;
- } else
- return (0);
- return (1);
-}
-
-static char* stuff[] = {
-"raw2tiff --- tool for converting raw byte sequences in TIFF images",
-"usage: raw2tiff [options] input.raw output.tif",
-"where options are:",
-" -L input data has LSB2MSB bit order (default)",
-" -M input data has MSB2LSB bit order",
-" -r # make each strip have no more than # rows",
-" -H # size of input image file header in bytes (0 by default)",
-" -w # width of input image in pixels",
-" -l # length of input image in lines",
-" -b # number of bands in input image (1 by default)",
-"",
-" -d data_type type of samples in input image",
-"where data_type may be:",
-" byte 8-bit unsigned integer (default)",
-" short 16-bit unsigned integer",
-" long 32-bit unsigned integer",
-" sbyte 8-bit signed integer",
-" sshort 16-bit signed integer",
-" slong 32-bit signed integer",
-" float 32-bit IEEE floating point",
-" double 64-bit IEEE floating point",
-"",
-" -p photo photometric interpretation (color space) of the input image",
-"where photo may be:",
-" miniswhite white color represented with 0 value",
-" minisblack black color represented with 0 value (default)",
-" rgb image has RGB color model",
-" cmyk image has CMYK (separated) color model",
-" ycbcr image has YCbCr color model",
-" cielab image has CIE L*a*b color model",
-" icclab image has ICC L*a*b color model",
-" itulab image has ITU L*a*b color model",
-"",
-" -s swap bytes fetched from input file",
-"",
-" -i config type of samples interleaving in input image",
-"where config may be:",
-" pixel pixel interleaved data (default)",
-" band band interleaved data",
-"",
-" -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding",
-" -c zip[:opts] compress output with deflate encoding",
-" -c jpeg[:opts] compress output with JPEG encoding",
-" -c packbits compress output with packbits encoding",
-" -c none use no compression algorithm on output",
-"",
-"JPEG options:",
-" # set compression quality level (0-100, default 75)",
-" r output color image as RGB rather than YCbCr",
-"For example, -c jpeg:r:50 to get JPEG-encoded RGB data with 50% comp. quality",
-"",
-"LZW and deflate options:",
-" # set predictor value",
-"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing",
-" -o out.tif write output to out.tif",
-" -h this help message",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/rgb2ycbcr.c b/tiff/tools/rgb2ycbcr.c
deleted file mode 100755
index a3eeb03..0000000
--- a/tiff/tools/rgb2ycbcr.c
+++ /dev/null
@@ -1,391 +0,0 @@
-/* $Id: rgb2ycbcr.c,v 1.15 2013-05-02 14:44:29 tgl Exp $ */
-
-/*
- * Copyright (c) 1991-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffiop.h"
-#include "tiffio.h"
-
-#define streq(a,b) (strcmp(a,b) == 0)
-#define CopyField(tag, v) \
- if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v)
-
-#ifndef howmany
-#define howmany(x, y) (((x)+((y)-1))/(y))
-#endif
-#define roundup(x, y) (howmany(x,y)*((uint32)(y)))
-
-#define LumaRed ycbcrCoeffs[0]
-#define LumaGreen ycbcrCoeffs[1]
-#define LumaBlue ycbcrCoeffs[2]
-
-uint16 compression = COMPRESSION_PACKBITS;
-uint32 rowsperstrip = (uint32) -1;
-
-uint16 horizSubSampling = 2; /* YCbCr horizontal subsampling */
-uint16 vertSubSampling = 2; /* YCbCr vertical subsampling */
-float ycbcrCoeffs[3] = { .299F, .587F, .114F };
-/* default coding range is CCIR Rec 601-1 with no headroom/footroom */
-float refBlackWhite[6] = { 0.F, 255.F, 128.F, 255.F, 128.F, 255.F };
-
-static int tiffcvt(TIFF* in, TIFF* out);
-static void usage(int code);
-static void setupLumaTables(void);
-
-int
-main(int argc, char* argv[])
-{
- TIFF *in, *out;
- int c;
- extern int optind;
- extern char *optarg;
-
- while ((c = getopt(argc, argv, "c:h:r:v:z")) != -1)
- switch (c) {
- case 'c':
- if (streq(optarg, "none"))
- compression = COMPRESSION_NONE;
- else if (streq(optarg, "packbits"))
- compression = COMPRESSION_PACKBITS;
- else if (streq(optarg, "lzw"))
- compression = COMPRESSION_LZW;
- else if (streq(optarg, "jpeg"))
- compression = COMPRESSION_JPEG;
- else if (streq(optarg, "zip"))
- compression = COMPRESSION_ADOBE_DEFLATE;
- else
- usage(-1);
- break;
- case 'h':
- horizSubSampling = atoi(optarg);
- break;
- case 'v':
- vertSubSampling = atoi(optarg);
- break;
- case 'r':
- rowsperstrip = atoi(optarg);
- break;
- case 'z': /* CCIR Rec 601-1 w/ headroom/footroom */
- refBlackWhite[0] = 16.;
- refBlackWhite[1] = 235.;
- refBlackWhite[2] = 128.;
- refBlackWhite[3] = 240.;
- refBlackWhite[4] = 128.;
- refBlackWhite[5] = 240.;
- break;
- case '?':
- usage(0);
- /*NOTREACHED*/
- }
- if (argc - optind < 2)
- usage(-1);
- out = TIFFOpen(argv[argc-1], "w");
- if (out == NULL)
- return (-2);
- setupLumaTables();
- for (; optind < argc-1; optind++) {
- in = TIFFOpen(argv[optind], "r");
- if (in != NULL) {
- do {
- if (!tiffcvt(in, out) ||
- !TIFFWriteDirectory(out)) {
- (void) TIFFClose(out);
- return (1);
- }
- } while (TIFFReadDirectory(in));
- (void) TIFFClose(in);
- }
- }
- (void) TIFFClose(out);
- return (0);
-}
-
-float *lumaRed;
-float *lumaGreen;
-float *lumaBlue;
-float D1, D2;
-int Yzero;
-
-static float*
-setupLuma(float c)
-{
- float *v = (float *)_TIFFmalloc(256 * sizeof (float));
- int i;
- for (i = 0; i < 256; i++)
- v[i] = c * i;
- return (v);
-}
-
-static unsigned
-V2Code(float f, float RB, float RW, int CR)
-{
- unsigned int c = (unsigned int)((((f)*(RW-RB)/CR)+RB)+.5);
- return (c > 255 ? 255 : c);
-}
-
-static void
-setupLumaTables(void)
-{
- lumaRed = setupLuma(LumaRed);
- lumaGreen = setupLuma(LumaGreen);
- lumaBlue = setupLuma(LumaBlue);
- D1 = 1.F/(2.F - 2.F*LumaBlue);
- D2 = 1.F/(2.F - 2.F*LumaRed);
- Yzero = V2Code(0, refBlackWhite[0], refBlackWhite[1], 255);
-}
-
-static void
-cvtClump(unsigned char* op, uint32* raster, uint32 ch, uint32 cw, uint32 w)
-{
- float Y, Cb = 0, Cr = 0;
- uint32 j, k;
- /*
- * Convert ch-by-cw block of RGB
- * to YCbCr and sample accordingly.
- */
- for (k = 0; k < ch; k++) {
- for (j = 0; j < cw; j++) {
- uint32 RGB = (raster - k*w)[j];
- Y = lumaRed[TIFFGetR(RGB)] +
- lumaGreen[TIFFGetG(RGB)] +
- lumaBlue[TIFFGetB(RGB)];
- /* accumulate chrominance */
- Cb += (TIFFGetB(RGB) - Y) * D1;
- Cr += (TIFFGetR(RGB) - Y) * D2;
- /* emit luminence */
- *op++ = V2Code(Y,
- refBlackWhite[0], refBlackWhite[1], 255);
- }
- for (; j < horizSubSampling; j++)
- *op++ = Yzero;
- }
- for (; k < vertSubSampling; k++) {
- for (j = 0; j < horizSubSampling; j++)
- *op++ = Yzero;
- }
- /* emit sampled chrominance values */
- *op++ = V2Code(Cb / (ch*cw), refBlackWhite[2], refBlackWhite[3], 127);
- *op++ = V2Code(Cr / (ch*cw), refBlackWhite[4], refBlackWhite[5], 127);
-}
-#undef LumaRed
-#undef LumaGreen
-#undef LumaBlue
-#undef V2Code
-
-/*
- * Convert a strip of RGB data to YCbCr and
- * sample to generate the output data.
- */
-static void
-cvtStrip(unsigned char* op, uint32* raster, uint32 nrows, uint32 width)
-{
- uint32 x;
- int clumpSize = vertSubSampling * horizSubSampling + 2;
- uint32 *tp;
-
- for (; nrows >= vertSubSampling; nrows -= vertSubSampling) {
- tp = raster;
- for (x = width; x >= horizSubSampling; x -= horizSubSampling) {
- cvtClump(op, tp,
- vertSubSampling, horizSubSampling, width);
- op += clumpSize;
- tp += horizSubSampling;
- }
- if (x > 0) {
- cvtClump(op, tp, vertSubSampling, x, width);
- op += clumpSize;
- }
- raster -= vertSubSampling*width;
- }
- if (nrows > 0) {
- tp = raster;
- for (x = width; x >= horizSubSampling; x -= horizSubSampling) {
- cvtClump(op, tp, nrows, horizSubSampling, width);
- op += clumpSize;
- tp += horizSubSampling;
- }
- if (x > 0)
- cvtClump(op, tp, nrows, x, width);
- }
-}
-
-static int
-cvtRaster(TIFF* tif, uint32* raster, uint32 width, uint32 height)
-{
- uint32 y;
- tstrip_t strip = 0;
- tsize_t cc, acc;
- unsigned char* buf;
- uint32 rwidth = roundup(width, horizSubSampling);
- uint32 rheight = roundup(height, vertSubSampling);
- uint32 nrows = (rowsperstrip > rheight ? rheight : rowsperstrip);
- uint32 rnrows = roundup(nrows,vertSubSampling);
-
- cc = rnrows*rwidth +
- 2*((rnrows*rwidth) / (horizSubSampling*vertSubSampling));
- buf = (unsigned char*)_TIFFmalloc(cc);
- // FIXME unchecked malloc
- for (y = height; (int32) y > 0; y -= nrows) {
- uint32 nr = (y > nrows ? nrows : y);
- cvtStrip(buf, raster + (y-1)*width, nr, width);
- nr = roundup(nr, vertSubSampling);
- acc = nr*rwidth +
- 2*((nr*rwidth)/(horizSubSampling*vertSubSampling));
- if (!TIFFWriteEncodedStrip(tif, strip++, buf, acc)) {
- _TIFFfree(buf);
- return (0);
- }
- }
- _TIFFfree(buf);
- return (1);
-}
-
-static int
-tiffcvt(TIFF* in, TIFF* out)
-{
- uint32 width, height; /* image width & height */
- uint32* raster; /* retrieve RGBA image */
- uint16 shortv;
- float floatv;
- char *stringv;
- uint32 longv;
- int result;
- size_t pixel_count;
-
- TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width);
- TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height);
- pixel_count = width * height;
-
- /* XXX: Check the integer overflow. */
- if (!width || !height || pixel_count / width != height) {
- TIFFError(TIFFFileName(in),
- "Malformed input file; "
- "can't allocate buffer for raster of %lux%lu size",
- (unsigned long)width, (unsigned long)height);
- return 0;
- }
-
- raster = (uint32*)_TIFFCheckMalloc(in, pixel_count, sizeof(uint32),
- "raster buffer");
- if (raster == 0) {
- TIFFError(TIFFFileName(in),
- "Failed to allocate buffer (%lu elements of %lu each)",
- (unsigned long)pixel_count,
- (unsigned long)sizeof(uint32));
- return (0);
- }
-
- if (!TIFFReadRGBAImage(in, width, height, raster, 0)) {
- _TIFFfree(raster);
- return (0);
- }
-
- CopyField(TIFFTAG_SUBFILETYPE, longv);
- TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width);
- TIFFSetField(out, TIFFTAG_IMAGELENGTH, height);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 8);
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR);
- if (compression == COMPRESSION_JPEG)
- TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RAW);
- CopyField(TIFFTAG_FILLORDER, shortv);
- TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 3);
- CopyField(TIFFTAG_XRESOLUTION, floatv);
- CopyField(TIFFTAG_YRESOLUTION, floatv);
- CopyField(TIFFTAG_RESOLUTIONUNIT, shortv);
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- { char buf[2048];
- char *cp = strrchr(TIFFFileName(in), '/');
- snprintf(buf, sizeof(buf), "YCbCr conversion of %s",
- cp ? cp+1 : TIFFFileName(in));
- TIFFSetField(out, TIFFTAG_IMAGEDESCRIPTION, buf);
- }
- TIFFSetField(out, TIFFTAG_SOFTWARE, TIFFGetVersion());
- CopyField(TIFFTAG_DOCUMENTNAME, stringv);
-
- TIFFSetField(out, TIFFTAG_REFERENCEBLACKWHITE, refBlackWhite);
- TIFFSetField(out, TIFFTAG_YCBCRSUBSAMPLING,
- horizSubSampling, vertSubSampling);
- TIFFSetField(out, TIFFTAG_YCBCRPOSITIONING, YCBCRPOSITION_CENTERED);
- TIFFSetField(out, TIFFTAG_YCBCRCOEFFICIENTS, ycbcrCoeffs);
- rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip);
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
-
- result = cvtRaster(out, raster, width, height);
- _TIFFfree(raster);
- return result;
-}
-
-char* stuff[] = {
- "usage: rgb2ycbcr [-c comp] [-r rows] [-h N] [-v N] input... output\n",
- "where comp is one of the following compression algorithms:\n",
- " jpeg\t\tJPEG encoding\n",
- " lzw\t\tLempel-Ziv & Welch encoding\n",
- " zip\t\tdeflate encoding\n",
- " packbits\tPackBits encoding (default)\n",
- " none\t\tno compression\n",
- "and the other options are:\n",
- " -r\trows/strip\n",
- " -h\thorizontal sampling factor (1,2,4)\n",
- " -v\tvertical sampling factor (1,2,4)\n",
- NULL
-};
-
-static void
-usage(int code)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
-
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(code);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/sgi2tiff.c b/tiff/tools/sgi2tiff.c
deleted file mode 100755
index 227e621..0000000
--- a/tiff/tools/sgi2tiff.c
+++ /dev/null
@@ -1,335 +0,0 @@
-/* $Id: sgi2tiff.c,v 1.6 2010-03-10 18:56:49 bfriesen Exp $ */
-
-/*
- * Copyright (c) 1991-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <gl/image.h>
-#include <ctype.h>
-
-#include "tiffio.h"
-
-#define streq(a,b) (strcmp(a,b) == 0)
-#define strneq(a,b,n) (strncmp(a,b,n) == 0)
-
-static short config = PLANARCONFIG_CONTIG;
-static uint16 compression = COMPRESSION_PACKBITS;
-static uint16 predictor = 0;
-static uint16 fillorder = 0;
-static uint32 rowsperstrip = (uint32) -1;
-static int jpegcolormode = JPEGCOLORMODE_RGB;
-static int quality = 75; /* JPEG quality */
-static uint16 photometric;
-
-static void usage(void);
-static int cpContig(IMAGE*, TIFF*);
-static int cpSeparate(IMAGE*, TIFF*);
-static int processCompressOptions(char*);
-
-/* XXX image library has no prototypes */
-extern IMAGE* iopen(const char*, const char*);
-extern void iclose(IMAGE*);
-extern void getrow(IMAGE*, short*, int, int);
-
-int
-main(int argc, char* argv[])
-{
- IMAGE *in;
- TIFF *out;
- int c;
- extern int optind;
- extern char* optarg;
-
- while ((c = getopt(argc, argv, "c:p:r:")) != -1)
- switch (c) {
- case 'c': /* compression scheme */
- if (!processCompressOptions(optarg))
- usage();
- break;
- case 'f': /* fill order */
- if (streq(optarg, "lsb2msb"))
- fillorder = FILLORDER_LSB2MSB;
- else if (streq(optarg, "msb2lsb"))
- fillorder = FILLORDER_MSB2LSB;
- else
- usage();
- break;
- case 'p': /* planar configuration */
- if (streq(optarg, "separate"))
- config = PLANARCONFIG_SEPARATE;
- else if (streq(optarg, "contig"))
- config = PLANARCONFIG_CONTIG;
- else
- usage();
- break;
- case 'r': /* rows/strip */
- rowsperstrip = atoi(optarg);
- break;
- case '?':
- usage();
- /*NOTREACHED*/
- }
- if (argc - optind != 2)
- usage();
- in = iopen(argv[optind], "r");
- if (in == NULL)
- return (-1);
- out = TIFFOpen(argv[optind+1], "w");
- if (out == NULL)
- return (-2);
- TIFFSetField(out, TIFFTAG_IMAGEWIDTH, (uint32) in->xsize);
- TIFFSetField(out, TIFFTAG_IMAGELENGTH, (uint32) in->ysize);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 8);
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- if (in->zsize == 1)
- photometric = PHOTOMETRIC_MINISBLACK;
- else
- photometric = PHOTOMETRIC_RGB;
- switch (compression) {
- case COMPRESSION_JPEG:
- if (photometric == PHOTOMETRIC_RGB && jpegcolormode == JPEGCOLORMODE_RGB)
- photometric = PHOTOMETRIC_YCBCR;
- TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality);
- TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode);
- break;
- case COMPRESSION_LZW:
- case COMPRESSION_DEFLATE:
- if (predictor != 0)
- TIFFSetField(out, TIFFTAG_PREDICTOR, predictor);
- break;
- }
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric);
- if (fillorder != 0)
- TIFFSetField(out, TIFFTAG_FILLORDER, fillorder);
- TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, in->zsize);
- if (in->zsize > 3) {
- uint16 v[1];
- v[0] = EXTRASAMPLE_UNASSALPHA;
- TIFFSetField(out, TIFFTAG_EXTRASAMPLES, 1, v);
- }
- TIFFSetField(out, TIFFTAG_MINSAMPLEVALUE, (uint16) in->min);
- TIFFSetField(out, TIFFTAG_MAXSAMPLEVALUE, (uint16) in->max);
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, config);
- if (config != PLANARCONFIG_SEPARATE)
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP,
- TIFFDefaultStripSize(out, rowsperstrip));
- else /* force 1 row/strip for library limitation */
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, 1L);
- if (in->name[0] != '\0')
- TIFFSetField(out, TIFFTAG_IMAGEDESCRIPTION, in->name);
- if (config == PLANARCONFIG_CONTIG)
- cpContig(in, out);
- else
- cpSeparate(in, out);
- (void) iclose(in);
- (void) TIFFClose(out);
- return (0);
-}
-
-static int
-processCompressOptions(char* opt)
-{
- if (streq(opt, "none"))
- compression = COMPRESSION_NONE;
- else if (streq(opt, "packbits"))
- compression = COMPRESSION_PACKBITS;
- else if (strneq(opt, "jpeg", 4)) {
- char* cp = strchr(opt, ':');
-
- defcompression = COMPRESSION_JPEG;
- while( cp )
- {
- if (isdigit((int)cp[1]))
- quality = atoi(cp+1);
- else if (cp[1] == 'r' )
- jpegcolormode = JPEGCOLORMODE_RAW;
- else
- usage();
-
- cp = strchr(cp+1,':');
- }
- } else if (strneq(opt, "lzw", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_LZW;
- } else if (strneq(opt, "zip", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_DEFLATE;
- } else
- return (0);
- return (1);
-}
-
-static int
-cpContig(IMAGE* in, TIFF* out)
-{
- tdata_t buf = _TIFFmalloc(TIFFScanlineSize(out));
- short *r = NULL;
- int x, y;
-
- if (in->zsize == 3) {
- short *g, *b;
-
- r = (short *)_TIFFmalloc(3 * in->xsize * sizeof (short));
- g = r + in->xsize;
- b = g + in->xsize;
- for (y = in->ysize-1; y >= 0; y--) {
- uint8* pp = (uint8*) buf;
-
- getrow(in, r, y, 0);
- getrow(in, g, y, 1);
- getrow(in, b, y, 2);
- for (x = 0; x < in->xsize; x++) {
- pp[0] = r[x];
- pp[1] = g[x];
- pp[2] = b[x];
- pp += 3;
- }
- if (TIFFWriteScanline(out, buf, in->ysize-y-1, 0) < 0)
- goto bad;
- }
- } else if (in->zsize == 4) {
- short *g, *b, *a;
-
- r = (short *)_TIFFmalloc(4 * in->xsize * sizeof (short));
- g = r + in->xsize;
- b = g + in->xsize;
- a = b + in->xsize;
- for (y = in->ysize-1; y >= 0; y--) {
- uint8* pp = (uint8*) buf;
-
- getrow(in, r, y, 0);
- getrow(in, g, y, 1);
- getrow(in, b, y, 2);
- getrow(in, a, y, 3);
- for (x = 0; x < in->xsize; x++) {
- pp[0] = r[x];
- pp[1] = g[x];
- pp[2] = b[x];
- pp[3] = a[x];
- pp += 4;
- }
- if (TIFFWriteScanline(out, buf, in->ysize-y-1, 0) < 0)
- goto bad;
- }
- } else {
- uint8* pp = (uint8*) buf;
-
- r = (short *)_TIFFmalloc(in->xsize * sizeof (short));
- for (y = in->ysize-1; y >= 0; y--) {
- getrow(in, r, y, 0);
- for (x = in->xsize-1; x >= 0; x--)
- pp[x] = r[x];
- if (TIFFWriteScanline(out, buf, in->ysize-y-1, 0) < 0)
- goto bad;
- }
- }
- if (r)
- _TIFFfree(r);
- _TIFFfree(buf);
- return (1);
-bad:
- if (r)
- _TIFFfree(r);
- _TIFFfree(buf);
- return (0);
-}
-
-static int
-cpSeparate(IMAGE* in, TIFF* out)
-{
- tdata_t buf = _TIFFmalloc(TIFFScanlineSize(out));
- short *r = (short *)_TIFFmalloc(in->xsize * sizeof (short));
- uint8* pp = (uint8*) buf;
- int x, y, z;
-
- for (z = 0; z < in->zsize; z++) {
- for (y = in->ysize-1; y >= 0; y--) {
- getrow(in, r, y, z);
- for (x = 0; x < in->xsize; x++)
- pp[x] = r[x];
- if (TIFFWriteScanline(out, buf, in->ysize-y-1, z) < 0)
- goto bad;
- }
- }
- _TIFFfree(r);
- _TIFFfree(buf);
- return (1);
-bad:
- _TIFFfree(r);
- _TIFFfree(buf);
- return (0);
-}
-
-char* stuff[] = {
-"usage: sgi2tiff [options] input.rgb output.tif",
-"where options are:",
-" -r # make each strip have no more than # rows",
-"",
-" -p contig pack samples contiguously (e.g. RGBRGB...)",
-" -p separate store samples separately (e.g. RRR...GGG...BBB...)",
-"",
-" -f lsb2msb force lsb-to-msb FillOrder for output",
-" -f msb2lsb force msb-to-lsb FillOrder for output",
-"",
-" -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding",
-" -c zip[:opts] compress output with deflate encoding",
-" -c jpeg[:opts]compress output with JPEG encoding",
-" -c packbits compress output with packbits encoding",
-" -c none use no compression algorithm on output",
-"",
-"JPEG options:",
-" # set compression quality level (0-100, default 75)",
-" r output color image as RGB rather than YCbCr",
-"",
-"LZW and deflate options:",
-" # set predictor value",
-"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/sgisv.c b/tiff/tools/sgisv.c
deleted file mode 100755
index e0d91e0..0000000
--- a/tiff/tools/sgisv.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/* $Id: sgisv.c,v 1.6 2010-03-10 18:56:49 bfriesen Exp $ */
-
-/*
- * Copyright (c) 1990-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <gl.h>
-#include <ctype.h>
-
-#include "tiffio.h"
-
-typedef unsigned char unsigned char;
-typedef unsigned long uint32;
-
-#define streq(a,b) (strcmp(a,b) == 0)
-#define strneq(a,b,n) (strncmp(a,b,n) == 0)
-
-uint32 rowsperstrip = (uint32) -1;
-uint16 compression = COMPRESSION_PACKBITS;
-uint16 config = PLANARCONFIG_CONTIG;
-uint16 predictor = 0;
-int xmaxscreen;
-int ymaxscreen;
-uint16 photometric = PHOTOMETRIC_RGB;
-int jpegcolormode = JPEGCOLORMODE_RGB;
-int quality = 75; /* JPEG quality */
-
-static void usage(void);
-static void tiffsv(char*, int, int, int, int);
-
-int
-main(int argc, char* argv[])
-{
- int c;
- extern int optind;
- extern char* optarg;
-
- while ((c = getopt(argc, argv, "c:p:r:")) != -1)
- switch (c) {
- case 'b': /* save as b&w */
- photometric = PHOTOMETRIC_MINISBLACK;
- break;
- case 'c': /* compression scheme */
- if (streq(optarg, "none"))
- compression = COMPRESSION_NONE;
- else if (streq(optarg, "packbits"))
- compression = COMPRESSION_PACKBITS;
- else if (strneq(optarg, "jpeg", 4)) {
- char* cp = strchr(optarg, ':');
- if (cp && isdigit(cp[1]))
- quality = atoi(cp+1);
- if (cp && strchr(cp, 'r'))
- jpegcolormode = JPEGCOLORMODE_RAW;
- compression = COMPRESSION_JPEG;
- } else if (strneq(optarg, "lzw", 3)) {
- char* cp = strchr(optarg, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_LZW;
- } else
- usage();
- break;
- case 'p': /* planar configuration */
- if (streq(optarg, "separate"))
- config = PLANARCONFIG_SEPARATE;
- else if (streq(optarg, "contig"))
- config = PLANARCONFIG_CONTIG;
- else
- usage();
- break;
- case 'r': /* rows/strip */
- rowsperstrip = atoi(optarg);
- break;
- case '?':
- usage();
- /*NOTREACHED*/
- }
- if (argc - optind != 1 && argc - optind != 5)
- usage();
- xmaxscreen = getgdesc(GD_XPMAX)-1;
- ymaxscreen = getgdesc(GD_YPMAX)-1;
- foreground();
- noport();
- winopen("tiffsv");
- if (argc - optind == 5)
- tiffsv(argv[optind],
- atoi(argv[optind+1]), atoi(argv[optind+2]),
- atoi(argv[optind+3]), atoi(argv[optind+4]));
- else
- tiffsv(argv[optind], 0, xmaxscreen, 0, ymaxscreen);
- return (0);
-}
-
-char* stuff[] = {
-"usage: tiffsv [options] outimage.tif [x1 x2 y1 y2] [-b]",
-"where options are:",
-" -p contig pack samples contiguously (e.g. RGBRGB...)",
-" -p separate store samples separately (e.g. RRR...GGG...BBB...)",
-"",
-" -r # make each strip have no more than # rows",
-"",
-" -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding",
-" -c jpeg[:opts]compress output with JPEG encoding",
-" -c packbits compress output with packbits encoding",
-" -c none use no compression algorithm on output",
-"",
-"JPEG options:",
-" # set compression quality level (0-100, default 75)",
-" r output color image as RGB rather than YCbCr",
-"",
-"LZW options:",
-" # set predictor value for Lempel-Ziv & Welch encoding",
-"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-static void
-svRGBSeparate(TIFF* tif, uint32* ss, int xsize, int ysize)
-{
- tsize_t stripsize = TIFFStripSize(tif);
- unsigned char *rbuf = (unsigned char *)_TIFFmalloc(3*stripsize);
- unsigned char *gbuf = rbuf + stripsize;
- unsigned char *bbuf = gbuf + stripsize;
- register int y;
-
- for (y = 0; y <= ysize; y += rowsperstrip) {
- unsigned char *rp, *gp, *bp;
- register int x;
- register uint32 n;
-
- n = rowsperstrip;
- if (n > ysize-y+1)
- n = ysize-y+1;
- rp = rbuf; gp = gbuf; bp = bbuf;
- do {
- for (x = 0; x <= xsize; x++) {
- uint32 v = ss[x];
- rp[x] = v;
- gp[x] = v >> 8;
- bp[x] = v >> 16;
- }
- rp += xsize+1, gp += xsize+1, bp += xsize+1;
- ss += xsize+1;
- } while (--n);
- if (TIFFWriteEncodedStrip(tif, TIFFComputeStrip(tif,y,0),
- rbuf, stripsize) < 0)
- break;
- if (TIFFWriteEncodedStrip(tif, TIFFComputeStrip(tif,y,1),
- gbuf, stripsize) < 0)
- break;
- if (TIFFWriteEncodedStrip(tif, TIFFComputeStrip(tif,y,2),
- bbuf, stripsize) < 0)
- break;
- }
- _TIFFfree(rbuf);
-}
-
-static void
-svRGBContig(TIFF* tif, uint32* ss, int xsize, int ysize)
-{
- register int x, y;
- tsize_t stripsize = TIFFStripSize(tif);
- unsigned char *strip = (unsigned char *)_TIFFmalloc(stripsize);
-
- for (y = 0; y <= ysize; y += rowsperstrip) {
- register unsigned char *pp = strip;
- register uint32 n;
-
- n = rowsperstrip;
- if (n > ysize-y+1)
- n = ysize-y+1;
- do {
- for (x = 0; x <= xsize; x++) {
- uint32 v = ss[x];
- pp[0] = v;
- pp[1] = v >> 8;
- pp[2] = v >> 16;
- pp += 3;
- }
- ss += xsize+1;
- } while (--n);
- if (TIFFWriteEncodedStrip(tif, TIFFComputeStrip(tif,y,0),
- strip, stripsize) < 0)
- break;
- }
- _TIFFfree(strip);
-}
-
-#undef RED
-#undef GREEN
-#undef BLUE
-#define CVT(x) (((x)*255)/100)
-#define RED CVT(28) /* 28% */
-#define GREEN CVT(59) /* 59% */
-#define BLUE CVT(11) /* 11% */
-
-static void
-svGrey(TIFF* tif, uint32* ss, int xsize, int ysize)
-{
- register int x, y;
- unsigned char *buf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(tif));
-
- for (y = 0; y <= ysize; y++) {
- for (x = 0; x <= xsize; x++) {
- unsigned char *cp = (unsigned char *)&ss[x];
- buf[x] = (RED*cp[3] + GREEN*cp[2] + BLUE*cp[1]) >> 8;
- }
- if (TIFFWriteScanline(tif, buf, (uint32) y, 0) < 0)
- break;
- ss += xsize+1;
- }
- _TIFFfree(buf);
-}
-
-#define MIN(a,b) ((a)<(b)?(a):(b))
-#define ABS(x) ((x)<0?-(x):(x))
-
-static void
-tiffsv(char* name, int x1, int x2, int y1, int y2)
-{
- TIFF *tif;
- int xsize, ysize;
- int xorg, yorg;
- uint32 *scrbuf;
-
- xorg = MIN(x1,x2);
- yorg = MIN(y1,y2);
- if (xorg<0)
- xorg = 0;
- if (yorg<0)
- yorg = 0;
- xsize = ABS(x2-x1);
- ysize = ABS(y2-y1);
- if (xorg+xsize > xmaxscreen)
- xsize = xmaxscreen-xorg;
- if (yorg+ysize > ymaxscreen)
- ysize = ymaxscreen-yorg;
- tif = TIFFOpen(name, "w");
- TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, (uint32) (xsize+1));
- TIFFSetField(tif, TIFFTAG_IMAGELENGTH, (uint32) (ysize+1));
- TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
- TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL,
- photometric == PHOTOMETRIC_RGB ? 3 : 1);
- TIFFSetField(tif, TIFFTAG_PLANARCONFIG, config);
- TIFFSetField(tif, TIFFTAG_COMPRESSION, compression);
- switch (compression) {
- case COMPRESSION_JPEG:
- if (photometric == PHOTOMETRIC_RGB && jpegcolormode == JPEGCOLORMODE_RGB)
- photometric = PHOTOMETRIC_YCBCR;
- TIFFSetField(tif, TIFFTAG_JPEGQUALITY, quality);
- TIFFSetField(tif, TIFFTAG_JPEGCOLORMODE, jpegcolormode);
- break;
- case COMPRESSION_LZW:
- if (predictor != 0)
- TIFFSetField(tif, TIFFTAG_PREDICTOR, predictor);
- break;
- }
- TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, photometric);
- TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_BOTLEFT);
- rowsperstrip = TIFFDefaultStripSize(tif, rowsperstrip);
- TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
- scrbuf = (uint32 *)_TIFFmalloc((xsize+1)*(ysize+1)*sizeof (uint32));
- readdisplay(xorg, yorg, xorg+xsize, yorg+ysize, scrbuf, RD_FREEZE);
- if (photometric == PHOTOMETRIC_RGB) {
- if (config == PLANARCONFIG_SEPARATE)
- svRGBSeparate(tif, scrbuf, xsize, ysize);
- else
- svRGBContig(tif, scrbuf, xsize, ysize);
- } else
- svGrey(tif, scrbuf, xsize, ysize);
- (void) TIFFClose(tif);
- _TIFFfree((char *)scrbuf);
-}
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/thumbnail.c b/tiff/tools/thumbnail.c
deleted file mode 100755
index 2699324..0000000
--- a/tiff/tools/thumbnail.c
+++ /dev/null
@@ -1,689 +0,0 @@
-/* $Id: thumbnail.c,v 1.20 2014-12-21 20:04:31 erouault Exp $ */
-
-/*
- * Copyright (c) 1994-1997 Sam Leffler
- * Copyright (c) 1994-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffio.h"
-
-#ifndef HAVE_GETOPT
-extern int getopt(int, char**, char*);
-#endif
-
-#define streq(a,b) (strcmp(a,b) == 0)
-
-#ifndef TIFFhowmany8
-# define TIFFhowmany8(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3)
-#endif
-
-typedef enum {
- EXP50,
- EXP60,
- EXP70,
- EXP80,
- EXP90,
- EXP,
- LINEAR
-} Contrast;
-
-static uint32 tnw = 216; /* thumbnail width */
-static uint32 tnh = 274; /* thumbnail height */
-static Contrast contrast = LINEAR; /* current contrast */
-static uint8* thumbnail;
-
-static int cpIFD(TIFF*, TIFF*);
-static int generateThumbnail(TIFF*, TIFF*);
-static void initScale();
-static void usage(void);
-
-extern char* optarg;
-extern int optind;
-
-int
-main(int argc, char* argv[])
-{
- TIFF* in;
- TIFF* out;
- int c;
-
- while ((c = getopt(argc, argv, "w:h:c:")) != -1) {
- switch (c) {
- case 'w': tnw = strtoul(optarg, NULL, 0); break;
- case 'h': tnh = strtoul(optarg, NULL, 0); break;
- case 'c': contrast = streq(optarg, "exp50") ? EXP50 :
- streq(optarg, "exp60") ? EXP60 :
- streq(optarg, "exp70") ? EXP70 :
- streq(optarg, "exp80") ? EXP80 :
- streq(optarg, "exp90") ? EXP90 :
- streq(optarg, "exp") ? EXP :
- streq(optarg, "linear")? LINEAR :
- EXP;
- break;
- default: usage();
- }
- }
- if (argc-optind != 2)
- usage();
-
- out = TIFFOpen(argv[optind+1], "w");
- if (out == NULL)
- return 2;
- in = TIFFOpen(argv[optind], "r");
- if( in == NULL )
- return 2;
-
- thumbnail = (uint8*) _TIFFmalloc(tnw * tnh);
- if (!thumbnail) {
- TIFFError(TIFFFileName(in),
- "Can't allocate space for thumbnail buffer.");
- return 1;
- }
-
- if (in != NULL) {
- initScale();
- do {
- if (!generateThumbnail(in, out))
- goto bad;
- if (!cpIFD(in, out) || !TIFFWriteDirectory(out))
- goto bad;
- } while (TIFFReadDirectory(in));
- (void) TIFFClose(in);
- }
- (void) TIFFClose(out);
- return 0;
-bad:
- (void) TIFFClose(out);
- return 1;
-}
-
-#define CopyField(tag, v) \
- if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v)
-#define CopyField2(tag, v1, v2) \
- if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2)
-#define CopyField3(tag, v1, v2, v3) \
- if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3)
-#define CopyField4(tag, v1, v2, v3, v4) \
- if (TIFFGetField(in, tag, &v1, &v2, &v3, &v4)) TIFFSetField(out, tag, v1, v2, v3, v4)
-
-static void
-cpTag(TIFF* in, TIFF* out, uint16 tag, uint16 count, TIFFDataType type)
-{
- switch (type) {
- case TIFF_SHORT:
- if (count == 1) {
- uint16 shortv;
- CopyField(tag, shortv);
- } else if (count == 2) {
- uint16 shortv1, shortv2;
- CopyField2(tag, shortv1, shortv2);
- } else if (count == 4) {
- uint16 *tr, *tg, *tb, *ta;
- CopyField4(tag, tr, tg, tb, ta);
- } else if (count == (uint16) -1) {
- uint16 shortv1;
- uint16* shortav;
- CopyField2(tag, shortv1, shortav);
- }
- break;
- case TIFF_LONG:
- { uint32 longv;
- CopyField(tag, longv);
- }
- break;
- case TIFF_LONG8:
- { uint64 longv8;
- CopyField(tag, longv8);
- }
- break;
- case TIFF_SLONG8:
- { int64 longv8;
- CopyField(tag, longv8);
- }
- break;
- case TIFF_RATIONAL:
- if (count == 1) {
- float floatv;
- CopyField(tag, floatv);
- } else if (count == (uint16) -1) {
- float* floatav;
- CopyField(tag, floatav);
- }
- break;
- case TIFF_ASCII:
- { char* stringv;
- CopyField(tag, stringv);
- }
- break;
- case TIFF_DOUBLE:
- if (count == 1) {
- double doublev;
- CopyField(tag, doublev);
- } else if (count == (uint16) -1) {
- double* doubleav;
- CopyField(tag, doubleav);
- }
- break;
- case TIFF_IFD8:
- { toff_t ifd8;
- CopyField(tag, ifd8);
- }
- break; default:
- TIFFError(TIFFFileName(in),
- "Data type %d is not supported, tag %d skipped.",
- tag, type);
- }
-}
-
-#undef CopyField4
-#undef CopyField3
-#undef CopyField2
-#undef CopyField
-
-static struct cpTag {
- uint16 tag;
- uint16 count;
- TIFFDataType type;
-} tags[] = {
- { TIFFTAG_IMAGEWIDTH, 1, TIFF_LONG },
- { TIFFTAG_IMAGELENGTH, 1, TIFF_LONG },
- { TIFFTAG_BITSPERSAMPLE, 1, TIFF_SHORT },
- { TIFFTAG_COMPRESSION, 1, TIFF_SHORT },
- { TIFFTAG_FILLORDER, 1, TIFF_SHORT },
- { TIFFTAG_SAMPLESPERPIXEL, 1, TIFF_SHORT },
- { TIFFTAG_ROWSPERSTRIP, 1, TIFF_LONG },
- { TIFFTAG_PLANARCONFIG, 1, TIFF_SHORT },
- { TIFFTAG_GROUP3OPTIONS, 1, TIFF_LONG },
- { TIFFTAG_SUBFILETYPE, 1, TIFF_LONG },
- { TIFFTAG_PHOTOMETRIC, 1, TIFF_SHORT },
- { TIFFTAG_THRESHHOLDING, 1, TIFF_SHORT },
- { TIFFTAG_DOCUMENTNAME, 1, TIFF_ASCII },
- { TIFFTAG_IMAGEDESCRIPTION, 1, TIFF_ASCII },
- { TIFFTAG_MAKE, 1, TIFF_ASCII },
- { TIFFTAG_MODEL, 1, TIFF_ASCII },
- { TIFFTAG_ORIENTATION, 1, TIFF_SHORT },
- { TIFFTAG_MINSAMPLEVALUE, 1, TIFF_SHORT },
- { TIFFTAG_MAXSAMPLEVALUE, 1, TIFF_SHORT },
- { TIFFTAG_XRESOLUTION, 1, TIFF_RATIONAL },
- { TIFFTAG_YRESOLUTION, 1, TIFF_RATIONAL },
- { TIFFTAG_PAGENAME, 1, TIFF_ASCII },
- { TIFFTAG_XPOSITION, 1, TIFF_RATIONAL },
- { TIFFTAG_YPOSITION, 1, TIFF_RATIONAL },
- { TIFFTAG_GROUP4OPTIONS, 1, TIFF_LONG },
- { TIFFTAG_RESOLUTIONUNIT, 1, TIFF_SHORT },
- { TIFFTAG_PAGENUMBER, 2, TIFF_SHORT },
- { TIFFTAG_SOFTWARE, 1, TIFF_ASCII },
- { TIFFTAG_DATETIME, 1, TIFF_ASCII },
- { TIFFTAG_ARTIST, 1, TIFF_ASCII },
- { TIFFTAG_HOSTCOMPUTER, 1, TIFF_ASCII },
- { TIFFTAG_WHITEPOINT, 2, TIFF_RATIONAL },
- { TIFFTAG_PRIMARYCHROMATICITIES, (uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_HALFTONEHINTS, 2, TIFF_SHORT },
- { TIFFTAG_BADFAXLINES, 1, TIFF_LONG },
- { TIFFTAG_CLEANFAXDATA, 1, TIFF_SHORT },
- { TIFFTAG_CONSECUTIVEBADFAXLINES, 1, TIFF_LONG },
- { TIFFTAG_INKSET, 1, TIFF_SHORT },
- /*{ TIFFTAG_INKNAMES, 1, TIFF_ASCII },*/ /* Needs much more complicated logic. See tiffcp */
- { TIFFTAG_DOTRANGE, 2, TIFF_SHORT },
- { TIFFTAG_TARGETPRINTER, 1, TIFF_ASCII },
- { TIFFTAG_SAMPLEFORMAT, 1, TIFF_SHORT },
- { TIFFTAG_YCBCRCOEFFICIENTS, (uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_YCBCRSUBSAMPLING, 2, TIFF_SHORT },
- { TIFFTAG_YCBCRPOSITIONING, 1, TIFF_SHORT },
- { TIFFTAG_REFERENCEBLACKWHITE, (uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_EXTRASAMPLES, (uint16) -1, TIFF_SHORT },
-};
-#define NTAGS (sizeof (tags) / sizeof (tags[0]))
-
-static void
-cpTags(TIFF* in, TIFF* out)
-{
- struct cpTag *p;
- for (p = tags; p < &tags[NTAGS]; p++)
- {
- /* Horrible: but TIFFGetField() expects 2 arguments to be passed */
- /* if we request a tag that is defined in a codec, but that codec */
- /* isn't used */
- if( p->tag == TIFFTAG_GROUP3OPTIONS )
- {
- uint16 compression;
- if( !TIFFGetField(in, TIFFTAG_COMPRESSION, &compression) ||
- compression != COMPRESSION_CCITTFAX3 )
- continue;
- }
- if( p->tag == TIFFTAG_GROUP4OPTIONS )
- {
- uint16 compression;
- if( !TIFFGetField(in, TIFFTAG_COMPRESSION, &compression) ||
- compression != COMPRESSION_CCITTFAX4 )
- continue;
- }
- cpTag(in, out, p->tag, p->count, p->type);
- }
-}
-#undef NTAGS
-
-static int
-cpStrips(TIFF* in, TIFF* out)
-{
- tsize_t bufsize = TIFFStripSize(in);
- unsigned char *buf = (unsigned char *)_TIFFmalloc(bufsize);
-
- if (buf) {
- tstrip_t s, ns = TIFFNumberOfStrips(in);
- uint64 *bytecounts;
-
- TIFFGetField(in, TIFFTAG_STRIPBYTECOUNTS, &bytecounts);
- for (s = 0; s < ns; s++) {
- if (bytecounts[s] > (uint64) bufsize) {
- buf = (unsigned char *)_TIFFrealloc(buf, (tmsize_t)bytecounts[s]);
- if (!buf)
- goto bad;
- bufsize = (tmsize_t)bytecounts[s];
- }
- if (TIFFReadRawStrip(in, s, buf, (tmsize_t)bytecounts[s]) < 0 ||
- TIFFWriteRawStrip(out, s, buf, (tmsize_t)bytecounts[s]) < 0) {
- _TIFFfree(buf);
- return 0;
- }
- }
- _TIFFfree(buf);
- return 1;
- }
-
-bad:
- TIFFError(TIFFFileName(in),
- "Can't allocate space for strip buffer.");
- return 0;
-}
-
-static int
-cpTiles(TIFF* in, TIFF* out)
-{
- tsize_t bufsize = TIFFTileSize(in);
- unsigned char *buf = (unsigned char *)_TIFFmalloc(bufsize);
-
- if (buf) {
- ttile_t t, nt = TIFFNumberOfTiles(in);
- uint64 *bytecounts;
-
- TIFFGetField(in, TIFFTAG_TILEBYTECOUNTS, &bytecounts);
- for (t = 0; t < nt; t++) {
- if (bytecounts[t] > (uint64) bufsize) {
- buf = (unsigned char *)_TIFFrealloc(buf, (tmsize_t)bytecounts[t]);
- if (!buf)
- goto bad;
- bufsize = (tmsize_t)bytecounts[t];
- }
- if (TIFFReadRawTile(in, t, buf, (tmsize_t)bytecounts[t]) < 0 ||
- TIFFWriteRawTile(out, t, buf, (tmsize_t)bytecounts[t]) < 0) {
- _TIFFfree(buf);
- return 0;
- }
- }
- _TIFFfree(buf);
- return 1;
- }
-
-bad:
- TIFFError(TIFFFileName(in),
- "Can't allocate space for tile buffer.");
- return (0);
-}
-
-static int
-cpIFD(TIFF* in, TIFF* out)
-{
- cpTags(in, out);
- if (TIFFIsTiled(in)) {
- if (!cpTiles(in, out))
- return (0);
- } else {
- if (!cpStrips(in, out))
- return (0);
- }
- return (1);
-}
-
-static uint16 photometric; /* current photometric of raster */
-static uint16 filterWidth; /* filter width in pixels */
-static uint32 stepSrcWidth; /* src image stepping width */
-static uint32 stepDstWidth; /* dest stepping width */
-static uint8* src0; /* horizontal bit stepping (start) */
-static uint8* src1; /* horizontal bit stepping (middle) */
-static uint8* src2; /* horizontal bit stepping (end) */
-static uint32* rowoff; /* row offset for stepping */
-static uint8 cmap[256]; /* colormap indexes */
-static uint8 bits[256]; /* count of bits set */
-
-static void
-setupBitsTables()
-{
- int i;
- for (i = 0; i < 256; i++) {
- int n = 0;
- if (i&0x01) n++;
- if (i&0x02) n++;
- if (i&0x04) n++;
- if (i&0x08) n++;
- if (i&0x10) n++;
- if (i&0x20) n++;
- if (i&0x40) n++;
- if (i&0x80) n++;
- bits[i] = n;
- }
-}
-
-static int clamp(float v, int low, int high)
- { return (v < low ? low : v > high ? high : (int)v); }
-
-#ifndef M_E
-#define M_E 2.7182818284590452354
-#endif
-
-static void
-expFill(float pct[], uint32 p, uint32 n)
-{
- uint32 i;
- uint32 c = (p * n) / 100;
- for (i = 1; i < c; i++)
- pct[i] = (float) (1-exp(i/((double)(n-1)))/ M_E);
- for (; i < n; i++)
- pct[i] = 0.;
-}
-
-static void
-setupCmap()
-{
- float pct[256]; /* known to be large enough */
- uint32 i;
- pct[0] = 1; /* force white */
- switch (contrast) {
- case EXP50: expFill(pct, 50, 256); break;
- case EXP60: expFill(pct, 60, 256); break;
- case EXP70: expFill(pct, 70, 256); break;
- case EXP80: expFill(pct, 80, 256); break;
- case EXP90: expFill(pct, 90, 256); break;
- case EXP: expFill(pct, 100, 256); break;
- case LINEAR:
- for (i = 1; i < 256; i++)
- pct[i] = 1-((float)i)/(256-1);
- break;
- }
- switch (photometric) {
- case PHOTOMETRIC_MINISWHITE:
- for (i = 0; i < 256; i++)
- cmap[i] = clamp(255*pct[(256-1)-i], 0, 255);
- break;
- case PHOTOMETRIC_MINISBLACK:
- for (i = 0; i < 256; i++)
- cmap[i] = clamp(255*pct[i], 0, 255);
- break;
- }
-}
-
-static void
-initScale()
-{
- src0 = (uint8*) _TIFFmalloc(sizeof (uint8) * tnw);
- src1 = (uint8*) _TIFFmalloc(sizeof (uint8) * tnw);
- src2 = (uint8*) _TIFFmalloc(sizeof (uint8) * tnw);
- rowoff = (uint32*) _TIFFmalloc(sizeof (uint32) * tnw);
- filterWidth = 0;
- stepDstWidth = stepSrcWidth = 0;
- setupBitsTables();
-}
-
-/*
- * Calculate the horizontal accumulation parameteres
- * according to the widths of the src and dst images.
- */
-static void
-setupStepTables(uint32 sw)
-{
- if (stepSrcWidth != sw || stepDstWidth != tnw) {
- int step = sw;
- int limit = tnw;
- int err = 0;
- uint32 sx = 0;
- uint32 x;
- int fw;
- uint8 b;
- for (x = 0; x < tnw; x++) {
- uint32 sx0 = sx;
- err += step;
- while (err >= limit) {
- err -= limit;
- sx++;
- }
- rowoff[x] = sx0 >> 3;
- fw = sx - sx0; /* width */
- b = (fw < 8) ? 0xff<<(8-fw) : 0xff;
- src0[x] = b >> (sx0&7);
- fw -= 8 - (sx0&7);
- if (fw < 0)
- fw = 0;
- src1[x] = fw >> 3;
- fw -= (fw>>3)<<3;
- src2[x] = 0xff << (8-fw);
- }
- stepSrcWidth = sw;
- stepDstWidth = tnw;
- }
-}
-
-static void
-setrow(uint8* row, uint32 nrows, const uint8* rows[])
-{
- uint32 x;
- uint32 area = nrows * filterWidth;
- for (x = 0; x < tnw; x++) {
- uint32 mask0 = src0[x];
- uint32 fw = src1[x];
- uint32 mask1 = src1[x];
- uint32 off = rowoff[x];
- uint32 acc = 0;
- uint32 y, i;
- for (y = 0; y < nrows; y++) {
- const uint8* src = rows[y] + off;
- acc += bits[*src++ & mask0];
- switch (fw) {
- default:
- for (i = fw; i > 8; i--)
- acc += bits[*src++];
- /* fall thru... */
- case 8: acc += bits[*src++];
- case 7: acc += bits[*src++];
- case 6: acc += bits[*src++];
- case 5: acc += bits[*src++];
- case 4: acc += bits[*src++];
- case 3: acc += bits[*src++];
- case 2: acc += bits[*src++];
- case 1: acc += bits[*src++];
- case 0: break;
- }
- acc += bits[*src & mask1];
- }
- *row++ = cmap[(255*acc)/area];
- }
-}
-
-/*
- * Install the specified image. The
- * image is resized to fit the display page using
- * a box filter. The resultant pixels are mapped
- * with a user-selectable contrast curve.
- */
-static void
-setImage1(const uint8* br, uint32 rw, uint32 rh)
-{
- int step = rh;
- int limit = tnh;
- int err = 0;
- int bpr = TIFFhowmany8(rw);
- int sy = 0;
- uint8* row = thumbnail;
- uint32 dy;
- for (dy = 0; dy < tnh; dy++) {
- const uint8* rows[256];
- uint32 nrows = 1;
- fprintf(stderr, "bpr=%d, sy=%d, bpr*sy=%d\n", bpr, sy, bpr*sy);
- rows[0] = br + bpr*sy;
- err += step;
- while (err >= limit) {
- err -= limit;
- sy++;
- if (err >= limit)
- {
- /* We should perhaps error loudly, but I can't make sense of that */
- /* code... */
- if( nrows == 256 )
- break;
- rows[nrows++] = br + bpr*sy;
- }
- }
- setrow(row, nrows, rows);
- row += tnw;
- }
-}
-
-static void
-setImage(const uint8* br, uint32 rw, uint32 rh)
-{
- filterWidth = (uint16) ceil((double) rw / (double) tnw);
- setupStepTables(rw);
- setImage1(br, rw, rh);
-}
-
-static int
-generateThumbnail(TIFF* in, TIFF* out)
-{
- unsigned char* raster;
- unsigned char* rp;
- uint32 sw, sh, rps;
- uint16 bps, spp;
- tsize_t rowsize, rastersize;
- tstrip_t s, ns = TIFFNumberOfStrips(in);
- toff_t diroff[1];
-
- TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &sw);
- TIFFGetField(in, TIFFTAG_IMAGELENGTH, &sh);
- TIFFGetFieldDefaulted(in, TIFFTAG_BITSPERSAMPLE, &bps);
- TIFFGetFieldDefaulted(in, TIFFTAG_SAMPLESPERPIXEL, &spp);
- TIFFGetFieldDefaulted(in, TIFFTAG_ROWSPERSTRIP, &rps);
- if (spp != 1 || bps != 1)
- return 0;
- rowsize = TIFFScanlineSize(in);
- rastersize = sh * rowsize;
- fprintf(stderr, "rastersize=%u\n", (unsigned int)rastersize);
- /* +3 : add a few guard bytes since setrow() can read a bit */
- /* outside buffer */
- raster = (unsigned char*)_TIFFmalloc(rastersize+3);
- if (!raster) {
- TIFFError(TIFFFileName(in),
- "Can't allocate space for raster buffer.");
- return 0;
- }
- raster[rastersize] = 0;
- raster[rastersize+1] = 0;
- raster[rastersize+2] = 0;
- rp = raster;
- for (s = 0; s < ns; s++) {
- (void) TIFFReadEncodedStrip(in, s, rp, -1);
- rp += rps * rowsize;
- }
- TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &photometric);
- setupCmap();
- setImage(raster, sw, sh);
- _TIFFfree(raster);
-
- TIFFSetField(out, TIFFTAG_SUBFILETYPE, FILETYPE_REDUCEDIMAGE);
- TIFFSetField(out, TIFFTAG_IMAGEWIDTH, (uint32) tnw);
- TIFFSetField(out, TIFFTAG_IMAGELENGTH, (uint32) tnh);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, (uint16) 8);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, (uint16) 1);
- TIFFSetField(out, TIFFTAG_COMPRESSION, COMPRESSION_PACKBITS);
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE);
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
- cpTag(in, out, TIFFTAG_SOFTWARE, (uint16) -1, TIFF_ASCII);
- cpTag(in, out, TIFFTAG_IMAGEDESCRIPTION, (uint16) -1, TIFF_ASCII);
- cpTag(in, out, TIFFTAG_DATETIME, (uint16) -1, TIFF_ASCII);
- cpTag(in, out, TIFFTAG_HOSTCOMPUTER, (uint16) -1, TIFF_ASCII);
- diroff[0] = 0UL;
- TIFFSetField(out, TIFFTAG_SUBIFD, 1, diroff);
- return (TIFFWriteEncodedStrip(out, 0, thumbnail, tnw*tnh) != -1 &&
- TIFFWriteDirectory(out) != -1);
-}
-
-char* stuff[] = {
-"usage: thumbnail [options] input.tif output.tif",
-"where options are:",
-" -h # specify thumbnail image height (default is 274)",
-" -w # specify thumbnail image width (default is 216)",
-"",
-" -c linear use linear contrast curve",
-" -c exp50 use 50% exponential contrast curve",
-" -c exp60 use 60% exponential contrast curve",
-" -c exp70 use 70% exponential contrast curve",
-" -c exp80 use 80% exponential contrast curve",
-" -c exp90 use 90% exponential contrast curve",
-" -c exp use pure exponential contrast curve",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/tiff2bw.c b/tiff/tools/tiff2bw.c
deleted file mode 100755
index 6bdf6a2..0000000
--- a/tiff/tools/tiff2bw.c
+++ /dev/null
@@ -1,476 +0,0 @@
-/* $Id: tiff2bw.c,v 1.17 2014-12-21 20:58:30 erouault Exp $ */
-
-/*
- * Copyright (c) 1988-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffio.h"
-
-#define streq(a,b) (strcmp((a),(b)) == 0)
-#define strneq(a,b,n) (strncmp(a,b,n) == 0)
-
-/* x% weighting -> fraction of full color */
-#define PCT(x) (((x)*255+127)/100)
-int RED = PCT(30); /* 30% */
-int GREEN = PCT(59); /* 59% */
-int BLUE = PCT(11); /* 11% */
-
-static void usage(void);
-static int processCompressOptions(char*);
-
-static void
-compresscontig(unsigned char* out, unsigned char* rgb, uint32 n)
-{
- register int v, red = RED, green = GREEN, blue = BLUE;
-
- while (n-- > 0) {
- v = red*(*rgb++);
- v += green*(*rgb++);
- v += blue*(*rgb++);
- *out++ = v>>8;
- }
-}
-
-static void
-compresssep(unsigned char* out,
- unsigned char* r, unsigned char* g, unsigned char* b, uint32 n)
-{
- register uint32 red = RED, green = GREEN, blue = BLUE;
-
- while (n-- > 0)
- *out++ = (unsigned char)
- ((red*(*r++) + green*(*g++) + blue*(*b++)) >> 8);
-}
-
-static int
-checkcmap(TIFF* tif, int n, uint16* r, uint16* g, uint16* b)
-{
- while (n-- > 0)
- if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256)
- return (16);
- TIFFWarning(TIFFFileName(tif), "Assuming 8-bit colormap");
- return (8);
-}
-
-static void
-compresspalette(unsigned char* out, unsigned char* data, uint32 n, uint16* rmap, uint16* gmap, uint16* bmap)
-{
- register int v, red = RED, green = GREEN, blue = BLUE;
-
- while (n-- > 0) {
- unsigned int ix = *data++;
- v = red*rmap[ix];
- v += green*gmap[ix];
- v += blue*bmap[ix];
- *out++ = v>>8;
- }
-}
-
-static uint16 compression = (uint16) -1;
-static uint16 predictor = 0;
-static int jpegcolormode = JPEGCOLORMODE_RGB;
-static int quality = 75; /* JPEG quality */
-
-static void cpTags(TIFF* in, TIFF* out);
-
-int
-main(int argc, char* argv[])
-{
- uint32 rowsperstrip = (uint32) -1;
- TIFF *in, *out;
- uint32 w, h;
- uint16 samplesperpixel;
- uint16 bitspersample;
- uint16 config;
- uint16 photometric;
- uint16* red;
- uint16* green;
- uint16* blue;
- tsize_t rowsize;
- register uint32 row;
- register tsample_t s;
- unsigned char *inbuf, *outbuf;
- char thing[1024];
- int c;
- extern int optind;
- extern char *optarg;
-
- while ((c = getopt(argc, argv, "c:r:R:G:B:")) != -1)
- switch (c) {
- case 'c': /* compression scheme */
- if (!processCompressOptions(optarg))
- usage();
- break;
- case 'r': /* rows/strip */
- rowsperstrip = atoi(optarg);
- break;
- case 'R':
- RED = PCT(atoi(optarg));
- break;
- case 'G':
- GREEN = PCT(atoi(optarg));
- break;
- case 'B':
- BLUE = PCT(atoi(optarg));
- break;
- case '?':
- usage();
- /*NOTREACHED*/
- }
- if (argc - optind < 2)
- usage();
- in = TIFFOpen(argv[optind], "r");
- if (in == NULL)
- return (-1);
- photometric = 0;
- TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &photometric);
- if (photometric != PHOTOMETRIC_RGB && photometric != PHOTOMETRIC_PALETTE ) {
- fprintf(stderr,
- "%s: Bad photometric; can only handle RGB and Palette images.\n",
- argv[optind]);
- return (-1);
- }
- TIFFGetField(in, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel);
- if (samplesperpixel != 1 && samplesperpixel != 3) {
- fprintf(stderr, "%s: Bad samples/pixel %u.\n",
- argv[optind], samplesperpixel);
- return (-1);
- }
- if( photometric == PHOTOMETRIC_RGB && samplesperpixel != 3) {
- fprintf(stderr, "%s: Bad samples/pixel %u for PHOTOMETRIC_RGB.\n",
- argv[optind], samplesperpixel);
- return (-1);
- }
- TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bitspersample);
- if (bitspersample != 8) {
- fprintf(stderr,
- " %s: Sorry, only handle 8-bit samples.\n", argv[optind]);
- return (-1);
- }
- TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &w);
- TIFFGetField(in, TIFFTAG_IMAGELENGTH, &h);
- TIFFGetField(in, TIFFTAG_PLANARCONFIG, &config);
-
- out = TIFFOpen(argv[optind+1], "w");
- if (out == NULL)
- return (-1);
- TIFFSetField(out, TIFFTAG_IMAGEWIDTH, w);
- TIFFSetField(out, TIFFTAG_IMAGELENGTH, h);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 8);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 1);
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- cpTags(in, out);
- if (compression != (uint16) -1) {
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- switch (compression) {
- case COMPRESSION_JPEG:
- TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality);
- TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode);
- break;
- case COMPRESSION_LZW:
- case COMPRESSION_DEFLATE:
- if (predictor != 0)
- TIFFSetField(out, TIFFTAG_PREDICTOR, predictor);
- break;
- }
- }
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
- snprintf(thing, sizeof(thing), "B&W version of %s", argv[optind]);
- TIFFSetField(out, TIFFTAG_IMAGEDESCRIPTION, thing);
- TIFFSetField(out, TIFFTAG_SOFTWARE, "tiff2bw");
- outbuf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(out));
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP,
- TIFFDefaultStripSize(out, rowsperstrip));
-
-#define pack(a,b) ((a)<<8 | (b))
- switch (pack(photometric, config)) {
- case pack(PHOTOMETRIC_PALETTE, PLANARCONFIG_CONTIG):
- case pack(PHOTOMETRIC_PALETTE, PLANARCONFIG_SEPARATE):
- TIFFGetField(in, TIFFTAG_COLORMAP, &red, &green, &blue);
- /*
- * Convert 16-bit colormap to 8-bit (unless it looks
- * like an old-style 8-bit colormap).
- */
- if (checkcmap(in, 1<<bitspersample, red, green, blue) == 16) {
- int i;
-#define CVT(x) (((x) * 255L) / ((1L<<16)-1))
- for (i = (1<<bitspersample)-1; i >= 0; i--) {
- red[i] = CVT(red[i]);
- green[i] = CVT(green[i]);
- blue[i] = CVT(blue[i]);
- }
-#undef CVT
- }
- inbuf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(in));
- for (row = 0; row < h; row++) {
- if (TIFFReadScanline(in, inbuf, row, 0) < 0)
- break;
- compresspalette(outbuf, inbuf, w, red, green, blue);
- if (TIFFWriteScanline(out, outbuf, row, 0) < 0)
- break;
- }
- break;
- case pack(PHOTOMETRIC_RGB, PLANARCONFIG_CONTIG):
- inbuf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(in));
- for (row = 0; row < h; row++) {
- if (TIFFReadScanline(in, inbuf, row, 0) < 0)
- break;
- compresscontig(outbuf, inbuf, w);
- if (TIFFWriteScanline(out, outbuf, row, 0) < 0)
- break;
- }
- break;
- case pack(PHOTOMETRIC_RGB, PLANARCONFIG_SEPARATE):
- rowsize = TIFFScanlineSize(in);
- inbuf = (unsigned char *)_TIFFmalloc(3*rowsize);
- for (row = 0; row < h; row++) {
- for (s = 0; s < 3; s++)
- if (TIFFReadScanline(in,
- inbuf+s*rowsize, row, s) < 0)
- return (-1);
- compresssep(outbuf,
- inbuf, inbuf+rowsize, inbuf+2*rowsize, w);
- if (TIFFWriteScanline(out, outbuf, row, 0) < 0)
- break;
- }
- break;
- }
-#undef pack
- TIFFClose(out);
- return (0);
-}
-
-static int
-processCompressOptions(char* opt)
-{
- if (streq(opt, "none"))
- compression = COMPRESSION_NONE;
- else if (streq(opt, "packbits"))
- compression = COMPRESSION_PACKBITS;
- else if (strneq(opt, "jpeg", 4)) {
- char* cp = strchr(opt, ':');
-
- compression = COMPRESSION_JPEG;
- while( cp )
- {
- if (isdigit((int)cp[1]))
- quality = atoi(cp+1);
- else if (cp[1] == 'r' )
- jpegcolormode = JPEGCOLORMODE_RAW;
- else
- usage();
-
- cp = strchr(cp+1,':');
- }
- } else if (strneq(opt, "lzw", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_LZW;
- } else if (strneq(opt, "zip", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_DEFLATE;
- } else
- return (0);
- return (1);
-}
-
-#define CopyField(tag, v) \
- if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v)
-#define CopyField2(tag, v1, v2) \
- if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2)
-#define CopyField3(tag, v1, v2, v3) \
- if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3)
-#define CopyField4(tag, v1, v2, v3, v4) \
- if (TIFFGetField(in, tag, &v1, &v2, &v3, &v4)) TIFFSetField(out, tag, v1, v2, v3, v4)
-
-static void
-cpTag(TIFF* in, TIFF* out, uint16 tag, uint16 count, TIFFDataType type)
-{
- switch (type) {
- case TIFF_SHORT:
- if (count == 1) {
- uint16 shortv;
- CopyField(tag, shortv);
- } else if (count == 2) {
- uint16 shortv1, shortv2;
- CopyField2(tag, shortv1, shortv2);
- } else if (count == 4) {
- uint16 *tr, *tg, *tb, *ta;
- CopyField4(tag, tr, tg, tb, ta);
- } else if (count == (uint16) -1) {
- uint16 shortv1;
- uint16* shortav;
- CopyField2(tag, shortv1, shortav);
- }
- break;
- case TIFF_LONG:
- { uint32 longv;
- CopyField(tag, longv);
- }
- break;
- case TIFF_RATIONAL:
- if (count == 1) {
- float floatv;
- CopyField(tag, floatv);
- } else if (count == (uint16) -1) {
- float* floatav;
- CopyField(tag, floatav);
- }
- break;
- case TIFF_ASCII:
- { char* stringv;
- CopyField(tag, stringv);
- }
- break;
- case TIFF_DOUBLE:
- if (count == 1) {
- double doublev;
- CopyField(tag, doublev);
- } else if (count == (uint16) -1) {
- double* doubleav;
- CopyField(tag, doubleav);
- }
- break;
- default:
- TIFFError(TIFFFileName(in),
- "Data type %d is not supported, tag %d skipped.",
- tag, type);
- }
-}
-
-#undef CopyField4
-#undef CopyField3
-#undef CopyField2
-#undef CopyField
-
-static struct cpTag {
- uint16 tag;
- uint16 count;
- TIFFDataType type;
-} tags[] = {
- { TIFFTAG_SUBFILETYPE, 1, TIFF_LONG },
- { TIFFTAG_THRESHHOLDING, 1, TIFF_SHORT },
- { TIFFTAG_DOCUMENTNAME, 1, TIFF_ASCII },
- { TIFFTAG_IMAGEDESCRIPTION, 1, TIFF_ASCII },
- { TIFFTAG_MAKE, 1, TIFF_ASCII },
- { TIFFTAG_MODEL, 1, TIFF_ASCII },
- { TIFFTAG_MINSAMPLEVALUE, 1, TIFF_SHORT },
- { TIFFTAG_MAXSAMPLEVALUE, 1, TIFF_SHORT },
- { TIFFTAG_XRESOLUTION, 1, TIFF_RATIONAL },
- { TIFFTAG_YRESOLUTION, 1, TIFF_RATIONAL },
- { TIFFTAG_PAGENAME, 1, TIFF_ASCII },
- { TIFFTAG_XPOSITION, 1, TIFF_RATIONAL },
- { TIFFTAG_YPOSITION, 1, TIFF_RATIONAL },
- { TIFFTAG_RESOLUTIONUNIT, 1, TIFF_SHORT },
- { TIFFTAG_SOFTWARE, 1, TIFF_ASCII },
- { TIFFTAG_DATETIME, 1, TIFF_ASCII },
- { TIFFTAG_ARTIST, 1, TIFF_ASCII },
- { TIFFTAG_HOSTCOMPUTER, 1, TIFF_ASCII },
- { TIFFTAG_WHITEPOINT, 2, TIFF_RATIONAL },
- { TIFFTAG_PRIMARYCHROMATICITIES,(uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_HALFTONEHINTS, 2, TIFF_SHORT },
- { TIFFTAG_INKSET, 1, TIFF_SHORT },
- { TIFFTAG_DOTRANGE, 2, TIFF_SHORT },
- { TIFFTAG_TARGETPRINTER, 1, TIFF_ASCII },
- { TIFFTAG_SAMPLEFORMAT, 1, TIFF_SHORT },
- { TIFFTAG_YCBCRCOEFFICIENTS, (uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_YCBCRSUBSAMPLING, 2, TIFF_SHORT },
- { TIFFTAG_YCBCRPOSITIONING, 1, TIFF_SHORT },
- { TIFFTAG_REFERENCEBLACKWHITE, (uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_EXTRASAMPLES, (uint16) -1, TIFF_SHORT },
- { TIFFTAG_SMINSAMPLEVALUE, 1, TIFF_DOUBLE },
- { TIFFTAG_SMAXSAMPLEVALUE, 1, TIFF_DOUBLE },
- { TIFFTAG_STONITS, 1, TIFF_DOUBLE },
-};
-#define NTAGS (sizeof (tags) / sizeof (tags[0]))
-
-static void
-cpTags(TIFF* in, TIFF* out)
-{
- struct cpTag *p;
- for (p = tags; p < &tags[NTAGS]; p++)
- cpTag(in, out, p->tag, p->count, p->type);
-}
-#undef NTAGS
-
-char* stuff[] = {
-"usage: tiff2bw [options] input.tif output.tif",
-"where options are:",
-" -R % use #% from red channel",
-" -G % use #% from green channel",
-" -B % use #% from blue channel",
-"",
-" -r # make each strip have no more than # rows",
-"",
-" -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding",
-" -c zip[:opts] compress output with deflate encoding",
-" -c packbits compress output with packbits encoding",
-" -c g3[:opts] compress output with CCITT Group 3 encoding",
-" -c g4 compress output with CCITT Group 4 encoding",
-" -c none use no compression algorithm on output",
-"",
-"LZW and deflate options:",
-" # set predictor value",
-"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/tiff2pdf.c b/tiff/tools/tiff2pdf.c
deleted file mode 100755
index 3761d38..0000000
--- a/tiff/tools/tiff2pdf.c
+++ /dev/null
@@ -1,5467 +0,0 @@
-/* $Id: tiff2pdf.c,v 1.83 2015-01-22 09:58:49 erouault Exp $
- *
- * tiff2pdf - converts a TIFF image to a PDF document
- *
- * Copyright (c) 2003 Ross Finlayson
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the name of
- * Ross Finlayson may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Ross Finlayson.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL ROSS FINLAYSON BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <time.h>
-#include <errno.h>
-#include <limits.h>
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#ifdef HAVE_IO_H
-# include <io.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffiop.h"
-#include "tiffio.h"
-
-#ifndef HAVE_GETOPT
-extern int getopt(int, char**, char*);
-#endif
-
-#ifndef EXIT_SUCCESS
-# define EXIT_SUCCESS 0
-#endif
-#ifndef EXIT_FAILURE
-# define EXIT_FAILURE 1
-#endif
-
-#define TIFF2PDF_MODULE "tiff2pdf"
-
-#define PS_UNIT_SIZE 72.0F
-
-/* This type is of PDF color spaces. */
-typedef enum {
- T2P_CS_BILEVEL = 0x01, /* Bilevel, black and white */
- T2P_CS_GRAY = 0x02, /* Single channel */
- T2P_CS_RGB = 0x04, /* Three channel tristimulus RGB */
- T2P_CS_CMYK = 0x08, /* Four channel CMYK print inkset */
- T2P_CS_LAB = 0x10, /* Three channel L*a*b* color space */
- T2P_CS_PALETTE = 0x1000,/* One of the above with a color map */
- T2P_CS_CALGRAY = 0x20, /* Calibrated single channel */
- T2P_CS_CALRGB = 0x40, /* Calibrated three channel tristimulus RGB */
- T2P_CS_ICCBASED = 0x80 /* ICC profile color specification */
-} t2p_cs_t;
-
-/* This type is of PDF compression types. */
-typedef enum{
- T2P_COMPRESS_NONE=0x00
-#ifdef CCITT_SUPPORT
- , T2P_COMPRESS_G4=0x01
-#endif
-#if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT)
- , T2P_COMPRESS_JPEG=0x02
-#endif
-#ifdef ZIP_SUPPORT
- , T2P_COMPRESS_ZIP=0x04
-#endif
-} t2p_compress_t;
-
-/* This type is whether TIFF image data can be used in PDF without transcoding. */
-typedef enum{
- T2P_TRANSCODE_RAW=0x01, /* The raw data from the input can be used without recompressing */
- T2P_TRANSCODE_ENCODE=0x02 /* The data from the input is perhaps unencoded and reencoded */
-} t2p_transcode_t;
-
-/* This type is of information about the data samples of the input image. */
-typedef enum{
- T2P_SAMPLE_NOTHING=0x0000, /* The unencoded samples are normal for the output colorspace */
- T2P_SAMPLE_ABGR_TO_RGB=0x0001, /* The unencoded samples are the result of ReadRGBAImage */
- T2P_SAMPLE_RGBA_TO_RGB=0x0002, /* The unencoded samples are contiguous RGBA */
- T2P_SAMPLE_RGBAA_TO_RGB=0x0004, /* The unencoded samples are RGBA with premultiplied alpha */
- T2P_SAMPLE_YCBCR_TO_RGB=0x0008,
- T2P_SAMPLE_YCBCR_TO_LAB=0x0010,
- T2P_SAMPLE_REALIZE_PALETTE=0x0020, /* The unencoded samples are indexes into the color map */
- T2P_SAMPLE_SIGNED_TO_UNSIGNED=0x0040, /* The unencoded samples are signed instead of unsignd */
- T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED=0x0040, /* The L*a*b* samples have a* and b* signed */
- T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG=0x0100 /* The unencoded samples are separate instead of contiguous */
-} t2p_sample_t;
-
-/* This type is of error status of the T2P struct. */
-typedef enum{
- T2P_ERR_OK = 0, /* This is the value of t2p->t2p_error when there is no error */
- T2P_ERR_ERROR = 1 /* This is the value of t2p->t2p_error when there was an error */
-} t2p_err_t;
-
-/* This struct defines a logical page of a TIFF. */
-typedef struct {
- tdir_t page_directory;
- uint32 page_number;
- ttile_t page_tilecount;
- uint32 page_extra;
-} T2P_PAGE;
-
-/* This struct defines a PDF rectangle's coordinates. */
-typedef struct {
- float x1;
- float y1;
- float x2;
- float y2;
- float mat[9];
-} T2P_BOX;
-
-/* This struct defines a tile of a PDF. */
-typedef struct {
- T2P_BOX tile_box;
-} T2P_TILE;
-
-/* This struct defines information about the tiles on a PDF page. */
-typedef struct {
- ttile_t tiles_tilecount;
- uint32 tiles_tilewidth;
- uint32 tiles_tilelength;
- uint32 tiles_tilecountx;
- uint32 tiles_tilecounty;
- uint32 tiles_edgetilewidth;
- uint32 tiles_edgetilelength;
- T2P_TILE* tiles_tiles;
-} T2P_TILES;
-
-/* This struct is the context of a function to generate PDF from a TIFF. */
-typedef struct {
- t2p_err_t t2p_error;
- T2P_PAGE* tiff_pages;
- T2P_TILES* tiff_tiles;
- tdir_t tiff_pagecount;
- uint16 tiff_compression;
- uint16 tiff_photometric;
- uint16 tiff_fillorder;
- uint16 tiff_bitspersample;
- uint16 tiff_samplesperpixel;
- uint16 tiff_planar;
- uint32 tiff_width;
- uint32 tiff_length;
- float tiff_xres;
- float tiff_yres;
- uint16 tiff_orientation;
- toff_t tiff_dataoffset;
- tsize_t tiff_datasize;
- uint16 tiff_resunit;
- uint16 pdf_centimeters;
- uint16 pdf_overrideres;
- uint16 pdf_overridepagesize;
- float pdf_defaultxres;
- float pdf_defaultyres;
- float pdf_xres;
- float pdf_yres;
- float pdf_defaultpagewidth;
- float pdf_defaultpagelength;
- float pdf_pagewidth;
- float pdf_pagelength;
- float pdf_imagewidth;
- float pdf_imagelength;
- int pdf_image_fillpage; /* 0 (default: no scaling, 1:scale imagesize to pagesize */
- T2P_BOX pdf_mediabox;
- T2P_BOX pdf_imagebox;
- uint16 pdf_majorversion;
- uint16 pdf_minorversion;
- uint32 pdf_catalog;
- uint32 pdf_pages;
- uint32 pdf_info;
- uint32 pdf_palettecs;
- uint16 pdf_fitwindow;
- uint32 pdf_startxref;
-#define TIFF2PDF_FILEID_SIZE 33
- char pdf_fileid[TIFF2PDF_FILEID_SIZE];
-#define TIFF2PDF_DATETIME_SIZE 17
- char pdf_datetime[TIFF2PDF_DATETIME_SIZE];
-#define TIFF2PDF_CREATOR_SIZE 512
- char pdf_creator[TIFF2PDF_CREATOR_SIZE];
-#define TIFF2PDF_AUTHOR_SIZE 512
- char pdf_author[TIFF2PDF_AUTHOR_SIZE];
-#define TIFF2PDF_TITLE_SIZE 512
- char pdf_title[TIFF2PDF_TITLE_SIZE];
-#define TIFF2PDF_SUBJECT_SIZE 512
- char pdf_subject[TIFF2PDF_SUBJECT_SIZE];
-#define TIFF2PDF_KEYWORDS_SIZE 512
- char pdf_keywords[TIFF2PDF_KEYWORDS_SIZE];
- t2p_cs_t pdf_colorspace;
- uint16 pdf_colorspace_invert;
- uint16 pdf_switchdecode;
- uint16 pdf_palettesize;
- unsigned char* pdf_palette;
- int pdf_labrange[4];
- t2p_compress_t pdf_defaultcompression;
- uint16 pdf_defaultcompressionquality;
- t2p_compress_t pdf_compression;
- uint16 pdf_compressionquality;
- uint16 pdf_nopassthrough;
- t2p_transcode_t pdf_transcode;
- t2p_sample_t pdf_sample;
- uint32* pdf_xrefoffsets;
- uint32 pdf_xrefcount;
- tdir_t pdf_page;
-#ifdef OJPEG_SUPPORT
- tdata_t pdf_ojpegdata;
- uint32 pdf_ojpegdatalength;
- uint32 pdf_ojpegiflength;
-#endif
- float tiff_whitechromaticities[2];
- float tiff_primarychromaticities[6];
- float tiff_referenceblackwhite[2];
- float* tiff_transferfunction[3];
- int pdf_image_interpolate; /* 0 (default) : do not interpolate,
- 1 : interpolate */
- uint16 tiff_transferfunctioncount;
- uint32 pdf_icccs;
- uint32 tiff_iccprofilelength;
- tdata_t tiff_iccprofile;
-
- /* fields for custom read/write procedures */
- FILE *outputfile;
- int outputdisable;
- tsize_t outputwritten;
-} T2P;
-
-/* These functions are called by main. */
-
-void tiff2pdf_usage(void);
-int tiff2pdf_match_paper_size(float*, float*, char*);
-
-/* These functions are used to generate a PDF from a TIFF. */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-T2P* t2p_init(void);
-void t2p_validate(T2P*);
-tsize_t t2p_write_pdf(T2P*, TIFF*, TIFF*);
-void t2p_free(T2P*);
-
-#ifdef __cplusplus
-}
-#endif
-
-void t2p_read_tiff_init(T2P*, TIFF*);
-int t2p_cmp_t2p_page(const void*, const void*);
-void t2p_read_tiff_data(T2P*, TIFF*);
-void t2p_read_tiff_size(T2P*, TIFF*);
-void t2p_read_tiff_size_tile(T2P*, TIFF*, ttile_t);
-int t2p_tile_is_right_edge(T2P_TILES, ttile_t);
-int t2p_tile_is_bottom_edge(T2P_TILES, ttile_t);
-int t2p_tile_is_edge(T2P_TILES, ttile_t);
-int t2p_tile_is_corner_edge(T2P_TILES, ttile_t);
-tsize_t t2p_readwrite_pdf_image(T2P*, TIFF*, TIFF*);
-tsize_t t2p_readwrite_pdf_image_tile(T2P*, TIFF*, TIFF*, ttile_t);
-#ifdef OJPEG_SUPPORT
-int t2p_process_ojpeg_tables(T2P*, TIFF*);
-#endif
-#ifdef JPEG_SUPPORT
-int t2p_process_jpeg_strip(unsigned char*, tsize_t*, unsigned char*, tsize_t*, tstrip_t, uint32);
-#endif
-void t2p_tile_collapse_left(tdata_t, tsize_t, uint32, uint32, uint32);
-void t2p_write_advance_directory(T2P*, TIFF*);
-tsize_t t2p_sample_planar_separate_to_contig(T2P*, unsigned char*, unsigned char*, tsize_t);
-tsize_t t2p_sample_realize_palette(T2P*, unsigned char*);
-tsize_t t2p_sample_abgr_to_rgb(tdata_t, uint32);
-tsize_t t2p_sample_rgba_to_rgb(tdata_t, uint32);
-tsize_t t2p_sample_rgbaa_to_rgb(tdata_t, uint32);
-tsize_t t2p_sample_lab_signed_to_unsigned(tdata_t, uint32);
-tsize_t t2p_write_pdf_header(T2P*, TIFF*);
-tsize_t t2p_write_pdf_obj_start(uint32, TIFF*);
-tsize_t t2p_write_pdf_obj_end(TIFF*);
-tsize_t t2p_write_pdf_name(unsigned char*, TIFF*);
-tsize_t t2p_write_pdf_string(char*, TIFF*);
-tsize_t t2p_write_pdf_stream(tdata_t, tsize_t, TIFF*);
-tsize_t t2p_write_pdf_stream_start(TIFF*);
-tsize_t t2p_write_pdf_stream_end(TIFF*);
-tsize_t t2p_write_pdf_stream_dict(tsize_t, uint32, TIFF*);
-tsize_t t2p_write_pdf_stream_dict_start(TIFF*);
-tsize_t t2p_write_pdf_stream_dict_end(TIFF*);
-tsize_t t2p_write_pdf_stream_length(tsize_t, TIFF*);
-tsize_t t2p_write_pdf_catalog(T2P*, TIFF*);
-tsize_t t2p_write_pdf_info(T2P*, TIFF*, TIFF*);
-void t2p_pdf_currenttime(T2P*);
-void t2p_pdf_tifftime(T2P*, TIFF*);
-tsize_t t2p_write_pdf_pages(T2P*, TIFF*);
-tsize_t t2p_write_pdf_page(uint32, T2P*, TIFF*);
-void t2p_compose_pdf_page(T2P*);
-void t2p_compose_pdf_page_orient(T2P_BOX*, uint16);
-void t2p_compose_pdf_page_orient_flip(T2P_BOX*, uint16);
-tsize_t t2p_write_pdf_page_content(T2P*, TIFF*);
-tsize_t t2p_write_pdf_xobject_stream_dict(ttile_t, T2P*, TIFF*);
-tsize_t t2p_write_pdf_xobject_cs(T2P*, TIFF*);
-tsize_t t2p_write_pdf_transfer(T2P*, TIFF*);
-tsize_t t2p_write_pdf_transfer_dict(T2P*, TIFF*, uint16);
-tsize_t t2p_write_pdf_transfer_stream(T2P*, TIFF*, uint16);
-tsize_t t2p_write_pdf_xobject_calcs(T2P*, TIFF*);
-tsize_t t2p_write_pdf_xobject_icccs(T2P*, TIFF*);
-tsize_t t2p_write_pdf_xobject_icccs_dict(T2P*, TIFF*);
-tsize_t t2p_write_pdf_xobject_icccs_stream(T2P*, TIFF*);
-tsize_t t2p_write_pdf_xobject_cs_stream(T2P*, TIFF*);
-tsize_t t2p_write_pdf_xobject_decode(T2P*, TIFF*);
-tsize_t t2p_write_pdf_xobject_stream_filter(ttile_t, T2P*, TIFF*);
-tsize_t t2p_write_pdf_xreftable(T2P*, TIFF*);
-tsize_t t2p_write_pdf_trailer(T2P*, TIFF*);
-
-static void
-t2p_disable(TIFF *tif)
-{
- T2P *t2p = (T2P*) TIFFClientdata(tif);
- t2p->outputdisable = 1;
-}
-
-static void
-t2p_enable(TIFF *tif)
-{
- T2P *t2p = (T2P*) TIFFClientdata(tif);
- t2p->outputdisable = 0;
-}
-
-/*
- * Procs for TIFFClientOpen
- */
-
-static tmsize_t
-t2pReadFile(TIFF *tif, tdata_t data, tmsize_t size)
-{
- thandle_t client = TIFFClientdata(tif);
- TIFFReadWriteProc proc = TIFFGetReadProc(tif);
- if (proc)
- return proc(client, data, size);
- return -1;
-}
-
-static tmsize_t
-t2pWriteFile(TIFF *tif, tdata_t data, tmsize_t size)
-{
- thandle_t client = TIFFClientdata(tif);
- TIFFReadWriteProc proc = TIFFGetWriteProc(tif);
- if (proc)
- return proc(client, data, size);
- return -1;
-}
-
-static uint64
-t2pSeekFile(TIFF *tif, toff_t offset, int whence)
-{
- thandle_t client = TIFFClientdata(tif);
- TIFFSeekProc proc = TIFFGetSeekProc(tif);
- if (proc)
- return proc(client, offset, whence);
- return -1;
-}
-
-static tmsize_t
-t2p_readproc(thandle_t handle, tdata_t data, tmsize_t size)
-{
- (void) handle, (void) data, (void) size;
- return -1;
-}
-
-static tmsize_t
-t2p_writeproc(thandle_t handle, tdata_t data, tmsize_t size)
-{
- T2P *t2p = (T2P*) handle;
- if (t2p->outputdisable <= 0 && t2p->outputfile) {
- tsize_t written = fwrite(data, 1, size, t2p->outputfile);
- t2p->outputwritten += written;
- return written;
- }
- return size;
-}
-
-static uint64
-t2p_seekproc(thandle_t handle, uint64 offset, int whence)
-{
- T2P *t2p = (T2P*) handle;
- if (t2p->outputdisable <= 0 && t2p->outputfile)
- return fseek(t2p->outputfile, (long) offset, whence);
- return offset;
-}
-
-static int
-t2p_closeproc(thandle_t handle)
-{
- T2P *t2p = (T2P*) handle;
- return fclose(t2p->outputfile);
-}
-
-static uint64
-t2p_sizeproc(thandle_t handle)
-{
- (void) handle;
- return -1;
-}
-
-static int
-t2p_mapproc(thandle_t handle, void **data, toff_t *offset)
-{
- (void) handle, (void) data, (void) offset;
- return -1;
-}
-
-static void
-t2p_unmapproc(thandle_t handle, void *data, toff_t offset)
-{
- (void) handle, (void) data, (void) offset;
-}
-
-static uint64
-checkAdd64(uint64 summand1, uint64 summand2, T2P* t2p)
-{
- uint64 bytes = summand1 + summand2;
-
- if (bytes < summand1) {
- TIFFError(TIFF2PDF_MODULE, "Integer overflow");
- t2p->t2p_error = T2P_ERR_ERROR;
- bytes = 0;
- }
-
- return bytes;
-}
-
-static uint64
-checkMultiply64(uint64 first, uint64 second, T2P* t2p)
-{
- uint64 bytes = first * second;
-
- if (second && bytes / second != first) {
- TIFFError(TIFF2PDF_MODULE, "Integer overflow");
- t2p->t2p_error = T2P_ERR_ERROR;
- bytes = 0;
- }
-
- return bytes;
-}
-
-/*
-
- This is the main function.
-
- The program converts one TIFF file to one PDF file, including multiple page
- TIFF files, tiled TIFF files, black and white. grayscale, and color TIFF
- files that contain data of TIFF photometric interpretations of bilevel,
- grayscale, RGB, YCbCr, CMYK separation, and ICC L*a*b* as supported by
- libtiff and PDF.
-
- If you have multiple TIFF files to convert into one PDF file then use tiffcp
- or other program to concatenate the files into a multiple page TIFF file.
- If the input TIFF file is of huge dimensions (greater than 10000 pixels height
- or width) convert the input image to a tiled TIFF if it is not already.
-
- The standard output is standard output. Set the output file name with the
- "-o output.pdf" option.
-
- All black and white files are compressed into a single strip CCITT G4 Fax
- compressed PDF, unless tiled, where tiled black and white images are
- compressed into tiled CCITT G4 Fax compressed PDF, libtiff CCITT support
- is assumed.
-
- Color and grayscale data can be compressed using either JPEG compression,
- ITU-T T.81, or Zip/Deflate LZ77 compression, per PNG 1.2 and RFC 1951. Set
- the compression type using the -j or -z options. JPEG compression support
- requires that libtiff be configured with JPEG support, and Zip/Deflate
- compression support requires that libtiff is configured with Zip support,
- in tiffconf.h. Use only one or the other of -j and -z. The -q option
- sets the image compression quality, that is 1-100 with libjpeg JPEG
- compression and one of 1, 10, 11, 12, 13, 14, or 15 for PNG group compression
- predictor methods, add 100, 200, ..., 900 to set zlib compression quality 1-9.
- PNG Group differencing predictor methods are not currently implemented.
-
- If the input TIFF contains single strip CCITT G4 Fax compressed information,
- then that is written to the PDF file without transcoding, unless the options
- of no compression and no passthrough are set, -d and -n.
-
- If the input TIFF contains JPEG or single strip Zip/Deflate compressed
- information, and they are configured, then that is written to the PDF file
- without transcoding, unless the options of no compression and no passthrough
- are set.
-
- The default page size upon which the TIFF image is placed is determined by
- the resolution and extent of the image data. Default values for the TIFF
- image resolution can be set using the -x and -y options. The page size can
- be set using the -p option for paper size, or -w and -l for paper width and
- length, then each page of the TIFF image is centered on its page. The
- distance unit for default resolution and page width and length can be set
- by the -u option, the default unit is inch.
-
- Various items of the output document information can be set with the -e, -c,
- -a, -t, -s, and -k tags. Setting the argument of the option to "" for these
- tags causes the relevant document information field to be not written. Some
- of the document information values otherwise get their information from the
- input TIFF image, the software, author, document name, and image description.
-
- The output PDF file conforms to the PDF 1.1 specification or PDF 1.2 if using
- Zip/Deflate compression.
-
- The Portable Document Format (PDF) specification is copyrighted by Adobe
- Systems, Incorporated. Todos derechos reservados.
-
- Here is a listing of the usage example and the options to the tiff2pdf
- program that is part of the libtiff distribution. Options followed by
- a colon have a required argument.
-
- usage: tiff2pdf [options] input.tif
-
- options:
- -o: output to file name
-
- -j: compress with JPEG (requires libjpeg configured with libtiff)
- -z: compress with Zip/Deflate (requires zlib configured with libtiff)
- -q: compression quality
- -n: no compressed data passthrough
- -d: do not compress (decompress)
- -i: invert colors
- -u: set distance unit, 'i' for inch, 'm' for centimeter
- -x: set x resolution default
- -y: set y resolution default
- -w: width in units
- -l: length in units
- -r: 'd' for resolution default, 'o' for resolution override
- -p: paper size, eg "letter", "legal", "a4"
- -F: make the tiff fill the PDF page
- -f: set pdf "fit window" user preference
- -b: set PDF "Interpolate" user preference
- -e: date, overrides image or current date/time default, YYYYMMDDHHMMSS
- -c: creator, overrides image software default
- -a: author, overrides image artist default
- -t: title, overrides image document name default
- -s: subject, overrides image image description default
- -k: keywords
-
- -h: usage
-
- examples:
-
- tiff2pdf -o output.pdf input.tiff
-
- The above example would generate the file output.pdf from input.tiff.
-
- tiff2pdf input.tiff
-
- The above example would generate PDF output from input.tiff and write it
- to standard output.
-
- tiff2pdf -j -p letter -o output.pdf input.tiff
-
- The above example would generate the file output.pdf from input.tiff,
- putting the image pages on a letter sized page, compressing the output
- with JPEG.
-
- Please report bugs through:
-
- http://bugzilla.remotesensing.org/buglist.cgi?product=libtiff
-
- See also libtiff.3t, tiffcp.
- */
-
-int main(int argc, char** argv){
-
- extern char *optarg;
- extern int optind;
- const char *outfilename = NULL;
- T2P *t2p = NULL;
- TIFF *input = NULL, *output = NULL;
- int c, ret = EXIT_SUCCESS;
-
- t2p = t2p_init();
-
- if (t2p == NULL){
- TIFFError(TIFF2PDF_MODULE, "Can't initialize context");
- goto fail;
- }
-
- while (argv &&
- (c = getopt(argc, argv,
- "o:q:u:x:y:w:l:r:p:e:c:a:t:s:k:jzndifbhF")) != -1){
- switch (c) {
- case 'o':
- outfilename = optarg;
- break;
-#ifdef JPEG_SUPPORT
- case 'j':
- t2p->pdf_defaultcompression=T2P_COMPRESS_JPEG;
- break;
-#endif
-#ifndef JPEG_SUPPORT
- case 'j':
- TIFFWarning(
- TIFF2PDF_MODULE,
- "JPEG support in libtiff required for JPEG compression, ignoring option");
- break;
-#endif
-#ifdef ZIP_SUPPORT
- case 'z':
- t2p->pdf_defaultcompression=T2P_COMPRESS_ZIP;
- break;
-#endif
-#ifndef ZIP_SUPPORT
- case 'z':
- TIFFWarning(
- TIFF2PDF_MODULE,
- "Zip support in libtiff required for Zip compression, ignoring option");
- break;
-#endif
- case 'q':
- t2p->pdf_defaultcompressionquality=atoi(optarg);
- break;
- case 'n':
- t2p->pdf_nopassthrough=1;
- break;
- case 'd':
- t2p->pdf_defaultcompression=T2P_COMPRESS_NONE;
- break;
- case 'u':
- if(optarg[0]=='m'){
- t2p->pdf_centimeters=1;
- }
- break;
- case 'x':
- t2p->pdf_defaultxres =
- (float)atof(optarg) / (t2p->pdf_centimeters?2.54F:1.0F);
- break;
- case 'y':
- t2p->pdf_defaultyres =
- (float)atof(optarg) / (t2p->pdf_centimeters?2.54F:1.0F);
- break;
- case 'w':
- t2p->pdf_overridepagesize=1;
- t2p->pdf_defaultpagewidth =
- ((float)atof(optarg) * PS_UNIT_SIZE) / (t2p->pdf_centimeters?2.54F:1.0F);
- break;
- case 'l':
- t2p->pdf_overridepagesize=1;
- t2p->pdf_defaultpagelength =
- ((float)atof(optarg) * PS_UNIT_SIZE) / (t2p->pdf_centimeters?2.54F:1.0F);
- break;
- case 'r':
- if(optarg[0]=='o'){
- t2p->pdf_overrideres=1;
- }
- break;
- case 'p':
- if(tiff2pdf_match_paper_size(
- &(t2p->pdf_defaultpagewidth),
- &(t2p->pdf_defaultpagelength),
- optarg)){
- t2p->pdf_overridepagesize=1;
- } else {
- TIFFWarning(TIFF2PDF_MODULE,
- "Unknown paper size %s, ignoring option",
- optarg);
- }
- break;
- case 'i':
- t2p->pdf_colorspace_invert=1;
- break;
- case 'F':
- t2p->pdf_image_fillpage = 1;
- break;
- case 'f':
- t2p->pdf_fitwindow=1;
- break;
- case 'e':
- if (strlen(optarg) == 0) {
- t2p->pdf_datetime[0] = '\0';
- } else {
- t2p->pdf_datetime[0] = 'D';
- t2p->pdf_datetime[1] = ':';
- strncpy(t2p->pdf_datetime + 2, optarg,
- sizeof(t2p->pdf_datetime) - 3);
- t2p->pdf_datetime[sizeof(t2p->pdf_datetime) - 1] = '\0';
- }
- break;
- case 'c':
- strncpy(t2p->pdf_creator, optarg, sizeof(t2p->pdf_creator) - 1);
- t2p->pdf_creator[sizeof(t2p->pdf_creator) - 1] = '\0';
- break;
- case 'a':
- strncpy(t2p->pdf_author, optarg, sizeof(t2p->pdf_author) - 1);
- t2p->pdf_author[sizeof(t2p->pdf_author) - 1] = '\0';
- break;
- case 't':
- strncpy(t2p->pdf_title, optarg, sizeof(t2p->pdf_title) - 1);
- t2p->pdf_title[sizeof(t2p->pdf_title) - 1] = '\0';
- break;
- case 's':
- strncpy(t2p->pdf_subject, optarg, sizeof(t2p->pdf_subject) - 1);
- t2p->pdf_subject[sizeof(t2p->pdf_subject) - 1] = '\0';
- break;
- case 'k':
- strncpy(t2p->pdf_keywords, optarg, sizeof(t2p->pdf_keywords) - 1);
- t2p->pdf_keywords[sizeof(t2p->pdf_keywords) - 1] = '\0';
- break;
- case 'b':
- t2p->pdf_image_interpolate = 1;
- break;
- case 'h':
- case '?':
- tiff2pdf_usage();
- goto success;
- break;
- }
- }
-
- /*
- * Input
- */
- if(argc > optind) {
- input = TIFFOpen(argv[optind++], "r");
- if (input==NULL) {
- TIFFError(TIFF2PDF_MODULE,
- "Can't open input file %s for reading",
- argv[optind-1]);
- goto fail;
- }
- } else {
- TIFFError(TIFF2PDF_MODULE, "No input file specified");
- tiff2pdf_usage();
- goto fail;
- }
-
- if(argc > optind) {
- TIFFError(TIFF2PDF_MODULE,
- "No support for multiple input files");
- tiff2pdf_usage();
- goto fail;
- }
-
- /*
- * Output
- */
- t2p->outputdisable = 0;
- if (outfilename) {
- t2p->outputfile = fopen(outfilename, "wb");
- if (t2p->outputfile == NULL) {
- TIFFError(TIFF2PDF_MODULE,
- "Can't open output file %s for writing",
- outfilename);
- goto fail;
- }
- } else {
- outfilename = "-";
- t2p->outputfile = stdout;
- }
-
- output = TIFFClientOpen(outfilename, "w", (thandle_t) t2p,
- t2p_readproc, t2p_writeproc, t2p_seekproc,
- t2p_closeproc, t2p_sizeproc,
- t2p_mapproc, t2p_unmapproc);
- if (output == NULL) {
- TIFFError(TIFF2PDF_MODULE,
- "Can't initialize output descriptor");
- goto fail;
- }
-
- /*
- * Validate
- */
- t2p_validate(t2p);
- t2pSeekFile(output, (toff_t) 0, SEEK_SET);
-
- /*
- * Write
- */
- t2p_write_pdf(t2p, input, output);
- if (t2p->t2p_error != 0) {
- TIFFError(TIFF2PDF_MODULE,
- "An error occurred creating output PDF file");
- goto fail;
- }
-
- goto success;
-fail:
- ret = EXIT_FAILURE;
-success:
- if(input != NULL)
- TIFFClose(input);
- if (output != NULL)
- TIFFClose(output);
- if (t2p != NULL)
- t2p_free(t2p);
- return ret;
-
-}
-
-void tiff2pdf_usage(){
- char* lines[]={
- "usage: tiff2pdf [options] input.tiff",
- "options:",
- " -o: output to file name",
-#ifdef JPEG_SUPPORT
- " -j: compress with JPEG",
-#endif
-#ifdef ZIP_SUPPORT
- " -z: compress with Zip/Deflate",
-#endif
- " -q: compression quality",
- " -n: no compressed data passthrough",
- " -d: do not compress (decompress)",
- " -i: invert colors",
- " -u: set distance unit, 'i' for inch, 'm' for centimeter",
- " -x: set x resolution default in dots per unit",
- " -y: set y resolution default in dots per unit",
- " -w: width in units",
- " -l: length in units",
- " -r: 'd' for resolution default, 'o' for resolution override",
- " -p: paper size, eg \"letter\", \"legal\", \"A4\"",
- " -F: make the tiff fill the PDF page",
- " -f: set PDF \"Fit Window\" user preference",
- " -e: date, overrides image or current date/time default, YYYYMMDDHHMMSS",
- " -c: sets document creator, overrides image software default",
- " -a: sets document author, overrides image artist default",
- " -t: sets document title, overrides image document name default",
- " -s: sets document subject, overrides image image description default",
- " -k: sets document keywords",
- " -b: set PDF \"Interpolate\" user preference",
- " -h: usage",
- NULL
- };
- int i=0;
-
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i=0;lines[i]!=NULL;i++){
- fprintf(stderr, "%s\n", lines[i]);
- }
-
- return;
-}
-
-int tiff2pdf_match_paper_size(float* width, float* length, char* papersize){
-
- size_t i, len;
- const char* sizes[]={
- "LETTER", "A4", "LEGAL",
- "EXECUTIVE", "LETTER", "LEGAL", "LEDGER", "TABLOID",
- "A", "B", "C", "D", "E", "F", "G", "H", "J", "K",
- "A10", "A9", "A8", "A7", "A6", "A5", "A4", "A3", "A2", "A1", "A0",
- "2A0", "4A0", "2A", "4A",
- "B10", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "B2", "B1", "B0",
- "JISB10", "JISB9", "JISB8", "JISB7", "JISB6", "JISB5", "JISB4",
- "JISB3", "JISB2", "JISB1", "JISB0",
- "C10", "C9", "C8", "C7", "C6", "C5", "C4", "C3", "C2", "C1", "C0",
- "RA2", "RA1", "RA0", "SRA4", "SRA3", "SRA2", "SRA1", "SRA0",
- "A3EXTRA", "A4EXTRA",
- "STATEMENT", "FOLIO", "QUARTO",
- NULL
- } ;
- const int widths[]={
- 612, 595, 612,
- 522, 612,612,792,792,
- 612,792,1224,1584,2448,2016,792,2016,2448,2880,
- 74,105,147,210,298,420,595,842,1191,1684,2384,3370,4768,3370,4768,
- 88,125,176,249,354,499,709,1001,1417,2004,2835,
- 91,128,181,258,363,516,729,1032,1460,2064,2920,
- 79,113,162,230,323,459,649,918,1298,1298,2599,
- 1219,1729,2438,638,907,1276,1814,2551,
- 914,667,
- 396, 612, 609,
- 0
- };
- const int lengths[]={
- 792,842,1008,
- 756,792,1008,1224,1224,
- 792,1224,1584,2448,3168,2880,6480,10296,12672,10296,
- 105,147,210,298,420,595,842,1191,1684,2384,3370,4768,6741,4768,6741,
- 125,176,249,354,499,709,1001,1417,2004,2835,4008,
- 128,181,258,363,516,729,1032,1460,2064,2920,4127,
- 113,162,230,323,459,649,918,1298,1837,1837,3677,
- 1729,2438,3458,907,1276,1814,2551,3628,
- 1262,914,
- 612, 936, 780,
- 0
- };
-
- len=strlen(papersize);
- for(i=0;i<len;i++){
- papersize[i]=toupper(papersize[i]);
- }
- for(i=0;sizes[i]!=NULL; i++){
- if (strcmp( (const char*)papersize, sizes[i])==0){
- *width=(float)widths[i];
- *length=(float)lengths[i];
- return(1);
- }
- }
-
- return(0);
-}
-
-/*
- * This function allocates and initializes a T2P context struct pointer.
- */
-
-T2P* t2p_init()
-{
- T2P* t2p = (T2P*) _TIFFmalloc(sizeof(T2P));
- if(t2p==NULL){
- TIFFError(
- TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for t2p_init",
- (unsigned long) sizeof(T2P));
- return( (T2P*) NULL );
- }
- _TIFFmemset(t2p, 0x00, sizeof(T2P));
- t2p->pdf_majorversion=1;
- t2p->pdf_minorversion=1;
- t2p->pdf_defaultxres=300.0;
- t2p->pdf_defaultyres=300.0;
- t2p->pdf_defaultpagewidth=612.0;
- t2p->pdf_defaultpagelength=792.0;
- t2p->pdf_xrefcount=3; /* Catalog, Info, Pages */
-
- return(t2p);
-}
-
-/*
- * This function frees a T2P context struct pointer and any allocated data fields of it.
- */
-
-void t2p_free(T2P* t2p)
-{
- int i = 0;
-
- if (t2p != NULL) {
- if(t2p->pdf_xrefoffsets != NULL){
- _TIFFfree( (tdata_t) t2p->pdf_xrefoffsets);
- }
- if(t2p->tiff_pages != NULL){
- _TIFFfree( (tdata_t) t2p->tiff_pages);
- }
- for(i=0;i<t2p->tiff_pagecount;i++){
- if(t2p->tiff_tiles[i].tiles_tiles != NULL){
- _TIFFfree( (tdata_t) t2p->tiff_tiles[i].tiles_tiles);
- }
- }
- if(t2p->tiff_tiles != NULL){
- _TIFFfree( (tdata_t) t2p->tiff_tiles);
- }
- if(t2p->pdf_palette != NULL){
- _TIFFfree( (tdata_t) t2p->pdf_palette);
- }
-#ifdef OJPEG_SUPPORT
- if(t2p->pdf_ojpegdata != NULL){
- _TIFFfree( (tdata_t) t2p->pdf_ojpegdata);
- }
-#endif
- _TIFFfree( (tdata_t) t2p );
- }
-
- return;
-}
-
-/*
- This function validates the values of a T2P context struct pointer
- before calling t2p_write_pdf with it.
-*/
-
-void t2p_validate(T2P* t2p){
-
-#ifdef JPEG_SUPPORT
- if(t2p->pdf_defaultcompression==T2P_COMPRESS_JPEG){
- if(t2p->pdf_defaultcompressionquality>100 ||
- t2p->pdf_defaultcompressionquality<1){
- t2p->pdf_defaultcompressionquality=0;
- }
- }
-#endif
-#ifdef ZIP_SUPPORT
- if(t2p->pdf_defaultcompression==T2P_COMPRESS_ZIP){
- uint16 m=t2p->pdf_defaultcompressionquality%100;
- if(t2p->pdf_defaultcompressionquality/100 > 9 ||
- (m>1 && m<10) || m>15){
- t2p->pdf_defaultcompressionquality=0;
- }
- if(t2p->pdf_defaultcompressionquality%100 !=0){
- t2p->pdf_defaultcompressionquality/=100;
- t2p->pdf_defaultcompressionquality*=100;
- TIFFError(
- TIFF2PDF_MODULE,
- "PNG Group predictor differencing not implemented, assuming compression quality %u",
- t2p->pdf_defaultcompressionquality);
- }
- t2p->pdf_defaultcompressionquality%=100;
- if(t2p->pdf_minorversion<2){t2p->pdf_minorversion=2;}
- }
-#endif
- (void)0;
-
- return;
-}
-
-
-/*
- This function scans the input TIFF file for pages. It attempts
- to determine which IFD's of the TIFF file contain image document
- pages. For each, it gathers some information that has to do
- with the output of the PDF document as a whole.
-*/
-
-void t2p_read_tiff_init(T2P* t2p, TIFF* input){
-
- tdir_t directorycount=0;
- tdir_t i=0;
- uint16 pagen=0;
- uint16 paged=0;
- uint16 xuint16=0;
-
- directorycount=TIFFNumberOfDirectories(input);
- t2p->tiff_pages = (T2P_PAGE*) _TIFFmalloc(TIFFSafeMultiply(tmsize_t,directorycount,sizeof(T2P_PAGE)));
- if(t2p->tiff_pages==NULL){
- TIFFError(
- TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for tiff_pages array, %s",
- (unsigned long) directorycount * sizeof(T2P_PAGE),
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- _TIFFmemset( t2p->tiff_pages, 0x00, directorycount * sizeof(T2P_PAGE));
- t2p->tiff_tiles = (T2P_TILES*) _TIFFmalloc(TIFFSafeMultiply(tmsize_t,directorycount,sizeof(T2P_TILES)));
- if(t2p->tiff_tiles==NULL){
- TIFFError(
- TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for tiff_tiles array, %s",
- (unsigned long) directorycount * sizeof(T2P_TILES),
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- _TIFFmemset( t2p->tiff_tiles, 0x00, directorycount * sizeof(T2P_TILES));
- for(i=0;i<directorycount;i++){
- uint32 subfiletype = 0;
-
- if(!TIFFSetDirectory(input, i)){
- TIFFError(
- TIFF2PDF_MODULE,
- "Can't set directory %u of input file %s",
- i,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- if(TIFFGetField(input, TIFFTAG_PAGENUMBER, &pagen, &paged)){
- if((pagen>paged) && (paged != 0)){
- t2p->tiff_pages[t2p->tiff_pagecount].page_number =
- paged;
- } else {
- t2p->tiff_pages[t2p->tiff_pagecount].page_number =
- pagen;
- }
- goto ispage2;
- }
- if(TIFFGetField(input, TIFFTAG_SUBFILETYPE, &subfiletype)){
- if ( ((subfiletype & FILETYPE_PAGE) != 0)
- || (subfiletype == 0)){
- goto ispage;
- } else {
- goto isnotpage;
- }
- }
- if(TIFFGetField(input, TIFFTAG_OSUBFILETYPE, &subfiletype)){
- if ((subfiletype == OFILETYPE_IMAGE)
- || (subfiletype == OFILETYPE_PAGE)
- || (subfiletype == 0) ){
- goto ispage;
- } else {
- goto isnotpage;
- }
- }
- ispage:
- t2p->tiff_pages[t2p->tiff_pagecount].page_number=t2p->tiff_pagecount;
- ispage2:
- t2p->tiff_pages[t2p->tiff_pagecount].page_directory=i;
- if(TIFFIsTiled(input)){
- t2p->tiff_pages[t2p->tiff_pagecount].page_tilecount =
- TIFFNumberOfTiles(input);
- }
- t2p->tiff_pagecount++;
- isnotpage:
- (void)0;
- }
-
- qsort((void*) t2p->tiff_pages, t2p->tiff_pagecount,
- sizeof(T2P_PAGE), t2p_cmp_t2p_page);
-
- for(i=0;i<t2p->tiff_pagecount;i++){
- t2p->pdf_xrefcount += 5;
- TIFFSetDirectory(input, t2p->tiff_pages[i].page_directory );
- if((TIFFGetField(input, TIFFTAG_PHOTOMETRIC, &xuint16)
- && (xuint16==PHOTOMETRIC_PALETTE))
- || TIFFGetField(input, TIFFTAG_INDEXED, &xuint16)) {
- t2p->tiff_pages[i].page_extra++;
- t2p->pdf_xrefcount++;
- }
-#ifdef ZIP_SUPPORT
- if (TIFFGetField(input, TIFFTAG_COMPRESSION, &xuint16)) {
- if( (xuint16== COMPRESSION_DEFLATE ||
- xuint16== COMPRESSION_ADOBE_DEFLATE) &&
- ((t2p->tiff_pages[i].page_tilecount != 0)
- || TIFFNumberOfStrips(input)==1) &&
- (t2p->pdf_nopassthrough==0) ){
- if(t2p->pdf_minorversion<2){t2p->pdf_minorversion=2;}
- }
- }
-#endif
- if (TIFFGetField(input, TIFFTAG_TRANSFERFUNCTION,
- &(t2p->tiff_transferfunction[0]),
- &(t2p->tiff_transferfunction[1]),
- &(t2p->tiff_transferfunction[2]))) {
- if((t2p->tiff_transferfunction[1] != (float*) NULL) &&
- (t2p->tiff_transferfunction[2] != (float*) NULL) &&
- (t2p->tiff_transferfunction[1] !=
- t2p->tiff_transferfunction[0])) {
- t2p->tiff_transferfunctioncount = 3;
- t2p->tiff_pages[i].page_extra += 4;
- t2p->pdf_xrefcount += 4;
- } else {
- t2p->tiff_transferfunctioncount = 1;
- t2p->tiff_pages[i].page_extra += 2;
- t2p->pdf_xrefcount += 2;
- }
- if(t2p->pdf_minorversion < 2)
- t2p->pdf_minorversion = 2;
- } else {
- t2p->tiff_transferfunctioncount=0;
- }
- if( TIFFGetField(
- input,
- TIFFTAG_ICCPROFILE,
- &(t2p->tiff_iccprofilelength),
- &(t2p->tiff_iccprofile)) != 0){
- t2p->tiff_pages[i].page_extra++;
- t2p->pdf_xrefcount++;
- if(t2p->pdf_minorversion<3){t2p->pdf_minorversion=3;}
- }
- t2p->tiff_tiles[i].tiles_tilecount=
- t2p->tiff_pages[i].page_tilecount;
- if( (TIFFGetField(input, TIFFTAG_PLANARCONFIG, &xuint16) != 0)
- && (xuint16 == PLANARCONFIG_SEPARATE ) ){
- if( !TIFFGetField(input, TIFFTAG_SAMPLESPERPIXEL, &xuint16) )
- {
- TIFFError(
- TIFF2PDF_MODULE,
- "Missing SamplesPerPixel, %s",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- if( (t2p->tiff_tiles[i].tiles_tilecount % xuint16) != 0 )
- {
- TIFFError(
- TIFF2PDF_MODULE,
- "Invalid tile count, %s",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- t2p->tiff_tiles[i].tiles_tilecount/= xuint16;
- }
- if( t2p->tiff_tiles[i].tiles_tilecount > 0){
- t2p->pdf_xrefcount +=
- (t2p->tiff_tiles[i].tiles_tilecount -1)*2;
- TIFFGetField(input,
- TIFFTAG_TILEWIDTH,
- &( t2p->tiff_tiles[i].tiles_tilewidth) );
- TIFFGetField(input,
- TIFFTAG_TILELENGTH,
- &( t2p->tiff_tiles[i].tiles_tilelength) );
- t2p->tiff_tiles[i].tiles_tiles =
- (T2P_TILE*) _TIFFmalloc(TIFFSafeMultiply(tmsize_t,t2p->tiff_tiles[i].tiles_tilecount,
- sizeof(T2P_TILE)) );
- if( t2p->tiff_tiles[i].tiles_tiles == NULL){
- TIFFError(
- TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for t2p_read_tiff_init, %s",
- (unsigned long) t2p->tiff_tiles[i].tiles_tilecount * sizeof(T2P_TILE),
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- }
- }
-
- return;
-}
-
-/*
- * This function is used by qsort to sort a T2P_PAGE* array of page structures
- * by page number. If the page numbers are the same, we fall back to comparing
- * directory numbers to preserve the order of the input file.
- */
-
-int t2p_cmp_t2p_page(const void* e1, const void* e2){
-
- int d;
- d = (int32)(((T2P_PAGE*)e1)->page_number) - (int32)(((T2P_PAGE*)e2)->page_number);
- if(d == 0){
- d = (int32)(((T2P_PAGE*)e1)->page_directory) - (int32)(((T2P_PAGE*)e2)->page_directory);
- }
- return d;
-}
-
-/*
- This function sets the input directory to the directory of a given
- page and determines information about the image. It checks
- the image characteristics to determine if it is possible to convert
- the image data into a page of PDF output, setting values of the T2P
- struct for this page. It determines what color space is used in
- the output PDF to represent the image.
-
- It determines if the image can be converted as raw data without
- requiring transcoding of the image data.
-*/
-
-void t2p_read_tiff_data(T2P* t2p, TIFF* input){
-
- int i=0;
- uint16* r;
- uint16* g;
- uint16* b;
- uint16* a;
- uint16 xuint16;
- uint16* xuint16p;
- float* xfloatp;
-
- t2p->pdf_transcode = T2P_TRANSCODE_ENCODE;
- t2p->pdf_sample = T2P_SAMPLE_NOTHING;
- t2p->pdf_switchdecode = t2p->pdf_colorspace_invert;
-
-
- TIFFSetDirectory(input, t2p->tiff_pages[t2p->pdf_page].page_directory);
-
- TIFFGetField(input, TIFFTAG_IMAGEWIDTH, &(t2p->tiff_width));
- if(t2p->tiff_width == 0){
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with zero width",
- TIFFFileName(input) );
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
-
- TIFFGetField(input, TIFFTAG_IMAGELENGTH, &(t2p->tiff_length));
- if(t2p->tiff_length == 0){
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with zero length",
- TIFFFileName(input) );
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
-
- if(TIFFGetField(input, TIFFTAG_COMPRESSION, &(t2p->tiff_compression)) == 0){
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with no compression tag",
- TIFFFileName(input) );
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
-
- }
- if( TIFFIsCODECConfigured(t2p->tiff_compression) == 0){
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with compression type %u: not configured",
- TIFFFileName(input),
- t2p->tiff_compression
- );
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
-
- }
-
- TIFFGetFieldDefaulted(input, TIFFTAG_BITSPERSAMPLE, &(t2p->tiff_bitspersample));
- switch(t2p->tiff_bitspersample){
- case 1:
- case 2:
- case 4:
- case 8:
- break;
- case 0:
- TIFFWarning(
- TIFF2PDF_MODULE,
- "Image %s has 0 bits per sample, assuming 1",
- TIFFFileName(input));
- t2p->tiff_bitspersample=1;
- break;
- default:
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with %u bits per sample",
- TIFFFileName(input),
- t2p->tiff_bitspersample);
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
-
- TIFFGetFieldDefaulted(input, TIFFTAG_SAMPLESPERPIXEL, &(t2p->tiff_samplesperpixel));
- if(t2p->tiff_samplesperpixel>4){
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with %u samples per pixel",
- TIFFFileName(input),
- t2p->tiff_samplesperpixel);
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- if(t2p->tiff_samplesperpixel==0){
- TIFFWarning(
- TIFF2PDF_MODULE,
- "Image %s has 0 samples per pixel, assuming 1",
- TIFFFileName(input));
- t2p->tiff_samplesperpixel=1;
- }
-
- if(TIFFGetField(input, TIFFTAG_SAMPLEFORMAT, &xuint16) != 0 ){
- switch(xuint16){
- case 0:
- case 1:
- case 4:
- break;
- default:
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with sample format %u",
- TIFFFileName(input),
- xuint16);
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- break;
- }
- }
-
- TIFFGetFieldDefaulted(input, TIFFTAG_FILLORDER, &(t2p->tiff_fillorder));
-
- if(TIFFGetField(input, TIFFTAG_PHOTOMETRIC, &(t2p->tiff_photometric)) == 0){
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with no photometric interpretation tag",
- TIFFFileName(input) );
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
-
- }
-
- switch(t2p->tiff_photometric){
- case PHOTOMETRIC_MINISWHITE:
- case PHOTOMETRIC_MINISBLACK:
- if (t2p->tiff_bitspersample==1){
- t2p->pdf_colorspace=T2P_CS_BILEVEL;
- if(t2p->tiff_photometric==PHOTOMETRIC_MINISWHITE){
- t2p->pdf_switchdecode ^= 1;
- }
- } else {
- t2p->pdf_colorspace=T2P_CS_GRAY;
- if(t2p->tiff_photometric==PHOTOMETRIC_MINISWHITE){
- t2p->pdf_switchdecode ^= 1;
- }
- }
- break;
- case PHOTOMETRIC_RGB:
- t2p->pdf_colorspace=T2P_CS_RGB;
- if(t2p->tiff_samplesperpixel == 3){
- break;
- }
- if(TIFFGetField(input, TIFFTAG_INDEXED, &xuint16)){
- if(xuint16==1)
- goto photometric_palette;
- }
- if(t2p->tiff_samplesperpixel > 3) {
- if(t2p->tiff_samplesperpixel == 4) {
- t2p->pdf_colorspace = T2P_CS_RGB;
- if(TIFFGetField(input,
- TIFFTAG_EXTRASAMPLES,
- &xuint16, &xuint16p)
- && xuint16 == 1) {
- if(xuint16p[0] == EXTRASAMPLE_ASSOCALPHA){
- if( t2p->tiff_bitspersample != 8 )
- {
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for BitsPerSample=%d for RGBA",
- t2p->tiff_bitspersample);
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- t2p->pdf_sample=T2P_SAMPLE_RGBAA_TO_RGB;
- break;
- }
- if(xuint16p[0] == EXTRASAMPLE_UNASSALPHA){
- if( t2p->tiff_bitspersample != 8 )
- {
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for BitsPerSample=%d for RGBA",
- t2p->tiff_bitspersample);
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- t2p->pdf_sample=T2P_SAMPLE_RGBA_TO_RGB;
- break;
- }
- TIFFWarning(
- TIFF2PDF_MODULE,
- "RGB image %s has 4 samples per pixel, assuming RGBA",
- TIFFFileName(input));
- break;
- }
- t2p->pdf_colorspace=T2P_CS_CMYK;
- t2p->pdf_switchdecode ^= 1;
- TIFFWarning(
- TIFF2PDF_MODULE,
- "RGB image %s has 4 samples per pixel, assuming inverse CMYK",
- TIFFFileName(input));
- break;
- } else {
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for RGB image %s with %u samples per pixel",
- TIFFFileName(input),
- t2p->tiff_samplesperpixel);
- t2p->t2p_error = T2P_ERR_ERROR;
- break;
- }
- } else {
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for RGB image %s with %u samples per pixel",
- TIFFFileName(input),
- t2p->tiff_samplesperpixel);
- t2p->t2p_error = T2P_ERR_ERROR;
- break;
- }
- case PHOTOMETRIC_PALETTE:
- photometric_palette:
- if(t2p->tiff_samplesperpixel!=1){
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for palettized image %s with not one sample per pixel",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- t2p->pdf_colorspace=T2P_CS_RGB | T2P_CS_PALETTE;
- t2p->pdf_palettesize=0x0001<<t2p->tiff_bitspersample;
- if(!TIFFGetField(input, TIFFTAG_COLORMAP, &r, &g, &b)){
- TIFFError(
- TIFF2PDF_MODULE,
- "Palettized image %s has no color map",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- if(t2p->pdf_palette != NULL){
- _TIFFfree(t2p->pdf_palette);
- t2p->pdf_palette=NULL;
- }
- t2p->pdf_palette = (unsigned char*)
- _TIFFmalloc(TIFFSafeMultiply(tmsize_t,t2p->pdf_palettesize,3));
- if(t2p->pdf_palette==NULL){
- TIFFError(
- TIFF2PDF_MODULE,
- "Can't allocate %u bytes of memory for t2p_read_tiff_image, %s",
- t2p->pdf_palettesize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- for(i=0;i<t2p->pdf_palettesize;i++){
- t2p->pdf_palette[(i*3)] = (unsigned char) (r[i]>>8);
- t2p->pdf_palette[(i*3)+1]= (unsigned char) (g[i]>>8);
- t2p->pdf_palette[(i*3)+2]= (unsigned char) (b[i]>>8);
- }
- t2p->pdf_palettesize *= 3;
- break;
- case PHOTOMETRIC_SEPARATED:
- if(TIFFGetField(input, TIFFTAG_INDEXED, &xuint16)){
- if(xuint16==1){
- goto photometric_palette_cmyk;
- }
- }
- if( TIFFGetField(input, TIFFTAG_INKSET, &xuint16) ){
- if(xuint16 != INKSET_CMYK){
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s because its inkset is not CMYK",
- TIFFFileName(input) );
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- }
- if(t2p->tiff_samplesperpixel==4){
- t2p->pdf_colorspace=T2P_CS_CMYK;
- } else {
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s because it has %u samples per pixel",
- TIFFFileName(input),
- t2p->tiff_samplesperpixel);
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- break;
- photometric_palette_cmyk:
- if(t2p->tiff_samplesperpixel!=1){
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for palettized CMYK image %s with not one sample per pixel",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- t2p->pdf_colorspace=T2P_CS_CMYK | T2P_CS_PALETTE;
- t2p->pdf_palettesize=0x0001<<t2p->tiff_bitspersample;
- if(!TIFFGetField(input, TIFFTAG_COLORMAP, &r, &g, &b, &a)){
- TIFFError(
- TIFF2PDF_MODULE,
- "Palettized image %s has no color map",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- if(t2p->pdf_palette != NULL){
- _TIFFfree(t2p->pdf_palette);
- t2p->pdf_palette=NULL;
- }
- t2p->pdf_palette = (unsigned char*)
- _TIFFmalloc(TIFFSafeMultiply(tmsize_t,t2p->pdf_palettesize,4));
- if(t2p->pdf_palette==NULL){
- TIFFError(
- TIFF2PDF_MODULE,
- "Can't allocate %u bytes of memory for t2p_read_tiff_image, %s",
- t2p->pdf_palettesize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- for(i=0;i<t2p->pdf_palettesize;i++){
- t2p->pdf_palette[(i*4)] = (unsigned char) (r[i]>>8);
- t2p->pdf_palette[(i*4)+1]= (unsigned char) (g[i]>>8);
- t2p->pdf_palette[(i*4)+2]= (unsigned char) (b[i]>>8);
- t2p->pdf_palette[(i*4)+3]= (unsigned char) (a[i]>>8);
- }
- t2p->pdf_palettesize *= 4;
- break;
- case PHOTOMETRIC_YCBCR:
- t2p->pdf_colorspace=T2P_CS_RGB;
- if(t2p->tiff_samplesperpixel==1){
- t2p->pdf_colorspace=T2P_CS_GRAY;
- t2p->tiff_photometric=PHOTOMETRIC_MINISBLACK;
- break;
- }
- t2p->pdf_sample=T2P_SAMPLE_YCBCR_TO_RGB;
-#ifdef JPEG_SUPPORT
- if(t2p->pdf_defaultcompression==T2P_COMPRESS_JPEG){
- t2p->pdf_sample=T2P_SAMPLE_NOTHING;
- }
-#endif
- break;
- case PHOTOMETRIC_CIELAB:
- if( t2p->tiff_samplesperpixel != 3){
- TIFFError(
- TIFF2PDF_MODULE,
- "Unsupported samplesperpixel = %d for CIELAB",
- t2p->tiff_samplesperpixel);
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- if( t2p->tiff_bitspersample != 8){
- TIFFError(
- TIFF2PDF_MODULE,
- "Invalid bitspersample = %d for CIELAB",
- t2p->tiff_bitspersample);
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- t2p->pdf_labrange[0]= -127;
- t2p->pdf_labrange[1]= 127;
- t2p->pdf_labrange[2]= -127;
- t2p->pdf_labrange[3]= 127;
- t2p->pdf_sample=T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED;
- t2p->pdf_colorspace=T2P_CS_LAB;
- break;
- case PHOTOMETRIC_ICCLAB:
- t2p->pdf_labrange[0]= 0;
- t2p->pdf_labrange[1]= 255;
- t2p->pdf_labrange[2]= 0;
- t2p->pdf_labrange[3]= 255;
- t2p->pdf_colorspace=T2P_CS_LAB;
- break;
- case PHOTOMETRIC_ITULAB:
- if( t2p->tiff_samplesperpixel != 3){
- TIFFError(
- TIFF2PDF_MODULE,
- "Unsupported samplesperpixel = %d for ITULAB",
- t2p->tiff_samplesperpixel);
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- if( t2p->tiff_bitspersample != 8){
- TIFFError(
- TIFF2PDF_MODULE,
- "Invalid bitspersample = %d for ITULAB",
- t2p->tiff_bitspersample);
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- t2p->pdf_labrange[0]=-85;
- t2p->pdf_labrange[1]=85;
- t2p->pdf_labrange[2]=-75;
- t2p->pdf_labrange[3]=124;
- t2p->pdf_sample=T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED;
- t2p->pdf_colorspace=T2P_CS_LAB;
- break;
- case PHOTOMETRIC_LOGL:
- case PHOTOMETRIC_LOGLUV:
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with photometric interpretation LogL/LogLuv",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- default:
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with photometric interpretation %u",
- TIFFFileName(input),
- t2p->tiff_photometric);
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
-
- if(TIFFGetField(input, TIFFTAG_PLANARCONFIG, &(t2p->tiff_planar))){
- switch(t2p->tiff_planar){
- case 0:
- TIFFWarning(
- TIFF2PDF_MODULE,
- "Image %s has planar configuration 0, assuming 1",
- TIFFFileName(input));
- t2p->tiff_planar=PLANARCONFIG_CONTIG;
- case PLANARCONFIG_CONTIG:
- break;
- case PLANARCONFIG_SEPARATE:
- t2p->pdf_sample=T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG;
- if(t2p->tiff_bitspersample!=8){
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with separated planar configuration and %u bits per sample",
- TIFFFileName(input),
- t2p->tiff_bitspersample);
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- break;
- default:
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with planar configuration %u",
- TIFFFileName(input),
- t2p->tiff_planar);
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- }
-
- TIFFGetFieldDefaulted(input, TIFFTAG_ORIENTATION,
- &(t2p->tiff_orientation));
- if(t2p->tiff_orientation>8){
- TIFFWarning(TIFF2PDF_MODULE,
- "Image %s has orientation %u, assuming 0",
- TIFFFileName(input), t2p->tiff_orientation);
- t2p->tiff_orientation=0;
- }
-
- if(TIFFGetField(input, TIFFTAG_XRESOLUTION, &(t2p->tiff_xres) ) == 0){
- t2p->tiff_xres=0.0;
- }
- if(TIFFGetField(input, TIFFTAG_YRESOLUTION, &(t2p->tiff_yres) ) == 0){
- t2p->tiff_yres=0.0;
- }
- TIFFGetFieldDefaulted(input, TIFFTAG_RESOLUTIONUNIT,
- &(t2p->tiff_resunit));
- if(t2p->tiff_resunit == RESUNIT_CENTIMETER) {
- t2p->tiff_xres *= 2.54F;
- t2p->tiff_yres *= 2.54F;
- } else if (t2p->tiff_resunit != RESUNIT_INCH
- && t2p->pdf_centimeters != 0) {
- t2p->tiff_xres *= 2.54F;
- t2p->tiff_yres *= 2.54F;
- }
-
- t2p_compose_pdf_page(t2p);
- if( t2p->t2p_error == T2P_ERR_ERROR )
- return;
-
- t2p->pdf_transcode = T2P_TRANSCODE_ENCODE;
- if(t2p->pdf_nopassthrough==0){
-#ifdef CCITT_SUPPORT
- if(t2p->tiff_compression==COMPRESSION_CCITTFAX4
- ){
- if(TIFFIsTiled(input) || (TIFFNumberOfStrips(input)==1) ){
- t2p->pdf_transcode = T2P_TRANSCODE_RAW;
- t2p->pdf_compression=T2P_COMPRESS_G4;
- }
- }
-#endif
-#ifdef ZIP_SUPPORT
- if(t2p->tiff_compression== COMPRESSION_ADOBE_DEFLATE
- || t2p->tiff_compression==COMPRESSION_DEFLATE){
- if(TIFFIsTiled(input) || (TIFFNumberOfStrips(input)==1) ){
- t2p->pdf_transcode = T2P_TRANSCODE_RAW;
- t2p->pdf_compression=T2P_COMPRESS_ZIP;
- }
- }
-#endif
-#ifdef OJPEG_SUPPORT
- if(t2p->tiff_compression==COMPRESSION_OJPEG){
- t2p->pdf_transcode = T2P_TRANSCODE_RAW;
- t2p->pdf_compression=T2P_COMPRESS_JPEG;
- t2p_process_ojpeg_tables(t2p, input);
- }
-#endif
-#ifdef JPEG_SUPPORT
- if(t2p->tiff_compression==COMPRESSION_JPEG){
- t2p->pdf_transcode = T2P_TRANSCODE_RAW;
- t2p->pdf_compression=T2P_COMPRESS_JPEG;
- }
-#endif
- (void)0;
- }
-
- if(t2p->pdf_transcode!=T2P_TRANSCODE_RAW){
- t2p->pdf_compression = t2p->pdf_defaultcompression;
- }
-
-#ifdef JPEG_SUPPORT
- if(t2p->pdf_defaultcompression==T2P_COMPRESS_JPEG){
- if(t2p->pdf_colorspace & T2P_CS_PALETTE){
- t2p->pdf_sample|=T2P_SAMPLE_REALIZE_PALETTE;
- t2p->pdf_colorspace ^= T2P_CS_PALETTE;
- t2p->tiff_pages[t2p->pdf_page].page_extra--;
- }
- }
- if(t2p->tiff_compression==COMPRESSION_JPEG){
- if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with JPEG compression and separated planar configuration",
- TIFFFileName(input));
- t2p->t2p_error=T2P_ERR_ERROR;
- return;
- }
- }
-#endif
-#ifdef OJPEG_SUPPORT
- if(t2p->tiff_compression==COMPRESSION_OJPEG){
- if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){
- TIFFError(
- TIFF2PDF_MODULE,
- "No support for %s with OJPEG compression and separated planar configuration",
- TIFFFileName(input));
- t2p->t2p_error=T2P_ERR_ERROR;
- return;
- }
- }
-#endif
-
- if(t2p->pdf_sample & T2P_SAMPLE_REALIZE_PALETTE){
- if(t2p->pdf_colorspace & T2P_CS_CMYK){
- t2p->tiff_samplesperpixel=4;
- t2p->tiff_photometric=PHOTOMETRIC_SEPARATED;
- } else {
- t2p->tiff_samplesperpixel=3;
- t2p->tiff_photometric=PHOTOMETRIC_RGB;
- }
- }
-
- if (TIFFGetField(input, TIFFTAG_TRANSFERFUNCTION,
- &(t2p->tiff_transferfunction[0]),
- &(t2p->tiff_transferfunction[1]),
- &(t2p->tiff_transferfunction[2]))) {
- if((t2p->tiff_transferfunction[1] != (float*) NULL) &&
- (t2p->tiff_transferfunction[2] != (float*) NULL) &&
- (t2p->tiff_transferfunction[1] !=
- t2p->tiff_transferfunction[0])) {
- t2p->tiff_transferfunctioncount=3;
- } else {
- t2p->tiff_transferfunctioncount=1;
- }
- } else {
- t2p->tiff_transferfunctioncount=0;
- }
- if(TIFFGetField(input, TIFFTAG_WHITEPOINT, &xfloatp)!=0){
- t2p->tiff_whitechromaticities[0]=xfloatp[0];
- t2p->tiff_whitechromaticities[1]=xfloatp[1];
- if(t2p->pdf_colorspace & T2P_CS_GRAY){
- t2p->pdf_colorspace |= T2P_CS_CALGRAY;
- }
- if(t2p->pdf_colorspace & T2P_CS_RGB){
- t2p->pdf_colorspace |= T2P_CS_CALRGB;
- }
- }
- if(TIFFGetField(input, TIFFTAG_PRIMARYCHROMATICITIES, &xfloatp)!=0){
- t2p->tiff_primarychromaticities[0]=xfloatp[0];
- t2p->tiff_primarychromaticities[1]=xfloatp[1];
- t2p->tiff_primarychromaticities[2]=xfloatp[2];
- t2p->tiff_primarychromaticities[3]=xfloatp[3];
- t2p->tiff_primarychromaticities[4]=xfloatp[4];
- t2p->tiff_primarychromaticities[5]=xfloatp[5];
- if(t2p->pdf_colorspace & T2P_CS_RGB){
- t2p->pdf_colorspace |= T2P_CS_CALRGB;
- }
- }
- if(t2p->pdf_colorspace & T2P_CS_LAB){
- if(TIFFGetField(input, TIFFTAG_WHITEPOINT, &xfloatp) != 0){
- t2p->tiff_whitechromaticities[0]=xfloatp[0];
- t2p->tiff_whitechromaticities[1]=xfloatp[1];
- } else {
- t2p->tiff_whitechromaticities[0]=0.3457F; /* 0.3127F; */
- t2p->tiff_whitechromaticities[1]=0.3585F; /* 0.3290F; */
- }
- }
- if(TIFFGetField(input,
- TIFFTAG_ICCPROFILE,
- &(t2p->tiff_iccprofilelength),
- &(t2p->tiff_iccprofile))!=0){
- t2p->pdf_colorspace |= T2P_CS_ICCBASED;
- } else {
- t2p->tiff_iccprofilelength=0;
- t2p->tiff_iccprofile=NULL;
- }
-
-#ifdef CCITT_SUPPORT
- if( t2p->tiff_bitspersample==1 &&
- t2p->tiff_samplesperpixel==1){
- t2p->pdf_compression = T2P_COMPRESS_G4;
- }
-#endif
-
-
- return;
-}
-
-/*
- This function returns the necessary size of a data buffer to contain the raw or
- uncompressed image data from the input TIFF for a page.
-*/
-
-void t2p_read_tiff_size(T2P* t2p, TIFF* input){
-
- uint64* sbc=NULL;
-#if defined(JPEG_SUPPORT) || defined (OJPEG_SUPPORT)
- unsigned char* jpt=NULL;
- tstrip_t i=0;
- tstrip_t stripcount=0;
-#endif
- uint64 k = 0;
-
- if(t2p->pdf_transcode == T2P_TRANSCODE_RAW){
-#ifdef CCITT_SUPPORT
- if(t2p->pdf_compression == T2P_COMPRESS_G4 ){
- TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc);
- t2p->tiff_datasize=(tmsize_t)sbc[0];
- return;
- }
-#endif
-#ifdef ZIP_SUPPORT
- if(t2p->pdf_compression == T2P_COMPRESS_ZIP){
- TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc);
- t2p->tiff_datasize=(tmsize_t)sbc[0];
- return;
- }
-#endif
-#ifdef OJPEG_SUPPORT
- if(t2p->tiff_compression == COMPRESSION_OJPEG){
- if(!TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc)){
- TIFFError(TIFF2PDF_MODULE,
- "Input file %s missing field: TIFFTAG_STRIPBYTECOUNTS",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- stripcount=TIFFNumberOfStrips(input);
- for(i=0;i<stripcount;i++){
- k = checkAdd64(k, sbc[i], t2p);
- }
- if(TIFFGetField(input, TIFFTAG_JPEGIFOFFSET, &(t2p->tiff_dataoffset))){
- if(t2p->tiff_dataoffset != 0){
- if(TIFFGetField(input, TIFFTAG_JPEGIFBYTECOUNT, &(t2p->tiff_datasize))!=0){
- if((uint64)t2p->tiff_datasize < k) {
- TIFFWarning(TIFF2PDF_MODULE,
- "Input file %s has short JPEG interchange file byte count",
- TIFFFileName(input));
- t2p->pdf_ojpegiflength=t2p->tiff_datasize;
- k = checkAdd64(k, t2p->tiff_datasize, t2p);
- k = checkAdd64(k, 6, t2p);
- k = checkAdd64(k, stripcount, t2p);
- k = checkAdd64(k, stripcount, t2p);
- t2p->tiff_datasize = (tsize_t) k;
- if ((uint64) t2p->tiff_datasize != k) {
- TIFFError(TIFF2PDF_MODULE, "Integer overflow");
- t2p->t2p_error = T2P_ERR_ERROR;
- }
- return;
- }
- return;
- }else {
- TIFFError(TIFF2PDF_MODULE,
- "Input file %s missing field: TIFFTAG_JPEGIFBYTECOUNT",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- }
- }
- k = checkAdd64(k, stripcount, t2p);
- k = checkAdd64(k, stripcount, t2p);
- k = checkAdd64(k, 2048, t2p);
- t2p->tiff_datasize = (tsize_t) k;
- if ((uint64) t2p->tiff_datasize != k) {
- TIFFError(TIFF2PDF_MODULE, "Integer overflow");
- t2p->t2p_error = T2P_ERR_ERROR;
- }
- return;
- }
-#endif
-#ifdef JPEG_SUPPORT
- if(t2p->tiff_compression == COMPRESSION_JPEG) {
- uint32 count = 0;
- if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0 ){
- if(count > 4){
- k += count;
- k -= 2; /* don't use EOI of header */
- }
- } else {
- k = 2; /* SOI for first strip */
- }
- stripcount=TIFFNumberOfStrips(input);
- if(!TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc)){
- TIFFError(TIFF2PDF_MODULE,
- "Input file %s missing field: TIFFTAG_STRIPBYTECOUNTS",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- for(i=0;i<stripcount;i++){
- k = checkAdd64(k, sbc[i], t2p);
- k -=2; /* don't use EOI of strip */
- k +=2; /* add space for restart marker */
- }
- k = checkAdd64(k, 2, t2p); /* use EOI of last strip */
- k = checkAdd64(k, 6, t2p); /* for DRI marker of first strip */
- t2p->tiff_datasize = (tsize_t) k;
- if ((uint64) t2p->tiff_datasize != k) {
- TIFFError(TIFF2PDF_MODULE, "Integer overflow");
- t2p->t2p_error = T2P_ERR_ERROR;
- }
- return;
- }
-#endif
- (void) 0;
- }
- k = checkMultiply64(TIFFScanlineSize(input), t2p->tiff_length, t2p);
- if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){
- k = checkMultiply64(k, t2p->tiff_samplesperpixel, t2p);
- }
- if (k == 0) {
- /* Assume we had overflow inside TIFFScanlineSize */
- t2p->t2p_error = T2P_ERR_ERROR;
- }
-
- t2p->tiff_datasize = (tsize_t) k;
- if ((uint64) t2p->tiff_datasize != k) {
- TIFFError(TIFF2PDF_MODULE, "Integer overflow");
- t2p->t2p_error = T2P_ERR_ERROR;
- }
-
- return;
-}
-
-/*
- This function returns the necessary size of a data buffer to contain the raw or
- uncompressed image data from the input TIFF for a tile of a page.
-*/
-
-void t2p_read_tiff_size_tile(T2P* t2p, TIFF* input, ttile_t tile){
-
- uint64* tbc = NULL;
- uint16 edge=0;
-#ifdef JPEG_SUPPORT
- unsigned char* jpt;
-#endif
- uint64 k;
-
- edge |= t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile);
- edge |= t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile);
-
- if(t2p->pdf_transcode==T2P_TRANSCODE_RAW){
- if(edge
-#if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT)
- && !(t2p->pdf_compression==T2P_COMPRESS_JPEG)
-#endif
- ){
- t2p->tiff_datasize=TIFFTileSize(input);
- if (t2p->tiff_datasize == 0) {
- /* Assume we had overflow inside TIFFTileSize */
- t2p->t2p_error = T2P_ERR_ERROR;
- }
- return;
- } else {
- TIFFGetField(input, TIFFTAG_TILEBYTECOUNTS, &tbc);
- k=tbc[tile];
-#ifdef OJPEG_SUPPORT
- if(t2p->tiff_compression==COMPRESSION_OJPEG){
- k = checkAdd64(k, 2048, t2p);
- }
-#endif
-#ifdef JPEG_SUPPORT
- if(t2p->tiff_compression==COMPRESSION_JPEG) {
- uint32 count = 0;
- if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt)!=0){
- if(count > 4){
- k = checkAdd64(k, count, t2p);
- k -= 2; /* don't use EOI of header or SOI of tile */
- }
- }
- }
-#endif
- t2p->tiff_datasize = (tsize_t) k;
- if ((uint64) t2p->tiff_datasize != k) {
- TIFFError(TIFF2PDF_MODULE, "Integer overflow");
- t2p->t2p_error = T2P_ERR_ERROR;
- }
- return;
- }
- }
- k = TIFFTileSize(input);
- if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){
- k = checkMultiply64(k, t2p->tiff_samplesperpixel, t2p);
- }
- if (k == 0) {
- /* Assume we had overflow inside TIFFTileSize */
- t2p->t2p_error = T2P_ERR_ERROR;
- }
-
- t2p->tiff_datasize = (tsize_t) k;
- if ((uint64) t2p->tiff_datasize != k) {
- TIFFError(TIFF2PDF_MODULE, "Integer overflow");
- t2p->t2p_error = T2P_ERR_ERROR;
- }
-
- return;
-}
-
-/*
- * This functions returns a non-zero value when the tile is on the right edge
- * and does not have full imaged tile width.
- */
-
-int t2p_tile_is_right_edge(T2P_TILES tiles, ttile_t tile){
-
- if( ((tile+1) % tiles.tiles_tilecountx == 0)
- && (tiles.tiles_edgetilewidth != 0) ){
- return(1);
- } else {
- return(0);
- }
-}
-
-/*
- * This functions returns a non-zero value when the tile is on the bottom edge
- * and does not have full imaged tile length.
- */
-
-int t2p_tile_is_bottom_edge(T2P_TILES tiles, ttile_t tile){
-
- if( ((tile+1) > (tiles.tiles_tilecount-tiles.tiles_tilecountx) )
- && (tiles.tiles_edgetilelength != 0) ){
- return(1);
- } else {
- return(0);
- }
-}
-
-/*
- * This function returns a non-zero value when the tile is a right edge tile
- * or a bottom edge tile.
- */
-
-int t2p_tile_is_edge(T2P_TILES tiles, ttile_t tile){
-
- return(t2p_tile_is_right_edge(tiles, tile) | t2p_tile_is_bottom_edge(tiles, tile) );
-}
-
-/*
- This function returns a non-zero value when the tile is a right edge tile and a bottom
- edge tile.
-*/
-
-int t2p_tile_is_corner_edge(T2P_TILES tiles, ttile_t tile){
-
- return(t2p_tile_is_right_edge(tiles, tile) & t2p_tile_is_bottom_edge(tiles, tile) );
-}
-
-
-/*
- This function reads the raster image data from the input TIFF for an image and writes
- the data to the output PDF XObject image dictionary stream. It returns the amount written
- or zero on error.
-*/
-
-tsize_t t2p_readwrite_pdf_image(T2P* t2p, TIFF* input, TIFF* output){
-
- tsize_t written=0;
- unsigned char* buffer=NULL;
- unsigned char* samplebuffer=NULL;
- tsize_t bufferoffset=0;
- tsize_t samplebufferoffset=0;
- tsize_t read=0;
- tstrip_t i=0;
- tstrip_t j=0;
- tstrip_t stripcount=0;
- tsize_t stripsize=0;
- tsize_t sepstripcount=0;
- tsize_t sepstripsize=0;
-#ifdef OJPEG_SUPPORT
- toff_t inputoffset=0;
- uint16 h_samp=1;
- uint16 v_samp=1;
- uint16 ri=1;
- uint32 rows=0;
-#endif
-#ifdef JPEG_SUPPORT
- unsigned char* jpt;
- float* xfloatp;
- uint64* sbc;
- unsigned char* stripbuffer;
- tsize_t striplength=0;
- uint32 max_striplength=0;
-#endif
-
- /* Fail if prior error (in particular, can't trust tiff_datasize) */
- if (t2p->t2p_error != T2P_ERR_OK)
- return(0);
-
- if(t2p->pdf_transcode == T2P_TRANSCODE_RAW){
-#ifdef CCITT_SUPPORT
- if(t2p->pdf_compression == T2P_COMPRESS_G4){
- buffer = (unsigned char*)
- _TIFFmalloc(t2p->tiff_datasize);
- if (buffer == NULL) {
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for "
- "t2p_readwrite_pdf_image, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- TIFFReadRawStrip(input, 0, (tdata_t) buffer,
- t2p->tiff_datasize);
- if (t2p->tiff_fillorder==FILLORDER_LSB2MSB){
- /*
- * make sure is lsb-to-msb
- * bit-endianness fill order
- */
- TIFFReverseBits(buffer,
- t2p->tiff_datasize);
- }
- t2pWriteFile(output, (tdata_t) buffer,
- t2p->tiff_datasize);
- _TIFFfree(buffer);
- return(t2p->tiff_datasize);
- }
-#endif
-#ifdef ZIP_SUPPORT
- if (t2p->pdf_compression == T2P_COMPRESS_ZIP) {
- buffer = (unsigned char*)
- _TIFFmalloc(t2p->tiff_datasize);
- if(buffer == NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- memset(buffer, 0, t2p->tiff_datasize);
- TIFFReadRawStrip(input, 0, (tdata_t) buffer,
- t2p->tiff_datasize);
- if (t2p->tiff_fillorder==FILLORDER_LSB2MSB) {
- TIFFReverseBits(buffer,
- t2p->tiff_datasize);
- }
- t2pWriteFile(output, (tdata_t) buffer,
- t2p->tiff_datasize);
- _TIFFfree(buffer);
- return(t2p->tiff_datasize);
- }
-#endif
-#ifdef OJPEG_SUPPORT
- if(t2p->tiff_compression == COMPRESSION_OJPEG) {
-
- if(t2p->tiff_dataoffset != 0) {
- buffer = (unsigned char*)
- _TIFFmalloc(t2p->tiff_datasize);
- if(buffer == NULL) {
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- memset(buffer, 0, t2p->tiff_datasize);
- if(t2p->pdf_ojpegiflength==0){
- inputoffset=t2pSeekFile(input, 0,
- SEEK_CUR);
- t2pSeekFile(input,
- t2p->tiff_dataoffset,
- SEEK_SET);
- t2pReadFile(input, (tdata_t) buffer,
- t2p->tiff_datasize);
- t2pSeekFile(input, inputoffset,
- SEEK_SET);
- t2pWriteFile(output, (tdata_t) buffer,
- t2p->tiff_datasize);
- _TIFFfree(buffer);
- return(t2p->tiff_datasize);
- } else {
- inputoffset=t2pSeekFile(input, 0,
- SEEK_CUR);
- t2pSeekFile(input,
- t2p->tiff_dataoffset,
- SEEK_SET);
- bufferoffset = t2pReadFile(input,
- (tdata_t) buffer,
- t2p->pdf_ojpegiflength);
- t2p->pdf_ojpegiflength = 0;
- t2pSeekFile(input, inputoffset,
- SEEK_SET);
- TIFFGetField(input,
- TIFFTAG_YCBCRSUBSAMPLING,
- &h_samp, &v_samp);
- buffer[bufferoffset++]= 0xff;
- buffer[bufferoffset++]= 0xdd;
- buffer[bufferoffset++]= 0x00;
- buffer[bufferoffset++]= 0x04;
- h_samp*=8;
- v_samp*=8;
- ri=(t2p->tiff_width+h_samp-1) / h_samp;
- TIFFGetField(input,
- TIFFTAG_ROWSPERSTRIP,
- &rows);
- ri*=(rows+v_samp-1)/v_samp;
- buffer[bufferoffset++]= (ri>>8) & 0xff;
- buffer[bufferoffset++]= ri & 0xff;
- stripcount=TIFFNumberOfStrips(input);
- for(i=0;i<stripcount;i++){
- if(i != 0 ){
- buffer[bufferoffset++]=0xff;
- buffer[bufferoffset++]=(0xd0 | ((i-1)%8));
- }
- bufferoffset+=TIFFReadRawStrip(input,
- i,
- (tdata_t) &(((unsigned char*)buffer)[bufferoffset]),
- -1);
- }
- t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
- _TIFFfree(buffer);
- return(bufferoffset);
- }
- } else {
- if(! t2p->pdf_ojpegdata){
- TIFFError(TIFF2PDF_MODULE,
- "No support for OJPEG image %s with bad tables",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- buffer = (unsigned char*)
- _TIFFmalloc(t2p->tiff_datasize);
- if(buffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- memset(buffer, 0, t2p->tiff_datasize);
- _TIFFmemcpy(buffer, t2p->pdf_ojpegdata, t2p->pdf_ojpegdatalength);
- bufferoffset=t2p->pdf_ojpegdatalength;
- stripcount=TIFFNumberOfStrips(input);
- for(i=0;i<stripcount;i++){
- if(i != 0){
- buffer[bufferoffset++]=0xff;
- buffer[bufferoffset++]=(0xd0 | ((i-1)%8));
- }
- bufferoffset+=TIFFReadRawStrip(input,
- i,
- (tdata_t) &(((unsigned char*)buffer)[bufferoffset]),
- -1);
- }
- if( ! ( (buffer[bufferoffset-1]==0xd9) && (buffer[bufferoffset-2]==0xff) ) ){
- buffer[bufferoffset++]=0xff;
- buffer[bufferoffset++]=0xd9;
- }
- t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
- _TIFFfree(buffer);
- return(bufferoffset);
- TIFFError(TIFF2PDF_MODULE,
- "No support for OJPEG image %s with no JPEG File Interchange offset",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- return(t2p->tiff_datasize);
- }
-#endif
-#ifdef JPEG_SUPPORT
- if(t2p->tiff_compression == COMPRESSION_JPEG) {
- uint32 count = 0;
- buffer = (unsigned char*)
- _TIFFmalloc(t2p->tiff_datasize);
- if(buffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- memset(buffer, 0, t2p->tiff_datasize);
- if (TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0) {
- if(count > 4) {
- _TIFFmemcpy(buffer, jpt, count);
- bufferoffset += count - 2;
- }
- }
- stripcount=TIFFNumberOfStrips(input);
- TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc);
- for(i=0;i<stripcount;i++){
- if(sbc[i]>max_striplength) max_striplength=sbc[i];
- }
- stripbuffer = (unsigned char*)
- _TIFFmalloc(max_striplength);
- if(stripbuffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %u bytes of memory for t2p_readwrite_pdf_image, %s",
- max_striplength,
- TIFFFileName(input));
- _TIFFfree(buffer);
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- for(i=0;i<stripcount;i++){
- striplength=TIFFReadRawStrip(input, i, (tdata_t) stripbuffer, -1);
- if(!t2p_process_jpeg_strip(
- stripbuffer,
- &striplength,
- buffer,
- &bufferoffset,
- i,
- t2p->tiff_length)){
- TIFFError(TIFF2PDF_MODULE,
- "Can't process JPEG data in input file %s",
- TIFFFileName(input));
- _TIFFfree(samplebuffer);
- _TIFFfree(buffer);
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- }
- buffer[bufferoffset++]=0xff;
- buffer[bufferoffset++]=0xd9;
- t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
- _TIFFfree(stripbuffer);
- _TIFFfree(buffer);
- return(bufferoffset);
- }
-#endif
- (void)0;
- }
-
- if(t2p->pdf_sample==T2P_SAMPLE_NOTHING){
- buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
- if(buffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- memset(buffer, 0, t2p->tiff_datasize);
- stripsize=TIFFStripSize(input);
- stripcount=TIFFNumberOfStrips(input);
- for(i=0;i<stripcount;i++){
- read =
- TIFFReadEncodedStrip(input,
- i,
- (tdata_t) &buffer[bufferoffset],
- TIFFmin(stripsize, t2p->tiff_datasize - bufferoffset));
- if(read==-1){
- TIFFError(TIFF2PDF_MODULE,
- "Error on decoding strip %u of %s",
- i,
- TIFFFileName(input));
- _TIFFfree(buffer);
- t2p->t2p_error=T2P_ERR_ERROR;
- return(0);
- }
- bufferoffset+=read;
- }
- } else {
- if(t2p->pdf_sample & T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG){
-
- sepstripsize=TIFFStripSize(input);
- sepstripcount=TIFFNumberOfStrips(input);
-
- stripsize=sepstripsize*t2p->tiff_samplesperpixel;
- stripcount=sepstripcount/t2p->tiff_samplesperpixel;
-
- buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
- if(buffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- memset(buffer, 0, t2p->tiff_datasize);
- samplebuffer = (unsigned char*) _TIFFmalloc(stripsize);
- if(samplebuffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- for(i=0;i<stripcount;i++){
- samplebufferoffset=0;
- for(j=0;j<t2p->tiff_samplesperpixel;j++){
- read =
- TIFFReadEncodedStrip(input,
- i + j*stripcount,
- (tdata_t) &(samplebuffer[samplebufferoffset]),
- TIFFmin(sepstripsize, stripsize - samplebufferoffset));
- if(read==-1){
- TIFFError(TIFF2PDF_MODULE,
- "Error on decoding strip %u of %s",
- i + j*stripcount,
- TIFFFileName(input));
- _TIFFfree(buffer);
- t2p->t2p_error=T2P_ERR_ERROR;
- return(0);
- }
- samplebufferoffset+=read;
- }
- t2p_sample_planar_separate_to_contig(
- t2p,
- &(buffer[bufferoffset]),
- samplebuffer,
- samplebufferoffset);
- bufferoffset+=samplebufferoffset;
- }
- _TIFFfree(samplebuffer);
- goto dataready;
- }
-
- buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
- if(buffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- memset(buffer, 0, t2p->tiff_datasize);
- stripsize=TIFFStripSize(input);
- stripcount=TIFFNumberOfStrips(input);
- for(i=0;i<stripcount;i++){
- read =
- TIFFReadEncodedStrip(input,
- i,
- (tdata_t) &buffer[bufferoffset],
- TIFFmin(stripsize, t2p->tiff_datasize - bufferoffset));
- if(read==-1){
- TIFFError(TIFF2PDF_MODULE,
- "Error on decoding strip %u of %s",
- i,
- TIFFFileName(input));
- _TIFFfree(samplebuffer);
- _TIFFfree(buffer);
- t2p->t2p_error=T2P_ERR_ERROR;
- return(0);
- }
- bufferoffset+=read;
- }
-
- if(t2p->pdf_sample & T2P_SAMPLE_REALIZE_PALETTE){
- // FIXME: overflow?
- samplebuffer=(unsigned char*)_TIFFrealloc(
- (tdata_t) buffer,
- t2p->tiff_datasize * t2p->tiff_samplesperpixel);
- if(samplebuffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- _TIFFfree(buffer);
- return(0);
- } else {
- buffer=samplebuffer;
- t2p->tiff_datasize *= t2p->tiff_samplesperpixel;
- }
- t2p_sample_realize_palette(t2p, buffer);
- }
-
- if(t2p->pdf_sample & T2P_SAMPLE_RGBA_TO_RGB){
- t2p->tiff_datasize=t2p_sample_rgba_to_rgb(
- (tdata_t)buffer,
- t2p->tiff_width*t2p->tiff_length);
- }
-
- if(t2p->pdf_sample & T2P_SAMPLE_RGBAA_TO_RGB){
- t2p->tiff_datasize=t2p_sample_rgbaa_to_rgb(
- (tdata_t)buffer,
- t2p->tiff_width*t2p->tiff_length);
- }
-
- if(t2p->pdf_sample & T2P_SAMPLE_YCBCR_TO_RGB){
- samplebuffer=(unsigned char*)_TIFFrealloc(
- (tdata_t)buffer,
- t2p->tiff_width*t2p->tiff_length*4);
- if(samplebuffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- _TIFFfree(buffer);
- return(0);
- } else {
- buffer=samplebuffer;
- }
- if(!TIFFReadRGBAImageOriented(
- input,
- t2p->tiff_width,
- t2p->tiff_length,
- (uint32*)buffer,
- ORIENTATION_TOPLEFT,
- 0)){
- TIFFError(TIFF2PDF_MODULE,
- "Can't use TIFFReadRGBAImageOriented to extract RGB image from %s",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- t2p->tiff_datasize=t2p_sample_abgr_to_rgb(
- (tdata_t) buffer,
- t2p->tiff_width*t2p->tiff_length);
-
- }
-
- if(t2p->pdf_sample & T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED){
- t2p->tiff_datasize=t2p_sample_lab_signed_to_unsigned(
- (tdata_t)buffer,
- t2p->tiff_width*t2p->tiff_length);
- }
- }
-
-dataready:
-
- t2p_disable(output);
- TIFFSetField(output, TIFFTAG_PHOTOMETRIC, t2p->tiff_photometric);
- TIFFSetField(output, TIFFTAG_BITSPERSAMPLE, t2p->tiff_bitspersample);
- TIFFSetField(output, TIFFTAG_SAMPLESPERPIXEL, t2p->tiff_samplesperpixel);
- TIFFSetField(output, TIFFTAG_IMAGEWIDTH, t2p->tiff_width);
- TIFFSetField(output, TIFFTAG_IMAGELENGTH, t2p->tiff_length);
- TIFFSetField(output, TIFFTAG_ROWSPERSTRIP, t2p->tiff_length);
- TIFFSetField(output, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- TIFFSetField(output, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
-
- switch(t2p->pdf_compression){
- case T2P_COMPRESS_NONE:
- TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
- break;
-#ifdef CCITT_SUPPORT
- case T2P_COMPRESS_G4:
- TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4);
- break;
-#endif
-#ifdef JPEG_SUPPORT
- case T2P_COMPRESS_JPEG:
- if(t2p->tiff_photometric==PHOTOMETRIC_YCBCR) {
- uint16 hor = 0, ver = 0;
- if (TIFFGetField(input, TIFFTAG_YCBCRSUBSAMPLING, &hor, &ver) !=0 ) {
- if(hor != 0 && ver != 0){
- TIFFSetField(output, TIFFTAG_YCBCRSUBSAMPLING, hor, ver);
- }
- }
- if(TIFFGetField(input, TIFFTAG_REFERENCEBLACKWHITE, &xfloatp)!=0){
- TIFFSetField(output, TIFFTAG_REFERENCEBLACKWHITE, xfloatp);
- }
- }
- if(TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_JPEG)==0){
- TIFFError(TIFF2PDF_MODULE,
- "Unable to use JPEG compression for input %s and output %s",
- TIFFFileName(input),
- TIFFFileName(output));
- _TIFFfree(buffer);
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- TIFFSetField(output, TIFFTAG_JPEGTABLESMODE, 0);
-
- if(t2p->pdf_colorspace & (T2P_CS_RGB | T2P_CS_LAB)){
- TIFFSetField(output, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR);
- if(t2p->tiff_photometric != PHOTOMETRIC_YCBCR){
- TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
- } else {
- TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RAW);
- }
- }
- if(t2p->pdf_colorspace & T2P_CS_GRAY){
- (void)0;
- }
- if(t2p->pdf_colorspace & T2P_CS_CMYK){
- (void)0;
- }
- if(t2p->pdf_defaultcompressionquality != 0){
- TIFFSetField(output,
- TIFFTAG_JPEGQUALITY,
- t2p->pdf_defaultcompressionquality);
- }
-
- break;
-#endif
-#ifdef ZIP_SUPPORT
- case T2P_COMPRESS_ZIP:
- TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE);
- if(t2p->pdf_defaultcompressionquality%100 != 0){
- TIFFSetField(output,
- TIFFTAG_PREDICTOR,
- t2p->pdf_defaultcompressionquality % 100);
- }
- if(t2p->pdf_defaultcompressionquality/100 != 0){
- TIFFSetField(output,
- TIFFTAG_ZIPQUALITY,
- (t2p->pdf_defaultcompressionquality / 100));
- }
- break;
-#endif
- default:
- break;
- }
-
- t2p_enable(output);
- t2p->outputwritten = 0;
-#ifdef JPEG_SUPPORT
- if(t2p->pdf_compression == T2P_COMPRESS_JPEG
- && t2p->tiff_photometric == PHOTOMETRIC_YCBCR){
- bufferoffset = TIFFWriteEncodedStrip(output, (tstrip_t)0,
- buffer,
- stripsize * stripcount);
- } else
-#endif
- {
- bufferoffset = TIFFWriteEncodedStrip(output, (tstrip_t)0,
- buffer,
- t2p->tiff_datasize);
- }
- if (buffer != NULL) {
- _TIFFfree(buffer);
- buffer=NULL;
- }
-
- if (bufferoffset == (tsize_t)-1) {
- TIFFError(TIFF2PDF_MODULE,
- "Error writing encoded strip to output PDF %s",
- TIFFFileName(output));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
-
- written = t2p->outputwritten;
- return(written);
-}
-
-/*
- * This function reads the raster image data from the input TIFF for an image
- * tile and writes the data to the output PDF XObject image dictionary stream
- * for the tile. It returns the amount written or zero on error.
- */
-
-tsize_t t2p_readwrite_pdf_image_tile(T2P* t2p, TIFF* input, TIFF* output, ttile_t tile){
-
- uint16 edge=0;
- tsize_t written=0;
- unsigned char* buffer=NULL;
- tsize_t bufferoffset=0;
- unsigned char* samplebuffer=NULL;
- tsize_t samplebufferoffset=0;
- tsize_t read=0;
- uint16 i=0;
- ttile_t tilecount=0;
- /* tsize_t tilesize=0; */
- ttile_t septilecount=0;
- tsize_t septilesize=0;
-#ifdef JPEG_SUPPORT
- unsigned char* jpt;
- float* xfloatp;
- uint32 xuint32=0;
-#endif
-
- /* Fail if prior error (in particular, can't trust tiff_datasize) */
- if (t2p->t2p_error != T2P_ERR_OK)
- return(0);
-
- edge |= t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile);
- edge |= t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile);
-
- if( (t2p->pdf_transcode == T2P_TRANSCODE_RAW) && ((edge == 0)
-#if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT)
- || (t2p->pdf_compression == T2P_COMPRESS_JPEG)
-#endif
- )
- ){
-#ifdef CCITT_SUPPORT
- if(t2p->pdf_compression == T2P_COMPRESS_G4){
- buffer= (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
- if(buffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory "
- "for t2p_readwrite_pdf_image_tile, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- TIFFReadRawTile(input, tile, (tdata_t) buffer, t2p->tiff_datasize);
- if (t2p->tiff_fillorder==FILLORDER_LSB2MSB){
- TIFFReverseBits(buffer, t2p->tiff_datasize);
- }
- t2pWriteFile(output, (tdata_t) buffer, t2p->tiff_datasize);
- _TIFFfree(buffer);
- return(t2p->tiff_datasize);
- }
-#endif
-#ifdef ZIP_SUPPORT
- if(t2p->pdf_compression == T2P_COMPRESS_ZIP){
- buffer= (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
- if(buffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory "
- "for t2p_readwrite_pdf_image_tile, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- TIFFReadRawTile(input, tile, (tdata_t) buffer, t2p->tiff_datasize);
- if (t2p->tiff_fillorder==FILLORDER_LSB2MSB){
- TIFFReverseBits(buffer, t2p->tiff_datasize);
- }
- t2pWriteFile(output, (tdata_t) buffer, t2p->tiff_datasize);
- _TIFFfree(buffer);
- return(t2p->tiff_datasize);
- }
-#endif
-#ifdef OJPEG_SUPPORT
- if(t2p->tiff_compression == COMPRESSION_OJPEG){
- if(! t2p->pdf_ojpegdata){
- TIFFError(TIFF2PDF_MODULE,
- "No support for OJPEG image %s with "
- "bad tables",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- buffer=(unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
- if(buffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory "
- "for t2p_readwrite_pdf_image, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- _TIFFmemcpy(buffer, t2p->pdf_ojpegdata, t2p->pdf_ojpegdatalength);
- if(edge!=0){
- if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile)){
- buffer[7]=
- (t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength >> 8) & 0xff;
- buffer[8]=
- (t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength ) & 0xff;
- }
- if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile)){
- buffer[9]=
- (t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth >> 8) & 0xff;
- buffer[10]=
- (t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth ) & 0xff;
- }
- }
- bufferoffset=t2p->pdf_ojpegdatalength;
- bufferoffset+=TIFFReadRawTile(input,
- tile,
- (tdata_t) &(((unsigned char*)buffer)[bufferoffset]),
- -1);
- ((unsigned char*)buffer)[bufferoffset++]=0xff;
- ((unsigned char*)buffer)[bufferoffset++]=0xd9;
- t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
- _TIFFfree(buffer);
- return(bufferoffset);
- }
-#endif
-#ifdef JPEG_SUPPORT
- if(t2p->tiff_compression == COMPRESSION_JPEG){
- unsigned char table_end[2];
- uint32 count = 0;
- buffer= (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
- if(buffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory "
- "for t2p_readwrite_pdf_image_tile, %s",
- t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0) {
- if (count > 0) {
- _TIFFmemcpy(buffer, jpt, count);
- bufferoffset += count - 2;
- table_end[0] = buffer[bufferoffset-2];
- table_end[1] = buffer[bufferoffset-1];
- }
- if (count > 0) {
- xuint32 = bufferoffset;
- bufferoffset += TIFFReadRawTile(
- input,
- tile,
- (tdata_t) &(((unsigned char*)buffer)[bufferoffset-2]),
- -1);
- buffer[xuint32-2]=table_end[0];
- buffer[xuint32-1]=table_end[1];
- } else {
- bufferoffset += TIFFReadRawTile(
- input,
- tile,
- (tdata_t) &(((unsigned char*)buffer)[bufferoffset]),
- -1);
- }
- }
- t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
- _TIFFfree(buffer);
- return(bufferoffset);
- }
-#endif
- (void)0;
- }
-
- if(t2p->pdf_sample==T2P_SAMPLE_NOTHING){
- buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
- if(buffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory for "
- "t2p_readwrite_pdf_image_tile, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
-
- read = TIFFReadEncodedTile(
- input,
- tile,
- (tdata_t) &buffer[bufferoffset],
- t2p->tiff_datasize);
- if(read==-1){
- TIFFError(TIFF2PDF_MODULE,
- "Error on decoding tile %u of %s",
- tile,
- TIFFFileName(input));
- _TIFFfree(buffer);
- t2p->t2p_error=T2P_ERR_ERROR;
- return(0);
- }
-
- } else {
-
- if(t2p->pdf_sample == T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG){
- septilesize=TIFFTileSize(input);
- septilecount=TIFFNumberOfTiles(input);
- /* tilesize=septilesize*t2p->tiff_samplesperpixel; */
- tilecount=septilecount/t2p->tiff_samplesperpixel;
- buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
- if(buffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory "
- "for t2p_readwrite_pdf_image_tile, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- samplebuffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
- if(samplebuffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory "
- "for t2p_readwrite_pdf_image_tile, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- samplebufferoffset=0;
- for(i=0;i<t2p->tiff_samplesperpixel;i++){
- read =
- TIFFReadEncodedTile(input,
- tile + i*tilecount,
- (tdata_t) &(samplebuffer[samplebufferoffset]),
- septilesize);
- if(read==-1){
- TIFFError(TIFF2PDF_MODULE,
- "Error on decoding tile %u of %s",
- tile + i*tilecount,
- TIFFFileName(input));
- _TIFFfree(samplebuffer);
- _TIFFfree(buffer);
- t2p->t2p_error=T2P_ERR_ERROR;
- return(0);
- }
- samplebufferoffset+=read;
- }
- t2p_sample_planar_separate_to_contig(
- t2p,
- &(buffer[bufferoffset]),
- samplebuffer,
- samplebufferoffset);
- bufferoffset+=samplebufferoffset;
- _TIFFfree(samplebuffer);
- }
-
- if(buffer==NULL){
- buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
- if(buffer==NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %lu bytes of memory "
- "for t2p_readwrite_pdf_image_tile, %s",
- (unsigned long) t2p->tiff_datasize,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- read = TIFFReadEncodedTile(
- input,
- tile,
- (tdata_t) &buffer[bufferoffset],
- t2p->tiff_datasize);
- if(read==-1){
- TIFFError(TIFF2PDF_MODULE,
- "Error on decoding tile %u of %s",
- tile,
- TIFFFileName(input));
- _TIFFfree(buffer);
- t2p->t2p_error=T2P_ERR_ERROR;
- return(0);
- }
- }
-
- if(t2p->pdf_sample & T2P_SAMPLE_RGBA_TO_RGB){
- t2p->tiff_datasize=t2p_sample_rgba_to_rgb(
- (tdata_t)buffer,
- t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth
- *t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
- }
-
- if(t2p->pdf_sample & T2P_SAMPLE_RGBAA_TO_RGB){
- t2p->tiff_datasize=t2p_sample_rgbaa_to_rgb(
- (tdata_t)buffer,
- t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth
- *t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
- }
-
- if(t2p->pdf_sample & T2P_SAMPLE_YCBCR_TO_RGB){
- TIFFError(TIFF2PDF_MODULE,
- "No support for YCbCr to RGB in tile for %s",
- TIFFFileName(input));
- _TIFFfree(buffer);
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
-
- if(t2p->pdf_sample & T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED){
- t2p->tiff_datasize=t2p_sample_lab_signed_to_unsigned(
- (tdata_t)buffer,
- t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth
- *t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
- }
- }
-
- if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile) != 0){
- t2p_tile_collapse_left(
- buffer,
- TIFFTileRowSize(input),
- t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth,
- t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth,
- t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
- }
-
-
- t2p_disable(output);
- TIFFSetField(output, TIFFTAG_PHOTOMETRIC, t2p->tiff_photometric);
- TIFFSetField(output, TIFFTAG_BITSPERSAMPLE, t2p->tiff_bitspersample);
- TIFFSetField(output, TIFFTAG_SAMPLESPERPIXEL, t2p->tiff_samplesperpixel);
- if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile) == 0){
- TIFFSetField(
- output,
- TIFFTAG_IMAGEWIDTH,
- t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth);
- } else {
- TIFFSetField(
- output,
- TIFFTAG_IMAGEWIDTH,
- t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth);
- }
- if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile) == 0){
- TIFFSetField(
- output,
- TIFFTAG_IMAGELENGTH,
- t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
- TIFFSetField(
- output,
- TIFFTAG_ROWSPERSTRIP,
- t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
- } else {
- TIFFSetField(
- output,
- TIFFTAG_IMAGELENGTH,
- t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
- TIFFSetField(
- output,
- TIFFTAG_ROWSPERSTRIP,
- t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
- }
- TIFFSetField(output, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- TIFFSetField(output, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
-
- switch(t2p->pdf_compression){
- case T2P_COMPRESS_NONE:
- TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
- break;
-#ifdef CCITT_SUPPORT
- case T2P_COMPRESS_G4:
- TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4);
- break;
-#endif
-#ifdef JPEG_SUPPORT
- case T2P_COMPRESS_JPEG:
- if (t2p->tiff_photometric==PHOTOMETRIC_YCBCR) {
- uint16 hor = 0, ver = 0;
- if (TIFFGetField(input, TIFFTAG_YCBCRSUBSAMPLING, &hor, &ver)!=0) {
- if (hor != 0 && ver != 0) {
- TIFFSetField(output, TIFFTAG_YCBCRSUBSAMPLING, hor, ver);
- }
- }
- if(TIFFGetField(input, TIFFTAG_REFERENCEBLACKWHITE, &xfloatp)!=0){
- TIFFSetField(output, TIFFTAG_REFERENCEBLACKWHITE, xfloatp);
- }
- }
- TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_JPEG);
- TIFFSetField(output, TIFFTAG_JPEGTABLESMODE, 0); /* JPEGTABLESMODE_NONE */
- if(t2p->pdf_colorspace & (T2P_CS_RGB | T2P_CS_LAB)){
- TIFFSetField(output, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR);
- if(t2p->tiff_photometric != PHOTOMETRIC_YCBCR){
- TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
- } else {
- TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RAW);
- }
- }
- if(t2p->pdf_colorspace & T2P_CS_GRAY){
- (void)0;
- }
- if(t2p->pdf_colorspace & T2P_CS_CMYK){
- (void)0;
- }
- if(t2p->pdf_defaultcompressionquality != 0){
- TIFFSetField(output,
- TIFFTAG_JPEGQUALITY,
- t2p->pdf_defaultcompressionquality);
- }
- break;
-#endif
-#ifdef ZIP_SUPPORT
- case T2P_COMPRESS_ZIP:
- TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE);
- if(t2p->pdf_defaultcompressionquality%100 != 0){
- TIFFSetField(output,
- TIFFTAG_PREDICTOR,
- t2p->pdf_defaultcompressionquality % 100);
- }
- if(t2p->pdf_defaultcompressionquality/100 != 0){
- TIFFSetField(output,
- TIFFTAG_ZIPQUALITY,
- (t2p->pdf_defaultcompressionquality / 100));
- }
- break;
-#endif
- default:
- break;
- }
-
- t2p_enable(output);
- t2p->outputwritten = 0;
- bufferoffset = TIFFWriteEncodedStrip(output, (tstrip_t) 0, buffer,
- TIFFStripSize(output));
- if (buffer != NULL) {
- _TIFFfree(buffer);
- buffer = NULL;
- }
- if (bufferoffset == -1) {
- TIFFError(TIFF2PDF_MODULE,
- "Error writing encoded tile to output PDF %s",
- TIFFFileName(output));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
-
- written = t2p->outputwritten;
-
- return(written);
-}
-
-#ifdef OJPEG_SUPPORT
-int t2p_process_ojpeg_tables(T2P* t2p, TIFF* input){
- uint16 proc=0;
- void* q;
- uint32 q_length=0;
- void* dc;
- uint32 dc_length=0;
- void* ac;
- uint32 ac_length=0;
- uint16* lp;
- uint16* pt;
- uint16 h_samp=1;
- uint16 v_samp=1;
- unsigned char* ojpegdata;
- uint16 table_count;
- uint32 offset_table;
- uint32 offset_ms_l;
- uint32 code_count;
- uint32 i=0;
- uint32 dest=0;
- uint16 ri=0;
- uint32 rows=0;
-
- if(!TIFFGetField(input, TIFFTAG_JPEGPROC, &proc)){
- TIFFError(TIFF2PDF_MODULE,
- "Missing JPEGProc field in OJPEG image %s",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- if(proc!=JPEGPROC_BASELINE && proc!=JPEGPROC_LOSSLESS){
- TIFFError(TIFF2PDF_MODULE,
- "Bad JPEGProc field in OJPEG image %s",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- if(!TIFFGetField(input, TIFFTAG_JPEGQTABLES, &q_length, &q)){
- TIFFError(TIFF2PDF_MODULE,
- "Missing JPEGQTables field in OJPEG image %s",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- if(q_length < (64U * t2p->tiff_samplesperpixel)){
- TIFFError(TIFF2PDF_MODULE,
- "Bad JPEGQTables field in OJPEG image %s",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- if(!TIFFGetField(input, TIFFTAG_JPEGDCTABLES, &dc_length, &dc)){
- TIFFError(TIFF2PDF_MODULE,
- "Missing JPEGDCTables field in OJPEG image %s",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- if(proc==JPEGPROC_BASELINE){
- if(!TIFFGetField(input, TIFFTAG_JPEGACTABLES, &ac_length, &ac)){
- TIFFError(TIFF2PDF_MODULE,
- "Missing JPEGACTables field in OJPEG image %s",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- } else {
- if(!TIFFGetField(input, TIFFTAG_JPEGLOSSLESSPREDICTORS, &lp)){
- TIFFError(TIFF2PDF_MODULE,
- "Missing JPEGLosslessPredictors field in OJPEG image %s",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- if(!TIFFGetField(input, TIFFTAG_JPEGPOINTTRANSFORM, &pt)){
- TIFFError(TIFF2PDF_MODULE,
- "Missing JPEGPointTransform field in OJPEG image %s",
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- }
- if(!TIFFGetField(input, TIFFTAG_YCBCRSUBSAMPLING, &h_samp, &v_samp)){
- h_samp=1;
- v_samp=1;
- }
- if(t2p->pdf_ojpegdata != NULL){
- _TIFFfree(t2p->pdf_ojpegdata);
- t2p->pdf_ojpegdata=NULL;
- }
- t2p->pdf_ojpegdata = _TIFFmalloc(2048);
- if(t2p->pdf_ojpegdata == NULL){
- TIFFError(TIFF2PDF_MODULE,
- "Can't allocate %u bytes of memory for t2p_process_ojpeg_tables, %s",
- 2048,
- TIFFFileName(input));
- t2p->t2p_error = T2P_ERR_ERROR;
- return(0);
- }
- _TIFFmemset(t2p->pdf_ojpegdata, 0x00, 2048);
- t2p->pdf_ojpegdatalength = 0;
- table_count=t2p->tiff_samplesperpixel;
- if(proc==JPEGPROC_BASELINE){
- if(table_count>2) table_count=2;
- }
- ojpegdata=(unsigned char*)t2p->pdf_ojpegdata;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xd8;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
- if(proc==JPEGPROC_BASELINE){
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xc0;
- } else {
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xc3;
- }
- ojpegdata[t2p->pdf_ojpegdatalength++]=0x00;
- ojpegdata[t2p->pdf_ojpegdatalength++]=(8 + 3*t2p->tiff_samplesperpixel);
- ojpegdata[t2p->pdf_ojpegdatalength++]=(t2p->tiff_bitspersample & 0xff);
- if(TIFFIsTiled(input)){
- ojpegdata[t2p->pdf_ojpegdatalength++]=
- (t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength >> 8) & 0xff;
- ojpegdata[t2p->pdf_ojpegdatalength++]=
- (t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength ) & 0xff;
- ojpegdata[t2p->pdf_ojpegdatalength++]=
- (t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth >> 8) & 0xff;
- ojpegdata[t2p->pdf_ojpegdatalength++]=
- (t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth ) & 0xff;
- } else {
- ojpegdata[t2p->pdf_ojpegdatalength++]=
- (t2p->tiff_length >> 8) & 0xff;
- ojpegdata[t2p->pdf_ojpegdatalength++]=
- (t2p->tiff_length ) & 0xff;
- ojpegdata[t2p->pdf_ojpegdatalength++]=
- (t2p->tiff_width >> 8) & 0xff;
- ojpegdata[t2p->pdf_ojpegdatalength++]=
- (t2p->tiff_width ) & 0xff;
- }
- ojpegdata[t2p->pdf_ojpegdatalength++]=(t2p->tiff_samplesperpixel & 0xff);
- for(i=0;i<t2p->tiff_samplesperpixel;i++){
- ojpegdata[t2p->pdf_ojpegdatalength++]=i;
- if(i==0){
- ojpegdata[t2p->pdf_ojpegdatalength] |= h_samp<<4 & 0xf0;;
- ojpegdata[t2p->pdf_ojpegdatalength++] |= v_samp & 0x0f;
- } else {
- ojpegdata[t2p->pdf_ojpegdatalength++]= 0x11;
- }
- ojpegdata[t2p->pdf_ojpegdatalength++]=i;
- }
- for(dest=0;dest<t2p->tiff_samplesperpixel;dest++){
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xdb;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0x00;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0x43;
- ojpegdata[t2p->pdf_ojpegdatalength++]=dest;
- _TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength++]),
- &(((unsigned char*)q)[64*dest]), 64);
- t2p->pdf_ojpegdatalength+=64;
- }
- offset_table=0;
- for(dest=0;dest<table_count;dest++){
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xc4;
- offset_ms_l=t2p->pdf_ojpegdatalength;
- t2p->pdf_ojpegdatalength+=2;
- ojpegdata[t2p->pdf_ojpegdatalength++]=dest & 0x0f;
- _TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]),
- &(((unsigned char*)dc)[offset_table]), 16);
- code_count=0;
- offset_table+=16;
- for(i=0;i<16;i++){
- code_count+=ojpegdata[t2p->pdf_ojpegdatalength++];
- }
- ojpegdata[offset_ms_l]=((19+code_count)>>8) & 0xff;
- ojpegdata[offset_ms_l+1]=(19+code_count) & 0xff;
- _TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]),
- &(((unsigned char*)dc)[offset_table]), code_count);
- offset_table+=code_count;
- t2p->pdf_ojpegdatalength+=code_count;
- }
- if(proc==JPEGPROC_BASELINE){
- offset_table=0;
- for(dest=0;dest<table_count;dest++){
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xc4;
- offset_ms_l=t2p->pdf_ojpegdatalength;
- t2p->pdf_ojpegdatalength+=2;
- ojpegdata[t2p->pdf_ojpegdatalength] |= 0x10;
- ojpegdata[t2p->pdf_ojpegdatalength++] |=dest & 0x0f;
- _TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]),
- &(((unsigned char*)ac)[offset_table]), 16);
- code_count=0;
- offset_table+=16;
- for(i=0;i<16;i++){
- code_count+=ojpegdata[t2p->pdf_ojpegdatalength++];
- }
- ojpegdata[offset_ms_l]=((19+code_count)>>8) & 0xff;
- ojpegdata[offset_ms_l+1]=(19+code_count) & 0xff;
- _TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]),
- &(((unsigned char*)ac)[offset_table]), code_count);
- offset_table+=code_count;
- t2p->pdf_ojpegdatalength+=code_count;
- }
- }
- if(TIFFNumberOfStrips(input)>1){
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xdd;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0x00;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0x04;
- h_samp*=8;
- v_samp*=8;
- ri=(t2p->tiff_width+h_samp-1) / h_samp;
- TIFFGetField(input, TIFFTAG_ROWSPERSTRIP, &rows);
- ri*=(rows+v_samp-1)/v_samp;
- ojpegdata[t2p->pdf_ojpegdatalength++]= (ri>>8) & 0xff;
- ojpegdata[t2p->pdf_ojpegdatalength++]= ri & 0xff;
- }
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0xda;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0x00;
- ojpegdata[t2p->pdf_ojpegdatalength++]=(6 + 2*t2p->tiff_samplesperpixel);
- ojpegdata[t2p->pdf_ojpegdatalength++]=t2p->tiff_samplesperpixel & 0xff;
- for(i=0;i<t2p->tiff_samplesperpixel;i++){
- ojpegdata[t2p->pdf_ojpegdatalength++]= i & 0xff;
- if(proc==JPEGPROC_BASELINE){
- ojpegdata[t2p->pdf_ojpegdatalength] |=
- ( ( (i>(table_count-1U)) ? (table_count-1U) : i) << 4U) & 0xf0;
- ojpegdata[t2p->pdf_ojpegdatalength++] |=
- ( (i>(table_count-1U)) ? (table_count-1U) : i) & 0x0f;
- } else {
- ojpegdata[t2p->pdf_ojpegdatalength++] = (i << 4) & 0xf0;
- }
- }
- if(proc==JPEGPROC_BASELINE){
- t2p->pdf_ojpegdatalength++;
- ojpegdata[t2p->pdf_ojpegdatalength++]=0x3f;
- t2p->pdf_ojpegdatalength++;
- } else {
- ojpegdata[t2p->pdf_ojpegdatalength++]= (lp[0] & 0xff);
- t2p->pdf_ojpegdatalength++;
- ojpegdata[t2p->pdf_ojpegdatalength++]= (pt[0] & 0x0f);
- }
-
- return(1);
-}
-#endif
-
-#ifdef JPEG_SUPPORT
-int t2p_process_jpeg_strip(
- unsigned char* strip,
- tsize_t* striplength,
- unsigned char* buffer,
- tsize_t* bufferoffset,
- tstrip_t no,
- uint32 height){
-
- tsize_t i=0;
-
- while (i < *striplength) {
- tsize_t datalen;
- uint16 ri;
- uint16 v_samp;
- uint16 h_samp;
- int j;
- int ncomp;
-
- /* marker header: one or more FFs */
- if (strip[i] != 0xff)
- return(0);
- i++;
- while (i < *striplength && strip[i] == 0xff)
- i++;
- if (i >= *striplength)
- return(0);
- /* SOI is the only pre-SOS marker without a length word */
- if (strip[i] == 0xd8)
- datalen = 0;
- else {
- if ((*striplength - i) <= 2)
- return(0);
- datalen = (strip[i+1] << 8) | strip[i+2];
- if (datalen < 2 || datalen >= (*striplength - i))
- return(0);
- }
- switch( strip[i] ){
- case 0xd8: /* SOI - start of image */
- _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), 2);
- *bufferoffset+=2;
- break;
- case 0xc0: /* SOF0 */
- case 0xc1: /* SOF1 */
- case 0xc3: /* SOF3 */
- case 0xc9: /* SOF9 */
- case 0xca: /* SOF10 */
- if(no==0){
- _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), datalen+2);
- ncomp = buffer[*bufferoffset+9];
- if (ncomp < 1 || ncomp > 4)
- return(0);
- v_samp=1;
- h_samp=1;
- for(j=0;j<ncomp;j++){
- uint16 samp = buffer[*bufferoffset+11+(3*j)];
- if( (samp>>4) > h_samp)
- h_samp = (samp>>4);
- if( (samp & 0x0f) > v_samp)
- v_samp = (samp & 0x0f);
- }
- v_samp*=8;
- h_samp*=8;
- ri=((( ((uint16)(buffer[*bufferoffset+5])<<8) |
- (uint16)(buffer[*bufferoffset+6]) )+v_samp-1)/
- v_samp);
- ri*=((( ((uint16)(buffer[*bufferoffset+7])<<8) |
- (uint16)(buffer[*bufferoffset+8]) )+h_samp-1)/
- h_samp);
- buffer[*bufferoffset+5]=
- (unsigned char) ((height>>8) & 0xff);
- buffer[*bufferoffset+6]=
- (unsigned char) (height & 0xff);
- *bufferoffset+=datalen+2;
- /* insert a DRI marker */
- buffer[(*bufferoffset)++]=0xff;
- buffer[(*bufferoffset)++]=0xdd;
- buffer[(*bufferoffset)++]=0x00;
- buffer[(*bufferoffset)++]=0x04;
- buffer[(*bufferoffset)++]=(ri >> 8) & 0xff;
- buffer[(*bufferoffset)++]= ri & 0xff;
- }
- break;
- case 0xc4: /* DHT */
- case 0xdb: /* DQT */
- _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), datalen+2);
- *bufferoffset+=datalen+2;
- break;
- case 0xda: /* SOS */
- if(no==0){
- _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), datalen+2);
- *bufferoffset+=datalen+2;
- } else {
- buffer[(*bufferoffset)++]=0xff;
- buffer[(*bufferoffset)++]=
- (unsigned char)(0xd0 | ((no-1)%8));
- }
- i += datalen + 1;
- /* copy remainder of strip */
- _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i]), *striplength - i);
- *bufferoffset+= *striplength - i;
- return(1);
- default:
- /* ignore any other marker */
- break;
- }
- i += datalen + 1;
- }
-
- /* failed to find SOS marker */
- return(0);
-}
-#endif
-
-/*
- This functions converts a tilewidth x tilelength buffer of samples into an edgetilewidth x
- tilelength buffer of samples.
-*/
-void t2p_tile_collapse_left(
- tdata_t buffer,
- tsize_t scanwidth,
- uint32 tilewidth,
- uint32 edgetilewidth,
- uint32 tilelength){
-
- uint32 i;
- tsize_t edgescanwidth=0;
-
- edgescanwidth = (scanwidth * edgetilewidth + (tilewidth - 1))/ tilewidth;
- for(i=0;i<tilelength;i++){
- _TIFFmemcpy(
- &(((char*)buffer)[edgescanwidth*i]),
- &(((char*)buffer)[scanwidth*i]),
- edgescanwidth);
- }
-
- return;
-}
-
-
-/*
- * This function calls TIFFWriteDirectory on the output after blanking its
- * output by replacing the read, write, and seek procedures with empty
- * implementations, then it replaces the original implementations.
- */
-
-void
-t2p_write_advance_directory(T2P* t2p, TIFF* output)
-{
- t2p_disable(output);
- if(!TIFFWriteDirectory(output)){
- TIFFError(TIFF2PDF_MODULE,
- "Error writing virtual directory to output PDF %s",
- TIFFFileName(output));
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- t2p_enable(output);
- return;
-}
-
-tsize_t t2p_sample_planar_separate_to_contig(
- T2P* t2p,
- unsigned char* buffer,
- unsigned char* samplebuffer,
- tsize_t samplebuffersize){
-
- tsize_t stride=0;
- tsize_t i=0;
- tsize_t j=0;
-
- stride=samplebuffersize/t2p->tiff_samplesperpixel;
- for(i=0;i<stride;i++){
- for(j=0;j<t2p->tiff_samplesperpixel;j++){
- buffer[i*t2p->tiff_samplesperpixel + j] = samplebuffer[i + j*stride];
- }
- }
-
- return(samplebuffersize);
-}
-
-tsize_t t2p_sample_realize_palette(T2P* t2p, unsigned char* buffer){
-
- uint32 sample_count=0;
- uint16 component_count=0;
- uint32 palette_offset=0;
- uint32 sample_offset=0;
- uint32 i=0;
- uint32 j=0;
- sample_count=t2p->tiff_width*t2p->tiff_length;
- component_count=t2p->tiff_samplesperpixel;
-
- for(i=sample_count;i>0;i--){
- palette_offset=buffer[i-1] * component_count;
- sample_offset= (i-1) * component_count;
- for(j=0;j<component_count;j++){
- buffer[sample_offset+j]=t2p->pdf_palette[palette_offset+j];
- }
- }
-
- return(0);
-}
-
-/*
- This functions converts in place a buffer of ABGR interleaved data
- into RGB interleaved data, discarding A.
-*/
-
-tsize_t t2p_sample_abgr_to_rgb(tdata_t data, uint32 samplecount)
-{
- uint32 i=0;
- uint32 sample=0;
-
- for(i=0;i<samplecount;i++){
- sample=((uint32*)data)[i];
- ((char*)data)[i*3]= (char) (sample & 0xff);
- ((char*)data)[i*3+1]= (char) ((sample>>8) & 0xff);
- ((char*)data)[i*3+2]= (char) ((sample>>16) & 0xff);
- }
-
- return(i*3);
-}
-
-/*
- * This functions converts in place a buffer of RGBA interleaved data
- * into RGB interleaved data, discarding A.
- */
-
-tsize_t
-t2p_sample_rgbaa_to_rgb(tdata_t data, uint32 samplecount)
-{
- uint32 i;
-
- for(i = 0; i < samplecount; i++)
- memcpy((uint8*)data + i * 3, (uint8*)data + i * 4, 3);
-
- return(i * 3);
-}
-
-/*
- * This functions converts in place a buffer of RGBA interleaved data
- * into RGB interleaved data, adding 255-A to each component sample.
- */
-
-tsize_t
-t2p_sample_rgba_to_rgb(tdata_t data, uint32 samplecount)
-{
- uint32 i = 0;
- uint32 sample = 0;
- uint8 alpha = 0;
-
- for (i = 0; i < samplecount; i++) {
- sample=((uint32*)data)[i];
- alpha=(uint8)((255 - ((sample >> 24) & 0xff)));
- ((uint8 *)data)[i * 3] = (uint8) ((sample >> 16) & 0xff) + alpha;
- ((uint8 *)data)[i * 3 + 1] = (uint8) ((sample >> 8) & 0xff) + alpha;
- ((uint8 *)data)[i * 3 + 2] = (uint8) (sample & 0xff) + alpha;
- }
-
- return (i * 3);
-}
-
-/*
- This function converts the a and b samples of Lab data from signed
- to unsigned.
-*/
-
-tsize_t t2p_sample_lab_signed_to_unsigned(tdata_t buffer, uint32 samplecount){
-
- uint32 i=0;
-
- for(i=0;i<samplecount;i++){
- if( (((unsigned char*)buffer)[(i*3)+1] & 0x80) !=0){
- ((unsigned char*)buffer)[(i*3)+1] =
- (unsigned char)(0x80 + ((char*)buffer)[(i*3)+1]);
- } else {
- ((unsigned char*)buffer)[(i*3)+1] |= 0x80;
- }
- if( (((unsigned char*)buffer)[(i*3)+2] & 0x80) !=0){
- ((unsigned char*)buffer)[(i*3)+2] =
- (unsigned char)(0x80 + ((char*)buffer)[(i*3)+2]);
- } else {
- ((unsigned char*)buffer)[(i*3)+2] |= 0x80;
- }
- }
-
- return(samplecount*3);
-}
-
-/*
- This function writes the PDF header to output.
-*/
-
-tsize_t t2p_write_pdf_header(T2P* t2p, TIFF* output){
-
- tsize_t written=0;
- char buffer[16];
- int buflen=0;
-
- buflen = snprintf(buffer, sizeof(buffer), "%%PDF-%u.%u ",
- t2p->pdf_majorversion&0xff,
- t2p->pdf_minorversion&0xff);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t)"\n%\342\343\317\323\n", 7);
-
- return(written);
-}
-
-/*
- This function writes the beginning of a PDF object to output.
-*/
-
-tsize_t t2p_write_pdf_obj_start(uint32 number, TIFF* output){
-
- tsize_t written=0;
- char buffer[32];
- int buflen=0;
-
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)number);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen );
- written += t2pWriteFile(output, (tdata_t) " 0 obj\n", 7);
-
- return(written);
-}
-
-/*
- This function writes the end of a PDF object to output.
-*/
-
-tsize_t t2p_write_pdf_obj_end(TIFF* output){
-
- tsize_t written=0;
-
- written += t2pWriteFile(output, (tdata_t) "endobj\n", 7);
-
- return(written);
-}
-
-/*
- This function writes a PDF name object to output.
-*/
-
-tsize_t t2p_write_pdf_name(unsigned char* name, TIFF* output){
-
- tsize_t written=0;
- uint32 i=0;
- char buffer[64];
- uint16 nextchar=0;
- size_t namelen=0;
-
- namelen = strlen((char *)name);
- if (namelen>126) {
- namelen=126;
- }
- written += t2pWriteFile(output, (tdata_t) "/", 1);
- for (i=0;i<namelen;i++){
- if ( ((unsigned char)name[i]) < 0x21){
- snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
- buffer[sizeof(buffer) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) buffer, 3);
- nextchar=1;
- }
- if ( ((unsigned char)name[i]) > 0x7E){
- snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
- buffer[sizeof(buffer) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) buffer, 3);
- nextchar=1;
- }
- if (nextchar==0){
- switch (name[i]){
- case 0x23:
- snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
- buffer[sizeof(buffer) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) buffer, 3);
- break;
- case 0x25:
- snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
- buffer[sizeof(buffer) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) buffer, 3);
- break;
- case 0x28:
- snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
- buffer[sizeof(buffer) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) buffer, 3);
- break;
- case 0x29:
- snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
- buffer[sizeof(buffer) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) buffer, 3);
- break;
- case 0x2F:
- snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
- buffer[sizeof(buffer) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) buffer, 3);
- break;
- case 0x3C:
- snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
- buffer[sizeof(buffer) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) buffer, 3);
- break;
- case 0x3E:
- snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
- buffer[sizeof(buffer) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) buffer, 3);
- break;
- case 0x5B:
- snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
- buffer[sizeof(buffer) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) buffer, 3);
- break;
- case 0x5D:
- snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
- buffer[sizeof(buffer) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) buffer, 3);
- break;
- case 0x7B:
- snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
- buffer[sizeof(buffer) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) buffer, 3);
- break;
- case 0x7D:
- snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
- buffer[sizeof(buffer) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) buffer, 3);
- break;
- default:
- written += t2pWriteFile(output, (tdata_t) &name[i], 1);
- }
- }
- nextchar=0;
- }
- written += t2pWriteFile(output, (tdata_t) " ", 1);
-
- return(written);
-}
-
-/*
- * This function writes a PDF string object to output.
- */
-
-tsize_t t2p_write_pdf_string(char* pdfstr, TIFF* output)
-{
- tsize_t written = 0;
- uint32 i = 0;
- char buffer[64];
- size_t len = 0;
-
- len = strlen(pdfstr);
- written += t2pWriteFile(output, (tdata_t) "(", 1);
- for (i=0; i<len; i++) {
- if((pdfstr[i]&0x80) || (pdfstr[i]==127) || (pdfstr[i]<32)){
- snprintf(buffer, sizeof(buffer), "\\%.3o", ((unsigned char)pdfstr[i]));
- written += t2pWriteFile(output, (tdata_t)buffer, 4);
- } else {
- switch (pdfstr[i]){
- case 0x08:
- written += t2pWriteFile(output, (tdata_t) "\\b", 2);
- break;
- case 0x09:
- written += t2pWriteFile(output, (tdata_t) "\\t", 2);
- break;
- case 0x0A:
- written += t2pWriteFile(output, (tdata_t) "\\n", 2);
- break;
- case 0x0C:
- written += t2pWriteFile(output, (tdata_t) "\\f", 2);
- break;
- case 0x0D:
- written += t2pWriteFile(output, (tdata_t) "\\r", 2);
- break;
- case 0x28:
- written += t2pWriteFile(output, (tdata_t) "\\(", 2);
- break;
- case 0x29:
- written += t2pWriteFile(output, (tdata_t) "\\)", 2);
- break;
- case 0x5C:
- written += t2pWriteFile(output, (tdata_t) "\\\\", 2);
- break;
- default:
- written += t2pWriteFile(output, (tdata_t) &pdfstr[i], 1);
- }
- }
- }
- written += t2pWriteFile(output, (tdata_t) ") ", 1);
-
- return(written);
-}
-
-
-/*
- This function writes a buffer of data to output.
-*/
-
-tsize_t t2p_write_pdf_stream(tdata_t buffer, tsize_t len, TIFF* output){
-
- tsize_t written=0;
-
- written += t2pWriteFile(output, (tdata_t) buffer, len);
-
- return(written);
-}
-
-/*
- This functions writes the beginning of a PDF stream to output.
-*/
-
-tsize_t t2p_write_pdf_stream_start(TIFF* output){
-
- tsize_t written=0;
-
- written += t2pWriteFile(output, (tdata_t) "stream\n", 7);
-
- return(written);
-}
-
-/*
- This function writes the end of a PDF stream to output.
-*/
-
-tsize_t t2p_write_pdf_stream_end(TIFF* output){
-
- tsize_t written=0;
-
- written += t2pWriteFile(output, (tdata_t) "\nendstream\n", 11);
-
- return(written);
-}
-
-/*
- This function writes a stream dictionary for a PDF stream to output.
-*/
-
-tsize_t t2p_write_pdf_stream_dict(tsize_t len, uint32 number, TIFF* output){
-
- tsize_t written=0;
- char buffer[32];
- int buflen=0;
-
- written += t2pWriteFile(output, (tdata_t) "/Length ", 8);
- if(len!=0){
- written += t2p_write_pdf_stream_length(len, output);
- } else {
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)number);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
- }
-
- return(written);
-}
-
-/*
- This functions writes the beginning of a PDF stream dictionary to output.
-*/
-
-tsize_t t2p_write_pdf_stream_dict_start(TIFF* output){
-
- tsize_t written=0;
-
- written += t2pWriteFile(output, (tdata_t) "<< \n", 4);
-
- return(written);
-}
-
-/*
- This function writes the end of a PDF stream dictionary to output.
-*/
-
-tsize_t t2p_write_pdf_stream_dict_end(TIFF* output){
-
- tsize_t written=0;
-
- written += t2pWriteFile(output, (tdata_t) " >>\n", 4);
-
- return(written);
-}
-
-/*
- This function writes a number to output.
-*/
-
-tsize_t t2p_write_pdf_stream_length(tsize_t len, TIFF* output){
-
- tsize_t written=0;
- char buffer[32];
- int buflen=0;
-
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)len);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "\n", 1);
-
- return(written);
-}
-
-/*
- * This function writes the PDF Catalog structure to output.
- */
-
-tsize_t t2p_write_pdf_catalog(T2P* t2p, TIFF* output)
-{
- tsize_t written = 0;
- char buffer[32];
- int buflen = 0;
-
- written += t2pWriteFile(output,
- (tdata_t)"<< \n/Type /Catalog \n/Pages ",
- 27);
- buflen = snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_pages);
- written += t2pWriteFile(output, (tdata_t) buffer,
- TIFFmin((size_t)buflen, sizeof(buffer) - 1));
- written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
- if(t2p->pdf_fitwindow){
- written += t2pWriteFile(output,
- (tdata_t) "/ViewerPreferences <</FitWindow true>>\n",
- 39);
- }
- written += t2pWriteFile(output, (tdata_t)">>\n", 3);
-
- return(written);
-}
-
-/*
- This function writes the PDF Info structure to output.
-*/
-
-tsize_t t2p_write_pdf_info(T2P* t2p, TIFF* input, TIFF* output)
-{
- tsize_t written = 0;
- char* info;
- char buffer[512];
-
- if(t2p->pdf_datetime[0] == '\0')
- t2p_pdf_tifftime(t2p, input);
- if (strlen(t2p->pdf_datetime) > 0) {
- written += t2pWriteFile(output, (tdata_t) "<< \n/CreationDate ", 18);
- written += t2p_write_pdf_string(t2p->pdf_datetime, output);
- written += t2pWriteFile(output, (tdata_t) "\n/ModDate ", 10);
- written += t2p_write_pdf_string(t2p->pdf_datetime, output);
- }
- written += t2pWriteFile(output, (tdata_t) "\n/Producer ", 11);
- snprintf(buffer, sizeof(buffer), "libtiff / tiff2pdf - %d", TIFFLIB_VERSION);
- written += t2p_write_pdf_string(buffer, output);
- written += t2pWriteFile(output, (tdata_t) "\n", 1);
- if (t2p->pdf_creator[0] != '\0') {
- written += t2pWriteFile(output, (tdata_t) "/Creator ", 9);
- written += t2p_write_pdf_string(t2p->pdf_creator, output);
- written += t2pWriteFile(output, (tdata_t) "\n", 1);
- } else {
- if (TIFFGetField(input, TIFFTAG_SOFTWARE, &info) != 0 && info) {
- if(strlen(info) >= sizeof(t2p->pdf_creator))
- info[sizeof(t2p->pdf_creator) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) "/Creator ", 9);
- written += t2p_write_pdf_string(info, output);
- written += t2pWriteFile(output, (tdata_t) "\n", 1);
- }
- }
- if (t2p->pdf_author[0] != '\0') {
- written += t2pWriteFile(output, (tdata_t) "/Author ", 8);
- written += t2p_write_pdf_string(t2p->pdf_author, output);
- written += t2pWriteFile(output, (tdata_t) "\n", 1);
- } else {
- if ((TIFFGetField(input, TIFFTAG_ARTIST, &info) != 0
- || TIFFGetField(input, TIFFTAG_COPYRIGHT, &info) != 0)
- && info) {
- if (strlen(info) >= sizeof(t2p->pdf_author))
- info[sizeof(t2p->pdf_author) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) "/Author ", 8);
- written += t2p_write_pdf_string(info, output);
- written += t2pWriteFile(output, (tdata_t) "\n", 1);
- }
- }
- if (t2p->pdf_title[0] != '\0') {
- written += t2pWriteFile(output, (tdata_t) "/Title ", 7);
- written += t2p_write_pdf_string(t2p->pdf_title, output);
- written += t2pWriteFile(output, (tdata_t) "\n", 1);
- } else {
- if (TIFFGetField(input, TIFFTAG_DOCUMENTNAME, &info) != 0){
- if(strlen(info) > 511) {
- info[512] = '\0';
- }
- written += t2pWriteFile(output, (tdata_t) "/Title ", 7);
- written += t2p_write_pdf_string(info, output);
- written += t2pWriteFile(output, (tdata_t) "\n", 1);
- }
- }
- if (t2p->pdf_subject[0] != '\0') {
- written += t2pWriteFile(output, (tdata_t) "/Subject ", 9);
- written += t2p_write_pdf_string(t2p->pdf_subject, output);
- written += t2pWriteFile(output, (tdata_t) "\n", 1);
- } else {
- if (TIFFGetField(input, TIFFTAG_IMAGEDESCRIPTION, &info) != 0 && info) {
- if (strlen(info) >= sizeof(t2p->pdf_subject))
- info[sizeof(t2p->pdf_subject) - 1] = '\0';
- written += t2pWriteFile(output, (tdata_t) "/Subject ", 9);
- written += t2p_write_pdf_string(info, output);
- written += t2pWriteFile(output, (tdata_t) "\n", 1);
- }
- }
- if (t2p->pdf_keywords[0] != '\0') {
- written += t2pWriteFile(output, (tdata_t) "/Keywords ", 10);
- written += t2p_write_pdf_string(t2p->pdf_keywords, output);
- written += t2pWriteFile(output, (tdata_t) "\n", 1);
- }
- written += t2pWriteFile(output, (tdata_t) ">> \n", 4);
-
- return(written);
-}
-
-/*
- * This function fills a string of a T2P struct with the current time as a PDF
- * date string, it is called by t2p_pdf_tifftime.
- */
-
-void t2p_pdf_currenttime(T2P* t2p)
-{
- struct tm* currenttime;
- time_t timenow;
-
- if (time(&timenow) == (time_t) -1) {
- TIFFError(TIFF2PDF_MODULE,
- "Can't get the current time: %s", strerror(errno));
- timenow = (time_t) 0;
- }
-
- currenttime = localtime(&timenow);
- snprintf(t2p->pdf_datetime, sizeof(t2p->pdf_datetime),
- "D:%.4d%.2d%.2d%.2d%.2d%.2d",
- (currenttime->tm_year + 1900) % 65536,
- (currenttime->tm_mon + 1) % 256,
- (currenttime->tm_mday) % 256,
- (currenttime->tm_hour) % 256,
- (currenttime->tm_min) % 256,
- (currenttime->tm_sec) % 256);
-
- return;
-}
-
-/*
- * This function fills a string of a T2P struct with the date and time of a
- * TIFF file if it exists or the current time as a PDF date string.
- */
-
-void t2p_pdf_tifftime(T2P* t2p, TIFF* input)
-{
- char* datetime;
-
- if (TIFFGetField(input, TIFFTAG_DATETIME, &datetime) != 0
- && (strlen(datetime) >= 19) ){
- t2p->pdf_datetime[0]='D';
- t2p->pdf_datetime[1]=':';
- t2p->pdf_datetime[2]=datetime[0];
- t2p->pdf_datetime[3]=datetime[1];
- t2p->pdf_datetime[4]=datetime[2];
- t2p->pdf_datetime[5]=datetime[3];
- t2p->pdf_datetime[6]=datetime[5];
- t2p->pdf_datetime[7]=datetime[6];
- t2p->pdf_datetime[8]=datetime[8];
- t2p->pdf_datetime[9]=datetime[9];
- t2p->pdf_datetime[10]=datetime[11];
- t2p->pdf_datetime[11]=datetime[12];
- t2p->pdf_datetime[12]=datetime[14];
- t2p->pdf_datetime[13]=datetime[15];
- t2p->pdf_datetime[14]=datetime[17];
- t2p->pdf_datetime[15]=datetime[18];
- t2p->pdf_datetime[16] = '\0';
- } else {
- t2p_pdf_currenttime(t2p);
- }
-
- return;
-}
-
-/*
- * This function writes a PDF Pages Tree structure to output.
- */
-
-tsize_t t2p_write_pdf_pages(T2P* t2p, TIFF* output)
-{
- tsize_t written=0;
- tdir_t i=0;
- char buffer[32];
- int buflen=0;
-
- int page=0;
- written += t2pWriteFile(output,
- (tdata_t) "<< \n/Type /Pages \n/Kids [ ", 26);
- page = t2p->pdf_pages+1;
- for (i=0;i<t2p->tiff_pagecount;i++){
- buflen=snprintf(buffer, sizeof(buffer), "%d", page);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
- if ( ((i+1)%8)==0 ) {
- written += t2pWriteFile(output, (tdata_t) "\n", 1);
- }
- page +=3;
- page += t2p->tiff_pages[i].page_extra;
- if(t2p->tiff_pages[i].page_tilecount>0){
- page += (2 * t2p->tiff_pages[i].page_tilecount);
- } else {
- page +=2;
- }
- }
- written += t2pWriteFile(output, (tdata_t) "] \n/Count ", 10);
- buflen=snprintf(buffer, sizeof(buffer), "%d", t2p->tiff_pagecount);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " \n>> \n", 6);
-
- return(written);
-}
-
-/*
- This function writes a PDF Page structure to output.
-*/
-
-tsize_t t2p_write_pdf_page(uint32 object, T2P* t2p, TIFF* output){
-
- unsigned int i=0;
- tsize_t written=0;
- char buffer[256];
- int buflen=0;
-
- written += t2pWriteFile(output, (tdata_t) "<<\n/Type /Page \n/Parent ", 24);
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_pages);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
- written += t2pWriteFile(output, (tdata_t) "/MediaBox [", 11);
- buflen=snprintf(buffer, sizeof(buffer), "%.4f",t2p->pdf_mediabox.x1);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " ", 1);
- buflen=snprintf(buffer, sizeof(buffer), "%.4f",t2p->pdf_mediabox.y1);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " ", 1);
- buflen=snprintf(buffer, sizeof(buffer), "%.4f",t2p->pdf_mediabox.x2);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " ", 1);
- buflen=snprintf(buffer, sizeof(buffer), "%.4f",t2p->pdf_mediabox.y2);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "] \n", 3);
- written += t2pWriteFile(output, (tdata_t) "/Contents ", 10);
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)(object + 1));
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
- written += t2pWriteFile(output, (tdata_t) "/Resources << \n", 15);
- if( t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount != 0 ){
- written += t2pWriteFile(output, (tdata_t) "/XObject <<\n", 12);
- for(i=0;i<t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount;i++){
- written += t2pWriteFile(output, (tdata_t) "/Im", 3);
- buflen = snprintf(buffer, sizeof(buffer), "%u", t2p->pdf_page+1);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "_", 1);
- buflen = snprintf(buffer, sizeof(buffer), "%u", i+1);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " ", 1);
- buflen = snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)(object+3+(2*i)+t2p->tiff_pages[t2p->pdf_page].page_extra));
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
- if(i%4==3){
- written += t2pWriteFile(output, (tdata_t) "\n", 1);
- }
- }
- written += t2pWriteFile(output, (tdata_t) ">>\n", 3);
- } else {
- written += t2pWriteFile(output, (tdata_t) "/XObject <<\n", 12);
- written += t2pWriteFile(output, (tdata_t) "/Im", 3);
- buflen = snprintf(buffer, sizeof(buffer), "%u", t2p->pdf_page+1);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " ", 1);
- buflen = snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)(object+3+(2*i)+t2p->tiff_pages[t2p->pdf_page].page_extra));
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
- written += t2pWriteFile(output, (tdata_t) ">>\n", 3);
- }
- if(t2p->tiff_transferfunctioncount != 0) {
- written += t2pWriteFile(output, (tdata_t) "/ExtGState <<", 13);
- t2pWriteFile(output, (tdata_t) "/GS1 ", 5);
- buflen = snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)(object + 3));
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
- written += t2pWriteFile(output, (tdata_t) ">> \n", 4);
- }
- written += t2pWriteFile(output, (tdata_t) "/ProcSet [ ", 11);
- if(t2p->pdf_colorspace & T2P_CS_BILEVEL
- || t2p->pdf_colorspace & T2P_CS_GRAY
- ){
- written += t2pWriteFile(output, (tdata_t) "/ImageB ", 8);
- } else {
- written += t2pWriteFile(output, (tdata_t) "/ImageC ", 8);
- if(t2p->pdf_colorspace & T2P_CS_PALETTE){
- written += t2pWriteFile(output, (tdata_t) "/ImageI ", 8);
- }
- }
- written += t2pWriteFile(output, (tdata_t) "]\n>>\n>>\n", 8);
-
- return(written);
-}
-
-/*
- This function composes the page size and image and tile locations on a page.
-*/
-
-void t2p_compose_pdf_page(T2P* t2p){
-
- uint32 i=0;
- uint32 i2=0;
- T2P_TILE* tiles=NULL;
- T2P_BOX* boxp=NULL;
- uint32 tilecountx=0;
- uint32 tilecounty=0;
- uint32 tilewidth=0;
- uint32 tilelength=0;
- int istiled=0;
- float f=0;
- float width_ratio=0;
- float length_ratio=0;
-
- t2p->pdf_xres = t2p->tiff_xres;
- t2p->pdf_yres = t2p->tiff_yres;
- if(t2p->pdf_overrideres) {
- t2p->pdf_xres = t2p->pdf_defaultxres;
- t2p->pdf_yres = t2p->pdf_defaultyres;
- }
- if(t2p->pdf_xres == 0.0)
- t2p->pdf_xres = t2p->pdf_defaultxres;
- if(t2p->pdf_yres == 0.0)
- t2p->pdf_yres = t2p->pdf_defaultyres;
- if (t2p->pdf_image_fillpage) {
- width_ratio = t2p->pdf_defaultpagewidth/t2p->tiff_width;
- length_ratio = t2p->pdf_defaultpagelength/t2p->tiff_length;
- if (width_ratio < length_ratio ) {
- t2p->pdf_imagewidth = t2p->pdf_defaultpagewidth;
- t2p->pdf_imagelength = t2p->tiff_length * width_ratio;
- } else {
- t2p->pdf_imagewidth = t2p->tiff_width * length_ratio;
- t2p->pdf_imagelength = t2p->pdf_defaultpagelength;
- }
- } else if (t2p->tiff_resunit != RESUNIT_CENTIMETER /* RESUNIT_NONE and */
- && t2p->tiff_resunit != RESUNIT_INCH) { /* other cases */
- t2p->pdf_imagewidth = ((float)(t2p->tiff_width))/t2p->pdf_xres;
- t2p->pdf_imagelength = ((float)(t2p->tiff_length))/t2p->pdf_yres;
- } else {
- t2p->pdf_imagewidth =
- ((float)(t2p->tiff_width))*PS_UNIT_SIZE/t2p->pdf_xres;
- t2p->pdf_imagelength =
- ((float)(t2p->tiff_length))*PS_UNIT_SIZE/t2p->pdf_yres;
- }
- if(t2p->pdf_overridepagesize != 0) {
- t2p->pdf_pagewidth = t2p->pdf_defaultpagewidth;
- t2p->pdf_pagelength = t2p->pdf_defaultpagelength;
- } else {
- t2p->pdf_pagewidth = t2p->pdf_imagewidth;
- t2p->pdf_pagelength = t2p->pdf_imagelength;
- }
- t2p->pdf_mediabox.x1=0.0;
- t2p->pdf_mediabox.y1=0.0;
- t2p->pdf_mediabox.x2=t2p->pdf_pagewidth;
- t2p->pdf_mediabox.y2=t2p->pdf_pagelength;
- t2p->pdf_imagebox.x1=0.0;
- t2p->pdf_imagebox.y1=0.0;
- t2p->pdf_imagebox.x2=t2p->pdf_imagewidth;
- t2p->pdf_imagebox.y2=t2p->pdf_imagelength;
- if(t2p->pdf_overridepagesize!=0){
- t2p->pdf_imagebox.x1+=((t2p->pdf_pagewidth-t2p->pdf_imagewidth)/2.0F);
- t2p->pdf_imagebox.y1+=((t2p->pdf_pagelength-t2p->pdf_imagelength)/2.0F);
- t2p->pdf_imagebox.x2+=((t2p->pdf_pagewidth-t2p->pdf_imagewidth)/2.0F);
- t2p->pdf_imagebox.y2+=((t2p->pdf_pagelength-t2p->pdf_imagelength)/2.0F);
- }
- if(t2p->tiff_orientation > 4){
- f=t2p->pdf_mediabox.x2;
- t2p->pdf_mediabox.x2=t2p->pdf_mediabox.y2;
- t2p->pdf_mediabox.y2=f;
- }
- istiled=((t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecount==0) ? 0 : 1;
- if(istiled==0){
- t2p_compose_pdf_page_orient(&(t2p->pdf_imagebox), t2p->tiff_orientation);
- return;
- } else {
- tilewidth=(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilewidth;
- tilelength=(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilelength;
- if( tilewidth > INT_MAX ||
- tilelength > INT_MAX ||
- t2p->tiff_width > INT_MAX - tilewidth ||
- t2p->tiff_length > INT_MAX - tilelength )
- {
- TIFFError(TIFF2PDF_MODULE, "Integer overflow");
- t2p->t2p_error = T2P_ERR_ERROR;
- return;
- }
- tilecountx=(t2p->tiff_width +
- tilewidth -1)/
- tilewidth;
- (t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecountx=tilecountx;
- tilecounty=(t2p->tiff_length +
- tilelength -1)/
- tilelength;
- (t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecounty=tilecounty;
- (t2p->tiff_tiles[t2p->pdf_page]).tiles_edgetilewidth=
- t2p->tiff_width % tilewidth;
- (t2p->tiff_tiles[t2p->pdf_page]).tiles_edgetilelength=
- t2p->tiff_length % tilelength;
- tiles=(t2p->tiff_tiles[t2p->pdf_page]).tiles_tiles;
- for(i2=0;i2<tilecounty-1;i2++){
- for(i=0;i<tilecountx-1;i++){
- boxp=&(tiles[i2*tilecountx+i].tile_box);
- boxp->x1 =
- t2p->pdf_imagebox.x1
- + ((float)(t2p->pdf_imagewidth * i * tilewidth)
- / (float)t2p->tiff_width);
- boxp->x2 =
- t2p->pdf_imagebox.x1
- + ((float)(t2p->pdf_imagewidth * (i+1) * tilewidth)
- / (float)t2p->tiff_width);
- boxp->y1 =
- t2p->pdf_imagebox.y2
- - ((float)(t2p->pdf_imagelength * (i2+1) * tilelength)
- / (float)t2p->tiff_length);
- boxp->y2 =
- t2p->pdf_imagebox.y2
- - ((float)(t2p->pdf_imagelength * i2 * tilelength)
- / (float)t2p->tiff_length);
- }
- boxp=&(tiles[i2*tilecountx+i].tile_box);
- boxp->x1 =
- t2p->pdf_imagebox.x1
- + ((float)(t2p->pdf_imagewidth * i * tilewidth)
- / (float)t2p->tiff_width);
- boxp->x2 = t2p->pdf_imagebox.x2;
- boxp->y1 =
- t2p->pdf_imagebox.y2
- - ((float)(t2p->pdf_imagelength * (i2+1) * tilelength)
- / (float)t2p->tiff_length);
- boxp->y2 =
- t2p->pdf_imagebox.y2
- - ((float)(t2p->pdf_imagelength * i2 * tilelength)
- / (float)t2p->tiff_length);
- }
- for(i=0;i<tilecountx-1;i++){
- boxp=&(tiles[i2*tilecountx+i].tile_box);
- boxp->x1 =
- t2p->pdf_imagebox.x1
- + ((float)(t2p->pdf_imagewidth * i * tilewidth)
- / (float)t2p->tiff_width);
- boxp->x2 =
- t2p->pdf_imagebox.x1
- + ((float)(t2p->pdf_imagewidth * (i+1) * tilewidth)
- / (float)t2p->tiff_width);
- boxp->y1 = t2p->pdf_imagebox.y1;
- boxp->y2 =
- t2p->pdf_imagebox.y2
- - ((float)(t2p->pdf_imagelength * i2 * tilelength)
- / (float)t2p->tiff_length);
- }
- boxp=&(tiles[i2*tilecountx+i].tile_box);
- boxp->x1 =
- t2p->pdf_imagebox.x1
- + ((float)(t2p->pdf_imagewidth * i * tilewidth)
- / (float)t2p->tiff_width);
- boxp->x2 = t2p->pdf_imagebox.x2;
- boxp->y1 = t2p->pdf_imagebox.y1;
- boxp->y2 =
- t2p->pdf_imagebox.y2
- - ((float)(t2p->pdf_imagelength * i2 * tilelength)
- / (float)t2p->tiff_length);
- }
- if(t2p->tiff_orientation==0 || t2p->tiff_orientation==1){
- for(i=0;i<(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecount;i++){
- t2p_compose_pdf_page_orient( &(tiles[i].tile_box) , 0);
- }
- return;
- }
- for(i=0;i<(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecount;i++){
- boxp=&(tiles[i].tile_box);
- boxp->x1 -= t2p->pdf_imagebox.x1;
- boxp->x2 -= t2p->pdf_imagebox.x1;
- boxp->y1 -= t2p->pdf_imagebox.y1;
- boxp->y2 -= t2p->pdf_imagebox.y1;
- if(t2p->tiff_orientation==2 || t2p->tiff_orientation==3){
- boxp->x1 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x1;
- boxp->x2 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x2;
- }
- if(t2p->tiff_orientation==3 || t2p->tiff_orientation==4){
- boxp->y1 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y1;
- boxp->y2 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y2;
- }
- if(t2p->tiff_orientation==8 || t2p->tiff_orientation==5){
- boxp->y1 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y1;
- boxp->y2 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y2;
- }
- if(t2p->tiff_orientation==5 || t2p->tiff_orientation==6){
- boxp->x1 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x1;
- boxp->x2 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x2;
- }
- if(t2p->tiff_orientation > 4){
- f=boxp->x1;
- boxp->x1 = boxp->y1;
- boxp->y1 = f;
- f=boxp->x2;
- boxp->x2 = boxp->y2;
- boxp->y2 = f;
- t2p_compose_pdf_page_orient_flip(boxp, t2p->tiff_orientation);
- } else {
- t2p_compose_pdf_page_orient(boxp, t2p->tiff_orientation);
- }
-
- }
-
- return;
-}
-
-void t2p_compose_pdf_page_orient(T2P_BOX* boxp, uint16 orientation){
-
- float m1[9];
- float f=0.0;
-
- if( boxp->x1 > boxp->x2){
- f=boxp->x1;
- boxp->x1=boxp->x2;
- boxp->x2 = f;
- }
- if( boxp->y1 > boxp->y2){
- f=boxp->y1;
- boxp->y1=boxp->y2;
- boxp->y2 = f;
- }
- boxp->mat[0]=m1[0]=boxp->x2-boxp->x1;
- boxp->mat[1]=m1[1]=0.0;
- boxp->mat[2]=m1[2]=0.0;
- boxp->mat[3]=m1[3]=0.0;
- boxp->mat[4]=m1[4]=boxp->y2-boxp->y1;
- boxp->mat[5]=m1[5]=0.0;
- boxp->mat[6]=m1[6]=boxp->x1;
- boxp->mat[7]=m1[7]=boxp->y1;
- boxp->mat[8]=m1[8]=1.0;
- switch(orientation){
- case 0:
- case 1:
- break;
- case 2:
- boxp->mat[0]=0.0F-m1[0];
- boxp->mat[6]+=m1[0];
- break;
- case 3:
- boxp->mat[0]=0.0F-m1[0];
- boxp->mat[4]=0.0F-m1[4];
- boxp->mat[6]+=m1[0];
- boxp->mat[7]+=m1[4];
- break;
- case 4:
- boxp->mat[4]=0.0F-m1[4];
- boxp->mat[7]+=m1[4];
- break;
- case 5:
- boxp->mat[0]=0.0F;
- boxp->mat[1]=0.0F-m1[0];
- boxp->mat[3]=0.0F-m1[4];
- boxp->mat[4]=0.0F;
- boxp->mat[6]+=m1[4];
- boxp->mat[7]+=m1[0];
- break;
- case 6:
- boxp->mat[0]=0.0F;
- boxp->mat[1]=0.0F-m1[0];
- boxp->mat[3]=m1[4];
- boxp->mat[4]=0.0F;
- boxp->mat[7]+=m1[0];
- break;
- case 7:
- boxp->mat[0]=0.0F;
- boxp->mat[1]=m1[0];
- boxp->mat[3]=m1[4];
- boxp->mat[4]=0.0F;
- break;
- case 8:
- boxp->mat[0]=0.0F;
- boxp->mat[1]=m1[0];
- boxp->mat[3]=0.0F-m1[4];
- boxp->mat[4]=0.0F;
- boxp->mat[6]+=m1[4];
- break;
- }
-
- return;
-}
-
-void t2p_compose_pdf_page_orient_flip(T2P_BOX* boxp, uint16 orientation){
-
- float m1[9];
- float f=0.0;
-
- if( boxp->x1 > boxp->x2){
- f=boxp->x1;
- boxp->x1=boxp->x2;
- boxp->x2 = f;
- }
- if( boxp->y1 > boxp->y2){
- f=boxp->y1;
- boxp->y1=boxp->y2;
- boxp->y2 = f;
- }
- boxp->mat[0]=m1[0]=boxp->x2-boxp->x1;
- boxp->mat[1]=m1[1]=0.0F;
- boxp->mat[2]=m1[2]=0.0F;
- boxp->mat[3]=m1[3]=0.0F;
- boxp->mat[4]=m1[4]=boxp->y2-boxp->y1;
- boxp->mat[5]=m1[5]=0.0F;
- boxp->mat[6]=m1[6]=boxp->x1;
- boxp->mat[7]=m1[7]=boxp->y1;
- boxp->mat[8]=m1[8]=1.0F;
- switch(orientation){
- case 5:
- boxp->mat[0]=0.0F;
- boxp->mat[1]=0.0F-m1[4];
- boxp->mat[3]=0.0F-m1[0];
- boxp->mat[4]=0.0F;
- boxp->mat[6]+=m1[0];
- boxp->mat[7]+=m1[4];
- break;
- case 6:
- boxp->mat[0]=0.0F;
- boxp->mat[1]=0.0F-m1[4];
- boxp->mat[3]=m1[0];
- boxp->mat[4]=0.0F;
- boxp->mat[7]+=m1[4];
- break;
- case 7:
- boxp->mat[0]=0.0F;
- boxp->mat[1]=m1[4];
- boxp->mat[3]=m1[0];
- boxp->mat[4]=0.0F;
- break;
- case 8:
- boxp->mat[0]=0.0F;
- boxp->mat[1]=m1[4];
- boxp->mat[3]=0.0F-m1[0];
- boxp->mat[4]=0.0F;
- boxp->mat[6]+=m1[0];
- break;
- }
-
- return;
-}
-
-/*
- This function writes a PDF Contents stream to output.
-*/
-
-tsize_t t2p_write_pdf_page_content_stream(T2P* t2p, TIFF* output){
-
- tsize_t written=0;
- ttile_t i=0;
- char buffer[512];
- int buflen=0;
- T2P_BOX box;
-
- if(t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount>0){
- for(i=0;i<t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount; i++){
- box=t2p->tiff_tiles[t2p->pdf_page].tiles_tiles[i].tile_box;
- buflen=snprintf(buffer, sizeof(buffer),
- "q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d_%ld Do Q\n",
- t2p->tiff_transferfunctioncount?"/GS1 gs ":"",
- box.mat[0],
- box.mat[1],
- box.mat[3],
- box.mat[4],
- box.mat[6],
- box.mat[7],
- t2p->pdf_page + 1,
- (long)(i + 1));
- written += t2p_write_pdf_stream(buffer, buflen, output);
- }
- } else {
- box=t2p->pdf_imagebox;
- buflen=snprintf(buffer, sizeof(buffer),
- "q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d Do Q\n",
- t2p->tiff_transferfunctioncount?"/GS1 gs ":"",
- box.mat[0],
- box.mat[1],
- box.mat[3],
- box.mat[4],
- box.mat[6],
- box.mat[7],
- t2p->pdf_page+1);
- written += t2p_write_pdf_stream(buffer, buflen, output);
- }
-
- return(written);
-}
-
-/*
- This function writes a PDF Image XObject stream dictionary to output.
-*/
-
-tsize_t t2p_write_pdf_xobject_stream_dict(ttile_t tile,
- T2P* t2p,
- TIFF* output){
-
- tsize_t written=0;
- char buffer[32];
- int buflen=0;
-
- written += t2p_write_pdf_stream_dict(0, t2p->pdf_xrefcount+1, output);
- written += t2pWriteFile(output,
- (tdata_t) "/Type /XObject \n/Subtype /Image \n/Name /Im",
- 42);
- buflen=snprintf(buffer, sizeof(buffer), "%u", t2p->pdf_page+1);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- if(tile != 0){
- written += t2pWriteFile(output, (tdata_t) "_", 1);
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)tile);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- }
- written += t2pWriteFile(output, (tdata_t) "\n/Width ", 8);
- if(tile==0){
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->tiff_width);
- } else {
- if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)!=0){
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth);
- } else {
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth);
- }
- }
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "\n/Height ", 9);
- if(tile==0){
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->tiff_length);
- } else {
- if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)!=0){
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
- } else {
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
- }
- }
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "\n/BitsPerComponent ", 19);
- buflen=snprintf(buffer, sizeof(buffer), "%u", t2p->tiff_bitspersample);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "\n/ColorSpace ", 13);
- written += t2p_write_pdf_xobject_cs(t2p, output);
- if (t2p->pdf_image_interpolate)
- written += t2pWriteFile(output,
- (tdata_t) "\n/Interpolate true", 18);
- if( (t2p->pdf_switchdecode != 0)
-#ifdef CCITT_SUPPORT
- && ! (t2p->pdf_colorspace & T2P_CS_BILEVEL
- && t2p->pdf_compression == T2P_COMPRESS_G4)
-#endif
- ){
- written += t2p_write_pdf_xobject_decode(t2p, output);
- }
- written += t2p_write_pdf_xobject_stream_filter(tile, t2p, output);
-
- return(written);
-}
-
-/*
- * This function writes a PDF Image XObject Colorspace name to output.
- */
-
-
-tsize_t t2p_write_pdf_xobject_cs(T2P* t2p, TIFF* output){
-
- tsize_t written=0;
- char buffer[128];
- int buflen=0;
-
- float X_W=1.0;
- float Y_W=1.0;
- float Z_W=1.0;
-
- if( (t2p->pdf_colorspace & T2P_CS_ICCBASED) != 0){
- written += t2p_write_pdf_xobject_icccs(t2p, output);
- return(written);
- }
- if( (t2p->pdf_colorspace & T2P_CS_PALETTE) != 0){
- written += t2pWriteFile(output, (tdata_t) "[ /Indexed ", 11);
- t2p->pdf_colorspace ^= T2P_CS_PALETTE;
- written += t2p_write_pdf_xobject_cs(t2p, output);
- t2p->pdf_colorspace |= T2P_CS_PALETTE;
- buflen=snprintf(buffer, sizeof(buffer), "%u", (0x0001 << t2p->tiff_bitspersample)-1 );
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " ", 1);
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_palettecs );
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R ]\n", 7);
- return(written);
- }
- if(t2p->pdf_colorspace & T2P_CS_BILEVEL){
- written += t2pWriteFile(output, (tdata_t) "/DeviceGray \n", 13);
- }
- if(t2p->pdf_colorspace & T2P_CS_GRAY){
- if(t2p->pdf_colorspace & T2P_CS_CALGRAY){
- written += t2p_write_pdf_xobject_calcs(t2p, output);
- } else {
- written += t2pWriteFile(output, (tdata_t) "/DeviceGray \n", 13);
- }
- }
- if(t2p->pdf_colorspace & T2P_CS_RGB){
- if(t2p->pdf_colorspace & T2P_CS_CALRGB){
- written += t2p_write_pdf_xobject_calcs(t2p, output);
- } else {
- written += t2pWriteFile(output, (tdata_t) "/DeviceRGB \n", 12);
- }
- }
- if(t2p->pdf_colorspace & T2P_CS_CMYK){
- written += t2pWriteFile(output, (tdata_t) "/DeviceCMYK \n", 13);
- }
- if(t2p->pdf_colorspace & T2P_CS_LAB){
- written += t2pWriteFile(output, (tdata_t) "[/Lab << \n", 10);
- written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12);
- X_W = t2p->tiff_whitechromaticities[0];
- Y_W = t2p->tiff_whitechromaticities[1];
- Z_W = 1.0F - (X_W + Y_W);
- X_W /= Y_W;
- Z_W /= Y_W;
- Y_W = 1.0F;
- buflen=snprintf(buffer, sizeof(buffer), "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "/Range ", 7);
- buflen=snprintf(buffer, sizeof(buffer), "[%d %d %d %d] \n",
- t2p->pdf_labrange[0],
- t2p->pdf_labrange[1],
- t2p->pdf_labrange[2],
- t2p->pdf_labrange[3]);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) ">>] \n", 5);
-
- }
-
- return(written);
-}
-
-tsize_t t2p_write_pdf_transfer(T2P* t2p, TIFF* output){
-
- tsize_t written=0;
- char buffer[32];
- int buflen=0;
-
- written += t2pWriteFile(output, (tdata_t) "<< /Type /ExtGState \n/TR ", 25);
- if(t2p->tiff_transferfunctioncount == 1){
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)(t2p->pdf_xrefcount + 1));
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
- } else {
- written += t2pWriteFile(output, (tdata_t) "[ ", 2);
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)(t2p->pdf_xrefcount + 1));
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)(t2p->pdf_xrefcount + 2));
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)(t2p->pdf_xrefcount + 3));
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
- written += t2pWriteFile(output, (tdata_t) "/Identity ] ", 12);
- }
-
- written += t2pWriteFile(output, (tdata_t) " >> \n", 5);
-
- return(written);
-}
-
-tsize_t t2p_write_pdf_transfer_dict(T2P* t2p, TIFF* output, uint16 i){
-
- tsize_t written=0;
- char buffer[32];
- int buflen=0;
- (void)i; /* XXX */
-
- written += t2pWriteFile(output, (tdata_t) "/FunctionType 0 \n", 17);
- written += t2pWriteFile(output, (tdata_t) "/Domain [0.0 1.0] \n", 19);
- written += t2pWriteFile(output, (tdata_t) "/Range [0.0 1.0] \n", 18);
- buflen=snprintf(buffer, sizeof(buffer), "/Size [%u] \n", (1<<t2p->tiff_bitspersample));
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "/BitsPerSample 16 \n", 19);
- written += t2p_write_pdf_stream_dict(((tsize_t)1)<<(t2p->tiff_bitspersample+1), 0, output);
-
- return(written);
-}
-
-tsize_t t2p_write_pdf_transfer_stream(T2P* t2p, TIFF* output, uint16 i){
-
- tsize_t written=0;
-
- written += t2p_write_pdf_stream(
- t2p->tiff_transferfunction[i],
- (((tsize_t)1)<<(t2p->tiff_bitspersample+1)),
- output);
-
- return(written);
-}
-
-/*
- This function writes a PDF Image XObject Colorspace array to output.
-*/
-
-tsize_t t2p_write_pdf_xobject_calcs(T2P* t2p, TIFF* output){
-
- tsize_t written=0;
- char buffer[256];
- int buflen=0;
-
- float X_W=0.0;
- float Y_W=0.0;
- float Z_W=0.0;
- float X_R=0.0;
- float Y_R=0.0;
- float Z_R=0.0;
- float X_G=0.0;
- float Y_G=0.0;
- float Z_G=0.0;
- float X_B=0.0;
- float Y_B=0.0;
- float Z_B=0.0;
- float x_w=0.0;
- float y_w=0.0;
- float z_w=0.0;
- float x_r=0.0;
- float y_r=0.0;
- float x_g=0.0;
- float y_g=0.0;
- float x_b=0.0;
- float y_b=0.0;
- float R=1.0;
- float G=1.0;
- float B=1.0;
-
- written += t2pWriteFile(output, (tdata_t) "[", 1);
- if(t2p->pdf_colorspace & T2P_CS_CALGRAY){
- written += t2pWriteFile(output, (tdata_t) "/CalGray ", 9);
- X_W = t2p->tiff_whitechromaticities[0];
- Y_W = t2p->tiff_whitechromaticities[1];
- Z_W = 1.0F - (X_W + Y_W);
- X_W /= Y_W;
- Z_W /= Y_W;
- Y_W = 1.0F;
- }
- if(t2p->pdf_colorspace & T2P_CS_CALRGB){
- written += t2pWriteFile(output, (tdata_t) "/CalRGB ", 8);
- x_w = t2p->tiff_whitechromaticities[0];
- y_w = t2p->tiff_whitechromaticities[1];
- x_r = t2p->tiff_primarychromaticities[0];
- y_r = t2p->tiff_primarychromaticities[1];
- x_g = t2p->tiff_primarychromaticities[2];
- y_g = t2p->tiff_primarychromaticities[3];
- x_b = t2p->tiff_primarychromaticities[4];
- y_b = t2p->tiff_primarychromaticities[5];
- z_w = y_w * ((x_g - x_b)*y_r - (x_r-x_b)*y_g + (x_r-x_g)*y_b);
- Y_R = (y_r/R) * ((x_g-x_b)*y_w - (x_w-x_b)*y_g + (x_w-x_g)*y_b) / z_w;
- X_R = Y_R * x_r / y_r;
- Z_R = Y_R * (((1-x_r)/y_r)-1);
- Y_G = ((0.0F-(y_g))/G) * ((x_r-x_b)*y_w - (x_w-x_b)*y_r + (x_w-x_r)*y_b) / z_w;
- X_G = Y_G * x_g / y_g;
- Z_G = Y_G * (((1-x_g)/y_g)-1);
- Y_B = (y_b/B) * ((x_r-x_g)*y_w - (x_w-x_g)*y_r + (x_w-x_r)*y_g) / z_w;
- X_B = Y_B * x_b / y_b;
- Z_B = Y_B * (((1-x_b)/y_b)-1);
- X_W = (X_R * R) + (X_G * G) + (X_B * B);
- Y_W = (Y_R * R) + (Y_G * G) + (Y_B * B);
- Z_W = (Z_R * R) + (Z_G * G) + (Z_B * B);
- X_W /= Y_W;
- Z_W /= Y_W;
- Y_W = 1.0;
- }
- written += t2pWriteFile(output, (tdata_t) "<< \n", 4);
- if(t2p->pdf_colorspace & T2P_CS_CALGRAY){
- written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12);
- buflen=snprintf(buffer, sizeof(buffer), "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "/Gamma 2.2 \n", 12);
- }
- if(t2p->pdf_colorspace & T2P_CS_CALRGB){
- written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12);
- buflen=snprintf(buffer, sizeof(buffer), "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "/Matrix ", 8);
- buflen=snprintf(buffer, sizeof(buffer), "[%.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f] \n",
- X_R, Y_R, Z_R,
- X_G, Y_G, Z_G,
- X_B, Y_B, Z_B);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "/Gamma [2.2 2.2 2.2] \n", 22);
- }
- written += t2pWriteFile(output, (tdata_t) ">>] \n", 5);
-
- return(written);
-}
-
-/*
- This function writes a PDF Image XObject Colorspace array to output.
-*/
-
-tsize_t t2p_write_pdf_xobject_icccs(T2P* t2p, TIFF* output){
-
- tsize_t written=0;
- char buffer[32];
- int buflen=0;
-
- written += t2pWriteFile(output, (tdata_t) "[/ICCBased ", 11);
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_icccs);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R] \n", 7);
-
- return(written);
-}
-
-tsize_t t2p_write_pdf_xobject_icccs_dict(T2P* t2p, TIFF* output){
-
- tsize_t written=0;
- char buffer[32];
- int buflen=0;
-
- written += t2pWriteFile(output, (tdata_t) "/N ", 3);
- buflen=snprintf(buffer, sizeof(buffer), "%u \n", t2p->tiff_samplesperpixel);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "/Alternate ", 11);
- t2p->pdf_colorspace ^= T2P_CS_ICCBASED;
- written += t2p_write_pdf_xobject_cs(t2p, output);
- t2p->pdf_colorspace |= T2P_CS_ICCBASED;
- written += t2p_write_pdf_stream_dict(t2p->tiff_iccprofilelength, 0, output);
-
- return(written);
-}
-
-tsize_t t2p_write_pdf_xobject_icccs_stream(T2P* t2p, TIFF* output){
-
- tsize_t written=0;
-
- written += t2p_write_pdf_stream(
- (tdata_t) t2p->tiff_iccprofile,
- (tsize_t) t2p->tiff_iccprofilelength,
- output);
-
- return(written);
-}
-
-/*
- This function writes a palette stream for an indexed color space to output.
-*/
-
-tsize_t t2p_write_pdf_xobject_palettecs_stream(T2P* t2p, TIFF* output){
-
- tsize_t written=0;
-
- written += t2p_write_pdf_stream(
- (tdata_t) t2p->pdf_palette,
- (tsize_t) t2p->pdf_palettesize,
- output);
-
- return(written);
-}
-
-/*
- This function writes a PDF Image XObject Decode array to output.
-*/
-
-tsize_t t2p_write_pdf_xobject_decode(T2P* t2p, TIFF* output){
-
- tsize_t written=0;
- int i=0;
-
- written += t2pWriteFile(output, (tdata_t) "/Decode [ ", 10);
- for (i=0;i<t2p->tiff_samplesperpixel;i++){
- written += t2pWriteFile(output, (tdata_t) "1 0 ", 4);
- }
- written += t2pWriteFile(output, (tdata_t) "]\n", 2);
-
- return(written);
-}
-
-/*
- This function writes a PDF Image XObject stream filter name and parameters to
- output.
-*/
-
-tsize_t t2p_write_pdf_xobject_stream_filter(ttile_t tile, T2P* t2p, TIFF* output){
-
- tsize_t written=0;
- char buffer[32];
- int buflen=0;
-
- if(t2p->pdf_compression==T2P_COMPRESS_NONE){
- return(written);
- }
- written += t2pWriteFile(output, (tdata_t) "/Filter ", 8);
- switch(t2p->pdf_compression){
-#ifdef CCITT_SUPPORT
- case T2P_COMPRESS_G4:
- written += t2pWriteFile(output, (tdata_t) "/CCITTFaxDecode ", 16);
- written += t2pWriteFile(output, (tdata_t) "/DecodeParms ", 13);
- written += t2pWriteFile(output, (tdata_t) "<< /K -1 ", 9);
- if(tile==0){
- written += t2pWriteFile(output, (tdata_t) "/Columns ", 9);
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)t2p->tiff_width);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " /Rows ", 7);
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)t2p->tiff_length);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- } else {
- if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)==0){
- written += t2pWriteFile(output, (tdata_t) "/Columns ", 9);
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- } else {
- written += t2pWriteFile(output, (tdata_t) "/Columns ", 9);
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- }
- if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)==0){
- written += t2pWriteFile(output, (tdata_t) " /Rows ", 7);
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- } else {
- written += t2pWriteFile(output, (tdata_t) " /Rows ", 7);
- buflen=snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- }
- }
- if(t2p->pdf_switchdecode == 0){
- written += t2pWriteFile(output, (tdata_t) " /BlackIs1 true ", 16);
- }
- written += t2pWriteFile(output, (tdata_t) ">>\n", 3);
- break;
-#endif
-#ifdef JPEG_SUPPORT
- case T2P_COMPRESS_JPEG:
- written += t2pWriteFile(output, (tdata_t) "/DCTDecode ", 11);
-
- if(t2p->tiff_photometric != PHOTOMETRIC_YCBCR) {
- written += t2pWriteFile(output, (tdata_t) "/DecodeParms ", 13);
- written += t2pWriteFile(output, (tdata_t) "<< /ColorTransform 0 >>\n", 24);
- }
- break;
-#endif
-#ifdef ZIP_SUPPORT
- case T2P_COMPRESS_ZIP:
- written += t2pWriteFile(output, (tdata_t) "/FlateDecode ", 13);
- if(t2p->pdf_compressionquality%100){
- written += t2pWriteFile(output, (tdata_t) "/DecodeParms ", 13);
- written += t2pWriteFile(output, (tdata_t) "<< /Predictor ", 14);
- buflen=snprintf(buffer, sizeof(buffer), "%u", t2p->pdf_compressionquality%100);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " /Columns ", 10);
- buflen = snprintf(buffer, sizeof(buffer), "%lu",
- (unsigned long)t2p->tiff_width);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " /Colors ", 9);
- buflen=snprintf(buffer, sizeof(buffer), "%u", t2p->tiff_samplesperpixel);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " /BitsPerComponent ", 19);
- buflen=snprintf(buffer, sizeof(buffer), "%u", t2p->tiff_bitspersample);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) ">>\n", 3);
- }
- break;
-#endif
- default:
- break;
- }
-
- return(written);
-}
-
-/*
- This function writes a PDF xref table to output.
-*/
-
-tsize_t t2p_write_pdf_xreftable(T2P* t2p, TIFF* output){
-
- tsize_t written=0;
- char buffer[64];
- int buflen=0;
- uint32 i=0;
-
- written += t2pWriteFile(output, (tdata_t) "xref\n0 ", 7);
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)(t2p->pdf_xrefcount + 1));
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " \n0000000000 65535 f \n", 22);
- for (i=0;i<t2p->pdf_xrefcount;i++){
- snprintf(buffer, sizeof(buffer), "%.10lu 00000 n \n",
- (unsigned long)t2p->pdf_xrefoffsets[i]);
- written += t2pWriteFile(output, (tdata_t) buffer, 20);
- }
-
- return(written);
-}
-
-/*
- * This function writes a PDF trailer to output.
- */
-
-tsize_t t2p_write_pdf_trailer(T2P* t2p, TIFF* output)
-{
-
- tsize_t written = 0;
- char buffer[32];
- int buflen = 0;
- size_t i = 0;
-
- for (i = 0; i < sizeof(t2p->pdf_fileid) - 8; i += 8)
- snprintf(t2p->pdf_fileid + i, 9, "%.8X", rand());
-
- written += t2pWriteFile(output, (tdata_t) "trailer\n<<\n/Size ", 17);
- buflen = snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)(t2p->pdf_xrefcount+1));
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "\n/Root ", 7);
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_catalog);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R \n/Info ", 12);
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_info);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) " 0 R \n/ID[<", 11);
- written += t2pWriteFile(output, (tdata_t) t2p->pdf_fileid,
- sizeof(t2p->pdf_fileid) - 1);
- written += t2pWriteFile(output, (tdata_t) "><", 2);
- written += t2pWriteFile(output, (tdata_t) t2p->pdf_fileid,
- sizeof(t2p->pdf_fileid) - 1);
- written += t2pWriteFile(output, (tdata_t) ">]\n>>\nstartxref\n", 16);
- buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_startxref);
- written += t2pWriteFile(output, (tdata_t) buffer, buflen);
- written += t2pWriteFile(output, (tdata_t) "\n%%EOF\n", 7);
-
- return(written);
-}
-
-/*
-
- This function writes a PDF to a file given a pointer to a TIFF.
-
- The idea with using a TIFF* as output for a PDF file is that the file
- can be created with TIFFClientOpen for memory-mapped use within the TIFF
- library, and TIFFWriteEncodedStrip can be used to write compressed data to
- the output. The output is not actually a TIFF file, it is a PDF file.
-
- This function uses only t2pWriteFile and TIFFWriteEncodedStrip to write to
- the output TIFF file. When libtiff would otherwise be writing data to the
- output file, the write procedure of the TIFF structure is replaced with an
- empty implementation.
-
- The first argument to the function is an initialized and validated T2P
- context struct pointer.
-
- The second argument to the function is the TIFF* that is the input that has
- been opened for reading and no other functions have been called upon it.
-
- The third argument to the function is the TIFF* that is the output that has
- been opened for writing. It has to be opened so that it hasn't written any
- data to the output. If the output is seekable then it's OK to seek to the
- beginning of the file. The function only writes to the output PDF and does
- not seek. See the example usage in the main() function.
-
- TIFF* output = TIFFOpen("output.pdf", "w");
- assert(output != NULL);
-
- if(output->tif_seekproc != NULL){
- t2pSeekFile(output, (toff_t) 0, SEEK_SET);
- }
-
- This function returns the file size of the output PDF file. On error it
- returns zero and the t2p->t2p_error variable is set to T2P_ERR_ERROR.
-
- After this function completes, call t2p_free on t2p, TIFFClose on input,
- and TIFFClose on output.
-*/
-
-tsize_t t2p_write_pdf(T2P* t2p, TIFF* input, TIFF* output){
-
- tsize_t written=0;
- ttile_t i2=0;
- tsize_t streamlen=0;
- uint16 i=0;
-
- t2p_read_tiff_init(t2p, input);
- if(t2p->t2p_error!=T2P_ERR_OK){return(0);}
- t2p->pdf_xrefoffsets= (uint32*) _TIFFmalloc(TIFFSafeMultiply(tmsize_t,t2p->pdf_xrefcount,sizeof(uint32)) );
- if(t2p->pdf_xrefoffsets==NULL){
- TIFFError(
- TIFF2PDF_MODULE,
- "Can't allocate %u bytes of memory for t2p_write_pdf",
- (unsigned int) (t2p->pdf_xrefcount * sizeof(uint32)) );
- t2p->t2p_error = T2P_ERR_ERROR;
- return(written);
- }
- t2p->pdf_xrefcount=0;
- t2p->pdf_catalog=1;
- t2p->pdf_info=2;
- t2p->pdf_pages=3;
- written += t2p_write_pdf_header(t2p, output);
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- t2p->pdf_catalog=t2p->pdf_xrefcount;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_catalog(t2p, output);
- written += t2p_write_pdf_obj_end(output);
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- t2p->pdf_info=t2p->pdf_xrefcount;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_info(t2p, input, output);
- written += t2p_write_pdf_obj_end(output);
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- t2p->pdf_pages=t2p->pdf_xrefcount;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_pages(t2p, output);
- written += t2p_write_pdf_obj_end(output);
- for(t2p->pdf_page=0;t2p->pdf_page<t2p->tiff_pagecount;t2p->pdf_page++){
- t2p_read_tiff_data(t2p, input);
- if(t2p->t2p_error!=T2P_ERR_OK){return(0);}
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_page(t2p->pdf_xrefcount, t2p, output);
- written += t2p_write_pdf_obj_end(output);
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_stream_dict_start(output);
- written += t2p_write_pdf_stream_dict(0, t2p->pdf_xrefcount+1, output);
- written += t2p_write_pdf_stream_dict_end(output);
- written += t2p_write_pdf_stream_start(output);
- streamlen=written;
- written += t2p_write_pdf_page_content_stream(t2p, output);
- streamlen=written-streamlen;
- written += t2p_write_pdf_stream_end(output);
- written += t2p_write_pdf_obj_end(output);
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_stream_length(streamlen, output);
- written += t2p_write_pdf_obj_end(output);
- if(t2p->tiff_transferfunctioncount != 0){
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_transfer(t2p, output);
- written += t2p_write_pdf_obj_end(output);
- for(i=0; i < t2p->tiff_transferfunctioncount; i++){
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_stream_dict_start(output);
- written += t2p_write_pdf_transfer_dict(t2p, output, i);
- written += t2p_write_pdf_stream_dict_end(output);
- written += t2p_write_pdf_stream_start(output);
- streamlen=written;
- written += t2p_write_pdf_transfer_stream(t2p, output, i);
- streamlen=written-streamlen;
- written += t2p_write_pdf_stream_end(output);
- written += t2p_write_pdf_obj_end(output);
- }
- }
- if( (t2p->pdf_colorspace & T2P_CS_PALETTE) != 0){
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- t2p->pdf_palettecs=t2p->pdf_xrefcount;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_stream_dict_start(output);
- written += t2p_write_pdf_stream_dict(t2p->pdf_palettesize, 0, output);
- written += t2p_write_pdf_stream_dict_end(output);
- written += t2p_write_pdf_stream_start(output);
- streamlen=written;
- written += t2p_write_pdf_xobject_palettecs_stream(t2p, output);
- streamlen=written-streamlen;
- written += t2p_write_pdf_stream_end(output);
- written += t2p_write_pdf_obj_end(output);
- }
- if( (t2p->pdf_colorspace & T2P_CS_ICCBASED) != 0){
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- t2p->pdf_icccs=t2p->pdf_xrefcount;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_stream_dict_start(output);
- written += t2p_write_pdf_xobject_icccs_dict(t2p, output);
- written += t2p_write_pdf_stream_dict_end(output);
- written += t2p_write_pdf_stream_start(output);
- streamlen=written;
- written += t2p_write_pdf_xobject_icccs_stream(t2p, output);
- streamlen=written-streamlen;
- written += t2p_write_pdf_stream_end(output);
- written += t2p_write_pdf_obj_end(output);
- }
- if(t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount !=0){
- for(i2=0;i2<t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount;i2++){
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_stream_dict_start(output);
- written += t2p_write_pdf_xobject_stream_dict(
- i2+1,
- t2p,
- output);
- written += t2p_write_pdf_stream_dict_end(output);
- written += t2p_write_pdf_stream_start(output);
- streamlen=written;
- t2p_read_tiff_size_tile(t2p, input, i2);
- written += t2p_readwrite_pdf_image_tile(t2p, input, output, i2);
- t2p_write_advance_directory(t2p, output);
- if(t2p->t2p_error!=T2P_ERR_OK){return(0);}
- streamlen=written-streamlen;
- written += t2p_write_pdf_stream_end(output);
- written += t2p_write_pdf_obj_end(output);
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_stream_length(streamlen, output);
- written += t2p_write_pdf_obj_end(output);
- }
- } else {
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_stream_dict_start(output);
- written += t2p_write_pdf_xobject_stream_dict(
- 0,
- t2p,
- output);
- written += t2p_write_pdf_stream_dict_end(output);
- written += t2p_write_pdf_stream_start(output);
- streamlen=written;
- t2p_read_tiff_size(t2p, input);
- written += t2p_readwrite_pdf_image(t2p, input, output);
- t2p_write_advance_directory(t2p, output);
- if(t2p->t2p_error!=T2P_ERR_OK){return(0);}
- streamlen=written-streamlen;
- written += t2p_write_pdf_stream_end(output);
- written += t2p_write_pdf_obj_end(output);
- t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
- written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
- written += t2p_write_pdf_stream_length(streamlen, output);
- written += t2p_write_pdf_obj_end(output);
- }
- }
- t2p->pdf_startxref = written;
- written += t2p_write_pdf_xreftable(t2p, output);
- written += t2p_write_pdf_trailer(t2p, output);
- t2p_disable(output);
-
- return(written);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/tiff2ps.c b/tiff/tools/tiff2ps.c
deleted file mode 100755
index 7a9a816..0000000
--- a/tiff/tools/tiff2ps.c
+++ /dev/null
@@ -1,3082 +0,0 @@
-/* $Id: tiff2ps.c,v 1.52 2013-05-02 14:44:29 tgl Exp $ */
-
-/*
- * Copyright (c) 1988-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h> /* for atof */
-#include <math.h>
-#include <time.h>
-#include <string.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffio.h"
-
-/*
- * Revision history
- * 2013-Jan-21
- * Richard Nolde: Fix bug in auto rotate option code. Once a
- * rotation angle was set by the auto rotate check, it was
- * retained for all pages that followed instead of being
- * retested for each page.
- *
- * 2010-Sep-17
- * Richard Nolde: Reinstate code from Feb 2009 that never got
- * accepted into CVS with major modifications to handle -H and -W
- * options. Replaced original PlaceImage function with several
- * new functions that make support for multiple output pages
- * from a single image easier to understand. Added additional
- * warning messages for incompatible command line options.
- * Add new command line options to specify PageOrientation
- * Document Structuring Comment for landscape or portrait
- * and code to determine the values from ouput width and height
- * if not specified on the command line.
- * Add new command line option to specify document creator
- * as an alterntive to the string "tiff2ps" following model
- * of patch submitted by Thomas Jarosch for specifiying a
- * document title which is also supported now.
- *
- * 2009-Feb-11
- * Richard Nolde: Added support for rotations of 90, 180, 270
- * and auto using -r <90|180|270|auto>. Auto picks the best
- * fit for the image on the specified paper size (eg portrait
- * or landscape) if -h or -w is specified. Rotation is in
- * degrees counterclockwise since that is how Postscript does
- * it. The auto opption rotates the image 90 degrees ccw to
- * produce landscape if that is a better fit than portait.
- *
- * Cleaned up code in TIFF2PS and broke into smaller functions
- * to simplify rotations.
- *
- * Identified incompatible options and returned errors, eg
- * -i for imagemask operator is only available for Level2 or
- * Level3 Postscript in the current implmentation since there
- * is a difference in the way the operands are called for Level1
- * and there is no function to provide the Level1 version.
- * -H was not handled properly if -h and/or -w were specified.
- * It should only clip the masked images if the scaled image
- * exceeds the maxPageHeight specified with -H.
- *
- * New design allows for all of the following combinations:
- * Conversion of TIFF to Postscript with optional rotations
- * of 90, 180, 270, or auto degrees counterclockwise
- * Conversion of TIFF to Postscript with entire image scaled
- * to maximum of values spedified with -h or -w while
- * maintaining aspect ratio. Same rotations apply.
- * Conversion of TIFF to Postscript with clipping of output
- * viewport to height specified with -H, producing multiple
- * pages at this height and original width as needed.
- * Same rotations apply.
- * Conversion of TIFF to Postscript with image scaled to
- * maximum specified by -h and -w and the resulting scaled
- * image is presented in an output viewport clipped by -H height.
- * The same rotations apply.
- *
- * Added maxPageWidth option using -W flag. MaxPageHeight and
- * MaxPageWidth are mutually exclusive since the aspect ratio
- * cannot be maintained if you set both.
- * Rewrote PlaceImage to allow maxPageHeight and maxPageWidth
- * options to work with values smaller or larger than the
- * physical paper size and still preserve the aspect ratio.
- * This is accomplished by creating multiple pages across
- * as well as down if need be.
- *
- * 2001-Mar-21
- * I (Bruce A. Mallett) added this revision history comment ;)
- *
- * Fixed PS_Lvl2page() code which outputs non-ASCII85 raw
- * data. Moved test for when to output a line break to
- * *after* the output of a character. This just serves
- * to fix an eye-nuisance where the first line of raw
- * data was one character shorter than subsequent lines.
- *
- * Added an experimental ASCII85 encoder which can be used
- * only when there is a single buffer of bytes to be encoded.
- * This version is much faster at encoding a straight-line
- * buffer of data because it can avoid a lot of the loop
- * overhead of the byte-by-byte version. To use this version
- * you need to define EXP_ASCII85ENCODER (experimental ...).
- *
- * Added bug fix given by Michael Schmidt to PS_Lvl2page()
- * in which an end-of-data marker ('>') was not being output
- * when producing non-ASCII85 encoded PostScript Level 2
- * data.
- *
- * Fixed PS_Lvl2colorspace() so that it no longer assumes that
- * a TIFF having more than 2 planes is a CMYK. This routine
- * no longer looks at the samples per pixel but instead looks
- * at the "photometric" value. This change allows support of
- * CMYK TIFFs.
- *
- * Modified the PostScript L2 imaging loop so as to test if
- * the input stream is still open before attempting to do a
- * flushfile on it. This was done because some RIPs close
- * the stream after doing the image operation.
- *
- * Got rid of the realloc() being done inside a loop in the
- * PSRawDataBW() routine. The code now walks through the
- * byte-size array outside the loop to determine the largest
- * size memory block that will be needed.
- *
- * Added "-m" switch to ask tiff2ps to, where possible, use the
- * "imagemask" operator instead of the "image" operator.
- *
- * Added the "-i #" switch to allow interpolation to be disabled.
- *
- * Unrolled a loop or two to improve performance.
- */
-
-/*
- * Define EXP_ASCII85ENCODER if you want to use an experimental
- * version of the ASCII85 encoding routine. The advantage of
- * using this routine is that tiff2ps will convert to ASCII85
- * encoding at between 3 and 4 times the speed as compared to
- * using the old (non-experimental) encoder. The disadvantage
- * is that you will be using a new (and unproven) encoding
- * routine. So user beware, you have been warned!
- */
-
-#define EXP_ASCII85ENCODER
-
-/*
- * NB: this code assumes uint32 works with printf's %l[ud].
- */
-#ifndef TRUE
-#define TRUE 1
-#define FALSE 0
-#endif
-
-int ascii85 = FALSE; /* use ASCII85 encoding */
-int interpolate = TRUE; /* interpolate level2 image */
-int level2 = FALSE; /* generate PostScript level 2 */
-int level3 = FALSE; /* generate PostScript level 3 */
-int printAll = FALSE; /* print all images in file */
-int generateEPSF = TRUE; /* generate Encapsulated PostScript */
-int PSduplex = FALSE; /* enable duplex printing */
-int PStumble = FALSE; /* enable top edge binding */
-int PSavoiddeadzone = TRUE; /* enable avoiding printer deadzone */
-double maxPageHeight = 0; /* maximum height to select from image and print per page */
-double maxPageWidth = 0; /* maximum width to select from image and print per page */
-double splitOverlap = 0; /* amount for split pages to overlag */
-int rotation = 0; /* optional value for rotation angle */
-int auto_rotate = 0; /* rotate image for best fit on the page */
-char *filename = NULL; /* input filename */
-char *title = NULL; /* optional document title string */
-char *creator = NULL; /* optional document creator string */
-char pageOrientation[12]; /* set optional PageOrientation DSC to Landscape or Portrait */
-int useImagemask = FALSE; /* Use imagemask instead of image operator */
-uint16 res_unit = 0; /* Resolution units: 2 - inches, 3 - cm */
-
-/*
- * ASCII85 Encoding Support.
- */
-unsigned char ascii85buf[10];
-int ascii85count;
-int ascii85breaklen;
-
-int TIFF2PS(FILE*, TIFF*, double, double, double, double, int);
-void PSpage(FILE*, TIFF*, uint32, uint32);
-void PSColorContigPreamble(FILE*, uint32, uint32, int);
-void PSColorSeparatePreamble(FILE*, uint32, uint32, int);
-void PSDataColorContig(FILE*, TIFF*, uint32, uint32, int);
-void PSDataColorSeparate(FILE*, TIFF*, uint32, uint32, int);
-void PSDataPalette(FILE*, TIFF*, uint32, uint32);
-void PSDataBW(FILE*, TIFF*, uint32, uint32);
-void PSRawDataBW(FILE*, TIFF*, uint32, uint32);
-void Ascii85Init(void);
-void Ascii85Put(unsigned char code, FILE* fd);
-void Ascii85Flush(FILE* fd);
-void PSHead(FILE*, double, double, double, double);
-void PSTail(FILE*, int);
-int psStart(FILE *, int, int, int *, double *, double, double, double,
- double, double, double, double, double, double, double);
-int psPageSize(FILE *, int, double, double, double, double, double, double);
-int psRotateImage(FILE *, int, double, double, double, double);
-int psMaskImage(FILE *, TIFF *, int, int, int *, double, double,
- double, double, double, double, double, double, double);
-int psScaleImage(FILE *, double, int, int, double, double, double, double,
- double, double);
-int get_viewport (double, double, double, double, double *, double *, int);
-int exportMaskedImage(FILE *, double, double, double, double, int, int,
- double, double, double, int, int);
-
-#if defined( EXP_ASCII85ENCODER)
-tsize_t Ascii85EncodeBlock( uint8 * ascii85_p, unsigned f_eod, const uint8 * raw_p, tsize_t raw_l );
-#endif
-
-static void usage(int);
-
-int
-main(int argc, char* argv[])
-{
- int dirnum = -1, c, np = 0;
- int centered = 0;
- double bottommargin = 0;
- double leftmargin = 0;
- double pageWidth = 0;
- double pageHeight = 0;
- uint32 diroff = 0;
- extern char *optarg;
- extern int optind;
- FILE* output = stdout;
-
- pageOrientation[0] = '\0';
-
- while ((c = getopt(argc, argv, "b:d:h:H:W:L:i:w:l:o:O:P:C:r:t:acemxyzps1238DT")) != -1)
- switch (c) {
- case 'b':
- bottommargin = atof(optarg);
- break;
- case 'c':
- centered = 1;
- break;
- case 'C':
- creator = optarg;
- break;
- case 'd': /* without -a, this only processes one image at this IFD */
- dirnum = atoi(optarg);
- break;
- case 'D':
- PSduplex = TRUE;
- break;
- case 'i':
- interpolate = atoi(optarg) ? TRUE:FALSE;
- break;
- case 'T':
- PStumble = TRUE;
- break;
- case 'e':
- PSavoiddeadzone = FALSE;
- generateEPSF = TRUE;
- break;
- case 'h':
- pageHeight = atof(optarg);
- break;
- case 'H':
- maxPageHeight = atof(optarg);
- break;
- case 'W':
- maxPageWidth = atof(optarg);
- break;
- case 'L':
- splitOverlap = atof(optarg);
- break;
- case 'm':
- useImagemask = TRUE;
- break;
- case 'o':
- switch (optarg[0])
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9': diroff = (uint32) strtoul(optarg, NULL, 0);
- break;
- default: TIFFError ("-o", "Offset must be a numeric value.");
- exit (1);
- }
- break;
- case 'O': /* XXX too bad -o is already taken */
- output = fopen(optarg, "w");
- if (output == NULL) {
- fprintf(stderr,
- "%s: %s: Cannot open output file.\n",
- argv[0], optarg);
- exit(-2);
- }
- break;
- case 'P':
- switch (optarg[0])
- {
- case 'l':
- case 'L': strcpy (pageOrientation, "Landscape");
- break;
- case 'p':
- case 'P': strcpy (pageOrientation, "Portrait");
- break;
- default: TIFFError ("-P", "Page orientation must be Landscape or Portrait");
- exit (-1);
- }
- break;
- case 'l':
- leftmargin = atof(optarg);
- break;
- case 'a': /* removed fall through to generate warning below, R Nolde 09-01-2010 */
- printAll = TRUE;
- break;
- case 'p':
- generateEPSF = FALSE;
- break;
- case 'r':
- if (strcmp (optarg, "auto") == 0)
- {
- rotation = 0;
- auto_rotate = TRUE;
- }
- else
- {
- rotation = atoi(optarg);
- auto_rotate = FALSE;
- }
- switch (rotation)
- {
- case 0:
- case 90:
- case 180:
- case 270:
- break;
- default:
- fprintf (stderr, "Rotation angle must be 90, 180, 270 (degrees ccw) or auto\n");
- exit (-1);
- }
- break;
- case 's':
- printAll = FALSE;
- break;
- case 't':
- title = optarg;
- break;
- case 'w':
- pageWidth = atof(optarg);
- break;
- case 'z':
- PSavoiddeadzone = FALSE;
- break;
- case '1':
- level2 = FALSE;
- level3 = FALSE;
- ascii85 = FALSE;
- break;
- case '2':
- level2 = TRUE;
- ascii85 = TRUE; /* default to yes */
- break;
- case '3':
- level3 = TRUE;
- ascii85 = TRUE; /* default to yes */
- break;
- case '8':
- ascii85 = FALSE;
- break;
- case 'x':
- res_unit = RESUNIT_CENTIMETER;
- break;
- case 'y':
- res_unit = RESUNIT_INCH;
- break;
- case '?':
- usage(-1);
- }
-
- if (useImagemask == TRUE)
- {
- if ((level2 == FALSE) && (level3 == FALSE))
- {
- TIFFError ("-m "," imagemask operator requres Postscript Level2 or Level3");
- exit (1);
- }
- }
-
- if (pageWidth && (maxPageWidth > pageWidth))
- {
- TIFFError ("-W", "Max viewport width cannot exceed page width");
- exit (1);
- }
-
- if (pageHeight && (maxPageHeight > pageHeight))
- {
- TIFFError ("-H", "Max viewport height cannot exceed page height");
- exit (1);
- }
-
- /* auto rotate requires a specified page width and height */
- if (auto_rotate == TRUE)
- {
- /*
- if ((pageWidth == 0) || (pageHeight == 0))
- TIFFWarning ("-r auto", " requires page height and width specified with -h and -w");
- */
- if ((maxPageWidth > 0) || (maxPageHeight > 0))
- {
- TIFFError ("-r auto", " is incompatible with maximum page width/height specified by -H or -W");
- exit (1);
- }
- }
- if ((maxPageWidth > 0) && (maxPageHeight > 0))
- {
- TIFFError ("-H and -W", " Use only one of -H or -W to define a viewport");
- exit (1);
- }
-
- if ((generateEPSF == TRUE) && (printAll == TRUE))
- {
- TIFFError(" -e and -a", "Warning: Cannot generate Encapsulated Postscript for multiple images");
- generateEPSF = FALSE;
- }
-
- if ((generateEPSF == TRUE) && (PSduplex == TRUE))
- {
- TIFFError(" -e and -D", "Warning: Encapsulated Postscript does not support Duplex option");
- PSduplex = FALSE;
- }
-
- if ((generateEPSF == TRUE) && (PStumble == TRUE))
- {
- TIFFError(" -e and -T", "Warning: Encapsulated Postscript does not support Top Edge Binding option");
- PStumble = FALSE;
- }
-
- if ((generateEPSF == TRUE) && (PSavoiddeadzone == TRUE))
- PSavoiddeadzone = FALSE;
-
- for (; argc - optind > 0; optind++) {
- TIFF* tif = TIFFOpen(filename = argv[optind], "r");
- if (tif != NULL) {
- if (dirnum != -1
- && !TIFFSetDirectory(tif, (tdir_t)dirnum))
- return (-1);
- else if (diroff != 0 &&
- !TIFFSetSubDirectory(tif, diroff))
- return (-1);
- np = TIFF2PS(output, tif, pageWidth, pageHeight,
- leftmargin, bottommargin, centered);
- if (np < 0)
- {
- TIFFError("Error", "Unable to process %s", filename);
- }
- TIFFClose(tif);
- }
- }
- if (np)
- PSTail(output, np);
- else
- usage(-1);
- if (output != stdout)
- fclose(output);
- return (0);
-}
-
-static uint16 samplesperpixel;
-static uint16 bitspersample;
-static uint16 planarconfiguration;
-static uint16 photometric;
-static uint16 compression;
-static uint16 extrasamples;
-static int alpha;
-
-static int
-checkImage(TIFF* tif)
-{
- switch (photometric) {
- case PHOTOMETRIC_YCBCR:
- if ((compression == COMPRESSION_JPEG || compression == COMPRESSION_OJPEG)
- && planarconfiguration == PLANARCONFIG_CONTIG) {
- /* can rely on libjpeg to convert to RGB */
- TIFFSetField(tif, TIFFTAG_JPEGCOLORMODE,
- JPEGCOLORMODE_RGB);
- photometric = PHOTOMETRIC_RGB;
- } else {
- if (level2 || level3)
- break;
- TIFFError(filename, "Can not handle image with %s",
- "PhotometricInterpretation=YCbCr");
- return (0);
- }
- /* fall thru... */
- case PHOTOMETRIC_RGB:
- if (alpha && bitspersample != 8) {
- TIFFError(filename,
- "Can not handle %d-bit/sample RGB image with alpha",
- bitspersample);
- return (0);
- }
- /* fall thru... */
- case PHOTOMETRIC_SEPARATED:
- case PHOTOMETRIC_PALETTE:
- case PHOTOMETRIC_MINISBLACK:
- case PHOTOMETRIC_MINISWHITE:
- break;
- case PHOTOMETRIC_LOGL:
- case PHOTOMETRIC_LOGLUV:
- if (compression != COMPRESSION_SGILOG &&
- compression != COMPRESSION_SGILOG24) {
- TIFFError(filename,
- "Can not handle %s data with compression other than SGILog",
- (photometric == PHOTOMETRIC_LOGL) ?
- "LogL" : "LogLuv"
- );
- return (0);
- }
- /* rely on library to convert to RGB/greyscale */
- TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT);
- photometric = (photometric == PHOTOMETRIC_LOGL) ?
- PHOTOMETRIC_MINISBLACK : PHOTOMETRIC_RGB;
- bitspersample = 8;
- break;
- case PHOTOMETRIC_CIELAB:
- /* fall thru... */
- default:
- TIFFError(filename,
- "Can not handle image with PhotometricInterpretation=%d",
- photometric);
- return (0);
- }
- switch (bitspersample) {
- case 1: case 2:
- case 4: case 8:
- case 16:
- break;
- default:
- TIFFError(filename, "Can not handle %d-bit/sample image",
- bitspersample);
- return (0);
- }
- if (planarconfiguration == PLANARCONFIG_SEPARATE && extrasamples > 0)
- TIFFWarning(filename, "Ignoring extra samples");
- return (1);
-}
-
-#define PS_UNIT_SIZE 72.0F
-#define PSUNITS(npix,res) ((npix) * (PS_UNIT_SIZE / (res)))
-
-static char RGBcolorimage[] = "\
-/bwproc {\n\
- rgbproc\n\
- dup length 3 idiv string 0 3 0\n\
- 5 -1 roll {\n\
- add 2 1 roll 1 sub dup 0 eq {\n\
- pop 3 idiv\n\
- 3 -1 roll\n\
- dup 4 -1 roll\n\
- dup 3 1 roll\n\
- 5 -1 roll put\n\
- 1 add 3 0\n\
- } { 2 1 roll } ifelse\n\
- } forall\n\
- pop pop pop\n\
-} def\n\
-/colorimage where {pop} {\n\
- /colorimage {pop pop /rgbproc exch def {bwproc} image} bind def\n\
-} ifelse\n\
-";
-
-/*
- * Adobe Photoshop requires a comment line of the form:
- *
- * %ImageData: <cols> <rows> <depth> <main channels> <pad channels>
- * <block size> <1 for binary|2 for hex> "data start"
- *
- * It is claimed to be part of some future revision of the EPS spec.
- */
-static void
-PhotoshopBanner(FILE* fd, uint32 w, uint32 h, int bs, int nc, char* startline)
-{
- fprintf(fd, "%%ImageData: %ld %ld %d %d 0 %d 2 \"",
- (long) w, (long) h, bitspersample, nc, bs);
- fprintf(fd, startline, nc);
- fprintf(fd, "\"\n");
-}
-
-/* Convert pixel width and height pw, ph, to points pprw, pprh
- * using image resolution and resolution units from TIFF tags.
- * pw : image width in pixels
- * ph : image height in pixels
- * pprw : image width in PS units (72 dpi)
- * pprh : image height in PS units (72 dpi)
- */
-static void
-setupPageState(TIFF* tif, uint32* pw, uint32* ph, double* pprw, double* pprh)
-{
- float xres = 0.0F, yres = 0.0F;
-
- TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, pw);
- TIFFGetField(tif, TIFFTAG_IMAGELENGTH, ph);
- if (res_unit == 0) /* Not specified as command line option */
- if (!TIFFGetFieldDefaulted(tif, TIFFTAG_RESOLUTIONUNIT, &res_unit))
- res_unit = RESUNIT_INCH;
- /*
- * Calculate printable area.
- */
- if (!TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres)
- || fabs(xres) < 0.0000001)
- xres = PS_UNIT_SIZE;
- if (!TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres)
- || fabs(yres) < 0.0000001)
- yres = PS_UNIT_SIZE;
- switch (res_unit) {
- case RESUNIT_CENTIMETER:
- xres *= 2.54F, yres *= 2.54F;
- break;
- case RESUNIT_INCH:
- break;
- case RESUNIT_NONE: /* Subsequent code assumes we have converted to inches! */
- res_unit = RESUNIT_INCH;
- break;
- default: /* Last ditch guess for unspecified RESUNIT case
- * check that the resolution is not inches before scaling it.
- * Moved to end of function with additional check, RJN, 08-31-2010
- * if (xres != PS_UNIT_SIZE || yres != PS_UNIT_SIZE)
- * xres *= PS_UNIT_SIZE, yres *= PS_UNIT_SIZE;
- */
- break;
- }
- /* This is a hack to deal with images that have no meaningful Resolution Size
- * but may have x and/or y resolutions of 1 pixel per undefined unit.
- */
- if ((xres > 1.0) && (xres != PS_UNIT_SIZE))
- *pprw = PSUNITS(*pw, xres);
- else
- *pprw = PSUNITS(*pw, PS_UNIT_SIZE);
- if ((yres > 1.0) && (yres != PS_UNIT_SIZE))
- *pprh = PSUNITS(*ph, yres);
- else
- *pprh = PSUNITS(*ph, PS_UNIT_SIZE);
-}
-
-static int
-isCCITTCompression(TIFF* tif)
-{
- uint16 compress;
- TIFFGetField(tif, TIFFTAG_COMPRESSION, &compress);
- return (compress == COMPRESSION_CCITTFAX3 ||
- compress == COMPRESSION_CCITTFAX4 ||
- compress == COMPRESSION_CCITTRLE ||
- compress == COMPRESSION_CCITTRLEW);
-}
-
-static tsize_t tf_bytesperrow;
-static tsize_t ps_bytesperrow;
-static tsize_t tf_rowsperstrip;
-static tsize_t tf_numberstrips;
-static char *hex = "0123456789abcdef";
-
-/*
- * Pagewidth and pageheight are the output size in points,
- * may refer to values specified with -h and -w, or to
- * values read from the image if neither -h nor -w are used.
- * Imagewidth and imageheight are image size in points.
- * Ximages and Yimages are number of pages across and down.
- * Only one of maxPageHeight or maxPageWidth can be used.
- * These are global variables unfortunately.
- */
-int get_subimage_count(double pagewidth, double pageheight,
- double imagewidth, double imageheight,
- int *ximages, int *yimages,
- int rotation, double scale)
-{
- int pages = 1;
- double splitheight = 0; /* Requested Max Height in points */
- double splitwidth = 0; /* Requested Max Width in points */
- double overlap = 0; /* Repeated edge width in points */
-
- splitheight = maxPageHeight * PS_UNIT_SIZE;
- splitwidth = maxPageWidth * PS_UNIT_SIZE;
- overlap = splitOverlap * PS_UNIT_SIZE;
- pagewidth *= PS_UNIT_SIZE;
- pageheight *= PS_UNIT_SIZE;
-
- if ((imagewidth < 1.0) || (imageheight < 1.0))
- {
- TIFFError("get_subimage_count", "Invalid image width or height");
- return (0);
- }
-
- switch (rotation)
- {
- case 0:
- case 180: if (splitheight > 0) /* -H maxPageHeight */
- {
- if (imageheight > splitheight) /* More than one vertical image segment */
- {
- if (pagewidth)
- *ximages = (int)ceil((scale * imagewidth) / (pagewidth - overlap));
- else
- *ximages = 1;
- *yimages = (int)ceil((scale * imageheight) / (splitheight - overlap)); /* Max vert pages needed */
- }
- else
- {
- if (pagewidth)
- *ximages = (int)ceil((scale * imagewidth) / (pagewidth - overlap)); /* Max horz pages needed */
- else
- *ximages = 1;
- *yimages = 1; /* Max vert pages needed */
- }
- }
- else
- {
- if (splitwidth > 0) /* -W maxPageWidth */
- {
- if (imagewidth >splitwidth)
- {
- *ximages = (int)ceil((scale * imagewidth) / (splitwidth - overlap)); /* Max horz pages needed */
- if (pageheight)
- *yimages = (int)ceil((scale * imageheight) / (pageheight - overlap)); /* Max vert pages needed */
- else
- *yimages = 1;
- }
- else
- {
- *ximages = 1; /* Max vert pages needed */
- if (pageheight)
- *yimages = (int)ceil((scale * imageheight) / (pageheight - overlap)); /* Max vert pages needed */
- else
- *yimages = 1;
- }
- }
- else
- {
- *ximages = 1;
- *yimages = 1;
- }
- }
- break;
- case 90:
- case 270: if (splitheight > 0) /* -H maxPageHeight */
- {
- if (imagewidth > splitheight) /* More than one vertical image segment */
- {
- *yimages = (int)ceil((scale * imagewidth) / (splitheight - overlap)); /* Max vert pages needed */
- if (pagewidth)
- *ximages = (int)ceil((scale * imageheight) / (pagewidth - overlap)); /* Max horz pages needed */
- else
- *ximages = 1;
- }
- else
- {
- *yimages = 1; /* Max vert pages needed */
- if (pagewidth)
- *ximages = (int)ceil((scale * imageheight) / (pagewidth - overlap)); /* Max horz pages needed */
- else
- *ximages = 1;
- }
- }
- else
- {
- if (splitwidth > 0) /* -W maxPageWidth */
- {
- if (imageheight > splitwidth)
- {
- if (pageheight)
- *yimages = (int)ceil((scale * imagewidth) / (pageheight - overlap)); /* Max vert pages needed */
- else
- *yimages = 1;
- *ximages = (int)ceil((scale * imageheight) / (splitwidth - overlap)); /* Max horz pages needed */
- }
- else
- {
- if (pageheight)
- *yimages = (int)ceil((scale * imagewidth) / (pageheight - overlap)); /* Max horz pages needed */
- else
- *yimages = 1;
- *ximages = 1; /* Max vert pages needed */
- }
- }
- else
- {
- *ximages = 1;
- *yimages = 1;
- }
- }
- break;
- default: *ximages = 1;
- *yimages = 1;
- }
- pages = (*ximages) * (*yimages);
- return (pages);
- }
-
-/* New version of PlaceImage that handles only the translation and rotation
- * for a single output page.
- */
-int exportMaskedImage(FILE *fp, double pagewidth, double pageheight,
- double imagewidth, double imageheight,
- int row, int column,
- double left_offset, double bott_offset,
- double scale, int center, int rotation)
- {
- double xtran = 0.0;
- double ytran = 0.0;
-
- double xscale = 1.0;
- double yscale = 1.0;
-
- double splitheight = 0; /* Requested Max Height in points */
- double splitwidth = 0; /* Requested Max Width in points */
- double overlap = 0; /* Repeated edge width in points */
- double subimage_height = 0.0;
-
- splitheight = maxPageHeight * PS_UNIT_SIZE;
- splitwidth = maxPageWidth * PS_UNIT_SIZE;
- overlap = splitOverlap * PS_UNIT_SIZE;
- xscale = scale * imagewidth;
- yscale = scale * imageheight;
-
- if ((xscale < 0.0) || (yscale < 0.0))
- {
- TIFFError("exportMaskedImage", "Invalid parameters.");
- return (-1);
- }
-
- /* If images are cropped to a vewport with -H or -W, the output pages are shifted to
- * the top of each output page rather than the Postscript default lower edge.
- */
- switch (rotation)
- {
- case 0:
- case 180: if (splitheight > 0) /* -H maxPageHeight */
- {
- if (splitheight < imageheight) /* More than one vertical image segments */
- {
- xtran = -1.0 * column * (pagewidth - overlap);
- subimage_height = imageheight - ((splitheight - overlap) * row);
- ytran = pageheight - subimage_height * (pageheight / splitheight);
- }
- else /* Only one page in vertical direction */
- {
- xtran = -1.0 * column * (pagewidth - overlap);
- ytran = splitheight - imageheight;
- }
- }
- else
- {
- if (splitwidth > 0) /* maxPageWidth */
- {
- if (splitwidth < imagewidth)
- {
- xtran = -1.0 * column * splitwidth;
- ytran = -1.0 * row * (pageheight - overlap);
- }
- else /* Only one page in horizontal direction */
- {
- ytran = -1.0 * row * (pageheight - overlap);
- xtran = 0;
- }
- }
- else /* Simple case, no splitting */
- {
- ytran = pageheight - imageheight;
- xtran = 0;
- }
- }
- bott_offset += ytran / (center ? 2 : 1);
- left_offset += xtran / (center ? 2 : 1);
- break;
- case 90:
- case 270: if (splitheight > 0) /* -H maxPageHeight */
- {
- if (splitheight < imagewidth) /* More than one vertical image segments */
- {
- xtran = -1.0 * column * (pageheight - overlap);
- /* Commented code places image at bottom of page instead of top.
- ytran = -1.0 * row * splitheight;
- */
- if (row == 0)
- ytran = -1.0 * (imagewidth - splitheight);
- else
- ytran = -1.0 * (imagewidth - (splitheight - overlap) * (row + 1));
- }
- else /* Only one page in vertical direction */
- {
- xtran = -1.0 * column * (pageheight - overlap);
- ytran = splitheight - imagewidth;
- }
- }
- else
- {
- if (splitwidth > 0) /* maxPageWidth */
- {
- if (splitwidth < imageheight)
- {
- xtran = -1.0 * column * splitwidth;
- ytran = -1.0 * row * (pagewidth - overlap);
- }
- else /* Only one page in horizontal direction */
- {
- ytran = -1.0 * row * (pagewidth - overlap);
- xtran = 0;
- }
- }
- else /* Simple case, no splitting */
- {
- ytran = pageheight - imageheight;
- xtran = 0; /* pagewidth - imagewidth; */
- }
- }
- bott_offset += ytran / (center ? 2 : 1);
- left_offset += xtran / (center ? 2 : 1);
- break;
- default: xtran = 0;
- ytran = 0;
- }
-
- switch (rotation)
- {
- case 0: fprintf(fp, "%f %f translate\n", left_offset, bott_offset);
- fprintf(fp, "%f %f scale\n", xscale, yscale);
- break;
- case 180: fprintf(fp, "%f %f translate\n", left_offset, bott_offset);
- fprintf(fp, "%f %f scale\n1 1 translate 180 rotate\n", xscale, yscale);
- break;
- case 90: fprintf(fp, "%f %f translate\n", left_offset, bott_offset);
- fprintf(fp, "%f %f scale\n1 0 translate 90 rotate\n", yscale, xscale);
- break;
- case 270: fprintf(fp, "%f %f translate\n", left_offset, bott_offset);
- fprintf(fp, "%f %f scale\n0 1 translate 270 rotate\n", yscale, xscale);
- break;
- default: TIFFError ("exportMaskedImage", "Unsupported rotation angle %d. No rotation", rotation);
- fprintf( fp, "%f %f scale\n", xscale, yscale);
- break;
- }
-
- return (0);
- }
-
-/* Rotate an image without scaling or clipping */
-int psRotateImage (FILE * fd, int rotation, double pswidth, double psheight,
- double left_offset, double bottom_offset)
- {
- if ((left_offset != 0.0) || (bottom_offset != 0))
- fprintf (fd, "%f %f translate\n", left_offset, bottom_offset);
-
- /* Exchange width and height for 90/270 rotations */
- switch (rotation)
- {
- case 0: fprintf (fd, "%f %f scale\n", pswidth, psheight);
- break;
- case 90: fprintf (fd, "%f %f scale\n1 0 translate 90 rotate\n", psheight, pswidth);
- break;
- case 180: fprintf (fd, "%f %f scale\n1 1 translate 180 rotate\n", pswidth, psheight);
- break;
- case 270: fprintf (fd, "%f %f scale\n0 1 translate 270 rotate\n", psheight, pswidth);
- break;
- default: TIFFError ("psRotateImage", "Unsupported rotation %d.", rotation);
- fprintf( fd, "%f %f scale\n", pswidth, psheight);
- return (1);
- }
- return (0);
- }
-
-/* Scale and rotate an image to a single output page. */
-int psScaleImage(FILE * fd, double scale, int rotation, int center,
- double reqwidth, double reqheight, double pswidth, double psheight,
- double left_offset, double bottom_offset)
- {
- double hcenter = 0.0, vcenter = 0.0;
-
- /* Adjust offsets for centering */
- if (center)
- {
- switch (rotation)
- {
- case 90: vcenter = (reqheight - pswidth * scale) / 2;
- hcenter = (reqwidth - psheight * scale) / 2;
- fprintf (fd, "%f %f translate\n", hcenter, vcenter);
- fprintf (fd, "%f %f scale\n1 0 translate 90 rotate\n", psheight * scale, pswidth * scale);
- break;
- case 180: hcenter = (reqwidth - pswidth * scale) / 2;
- vcenter = (reqheight - psheight * scale) / 2;
- fprintf (fd, "%f %f translate\n", hcenter, vcenter);
- fprintf (fd, "%f %f scale\n1 1 translate 180 rotate\n", pswidth * scale, psheight * scale);
- break;
- case 270: vcenter = (reqheight - pswidth * scale) / 2;
- hcenter = (reqwidth - psheight * scale) / 2;
- fprintf (fd, "%f %f translate\n", hcenter, vcenter);
- fprintf (fd, "%f %f scale\n0 1 translate 270 rotate\n", psheight * scale, pswidth * scale);
- break;
- case 0:
- default: hcenter = (reqwidth - pswidth * scale) / 2;
- vcenter = (reqheight - psheight * scale) / 2;
- fprintf (fd, "%f %f translate\n", hcenter, vcenter);
- fprintf (fd, "%f %f scale\n", pswidth * scale, psheight * scale);
- break;
- }
- }
- else /* Not centered */
- {
- switch (rotation)
- {
- case 0: fprintf (fd, "%f %f translate\n", left_offset ? left_offset : 0.0,
- bottom_offset ? bottom_offset : reqheight - (psheight * scale));
- fprintf (fd, "%f %f scale\n", pswidth * scale, psheight * scale);
- break;
- case 90: fprintf (fd, "%f %f translate\n", left_offset ? left_offset : 0.0,
- bottom_offset ? bottom_offset : reqheight - (pswidth * scale));
- fprintf (fd, "%f %f scale\n1 0 translate 90 rotate\n", psheight * scale, pswidth * scale);
- break;
- case 180: fprintf (fd, "%f %f translate\n", left_offset ? left_offset : 0.0,
- bottom_offset ? bottom_offset : reqheight - (psheight * scale));
- fprintf (fd, "%f %f scale\n1 1 translate 180 rotate\n", pswidth * scale, psheight * scale);
- break;
- case 270: fprintf (fd, "%f %f translate\n", left_offset ? left_offset : 0.0,
- bottom_offset ? bottom_offset : reqheight - (pswidth * scale));
- fprintf (fd, "%f %f scale\n0 1 translate 270 rotate\n", psheight * scale, pswidth * scale);
- break;
- default: TIFFError ("psScaleImage", "Unsupported rotation %d", rotation);
- fprintf (fd, "%f %f scale\n", pswidth * scale, psheight * scale);
- return (1);
- }
- }
-
- return (0);
- }
-
-/* This controls the visible portion of the page which is displayed.
- * N.B. Setting maxPageHeight no longer sets pageheight if not set explicitly
- */
-int psPageSize (FILE * fd, int rotation, double pgwidth, double pgheight,
- double reqwidth, double reqheight, double pswidth, double psheight)
- {
- double xscale = 1.0, yscale = 1.0, scale = 1.0;
- double splitheight;
- double splitwidth;
- double new_width;
- double new_height;
-
- splitheight = maxPageHeight * PS_UNIT_SIZE;
- splitwidth = maxPageWidth * PS_UNIT_SIZE;
-
- switch (rotation)
- {
- case 0:
- case 180: if ((splitheight > 0) || (splitwidth > 0))
- {
- if (pgwidth != 0 || pgheight != 0)
- {
- xscale = reqwidth / (splitwidth ? splitwidth : pswidth);
- yscale = reqheight / (splitheight ? splitheight : psheight);
- scale = (xscale < yscale) ? xscale : yscale;
- }
- new_width = splitwidth ? splitwidth : scale * pswidth;
- new_height = splitheight ? splitheight : scale * psheight;
- if (strlen(pageOrientation))
- fprintf (fd, "%%%%PageOrientation: %s\n", pageOrientation);
- else
- fprintf (fd, "%%%%PageOrientation: %s\n", (new_width > new_height) ? "Landscape" : "Portrait");
- fprintf (fd, "%%%%PageBoundingBox: 0 0 %ld %ld\n", (long)new_width, (long)new_height);
- fprintf (fd, "1 dict begin /PageSize [ %f %f ] def currentdict end setpagedevice\n",
- new_width, new_height);
- }
- else /* No viewport defined with -H or -W */
- {
- if ((pgwidth == 0) && (pgheight == 0)) /* Image not scaled */
- {
- if (strlen(pageOrientation))
- fprintf (fd, "%%%%PageOrientation: %s\n", pageOrientation);
- else
- fprintf (fd, "%%%%PageOrientation: %s\n", (pswidth > psheight) ? "Landscape" : "Portrait");
- fprintf (fd, "%%%%PageBoundingBox: 0 0 %ld %ld\n", (long)pswidth, (long)psheight);
- fprintf(fd, "1 dict begin /PageSize [ %f %f ] def currentdict end setpagedevice\n",
- pswidth, psheight);
- }
- else /* Image scaled */
- {
- if (strlen(pageOrientation))
- fprintf (fd, "%%%%PageOrientation: %s\n", pageOrientation);
- else
- fprintf (fd, "%%%%PageOrientation: %s\n", (reqwidth > reqheight) ? "Landscape" : "Portrait");
- fprintf (fd, "%%%%PageBoundingBox: 0 0 %ld %ld\n", (long)reqwidth, (long)reqheight);
- fprintf(fd, "1 dict begin /PageSize [ %f %f ] def currentdict end setpagedevice\n",
- reqwidth, reqheight);
- }
- }
- break;
- case 90:
- case 270: if ((splitheight > 0) || (splitwidth > 0))
- {
- if (pgwidth != 0 || pgheight != 0)
- {
- xscale = reqwidth / (splitwidth ? splitwidth : pswidth);
- yscale = reqheight / (splitheight ? splitheight : psheight);
- scale = (xscale < yscale) ? xscale : yscale;
- }
- new_width = splitwidth ? splitwidth : scale * psheight;
- new_height = splitheight ? splitheight : scale * pswidth;
-
- if (strlen(pageOrientation))
- fprintf (fd, "%%%%PageOrientation: %s\n", pageOrientation);
- else
- fprintf (fd, "%%%%PageOrientation: %s\n", (new_width > new_height) ? "Landscape" : "Portrait");
- fprintf (fd, "%%%%PageBoundingBox: 0 0 %ld %ld\n", (long)new_width, (long)new_height);
- fprintf (fd, "1 dict begin /PageSize [ %f %f ] def currentdict end setpagedevice\n",
- new_width, new_height);
- }
- else
- {
- if ((pgwidth == 0) && (pgheight == 0)) /* Image not scaled */
- {
- if (strlen(pageOrientation))
- fprintf (fd, "%%%%PageOrientation: %s\n", pageOrientation);
- else
- fprintf (fd, "%%%%PageOrientation: %s\n", (psheight > pswidth) ? "Landscape" : "Portrait");
- fprintf (fd, "%%%%PageBoundingBox: 0 0 %ld %ld\n", (long)psheight, (long)pswidth);
- fprintf(fd, "1 dict begin /PageSize [ %f %f ] def currentdict end setpagedevice\n",
- psheight, pswidth);
- }
- else /* Image scaled */
- {
- if (strlen(pageOrientation))
- fprintf (fd, "%%%%PageOrientation: %s\n", pageOrientation);
- else
- fprintf (fd, "%%%%PageOrientation: %s\n", (reqwidth > reqheight) ? "Landscape" : "Portrait");
- fprintf (fd, "%%%%PageBoundingBox: 0 0 %ld %ld\n", (long)reqwidth, (long)reqheight);
- fprintf(fd, "1 dict begin /PageSize [ %f %f ] def currentdict end setpagedevice\n",
- reqwidth, reqheight);
- }
- }
- break;
- default: TIFFError ("psPageSize", "Invalid rotation %d", rotation);
- return (1);
- }
- fputs("<<\n /Policies <<\n /PageSize 3\n >>\n>> setpagedevice\n", fd);
-
- return (0);
- } /* end psPageSize */
-
-/* Mask an image as a series of pages, each only showing a section defined
- * by the maxPageHeight or maxPageWidth options.
- */
-int psMaskImage(FILE *fd, TIFF *tif, int rotation, int center,
- int *npages, double pixwidth, double pixheight,
- double left_margin, double bottom_margin,
- double pgwidth, double pgheight,
- double pswidth, double psheight, double scale)
- {
- int i, j;
- int ximages = 1, yimages = 1;
- int pages = *npages;
- double view_width = 0;
- double view_height = 0;
-
- if (get_viewport (pgwidth, pgheight, pswidth, psheight, &view_width, &view_height, rotation))
- {
- TIFFError ("get_viewport", "Unable to set image viewport");
- return (-1);
- }
-
- if (get_subimage_count(pgwidth, pgheight, pswidth, psheight,
- &ximages, &yimages, rotation, scale) < 1)
- {
- TIFFError("get_subimage_count", "Invalid image count: %d columns, %d rows", ximages, yimages);
- return (-1);
- }
-
- for (i = 0; i < yimages; i++)
- {
- for (j = 0; j < ximages; j++)
- {
- pages++;
- *npages = pages;
- fprintf(fd, "%%%%Page: %d %d\n", pages, pages);
-
- /* Write out the PageSize info for non EPS files */
- if (!generateEPSF && ( level2 || level3 ))
- {
- if (psPageSize(fd, rotation, pgwidth, pgheight,
- view_width, view_height, pswidth, psheight))
- return (-1);
- }
- fprintf(fd, "gsave\n");
- fprintf(fd, "100 dict begin\n");
- if (exportMaskedImage(fd, view_width, view_height, pswidth, psheight,
- i, j, left_margin, bottom_margin,
- scale, center, rotation))
- {
- TIFFError("exportMaskedImage", "Invalid image parameters.");
- return (-1);
- }
- PSpage(fd, tif, pixwidth, pixheight);
- fprintf(fd, "end\n");
- fprintf(fd, "grestore\n");
- fprintf(fd, "showpage\n");
- }
- }
-
- return (pages);
- }
-
-/* Compute scale factor and write out file header */
-int psStart(FILE *fd, int npages, int auto_rotate, int *rotation, double *scale,
- double ox, double oy, double pgwidth, double pgheight,
- double reqwidth, double reqheight, double pswidth, double psheight,
- double left_offset, double bottom_offset)
- {
- double maxsource = 0.0; /* Used for auto rotations */
- double maxtarget = 0.0;
- double xscale = 1.0, yscale = 1.0;
- double splitheight;
- double splitwidth;
- double view_width = 0.0, view_height = 0.0;
- double page_width = 0.0, page_height = 0.0;
-
- /* Splitheight and splitwidth are in inches */
- splitheight = maxPageHeight * PS_UNIT_SIZE;
- splitwidth = maxPageWidth * PS_UNIT_SIZE;
-
- page_width = pgwidth * PS_UNIT_SIZE;
- page_height = pgheight * PS_UNIT_SIZE;
-
- /* If user has specified a page width and height and requested the
- * image to be auto-rotated to fit on that media, we match the
- * longest dimension of the image to the longest dimension of the
- * target media but we have to ignore auto rotate if user specified
- * maxPageHeight since this makes life way too complicated. */
- if (auto_rotate)
- {
- if ((splitheight != 0) || (splitwidth != 0))
- {
- TIFFError ("psStart", "Auto-rotate is incompatible with page splitting ");
- return (1);
- }
-
- /* Find longest edges in image and output media */
- maxsource = (pswidth >= psheight) ? pswidth : psheight;
- maxtarget = (reqwidth >= reqheight) ? reqwidth : reqheight;
-
- if (((maxsource == pswidth) && (maxtarget != reqwidth)) ||
- ((maxsource == psheight) && (maxtarget != reqheight)))
- { /* optimal orientaion does not match input orientation */
- *rotation = 90;
- xscale = (reqwidth - left_offset)/psheight;
- yscale = (reqheight - bottom_offset)/pswidth;
- }
- else /* optimal orientaion matches input orientation */
- {
- xscale = (reqwidth - left_offset)/pswidth;
- yscale = (reqheight - bottom_offset)/psheight;
- }
- *scale = (xscale < yscale) ? xscale : yscale;
-
- /* Do not scale image beyound original size */
- if (*scale > 1.0)
- *scale = 1.0;
-
- /* Set the size of the displayed image to requested page size
- * and optimal orientation.
- */
- if (!npages)
- PSHead(fd, reqwidth, reqheight, ox, oy);
-
- return (0);
- }
-
- /* N.B. If pgwidth or pgheight are set from maxPageHeight/Width,
- * we have a problem with the tests below under splitheight.
- */
-
- switch (*rotation) /* Auto rotate has NOT been specified */
- {
- case 0:
- case 180: if ((splitheight != 0) || (splitwidth != 0))
- { /* Viewport clipped to maxPageHeight or maxPageWidth */
- if ((page_width != 0) || (page_height != 0)) /* Image scaled */
- {
- xscale = (reqwidth - left_offset) / (page_width ? page_width : pswidth);
- yscale = (reqheight - bottom_offset) / (page_height ? page_height : psheight);
- *scale = (xscale < yscale) ? xscale : yscale;
- /*
- if (*scale > 1.0)
- *scale = 1.0;
- */
- }
- else /* Image clipped but not scaled */
- *scale = 1.0;
-
- view_width = splitwidth ? splitwidth : *scale * pswidth;
- view_height = splitheight ? splitheight: *scale * psheight;
- }
- else /* Viewport not clipped to maxPageHeight or maxPageWidth */
- {
- if ((page_width != 0) || (page_height != 0))
- { /* Image scaled */
- xscale = (reqwidth - left_offset) / pswidth;
- yscale = (reqheight - bottom_offset) / psheight;
-
- view_width = reqwidth;
- view_height = reqheight;
- }
- else
- { /* Image not scaled */
- xscale = (pswidth - left_offset)/pswidth;
- yscale = (psheight - bottom_offset)/psheight;
-
- view_width = pswidth;
- view_height = psheight;
- }
- }
- break;
- case 90:
- case 270: if ((splitheight != 0) || (splitwidth != 0))
- { /* Viewport clipped to maxPageHeight or maxPageWidth */
- if ((page_width != 0) || (page_height != 0)) /* Image scaled */
- {
- xscale = (reqwidth - left_offset)/ psheight;
- yscale = (reqheight - bottom_offset)/ pswidth;
- *scale = (xscale < yscale) ? xscale : yscale;
- /*
- if (*scale > 1.0)
- *scale = 1.0;
- */
- }
- else /* Image clipped but not scaled */
- *scale = 1.0;
- view_width = splitwidth ? splitwidth : *scale * psheight;
- view_height = splitheight ? splitheight : *scale * pswidth;
- }
- else /* Viewport not clipped to maxPageHeight or maxPageWidth */
- {
- if ((page_width != 0) || (page_height != 0)) /* Image scaled */
- {
- xscale = (reqwidth - left_offset) / psheight;
- yscale = (reqheight - bottom_offset) / pswidth;
-
- view_width = reqwidth;
- view_height = reqheight;
- }
- else
- {
- xscale = (pswidth - left_offset)/ psheight;
- yscale = (psheight - bottom_offset)/ pswidth;
-
- view_width = psheight;
- view_height = pswidth;
- }
- }
- break;
- default: TIFFError ("psPageSize", "Invalid rotation %d", *rotation);
- return (1);
- }
-
- if (!npages)
- PSHead(fd, (page_width ? page_width : view_width), (page_height ? page_height : view_height), ox, oy);
-
- *scale = (xscale < yscale) ? xscale : yscale;
- if (*scale > 1.0)
- *scale = 1.0;
-
- return (0);
- }
-
-int get_viewport (double pgwidth, double pgheight, double pswidth, double psheight,
- double *view_width, double *view_height, int rotation)
- {
- /* Only one of maxPageHeight or maxPageWidth can be specified */
- if (maxPageHeight != 0) /* Clip the viewport to maxPageHeight on each page */
- {
- *view_height = maxPageHeight * PS_UNIT_SIZE;
- /*
- * if (res_unit == RESUNIT_CENTIMETER)
- * *view_height /= 2.54F;
- */
- }
- else
- {
- if (pgheight != 0) /* User has set PageHeight with -h flag */
- {
- *view_height = pgheight * PS_UNIT_SIZE; /* Postscript size for Page Height in inches */
- /* if (res_unit == RESUNIT_CENTIMETER)
- * *view_height /= 2.54F;
- */
- }
- else /* If no width or height are specified, use the original size from image */
- switch (rotation)
- {
- default:
- case 0:
- case 180: *view_height = psheight;
- break;
- case 90:
- case 270: *view_height = pswidth;
- break;
- }
- }
-
- if (maxPageWidth != 0) /* Clip the viewport to maxPageWidth on each page */
- {
- *view_width = maxPageWidth * PS_UNIT_SIZE;
- /* if (res_unit == RESUNIT_CENTIMETER)
- * *view_width /= 2.54F;
- */
- }
- else
- {
- if (pgwidth != 0) /* User has set PageWidth with -w flag */
- {
- *view_width = pgwidth * PS_UNIT_SIZE; /* Postscript size for Page Width in inches */
- /* if (res_unit == RESUNIT_CENTIMETER)
- * *view_width /= 2.54F;
- */
- }
- else /* If no width or height are specified, use the original size from image */
- switch (rotation)
- {
- default:
- case 0:
- case 180: *view_width = pswidth;
- break;
- case 90:
- case 270: *view_width = psheight; /* (*view_height / psheight) * psheight; */
- break;
- }
- }
-
- return (0);
- }
-
-/* pgwidth and pgheight specify page width and height in inches from -h and -w flags
- * lm and bm are the LeftMargin and BottomMargin in inches
- * center causes the image to be centered on the page if the paper size is
- * larger than the image size
- * returns the sequence number of the page processed or -1 on error
- */
-
-int TIFF2PS(FILE* fd, TIFF* tif, double pgwidth, double pgheight, double lm, double bm, int center)
- {
- uint32 pixwidth = 0, pixheight = 0; /* Image width and height in pixels */
- double ox = 0.0, oy = 0.0; /* Offset from current Postscript origin */
- double pswidth, psheight; /* Original raw image width and height in points */
- double view_width, view_height; /* Viewport width and height in points */
- double scale = 1.0;
- double left_offset = lm * PS_UNIT_SIZE;
- double bottom_offset = bm * PS_UNIT_SIZE;
- uint32 subfiletype;
- uint16* sampleinfo;
- static int npages = 0;
-
- if (!TIFFGetField(tif, TIFFTAG_XPOSITION, &ox))
- ox = 0;
- if (!TIFFGetField(tif, TIFFTAG_YPOSITION, &oy))
- oy = 0;
-
- /* Consolidated all the tag information into one code segment, Richard Nolde */
- do {
- tf_numberstrips = TIFFNumberOfStrips(tif);
- TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &tf_rowsperstrip);
- TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &bitspersample);
- TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel);
- TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planarconfiguration);
- TIFFGetField(tif, TIFFTAG_COMPRESSION, &compression);
- TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, &extrasamples, &sampleinfo);
- alpha = (extrasamples == 1 && sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
- if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric))
- {
- switch (samplesperpixel - extrasamples)
- {
- case 1: if (isCCITTCompression(tif))
- photometric = PHOTOMETRIC_MINISWHITE;
- else
- photometric = PHOTOMETRIC_MINISBLACK;
- break;
- case 3: photometric = PHOTOMETRIC_RGB;
- break;
- case 4: photometric = PHOTOMETRIC_SEPARATED;
- break;
- }
- }
-
- /* Read image tags for width and height in pixels pixwidth, pixheight,
- * and convert to points pswidth, psheight
- */
- setupPageState(tif, &pixwidth, &pixheight, &pswidth, &psheight);
- view_width = pswidth;
- view_height = psheight;
-
- if (get_viewport (pgwidth, pgheight, pswidth, psheight, &view_width, &view_height, rotation))
- {
- TIFFError("get_viewport", "Unable to set image viewport");
- return (1);
- }
-
- /* Write the Postscript file header with Bounding Box and Page Size definitions */
- if (psStart(fd, npages, auto_rotate, &rotation, &scale, ox, oy,
- pgwidth, pgheight, view_width, view_height, pswidth, psheight,
- left_offset, bottom_offset))
- return (-1);
-
- if (checkImage(tif)) /* Aborts if unsupported image parameters */
- {
- tf_bytesperrow = TIFFScanlineSize(tif);
-
- /* Set viewport clipping and scaling options */
- if ((maxPageHeight) || (maxPageWidth) || (pgwidth != 0) || (pgheight != 0))
- {
- if ((maxPageHeight) || (maxPageWidth)) /* used -H or -W option */
- {
- if (psMaskImage(fd, tif, rotation, center, &npages, pixwidth, pixheight,
- left_offset, bottom_offset, pgwidth, pgheight,
- pswidth, psheight, scale) < 0)
- return (-1);
- }
- else /* N.B. Setting maxPageHeight no longer sets pgheight */
- {
- if (pgwidth != 0 || pgheight != 0)
- {
- /* User did not specify a maxium page height or width using -H or -W flag
- * but did use -h or -w flag to scale to a specific size page.
- */
- npages++;
- fprintf(fd, "%%%%Page: %d %d\n", npages, npages);
-
- if (!generateEPSF && ( level2 || level3 ))
- {
- /* Write out the PageSize info for non EPS files */
- if (psPageSize(fd, rotation, pgwidth, pgheight,
- view_width, view_height, pswidth, psheight))
- return (-1);
- }
- fprintf(fd, "gsave\n");
- fprintf(fd, "100 dict begin\n");
- if (psScaleImage(fd, scale, rotation, center, view_width, view_height,
- pswidth, psheight, left_offset, bottom_offset))
- return (-1);
-
- PSpage(fd, tif, pixwidth, pixheight);
- fprintf(fd, "end\n");
- fprintf(fd, "grestore\n");
- fprintf(fd, "showpage\n");
- }
- }
- }
- else /* Simple rotation: user did not use -H, -W, -h or -w */
- {
- npages++;
- fprintf(fd, "%%%%Page: %d %d\n", npages, npages);
-
- if (!generateEPSF && ( level2 || level3 ))
- {
- /* Write out the PageSize info for non EPS files */
- if (psPageSize(fd, rotation, pgwidth, pgheight,
- view_width, view_height, pswidth, psheight))
- return (-1);
- }
- fprintf(fd, "gsave\n");
- fprintf(fd, "100 dict begin\n");
- if (psRotateImage(fd, rotation, pswidth, psheight, left_offset, bottom_offset))
- return (-1);
-
- PSpage(fd, tif, pixwidth, pixheight);
- fprintf(fd, "end\n");
- fprintf(fd, "grestore\n");
- fprintf(fd, "showpage\n");
- }
- }
- if (generateEPSF)
- break;
- if (auto_rotate)
- rotation = 0.0;
- TIFFGetFieldDefaulted(tif, TIFFTAG_SUBFILETYPE, &subfiletype);
- } while (((subfiletype & FILETYPE_PAGE) || printAll) && TIFFReadDirectory(tif));
-
-return(npages);
-}
-
-static char DuplexPreamble[] = "\
-%%BeginFeature: *Duplex True\n\
-systemdict begin\n\
- /languagelevel where { pop languagelevel } { 1 } ifelse\n\
- 2 ge { 1 dict dup /Duplex true put setpagedevice }\n\
- { statusdict /setduplex known { statusdict begin setduplex true end } if\n\
- } ifelse\n\
-end\n\
-%%EndFeature\n\
-";
-
-static char TumblePreamble[] = "\
-%%BeginFeature: *Tumble True\n\
-systemdict begin\n\
- /languagelevel where { pop languagelevel } { 1 } ifelse\n\
- 2 ge { 1 dict dup /Tumble true put setpagedevice }\n\
- { statusdict /settumble known { statusdict begin true settumble end } if\n\
- } ifelse\n\
-end\n\
-%%EndFeature\n\
-";
-
-static char AvoidDeadZonePreamble[] = "\
-gsave newpath clippath pathbbox grestore\n\
- 4 2 roll 2 copy translate\n\
- exch 3 1 roll sub 3 1 roll sub exch\n\
- currentpagedevice /PageSize get aload pop\n\
- exch 3 1 roll div 3 1 roll div abs exch abs\n\
- 2 copy gt { exch } if pop\n\
- dup 1 lt { dup scale } { pop } ifelse\n\
-";
-
-void
-PSHead(FILE *fd, double pagewidth, double pageheight, double xoff, double yoff)
-{
- time_t t;
-
- t = time(0);
- fprintf(fd, "%%!PS-Adobe-3.0%s\n", generateEPSF ? " EPSF-3.0" : "");
- fprintf(fd, "%%%%Creator: %s\n", creator ? creator : "tiff2ps");
- fprintf(fd, "%%%%Title: %s\n", title ? title : filename);
- fprintf(fd, "%%%%CreationDate: %s", ctime(&t));
- fprintf(fd, "%%%%DocumentData: Clean7Bit\n");
- /* NB: should use PageBoundingBox for each page instead of BoundingBox *
- * PageBoundingBox DSC added in PSPageSize function, R Nolde 09-01-2010
- */
- fprintf(fd, "%%%%Origin: %ld %ld\n", (long) xoff, (long) yoff);
- fprintf(fd, "%%%%BoundingBox: 0 0 %ld %ld\n",
- (long) ceil(pagewidth), (long) ceil(pageheight));
-
- fprintf(fd, "%%%%LanguageLevel: %d\n", (level3 ? 3 : (level2 ? 2 : 1)));
- if (generateEPSF == TRUE)
- fprintf(fd, "%%%%Pages: 1 1\n");
- else
- fprintf(fd, "%%%%Pages: (atend)\n");
- fprintf(fd, "%%%%EndComments\n");
- if (generateEPSF == FALSE)
- {
- fprintf(fd, "%%%%BeginSetup\n");
- if (PSduplex)
- fprintf(fd, "%s", DuplexPreamble);
- if (PStumble)
- fprintf(fd, "%s", TumblePreamble);
- if (PSavoiddeadzone && (level2 || level3))
- fprintf(fd, "%s", AvoidDeadZonePreamble);
- fprintf(fd, "%%%%EndSetup\n");
- }
-}
-
-void
-PSTail(FILE *fd, int npages)
-{
- fprintf(fd, "%%%%Trailer\n");
- if (generateEPSF == FALSE)
- fprintf(fd, "%%%%Pages: %d\n", npages);
- fprintf(fd, "%%%%EOF\n");
-}
-
-static int
-checkcmap(TIFF* tif, int n, uint16* r, uint16* g, uint16* b)
-{
- (void) tif;
- while (n-- > 0)
- if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256)
- return (16);
- TIFFWarning(filename, "Assuming 8-bit colormap");
- return (8);
-}
-
-static void
-PS_Lvl2colorspace(FILE* fd, TIFF* tif)
-{
- uint16 *rmap, *gmap, *bmap;
- int i, num_colors;
- const char * colorspace_p;
-
- switch ( photometric )
- {
- case PHOTOMETRIC_SEPARATED:
- colorspace_p = "CMYK";
- break;
-
- case PHOTOMETRIC_RGB:
- colorspace_p = "RGB";
- break;
-
- default:
- colorspace_p = "Gray";
- }
-
- /*
- * Set up PostScript Level 2 colorspace according to
- * section 4.8 in the PostScript refenence manual.
- */
- fputs("% PostScript Level 2 only.\n", fd);
- if (photometric != PHOTOMETRIC_PALETTE) {
- if (photometric == PHOTOMETRIC_YCBCR) {
- /* MORE CODE HERE */
- }
- fprintf(fd, "/Device%s setcolorspace\n", colorspace_p );
- return;
- }
-
- /*
- * Set up an indexed/palette colorspace
- */
- num_colors = (1 << bitspersample);
- if (!TIFFGetField(tif, TIFFTAG_COLORMAP, &rmap, &gmap, &bmap)) {
- TIFFError(filename,
- "Palette image w/o \"Colormap\" tag");
- return;
- }
- if (checkcmap(tif, num_colors, rmap, gmap, bmap) == 16) {
- /*
- * Convert colormap to 8-bits values.
- */
-#define CVT(x) (((x) * 255) / ((1L<<16)-1))
- for (i = 0; i < num_colors; i++) {
- rmap[i] = CVT(rmap[i]);
- gmap[i] = CVT(gmap[i]);
- bmap[i] = CVT(bmap[i]);
- }
-#undef CVT
- }
- fprintf(fd, "[ /Indexed /DeviceRGB %d", num_colors - 1);
- if (ascii85) {
- Ascii85Init();
- fputs("\n<~", fd);
- ascii85breaklen -= 2;
- } else
- fputs(" <", fd);
- for (i = 0; i < num_colors; i++) {
- if (ascii85) {
- Ascii85Put((unsigned char)rmap[i], fd);
- Ascii85Put((unsigned char)gmap[i], fd);
- Ascii85Put((unsigned char)bmap[i], fd);
- } else {
- fputs((i % 8) ? " " : "\n ", fd);
- fprintf(fd, "%02x%02x%02x",
- rmap[i], gmap[i], bmap[i]);
- }
- }
- if (ascii85)
- Ascii85Flush(fd);
- else
- fputs(">\n", fd);
- fputs("] setcolorspace\n", fd);
-}
-
-static int
-PS_Lvl2ImageDict(FILE* fd, TIFF* tif, uint32 w, uint32 h)
-{
- int use_rawdata;
- uint32 tile_width, tile_height;
- uint16 predictor, minsamplevalue, maxsamplevalue;
- int repeat_count;
- char im_h[64], im_x[64], im_y[64];
- char * imageOp = "image";
-
- if ( useImagemask && (bitspersample == 1) )
- imageOp = "imagemask";
-
- (void)strcpy(im_x, "0");
- (void)snprintf(im_y, sizeof(im_y), "%lu", (long) h);
- (void)snprintf(im_h, sizeof(im_h), "%lu", (long) h);
- tile_width = w;
- tile_height = h;
- if (TIFFIsTiled(tif)) {
- repeat_count = TIFFNumberOfTiles(tif);
- TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width);
- TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height);
- if (tile_width > w || tile_height > h ||
- (w % tile_width) != 0 || (h % tile_height != 0)) {
- /*
- * The tiles does not fit image width and height.
- * Set up a clip rectangle for the image unit square.
- */
- fputs("0 0 1 1 rectclip\n", fd);
- }
- if (tile_width < w) {
- fputs("/im_x 0 def\n", fd);
- (void)strcpy(im_x, "im_x neg");
- }
- if (tile_height < h) {
- fputs("/im_y 0 def\n", fd);
- (void)snprintf(im_y, sizeof(im_y), "%lu im_y sub", (unsigned long) h);
- }
- } else {
- repeat_count = tf_numberstrips;
- tile_height = tf_rowsperstrip;
- if (tile_height > h)
- tile_height = h;
- if (repeat_count > 1) {
- fputs("/im_y 0 def\n", fd);
- fprintf(fd, "/im_h %lu def\n",
- (unsigned long) tile_height);
- (void)strcpy(im_h, "im_h");
- (void)snprintf(im_y, sizeof(im_y), "%lu im_y sub", (unsigned long) h);
- }
- }
-
- /*
- * Output start of exec block
- */
- fputs("{ % exec\n", fd);
-
- if (repeat_count > 1)
- fprintf(fd, "%d { %% repeat\n", repeat_count);
-
- /*
- * Output filter options and image dictionary.
- */
- if (ascii85)
- fputs(" /im_stream currentfile /ASCII85Decode filter def\n",
- fd);
- fputs(" <<\n", fd);
- fputs(" /ImageType 1\n", fd);
- fprintf(fd, " /Width %lu\n", (unsigned long) tile_width);
- /*
- * Workaround for some software that may crash when last strip
- * of image contains fewer number of scanlines than specified
- * by the `/Height' variable. So for stripped images with multiple
- * strips we will set `/Height' as `im_h', because one is
- * recalculated for each strip - including the (smaller) final strip.
- * For tiled images and images with only one strip `/Height' will
- * contain number of scanlines in tile (or image height in case of
- * one-stripped image).
- */
- if (TIFFIsTiled(tif) || tf_numberstrips == 1)
- fprintf(fd, " /Height %lu\n", (unsigned long) tile_height);
- else
- fprintf(fd, " /Height im_h\n");
-
- if (planarconfiguration == PLANARCONFIG_SEPARATE && samplesperpixel > 1)
- fputs(" /MultipleDataSources true\n", fd);
- fprintf(fd, " /ImageMatrix [ %lu 0 0 %ld %s %s ]\n",
- (unsigned long) w, - (long)h, im_x, im_y);
- fprintf(fd, " /BitsPerComponent %d\n", bitspersample);
- fprintf(fd, " /Interpolate %s\n", interpolate ? "true" : "false");
-
- switch (samplesperpixel - extrasamples) {
- case 1:
- switch (photometric) {
- case PHOTOMETRIC_MINISBLACK:
- fputs(" /Decode [0 1]\n", fd);
- break;
- case PHOTOMETRIC_MINISWHITE:
- switch (compression) {
- case COMPRESSION_CCITTRLE:
- case COMPRESSION_CCITTRLEW:
- case COMPRESSION_CCITTFAX3:
- case COMPRESSION_CCITTFAX4:
- /*
- * Manage inverting with /Blackis1 flag
- * since there migth be uncompressed parts
- */
- fputs(" /Decode [0 1]\n", fd);
- break;
- default:
- /*
- * ERROR...
- */
- fputs(" /Decode [1 0]\n", fd);
- break;
- }
- break;
- case PHOTOMETRIC_PALETTE:
- TIFFGetFieldDefaulted(tif, TIFFTAG_MINSAMPLEVALUE,
- &minsamplevalue);
- TIFFGetFieldDefaulted(tif, TIFFTAG_MAXSAMPLEVALUE,
- &maxsamplevalue);
- fprintf(fd, " /Decode [%u %u]\n",
- minsamplevalue, maxsamplevalue);
- break;
- default:
- /*
- * ERROR ?
- */
- fputs(" /Decode [0 1]\n", fd);
- break;
- }
- break;
- case 3:
- switch (photometric) {
- case PHOTOMETRIC_RGB:
- fputs(" /Decode [0 1 0 1 0 1]\n", fd);
- break;
- case PHOTOMETRIC_MINISWHITE:
- case PHOTOMETRIC_MINISBLACK:
- default:
- /*
- * ERROR??
- */
- fputs(" /Decode [0 1 0 1 0 1]\n", fd);
- break;
- }
- break;
- case 4:
- /*
- * ERROR??
- */
- fputs(" /Decode [0 1 0 1 0 1 0 1]\n", fd);
- break;
- }
- fputs(" /DataSource", fd);
- if (planarconfiguration == PLANARCONFIG_SEPARATE &&
- samplesperpixel > 1)
- fputs(" [", fd);
- if (ascii85)
- fputs(" im_stream", fd);
- else
- fputs(" currentfile /ASCIIHexDecode filter", fd);
-
- use_rawdata = TRUE;
- switch (compression) {
- case COMPRESSION_NONE: /* 1: uncompressed */
- break;
- case COMPRESSION_CCITTRLE: /* 2: CCITT modified Huffman RLE */
- case COMPRESSION_CCITTRLEW: /* 32771: #1 w/ word alignment */
- case COMPRESSION_CCITTFAX3: /* 3: CCITT Group 3 fax encoding */
- case COMPRESSION_CCITTFAX4: /* 4: CCITT Group 4 fax encoding */
- fputs("\n\t<<\n", fd);
- if (compression == COMPRESSION_CCITTFAX3) {
- uint32 g3_options;
-
- fputs("\t /EndOfLine true\n", fd);
- fputs("\t /EndOfBlock false\n", fd);
- if (!TIFFGetField(tif, TIFFTAG_GROUP3OPTIONS,
- &g3_options))
- g3_options = 0;
- if (g3_options & GROUP3OPT_2DENCODING)
- fprintf(fd, "\t /K %s\n", im_h);
- if (g3_options & GROUP3OPT_UNCOMPRESSED)
- fputs("\t /Uncompressed true\n", fd);
- if (g3_options & GROUP3OPT_FILLBITS)
- fputs("\t /EncodedByteAlign true\n", fd);
- }
- if (compression == COMPRESSION_CCITTFAX4) {
- uint32 g4_options;
-
- fputs("\t /K -1\n", fd);
- TIFFGetFieldDefaulted(tif, TIFFTAG_GROUP4OPTIONS,
- &g4_options);
- if (g4_options & GROUP4OPT_UNCOMPRESSED)
- fputs("\t /Uncompressed true\n", fd);
- }
- if (!(tile_width == w && w == 1728U))
- fprintf(fd, "\t /Columns %lu\n",
- (unsigned long) tile_width);
- fprintf(fd, "\t /Rows %s\n", im_h);
- if (compression == COMPRESSION_CCITTRLE ||
- compression == COMPRESSION_CCITTRLEW) {
- fputs("\t /EncodedByteAlign true\n", fd);
- fputs("\t /EndOfBlock false\n", fd);
- }
- if (photometric == PHOTOMETRIC_MINISBLACK)
- fputs("\t /BlackIs1 true\n", fd);
- fprintf(fd, "\t>> /CCITTFaxDecode filter");
- break;
- case COMPRESSION_LZW: /* 5: Lempel-Ziv & Welch */
- TIFFGetFieldDefaulted(tif, TIFFTAG_PREDICTOR, &predictor);
- if (predictor == 2) {
- fputs("\n\t<<\n", fd);
- fprintf(fd, "\t /Predictor %u\n", predictor);
- fprintf(fd, "\t /Columns %lu\n",
- (unsigned long) tile_width);
- fprintf(fd, "\t /Colors %u\n", samplesperpixel);
- fprintf(fd, "\t /BitsPerComponent %u\n",
- bitspersample);
- fputs("\t>>", fd);
- }
- fputs(" /LZWDecode filter", fd);
- break;
- case COMPRESSION_DEFLATE: /* 5: ZIP */
- case COMPRESSION_ADOBE_DEFLATE:
- if ( level3 ) {
- TIFFGetFieldDefaulted(tif, TIFFTAG_PREDICTOR, &predictor);
- if (predictor > 1) {
- fprintf(fd, "\t %% PostScript Level 3 only.");
- fputs("\n\t<<\n", fd);
- fprintf(fd, "\t /Predictor %u\n", predictor);
- fprintf(fd, "\t /Columns %lu\n",
- (unsigned long) tile_width);
- fprintf(fd, "\t /Colors %u\n", samplesperpixel);
- fprintf(fd, "\t /BitsPerComponent %u\n",
- bitspersample);
- fputs("\t>>", fd);
- }
- fputs(" /FlateDecode filter", fd);
- } else {
- use_rawdata = FALSE ;
- }
- break;
- case COMPRESSION_PACKBITS: /* 32773: Macintosh RLE */
- fputs(" /RunLengthDecode filter", fd);
- use_rawdata = TRUE;
- break;
- case COMPRESSION_OJPEG: /* 6: !6.0 JPEG */
- case COMPRESSION_JPEG: /* 7: %JPEG DCT compression */
-#ifdef notdef
- /*
- * Code not tested yet
- */
- fputs(" /DCTDecode filter", fd);
- use_rawdata = TRUE;
-#else
- use_rawdata = FALSE;
-#endif
- break;
- case COMPRESSION_NEXT: /* 32766: NeXT 2-bit RLE */
- case COMPRESSION_THUNDERSCAN: /* 32809: ThunderScan RLE */
- case COMPRESSION_PIXARFILM: /* 32908: Pixar companded 10bit LZW */
- case COMPRESSION_JBIG: /* 34661: ISO JBIG */
- use_rawdata = FALSE;
- break;
- case COMPRESSION_SGILOG: /* 34676: SGI LogL or LogLuv */
- case COMPRESSION_SGILOG24: /* 34677: SGI 24-bit LogLuv */
- use_rawdata = FALSE;
- break;
- default:
- /*
- * ERROR...
- */
- use_rawdata = FALSE;
- break;
- }
- if (planarconfiguration == PLANARCONFIG_SEPARATE &&
- samplesperpixel > 1) {
- uint16 i;
-
- /*
- * NOTE: This code does not work yet...
- */
- for (i = 1; i < samplesperpixel; i++)
- fputs(" dup", fd);
- fputs(" ]", fd);
- }
-
- fprintf( fd, "\n >> %s\n", imageOp );
- if (ascii85)
- fputs(" im_stream status { im_stream flushfile } if\n", fd);
- if (repeat_count > 1) {
- if (tile_width < w) {
- fprintf(fd, " /im_x im_x %lu add def\n",
- (unsigned long) tile_width);
- if (tile_height < h) {
- fprintf(fd, " im_x %lu ge {\n",
- (unsigned long) w);
- fputs(" /im_x 0 def\n", fd);
- fprintf(fd, " /im_y im_y %lu add def\n",
- (unsigned long) tile_height);
- fputs(" } if\n", fd);
- }
- }
- if (tile_height < h) {
- if (tile_width >= w) {
- fprintf(fd, " /im_y im_y %lu add def\n",
- (unsigned long) tile_height);
- if (!TIFFIsTiled(tif)) {
- fprintf(fd, " /im_h %lu im_y sub",
- (unsigned long) h);
- fprintf(fd, " dup %lu gt { pop",
- (unsigned long) tile_height);
- fprintf(fd, " %lu } if def\n",
- (unsigned long) tile_height);
- }
- }
- }
- fputs("} repeat\n", fd);
- }
- /*
- * End of exec function
- */
- fputs("}\n", fd);
-
- return(use_rawdata);
-}
-
-/* Flip the byte order of buffers with 16 bit samples */
-static void
-PS_FlipBytes(unsigned char* buf, tsize_t count)
-{
- int i;
- unsigned char temp;
-
- if (count <= 0 || bitspersample <= 8) {
- return;
- }
-
- count--;
-
- for (i = 0; i < count; i += 2) {
- temp = buf[i];
- buf[i] = buf[i + 1];
- buf[i + 1] = temp;
- }
-}
-
-#define MAXLINE 36
-
-int
-PS_Lvl2page(FILE* fd, TIFF* tif, uint32 w, uint32 h)
-{
- uint16 fillorder;
- int use_rawdata, tiled_image, breaklen = MAXLINE;
- uint32 chunk_no, num_chunks;
- uint64 *bc;
- unsigned char *buf_data, *cp;
- tsize_t chunk_size, byte_count;
-
-#if defined( EXP_ASCII85ENCODER )
- tsize_t ascii85_l; /* Length, in bytes, of ascii85_p[] data */
- uint8 * ascii85_p = 0; /* Holds ASCII85 encoded data */
-#endif
-
- PS_Lvl2colorspace(fd, tif);
- use_rawdata = PS_Lvl2ImageDict(fd, tif, w, h);
-
-/* See http://bugzilla.remotesensing.org/show_bug.cgi?id=80 */
-#ifdef ENABLE_BROKEN_BEGINENDDATA
- fputs("%%BeginData:\n", fd);
-#endif
- fputs("exec\n", fd);
-
- tiled_image = TIFFIsTiled(tif);
- if (tiled_image) {
- num_chunks = TIFFNumberOfTiles(tif);
- TIFFGetField(tif, TIFFTAG_TILEBYTECOUNTS, &bc);
- } else {
- num_chunks = TIFFNumberOfStrips(tif);
- TIFFGetField(tif, TIFFTAG_STRIPBYTECOUNTS, &bc);
- }
-
- if (use_rawdata) {
- chunk_size = (tsize_t) bc[0];
- for (chunk_no = 1; chunk_no < num_chunks; chunk_no++)
- if ((tsize_t) bc[chunk_no] > chunk_size)
- chunk_size = (tsize_t) bc[chunk_no];
- } else {
- if (tiled_image)
- chunk_size = TIFFTileSize(tif);
- else
- chunk_size = TIFFStripSize(tif);
- }
- buf_data = (unsigned char *)_TIFFmalloc(chunk_size);
- if (!buf_data) {
- TIFFError(filename, "Can't alloc %lu bytes for %s.",
- (unsigned long) chunk_size, tiled_image ? "tiles" : "strips");
- return(FALSE);
- }
-
-#if defined( EXP_ASCII85ENCODER )
- if ( ascii85 ) {
- /*
- * Allocate a buffer to hold the ASCII85 encoded data. Note
- * that it is allocated with sufficient room to hold the
- * encoded data (5*chunk_size/4) plus the EOD marker (+8)
- * and formatting line breaks. The line breaks are more
- * than taken care of by using 6*chunk_size/4 rather than
- * 5*chunk_size/4.
- */
-
- ascii85_p = _TIFFmalloc( (chunk_size+(chunk_size/2)) + 8 );
-
- if ( !ascii85_p ) {
- _TIFFfree( buf_data );
-
- TIFFError( filename, "Cannot allocate ASCII85 encoding buffer." );
- return ( FALSE );
- }
- }
-#endif
-
- TIFFGetFieldDefaulted(tif, TIFFTAG_FILLORDER, &fillorder);
- for (chunk_no = 0; chunk_no < num_chunks; chunk_no++) {
- if (ascii85)
- Ascii85Init();
- else
- breaklen = MAXLINE;
- if (use_rawdata) {
- if (tiled_image)
- byte_count = TIFFReadRawTile(tif, chunk_no,
- buf_data, chunk_size);
- else
- byte_count = TIFFReadRawStrip(tif, chunk_no,
- buf_data, chunk_size);
- if (fillorder == FILLORDER_LSB2MSB)
- TIFFReverseBits(buf_data, byte_count);
- } else {
- if (tiled_image)
- byte_count = TIFFReadEncodedTile(tif,
- chunk_no, buf_data,
- chunk_size);
- else
- byte_count = TIFFReadEncodedStrip(tif,
- chunk_no, buf_data,
- chunk_size);
- }
- if (byte_count < 0) {
- TIFFError(filename, "Can't read %s %d.",
- tiled_image ? "tile" : "strip", chunk_no);
- if (ascii85)
- Ascii85Put('\0', fd);
- }
- /*
- * for 16 bits, the two bytes must be most significant
- * byte first
- */
- if (bitspersample == 16 && !TIFFIsBigEndian(tif)) {
- PS_FlipBytes(buf_data, byte_count);
- }
- /*
- * For images with alpha, matte against a white background;
- * i.e. Cback * (1 - Aimage) where Cback = 1. We will fill the
- * lower part of the buffer with the modified values.
- *
- * XXX: needs better solution
- */
- if (alpha) {
- int adjust, i, j = 0;
- int ncomps = samplesperpixel - extrasamples;
- for (i = 0; i < byte_count; i+=samplesperpixel) {
- adjust = 255 - buf_data[i + ncomps];
- switch (ncomps) {
- case 1:
- buf_data[j++] = buf_data[i] + adjust;
- break;
- case 2:
- buf_data[j++] = buf_data[i] + adjust;
- buf_data[j++] = buf_data[i+1] + adjust;
- break;
- case 3:
- buf_data[j++] = buf_data[i] + adjust;
- buf_data[j++] = buf_data[i+1] + adjust;
- buf_data[j++] = buf_data[i+2] + adjust;
- break;
- }
- }
- byte_count -= j;
- }
-
- if (ascii85) {
-#if defined( EXP_ASCII85ENCODER )
- ascii85_l = Ascii85EncodeBlock(ascii85_p, 1, buf_data, byte_count );
-
- if ( ascii85_l > 0 )
- fwrite( ascii85_p, ascii85_l, 1, fd );
-#else
- for (cp = buf_data; byte_count > 0; byte_count--)
- Ascii85Put(*cp++, fd);
-#endif
- }
- else
- {
- for (cp = buf_data; byte_count > 0; byte_count--) {
- putc(hex[((*cp)>>4)&0xf], fd);
- putc(hex[(*cp)&0xf], fd);
- cp++;
-
- if (--breaklen <= 0) {
- putc('\n', fd);
- breaklen = MAXLINE;
- }
- }
- }
-
- if ( !ascii85 ) {
- if ( level2 || level3 )
- putc( '>', fd );
- putc('\n', fd);
- }
-#if !defined( EXP_ASCII85ENCODER )
- else
- Ascii85Flush(fd);
-#endif
- }
-
-#if defined( EXP_ASCII85ENCODER )
- if ( ascii85_p )
- _TIFFfree( ascii85_p );
-#endif
-
- _TIFFfree(buf_data);
-#ifdef ENABLE_BROKEN_BEGINENDDATA
- fputs("%%EndData\n", fd);
-#endif
- return(TRUE);
-}
-
-void
-PSpage(FILE* fd, TIFF* tif, uint32 w, uint32 h)
-{
- char * imageOp = "image";
-
- if ( useImagemask && (bitspersample == 1) )
- imageOp = "imagemask";
-
- if ((level2 || level3) && PS_Lvl2page(fd, tif, w, h))
- return;
- ps_bytesperrow = tf_bytesperrow - (extrasamples * bitspersample / 8)*w;
- switch (photometric) {
- case PHOTOMETRIC_RGB:
- if (planarconfiguration == PLANARCONFIG_CONTIG) {
- fprintf(fd, "%s", RGBcolorimage);
- PSColorContigPreamble(fd, w, h, 3);
- PSDataColorContig(fd, tif, w, h, 3);
- } else {
- PSColorSeparatePreamble(fd, w, h, 3);
- PSDataColorSeparate(fd, tif, w, h, 3);
- }
- break;
- case PHOTOMETRIC_SEPARATED:
- /* XXX should emit CMYKcolorimage */
- if (planarconfiguration == PLANARCONFIG_CONTIG) {
- PSColorContigPreamble(fd, w, h, 4);
- PSDataColorContig(fd, tif, w, h, 4);
- } else {
- PSColorSeparatePreamble(fd, w, h, 4);
- PSDataColorSeparate(fd, tif, w, h, 4);
- }
- break;
- case PHOTOMETRIC_PALETTE:
- fprintf(fd, "%s", RGBcolorimage);
- PhotoshopBanner(fd, w, h, 1, 3, "false 3 colorimage");
- fprintf(fd, "/scanLine %ld string def\n",
- (long) ps_bytesperrow * 3L);
- fprintf(fd, "%lu %lu 8\n",
- (unsigned long) w, (unsigned long) h);
- fprintf(fd, "[%lu 0 0 -%lu 0 %lu]\n",
- (unsigned long) w, (unsigned long) h, (unsigned long) h);
- fprintf(fd, "{currentfile scanLine readhexstring pop} bind\n");
- fprintf(fd, "false 3 colorimage\n");
- PSDataPalette(fd, tif, w, h);
- break;
- case PHOTOMETRIC_MINISBLACK:
- case PHOTOMETRIC_MINISWHITE:
- PhotoshopBanner(fd, w, h, 1, 1, imageOp);
- fprintf(fd, "/scanLine %ld string def\n",
- (long) ps_bytesperrow);
- fprintf(fd, "%lu %lu %d\n",
- (unsigned long) w, (unsigned long) h, bitspersample);
- fprintf(fd, "[%lu 0 0 -%lu 0 %lu]\n",
- (unsigned long) w, (unsigned long) h, (unsigned long) h);
- fprintf(fd,
- "{currentfile scanLine readhexstring pop} bind\n");
- fprintf(fd, "%s\n", imageOp);
- PSDataBW(fd, tif, w, h);
- break;
- }
- putc('\n', fd);
-}
-
-void
-PSColorContigPreamble(FILE* fd, uint32 w, uint32 h, int nc)
-{
- ps_bytesperrow = nc * (tf_bytesperrow / samplesperpixel);
- PhotoshopBanner(fd, w, h, 1, nc, "false %d colorimage");
- fprintf(fd, "/line %ld string def\n", (long) ps_bytesperrow);
- fprintf(fd, "%lu %lu %d\n",
- (unsigned long) w, (unsigned long) h, bitspersample);
- fprintf(fd, "[%lu 0 0 -%lu 0 %lu]\n",
- (unsigned long) w, (unsigned long) h, (unsigned long) h);
- fprintf(fd, "{currentfile line readhexstring pop} bind\n");
- fprintf(fd, "false %d colorimage\n", nc);
-}
-
-void
-PSColorSeparatePreamble(FILE* fd, uint32 w, uint32 h, int nc)
-{
- int i;
-
- PhotoshopBanner(fd, w, h, ps_bytesperrow, nc, "true %d colorimage");
- for (i = 0; i < nc; i++)
- fprintf(fd, "/line%d %ld string def\n",
- i, (long) ps_bytesperrow);
- fprintf(fd, "%lu %lu %d\n",
- (unsigned long) w, (unsigned long) h, bitspersample);
- fprintf(fd, "[%lu 0 0 -%lu 0 %lu] \n",
- (unsigned long) w, (unsigned long) h, (unsigned long) h);
- for (i = 0; i < nc; i++)
- fprintf(fd, "{currentfile line%d readhexstring pop}bind\n", i);
- fprintf(fd, "true %d colorimage\n", nc);
-}
-
-#define DOBREAK(len, howmany, fd) \
- if (((len) -= (howmany)) <= 0) { \
- putc('\n', fd); \
- (len) = MAXLINE-(howmany); \
- }
-#define PUTHEX(c,fd) putc(hex[((c)>>4)&0xf],fd); putc(hex[(c)&0xf],fd)
-
-void
-PSDataColorContig(FILE* fd, TIFF* tif, uint32 w, uint32 h, int nc)
-{
- uint32 row;
- int breaklen = MAXLINE, es = samplesperpixel - nc;
- tsize_t cc;
- unsigned char *tf_buf;
- unsigned char *cp, c;
-
- (void) w;
- tf_buf = (unsigned char *) _TIFFmalloc(tf_bytesperrow);
- if (tf_buf == NULL) {
- TIFFError(filename, "No space for scanline buffer");
- return;
- }
- for (row = 0; row < h; row++) {
- if (TIFFReadScanline(tif, tf_buf, row, 0) < 0)
- break;
- cp = tf_buf;
- /*
- * for 16 bits, the two bytes must be most significant
- * byte first
- */
- if (bitspersample == 16 && !HOST_BIGENDIAN) {
- PS_FlipBytes(cp, tf_bytesperrow);
- }
- if (alpha) {
- int adjust;
- cc = 0;
- for (; cc < tf_bytesperrow; cc += samplesperpixel) {
- DOBREAK(breaklen, nc, fd);
- /*
- * For images with alpha, matte against
- * a white background; i.e.
- * Cback * (1 - Aimage)
- * where Cback = 1.
- */
- adjust = 255 - cp[nc];
- switch (nc) {
- case 4: c = *cp++ + adjust; PUTHEX(c,fd);
- case 3: c = *cp++ + adjust; PUTHEX(c,fd);
- case 2: c = *cp++ + adjust; PUTHEX(c,fd);
- case 1: c = *cp++ + adjust; PUTHEX(c,fd);
- }
- cp += es;
- }
- } else {
- cc = 0;
- for (; cc < tf_bytesperrow; cc += samplesperpixel) {
- DOBREAK(breaklen, nc, fd);
- switch (nc) {
- case 4: c = *cp++; PUTHEX(c,fd);
- case 3: c = *cp++; PUTHEX(c,fd);
- case 2: c = *cp++; PUTHEX(c,fd);
- case 1: c = *cp++; PUTHEX(c,fd);
- }
- cp += es;
- }
- }
- }
- _TIFFfree((char *) tf_buf);
-}
-
-void
-PSDataColorSeparate(FILE* fd, TIFF* tif, uint32 w, uint32 h, int nc)
-{
- uint32 row;
- int breaklen = MAXLINE;
- tsize_t cc;
- tsample_t s, maxs;
- unsigned char *tf_buf;
- unsigned char *cp, c;
-
- (void) w;
- tf_buf = (unsigned char *) _TIFFmalloc(tf_bytesperrow);
- if (tf_buf == NULL) {
- TIFFError(filename, "No space for scanline buffer");
- return;
- }
- maxs = (samplesperpixel > nc ? nc : samplesperpixel);
- for (row = 0; row < h; row++) {
- for (s = 0; s < maxs; s++) {
- if (TIFFReadScanline(tif, tf_buf, row, s) < 0)
- break;
- for (cp = tf_buf, cc = 0; cc < tf_bytesperrow; cc++) {
- DOBREAK(breaklen, 1, fd);
- c = *cp++;
- PUTHEX(c,fd);
- }
- }
- }
- _TIFFfree((char *) tf_buf);
-}
-
-#define PUTRGBHEX(c,fd) \
- PUTHEX(rmap[c],fd); PUTHEX(gmap[c],fd); PUTHEX(bmap[c],fd)
-
-void
-PSDataPalette(FILE* fd, TIFF* tif, uint32 w, uint32 h)
-{
- uint16 *rmap, *gmap, *bmap;
- uint32 row;
- int breaklen = MAXLINE, nc;
- tsize_t cc;
- unsigned char *tf_buf;
- unsigned char *cp, c;
-
- (void) w;
- if (!TIFFGetField(tif, TIFFTAG_COLORMAP, &rmap, &gmap, &bmap)) {
- TIFFError(filename, "Palette image w/o \"Colormap\" tag");
- return;
- }
- switch (bitspersample) {
- case 8: case 4: case 2: case 1:
- break;
- default:
- TIFFError(filename, "Depth %d not supported", bitspersample);
- return;
- }
- nc = 3 * (8 / bitspersample);
- tf_buf = (unsigned char *) _TIFFmalloc(tf_bytesperrow);
- if (tf_buf == NULL) {
- TIFFError(filename, "No space for scanline buffer");
- return;
- }
- if (checkcmap(tif, 1<<bitspersample, rmap, gmap, bmap) == 16) {
- int i;
-#define CVT(x) ((unsigned short) (((x) * 255) / ((1U<<16)-1)))
- for (i = (1<<bitspersample)-1; i >= 0; i--) {
- rmap[i] = CVT(rmap[i]);
- gmap[i] = CVT(gmap[i]);
- bmap[i] = CVT(bmap[i]);
- }
-#undef CVT
- }
- for (row = 0; row < h; row++) {
- if (TIFFReadScanline(tif, tf_buf, row, 0) < 0)
- break;
- for (cp = tf_buf, cc = 0; cc < tf_bytesperrow; cc++) {
- DOBREAK(breaklen, nc, fd);
- switch (bitspersample) {
- case 8:
- c = *cp++; PUTRGBHEX(c, fd);
- break;
- case 4:
- c = *cp++; PUTRGBHEX(c&0xf, fd);
- c >>= 4; PUTRGBHEX(c, fd);
- break;
- case 2:
- c = *cp++; PUTRGBHEX(c&0x3, fd);
- c >>= 2; PUTRGBHEX(c&0x3, fd);
- c >>= 2; PUTRGBHEX(c&0x3, fd);
- c >>= 2; PUTRGBHEX(c, fd);
- break;
- case 1:
- c = *cp++; PUTRGBHEX(c&0x1, fd);
- c >>= 1; PUTRGBHEX(c&0x1, fd);
- c >>= 1; PUTRGBHEX(c&0x1, fd);
- c >>= 1; PUTRGBHEX(c&0x1, fd);
- c >>= 1; PUTRGBHEX(c&0x1, fd);
- c >>= 1; PUTRGBHEX(c&0x1, fd);
- c >>= 1; PUTRGBHEX(c&0x1, fd);
- c >>= 1; PUTRGBHEX(c, fd);
- break;
- }
- }
- }
- _TIFFfree((char *) tf_buf);
-}
-
-void
-PSDataBW(FILE* fd, TIFF* tif, uint32 w, uint32 h)
-{
- int breaklen = MAXLINE;
- unsigned char* tf_buf;
- unsigned char* cp;
- tsize_t stripsize = TIFFStripSize(tif);
- tstrip_t s;
-
-#if defined( EXP_ASCII85ENCODER )
- tsize_t ascii85_l; /* Length, in bytes, of ascii85_p[] data */
- uint8 *ascii85_p = 0; /* Holds ASCII85 encoded data */
-#endif
-
- (void) w; (void) h;
- tf_buf = (unsigned char *) _TIFFmalloc(stripsize);
- if (tf_buf == NULL) {
- TIFFError(filename, "No space for scanline buffer");
- return;
- }
-
- // FIXME
- memset(tf_buf, 0, stripsize);
-
-#if defined( EXP_ASCII85ENCODER )
- if ( ascii85 ) {
- /*
- * Allocate a buffer to hold the ASCII85 encoded data. Note
- * that it is allocated with sufficient room to hold the
- * encoded data (5*stripsize/4) plus the EOD marker (+8)
- * and formatting line breaks. The line breaks are more
- * than taken care of by using 6*stripsize/4 rather than
- * 5*stripsize/4.
- */
-
- ascii85_p = _TIFFmalloc( (stripsize+(stripsize/2)) + 8 );
-
- if ( !ascii85_p ) {
- _TIFFfree( tf_buf );
-
- TIFFError( filename, "Cannot allocate ASCII85 encoding buffer." );
- return;
- }
- }
-#endif
-
- if (ascii85)
- Ascii85Init();
-
- for (s = 0; s < TIFFNumberOfStrips(tif); s++) {
- tmsize_t cc = TIFFReadEncodedStrip(tif, s, tf_buf, stripsize);
- if (cc < 0) {
- TIFFError(filename, "Can't read strip");
- break;
- }
- cp = tf_buf;
- if (photometric == PHOTOMETRIC_MINISWHITE) {
- for (cp += cc; --cp >= tf_buf;)
- *cp = ~*cp;
- cp++;
- }
- /*
- * for 16 bits, the two bytes must be most significant
- * byte first
- */
- if (bitspersample == 16 && !HOST_BIGENDIAN) {
- PS_FlipBytes(cp, cc);
- }
- if (ascii85) {
-#if defined( EXP_ASCII85ENCODER )
- if (alpha) {
- int adjust, i;
- for (i = 0; i < cc; i+=2) {
- adjust = 255 - cp[i + 1];
- cp[i / 2] = cp[i] + adjust;
- }
- cc /= 2;
- }
-
- ascii85_l = Ascii85EncodeBlock( ascii85_p, 1, cp, cc );
-
- if ( ascii85_l > 0 )
- fwrite( ascii85_p, ascii85_l, 1, fd );
-#else
- while (cc-- > 0)
- Ascii85Put(*cp++, fd);
-#endif /* EXP_ASCII85_ENCODER */
- } else {
- unsigned char c;
-
- if (alpha) {
- int adjust;
- while (cc-- > 0) {
- DOBREAK(breaklen, 1, fd);
- /*
- * For images with alpha, matte against
- * a white background; i.e.
- * Cback * (1 - Aimage)
- * where Cback = 1.
- */
- adjust = 255 - cp[1];
- c = *cp++ + adjust; PUTHEX(c,fd);
- cp++, cc--;
- }
- } else {
- while (cc-- > 0) {
- c = *cp++;
- DOBREAK(breaklen, 1, fd);
- PUTHEX(c, fd);
- }
- }
- }
- }
-
- if ( !ascii85 )
- {
- if ( level2 || level3)
- fputs(">\n", fd);
- }
-#if !defined( EXP_ASCII85ENCODER )
- else
- Ascii85Flush(fd);
-#else
- if ( ascii85_p )
- _TIFFfree( ascii85_p );
-#endif
-
- _TIFFfree(tf_buf);
-}
-
-void
-PSRawDataBW(FILE* fd, TIFF* tif, uint32 w, uint32 h)
-{
- uint64 *bc;
- uint32 bufsize;
- int breaklen = MAXLINE;
- tmsize_t cc;
- uint16 fillorder;
- unsigned char *tf_buf;
- unsigned char *cp, c;
- tstrip_t s;
-
-#if defined( EXP_ASCII85ENCODER )
- tsize_t ascii85_l; /* Length, in bytes, of ascii85_p[] data */
- uint8 * ascii85_p = 0; /* Holds ASCII85 encoded data */
-#endif
-
- (void) w; (void) h;
- TIFFGetFieldDefaulted(tif, TIFFTAG_FILLORDER, &fillorder);
- TIFFGetField(tif, TIFFTAG_STRIPBYTECOUNTS, &bc);
-
- /*
- * Find largest strip:
- */
-
- bufsize = (uint32) bc[0];
-
- for ( s = 0; ++s < (tstrip_t)tf_numberstrips; ) {
- if ( bc[s] > bufsize )
- bufsize = (uint32) bc[s];
- }
-
- tf_buf = (unsigned char*) _TIFFmalloc(bufsize);
- if (tf_buf == NULL) {
- TIFFError(filename, "No space for strip buffer");
- return;
- }
-
-#if defined( EXP_ASCII85ENCODER )
- if ( ascii85 ) {
- /*
- * Allocate a buffer to hold the ASCII85 encoded data. Note
- * that it is allocated with sufficient room to hold the
- * encoded data (5*bufsize/4) plus the EOD marker (+8)
- * and formatting line breaks. The line breaks are more
- * than taken care of by using 6*bufsize/4 rather than
- * 5*bufsize/4.
- */
-
- ascii85_p = _TIFFmalloc( (bufsize+(bufsize/2)) + 8 );
-
- if ( !ascii85_p ) {
- _TIFFfree( tf_buf );
-
- TIFFError( filename, "Cannot allocate ASCII85 encoding buffer." );
- return;
- }
- }
-#endif
-
- for (s = 0; s < (tstrip_t) tf_numberstrips; s++) {
- cc = TIFFReadRawStrip(tif, s, tf_buf, (tmsize_t) bc[s]);
- if (cc < 0) {
- TIFFError(filename, "Can't read strip");
- break;
- }
- if (fillorder == FILLORDER_LSB2MSB)
- TIFFReverseBits(tf_buf, cc);
- if (!ascii85) {
- for (cp = tf_buf; cc > 0; cc--) {
- DOBREAK(breaklen, 1, fd);
- c = *cp++;
- PUTHEX(c, fd);
- }
- fputs(">\n", fd);
- breaklen = MAXLINE;
- } else {
- Ascii85Init();
-#if defined( EXP_ASCII85ENCODER )
- ascii85_l = Ascii85EncodeBlock( ascii85_p, 1, tf_buf, cc );
-
- if ( ascii85_l > 0 )
- fwrite( ascii85_p, ascii85_l, 1, fd );
-#else
- for (cp = tf_buf; cc > 0; cc--)
- Ascii85Put(*cp++, fd);
- Ascii85Flush(fd);
-#endif /* EXP_ASCII85ENCODER */
- }
- }
- _TIFFfree((char *) tf_buf);
-
-#if defined( EXP_ASCII85ENCODER )
- if ( ascii85_p )
- _TIFFfree( ascii85_p );
-#endif
-}
-
-void
-Ascii85Init(void)
-{
- ascii85breaklen = 2*MAXLINE;
- ascii85count = 0;
-}
-
-static char*
-Ascii85Encode(unsigned char* raw)
-{
- static char encoded[6];
- uint32 word;
-
- word = (((raw[0]<<8)+raw[1])<<16) + (raw[2]<<8) + raw[3];
- if (word != 0L) {
- uint32 q;
- uint16 w1;
-
- q = word / (85L*85*85*85); /* actually only a byte */
- encoded[0] = (char) (q + '!');
-
- word -= q * (85L*85*85*85); q = word / (85L*85*85);
- encoded[1] = (char) (q + '!');
-
- word -= q * (85L*85*85); q = word / (85*85);
- encoded[2] = (char) (q + '!');
-
- w1 = (uint16) (word - q*(85L*85));
- encoded[3] = (char) ((w1 / 85) + '!');
- encoded[4] = (char) ((w1 % 85) + '!');
- encoded[5] = '\0';
- } else
- encoded[0] = 'z', encoded[1] = '\0';
- return (encoded);
-}
-
-void
-Ascii85Put(unsigned char code, FILE* fd)
-{
- ascii85buf[ascii85count++] = code;
- if (ascii85count >= 4) {
- unsigned char* p;
- int n;
-
- for (n = ascii85count, p = ascii85buf; n >= 4; n -= 4, p += 4) {
- char* cp;
- for (cp = Ascii85Encode(p); *cp; cp++) {
- putc(*cp, fd);
- if (--ascii85breaklen == 0) {
- putc('\n', fd);
- ascii85breaklen = 2*MAXLINE;
- }
- }
- }
- _TIFFmemcpy(ascii85buf, p, n);
- ascii85count = n;
- }
-}
-
-void
-Ascii85Flush(FILE* fd)
-{
- if (ascii85count > 0) {
- char* res;
- _TIFFmemset(&ascii85buf[ascii85count], 0, 3);
- res = Ascii85Encode(ascii85buf);
- fwrite(res[0] == 'z' ? "!!!!" : res, ascii85count + 1, 1, fd);
- }
- fputs("~>\n", fd);
-}
-#if defined( EXP_ASCII85ENCODER)
-
-#define A85BREAKCNTR ascii85breaklen
-#define A85BREAKLEN (2*MAXLINE)
-
-/*****************************************************************************
-*
-* Name: Ascii85EncodeBlock( ascii85_p, f_eod, raw_p, raw_l )
-*
-* Description: This routine will encode the raw data in the buffer described
-* by raw_p and raw_l into ASCII85 format and store the encoding
-* in the buffer given by ascii85_p.
-*
-* Parameters: ascii85_p - A buffer supplied by the caller which will
-* contain the encoded ASCII85 data.
-* f_eod - Flag: Nz means to end the encoded buffer with
-* an End-Of-Data marker.
-* raw_p - Pointer to the buffer of data to be encoded
-* raw_l - Number of bytes in raw_p[] to be encoded
-*
-* Returns: (int) < 0 Error, see errno
-* >= 0 Number of bytes written to ascii85_p[].
-*
-* Notes: An external variable given by A85BREAKCNTR is used to
-* determine when to insert newline characters into the
-* encoded data. As each byte is placed into ascii85_p this
-* external is decremented. If the variable is decrement to
-* or past zero then a newline is inserted into ascii85_p
-* and the A85BREAKCNTR is then reset to A85BREAKLEN.
-* Note: for efficiency reasons the A85BREAKCNTR variable
-* is not actually checked on *every* character
-* placed into ascii85_p but often only for every
-* 5 characters.
-*
-* THE CALLER IS RESPONSIBLE FOR ENSURING THAT ASCII85_P[] IS
-* SUFFICIENTLY LARGE TO THE ENCODED DATA!
-* You will need at least 5 * (raw_l/4) bytes plus space for
-* newline characters and space for an EOD marker (if
-* requested). A safe calculation is to use 6*(raw_l/4) + 8
-* to size ascii85_p.
-*
-*****************************************************************************/
-
-tsize_t Ascii85EncodeBlock( uint8 * ascii85_p, unsigned f_eod, const uint8 * raw_p, tsize_t raw_l )
-
-{
- char ascii85[5]; /* Encoded 5 tuple */
- tsize_t ascii85_l; /* Number of bytes written to ascii85_p[] */
- int rc; /* Return code */
- uint32 val32; /* Unencoded 4 tuple */
-
- ascii85_l = 0; /* Nothing written yet */
-
- if ( raw_p )
- {
- --raw_p; /* Prepare for pre-increment fetches */
-
- for ( ; raw_l > 3; raw_l -= 4 )
- {
- val32 = *(++raw_p) << 24;
- val32 += *(++raw_p) << 16;
- val32 += *(++raw_p) << 8;
- val32 += *(++raw_p);
-
- if ( val32 == 0 ) /* Special case */
- {
- ascii85_p[ascii85_l] = 'z';
- rc = 1;
- }
-
- else
- {
- ascii85[4] = (char) ((val32 % 85) + 33);
- val32 /= 85;
-
- ascii85[3] = (char) ((val32 % 85) + 33);
- val32 /= 85;
-
- ascii85[2] = (char) ((val32 % 85) + 33);
- val32 /= 85;
-
- ascii85[1] = (char) ((val32 % 85) + 33);
- ascii85[0] = (char) ((val32 / 85) + 33);
-
- _TIFFmemcpy( &ascii85_p[ascii85_l], ascii85, sizeof(ascii85) );
- rc = sizeof(ascii85);
- }
-
- ascii85_l += rc;
-
- if ( (A85BREAKCNTR -= rc) <= 0 )
- {
- ascii85_p[ascii85_l] = '\n';
- ++ascii85_l;
- A85BREAKCNTR = A85BREAKLEN;
- }
- }
-
- /*
- * Output any straggler bytes:
- */
-
- if ( raw_l > 0 )
- {
- tsize_t len; /* Output this many bytes */
-
- len = raw_l + 1;
- val32 = *++raw_p << 24; /* Prime the pump */
-
- if ( --raw_l > 0 ) val32 += *(++raw_p) << 16;
- if ( --raw_l > 0 ) val32 += *(++raw_p) << 8;
-
- val32 /= 85;
-
- ascii85[3] = (char) ((val32 % 85) + 33);
- val32 /= 85;
-
- ascii85[2] = (char) ((val32 % 85) + 33);
- val32 /= 85;
-
- ascii85[1] = (char) ((val32 % 85) + 33);
- ascii85[0] = (char) ((val32 / 85) + 33);
-
- _TIFFmemcpy( &ascii85_p[ascii85_l], ascii85, len );
- ascii85_l += len;
- }
- }
-
- /*
- * If requested add an ASCII85 End Of Data marker:
- */
-
- if ( f_eod )
- {
- ascii85_p[ascii85_l++] = '~';
- ascii85_p[ascii85_l++] = '>';
- ascii85_p[ascii85_l++] = '\n';
- }
-
- return ( ascii85_l );
-
-} /* Ascii85EncodeBlock() */
-
-#endif /* EXP_ASCII85ENCODER */
-
-
-char* stuff[] = {
-"usage: tiff2ps [options] input.tif ...",
-"where options are:",
-" -1 generate PostScript Level 1 (default)",
-" -2 generate PostScript Level 2",
-" -3 generate PostScript Level 3",
-" -8 disable use of ASCII85 encoding with PostScript Level 2/3",
-" -a convert all directories in file (default is first), Not EPS",
-" -b # set the bottom margin to # inches",
-" -c center image (-b and -l still add to this)",
-" -C name set postscript document creator name",
-" -d # set initial directory to # counting from zero",
-" -D enable duplex printing (two pages per sheet of paper)",
-" -e generate Encapsulated PostScript (EPS) (implies -z)",
-" -h # set printed page height to # inches (no default)",
-" -w # set printed page width to # inches (no default)",
-" -H # split image if height is more than # inches",
-" -W # split image if width is more than # inches",
-" -L # overLap split images by # inches",
-" -i # enable/disable (Nz/0) pixel interpolation (default: enable)",
-" -l # set the left margin to # inches",
-" -m use \"imagemask\" operator instead of \"image\"",
-" -o # convert directory at file offset # bytes",
-" -O file write PostScript to file instead of standard output",
-" -p generate regular (non-encapsulated) PostScript",
-" -P L or P set optional PageOrientation DSC comment to Landscape or Portrait",
-" -r # or auto rotate by 90, 180, 270 degrees or auto",
-" -s generate PostScript for a single image",
-" -t name set postscript document title. Otherwise the filename is used",
-" -T print pages for top edge binding",
-" -x override resolution units as centimeters",
-" -y override resolution units as inches",
-" -z enable printing in the deadzone (only for PostScript Level 2/3)",
-NULL
-};
-
-static void
-usage(int code)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(code);
-}
-
diff --git a/tiff/tools/tiff2rgba.c b/tiff/tools/tiff2rgba.c
deleted file mode 100755
index 32071db..0000000
--- a/tiff/tools/tiff2rgba.c
+++ /dev/null
@@ -1,541 +0,0 @@
-/* $Id: tiff2rgba.c,v 1.20 2014-06-08 03:37:02 bfriesen Exp $ */
-
-/*
- * Copyright (c) 1991-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffiop.h"
-#include "tiffio.h"
-
-#define streq(a,b) (strcmp(a,b) == 0)
-#define CopyField(tag, v) \
- if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v)
-
-#ifndef howmany
-#define howmany(x, y) (((x)+((y)-1))/(y))
-#endif
-#define roundup(x, y) (howmany(x,y)*((uint32)(y)))
-
-uint16 compression = COMPRESSION_PACKBITS;
-uint32 rowsperstrip = (uint32) -1;
-int process_by_block = 0; /* default is whole image at once */
-int no_alpha = 0;
-int bigtiff_output = 0;
-
-
-static int tiffcvt(TIFF* in, TIFF* out);
-static void usage(int code);
-
-int
-main(int argc, char* argv[])
-{
- TIFF *in, *out;
- int c;
- extern int optind;
- extern char *optarg;
-
- while ((c = getopt(argc, argv, "c:r:t:bn8")) != -1)
- switch (c) {
- case 'b':
- process_by_block = 1;
- break;
-
- case 'c':
- if (streq(optarg, "none"))
- compression = COMPRESSION_NONE;
- else if (streq(optarg, "packbits"))
- compression = COMPRESSION_PACKBITS;
- else if (streq(optarg, "lzw"))
- compression = COMPRESSION_LZW;
- else if (streq(optarg, "jpeg"))
- compression = COMPRESSION_JPEG;
- else if (streq(optarg, "zip"))
- compression = COMPRESSION_DEFLATE;
- else
- usage(-1);
- break;
-
- case 'r':
- rowsperstrip = atoi(optarg);
- break;
-
- case 't':
- rowsperstrip = atoi(optarg);
- break;
-
- case 'n':
- no_alpha = 1;
- break;
-
- case '8':
- bigtiff_output = 1;
- break;
-
- case '?':
- usage(0);
- /*NOTREACHED*/
- }
-
- if (argc - optind < 2)
- usage(-1);
-
- out = TIFFOpen(argv[argc-1], bigtiff_output?"w8":"w");
- if (out == NULL)
- return (-2);
-
- for (; optind < argc-1; optind++) {
- in = TIFFOpen(argv[optind], "r");
- if (in != NULL) {
- do {
- if (!tiffcvt(in, out) ||
- !TIFFWriteDirectory(out)) {
- (void) TIFFClose(out);
- (void) TIFFClose(in);
- return (1);
- }
- } while (TIFFReadDirectory(in));
- (void) TIFFClose(in);
- }
- }
- (void) TIFFClose(out);
- return (0);
-}
-
-static int
-cvt_by_tile( TIFF *in, TIFF *out )
-
-{
- uint32* raster; /* retrieve RGBA image */
- uint32 width, height; /* image width & height */
- uint32 tile_width, tile_height;
- uint32 row, col;
- uint32 *wrk_line;
- int ok = 1;
-
- TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width);
- TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height);
-
- if( !TIFFGetField(in, TIFFTAG_TILEWIDTH, &tile_width)
- || !TIFFGetField(in, TIFFTAG_TILELENGTH, &tile_height) ) {
- TIFFError(TIFFFileName(in), "Source image not tiled");
- return (0);
- }
-
- TIFFSetField(out, TIFFTAG_TILEWIDTH, tile_width );
- TIFFSetField(out, TIFFTAG_TILELENGTH, tile_height );
-
- /*
- * Allocate tile buffer
- */
- raster = (uint32*)_TIFFmalloc(tile_width * tile_height * sizeof (uint32));
- if (raster == 0) {
- TIFFError(TIFFFileName(in), "No space for raster buffer");
- return (0);
- }
-
- /*
- * Allocate a scanline buffer for swapping during the vertical
- * mirroring pass.
- */
- wrk_line = (uint32*)_TIFFmalloc(tile_width * sizeof (uint32));
- if (!wrk_line) {
- TIFFError(TIFFFileName(in), "No space for raster scanline buffer");
- ok = 0;
- }
-
- /*
- * Loop over the tiles.
- */
- for( row = 0; ok && row < height; row += tile_height )
- {
- for( col = 0; ok && col < width; col += tile_width )
- {
- uint32 i_row;
-
- /* Read the tile into an RGBA array */
- if (!TIFFReadRGBATile(in, col, row, raster)) {
- ok = 0;
- break;
- }
-
-
- /*
- * XXX: raster array has 4-byte unsigned integer type, that is why
- * we should rearrange it here.
- */
-#if HOST_BIGENDIAN
- TIFFSwabArrayOfLong(raster, tile_width * tile_height);
-#endif
-
- /*
- * For some reason the TIFFReadRGBATile() function chooses the
- * lower left corner as the origin. Vertically mirror scanlines.
- */
- for( i_row = 0; i_row < tile_height / 2; i_row++ )
- {
- uint32 *top_line, *bottom_line;
-
- top_line = raster + tile_width * i_row;
- bottom_line = raster + tile_width * (tile_height-i_row-1);
-
- _TIFFmemcpy(wrk_line, top_line, 4*tile_width);
- _TIFFmemcpy(top_line, bottom_line, 4*tile_width);
- _TIFFmemcpy(bottom_line, wrk_line, 4*tile_width);
- }
-
- /*
- * Write out the result in a tile.
- */
-
- if( TIFFWriteEncodedTile( out,
- TIFFComputeTile( out, col, row, 0, 0),
- raster,
- 4 * tile_width * tile_height ) == -1 )
- {
- ok = 0;
- break;
- }
- }
- }
-
- _TIFFfree( raster );
- _TIFFfree( wrk_line );
-
- return ok;
-}
-
-static int
-cvt_by_strip( TIFF *in, TIFF *out )
-
-{
- uint32* raster; /* retrieve RGBA image */
- uint32 width, height; /* image width & height */
- uint32 row;
- uint32 *wrk_line;
- int ok = 1;
-
- TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width);
- TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height);
-
- if( !TIFFGetField(in, TIFFTAG_ROWSPERSTRIP, &rowsperstrip) ) {
- TIFFError(TIFFFileName(in), "Source image not in strips");
- return (0);
- }
-
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
-
- /*
- * Allocate strip buffer
- */
- raster = (uint32*)_TIFFmalloc(width * rowsperstrip * sizeof (uint32));
- if (raster == 0) {
- TIFFError(TIFFFileName(in), "No space for raster buffer");
- return (0);
- }
-
- /*
- * Allocate a scanline buffer for swapping during the vertical
- * mirroring pass.
- */
- wrk_line = (uint32*)_TIFFmalloc(width * sizeof (uint32));
- if (!wrk_line) {
- TIFFError(TIFFFileName(in), "No space for raster scanline buffer");
- ok = 0;
- }
-
- /*
- * Loop over the strips.
- */
- for( row = 0; ok && row < height; row += rowsperstrip )
- {
- int rows_to_write, i_row;
-
- /* Read the strip into an RGBA array */
- if (!TIFFReadRGBAStrip(in, row, raster)) {
- ok = 0;
- break;
- }
-
- /*
- * XXX: raster array has 4-byte unsigned integer type, that is why
- * we should rearrange it here.
- */
-#if HOST_BIGENDIAN
- TIFFSwabArrayOfLong(raster, width * rowsperstrip);
-#endif
-
- /*
- * Figure out the number of scanlines actually in this strip.
- */
- if( row + rowsperstrip > height )
- rows_to_write = height - row;
- else
- rows_to_write = rowsperstrip;
-
- /*
- * For some reason the TIFFReadRGBAStrip() function chooses the
- * lower left corner as the origin. Vertically mirror scanlines.
- */
-
- for( i_row = 0; i_row < rows_to_write / 2; i_row++ )
- {
- uint32 *top_line, *bottom_line;
-
- top_line = raster + width * i_row;
- bottom_line = raster + width * (rows_to_write-i_row-1);
-
- _TIFFmemcpy(wrk_line, top_line, 4*width);
- _TIFFmemcpy(top_line, bottom_line, 4*width);
- _TIFFmemcpy(bottom_line, wrk_line, 4*width);
- }
-
- /*
- * Write out the result in a strip
- */
-
- if( TIFFWriteEncodedStrip( out, row / rowsperstrip, raster,
- 4 * rows_to_write * width ) == -1 )
- {
- ok = 0;
- break;
- }
- }
-
- _TIFFfree( raster );
- _TIFFfree( wrk_line );
-
- return ok;
-}
-
-/*
- * cvt_whole_image()
- *
- * read the whole image into one big RGBA buffer and then write out
- * strips from that. This is using the traditional TIFFReadRGBAImage()
- * API that we trust.
- */
-
-static int
-cvt_whole_image( TIFF *in, TIFF *out )
-
-{
- uint32* raster; /* retrieve RGBA image */
- uint32 width, height; /* image width & height */
- uint32 row;
- size_t pixel_count;
-
- TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width);
- TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height);
- pixel_count = width * height;
-
- /* XXX: Check the integer overflow. */
- if (!width || !height || pixel_count / width != height) {
- TIFFError(TIFFFileName(in),
- "Malformed input file; can't allocate buffer for raster of %lux%lu size",
- (unsigned long)width, (unsigned long)height);
- return 0;
- }
-
- rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip);
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
-
- raster = (uint32*)_TIFFCheckMalloc(in, pixel_count, sizeof(uint32), "raster buffer");
- if (raster == 0) {
- TIFFError(TIFFFileName(in), "Failed to allocate buffer (%lu elements of %lu each)",
- (unsigned long)pixel_count, (unsigned long)sizeof(uint32));
- return (0);
- }
-
- /* Read the image in one chunk into an RGBA array */
- if (!TIFFReadRGBAImageOriented(in, width, height, raster,
- ORIENTATION_TOPLEFT, 0)) {
- _TIFFfree(raster);
- return (0);
- }
-
- /*
- * XXX: raster array has 4-byte unsigned integer type, that is why
- * we should rearrange it here.
- */
-#if HOST_BIGENDIAN
- TIFFSwabArrayOfLong(raster, width * height);
-#endif
-
- /*
- * Do we want to strip away alpha components?
- */
- if (no_alpha)
- {
- size_t count = pixel_count;
- unsigned char *src, *dst;
-
- src = dst = (unsigned char *) raster;
- while (count > 0)
- {
- *(dst++) = *(src++);
- *(dst++) = *(src++);
- *(dst++) = *(src++);
- src++;
- count--;
- }
- }
-
- /*
- * Write out the result in strips
- */
- for (row = 0; row < height; row += rowsperstrip)
- {
- unsigned char * raster_strip;
- int rows_to_write;
- int bytes_per_pixel;
-
- if (no_alpha)
- {
- raster_strip = ((unsigned char *) raster) + 3 * row * width;
- bytes_per_pixel = 3;
- }
- else
- {
- raster_strip = (unsigned char *) (raster + row * width);
- bytes_per_pixel = 4;
- }
-
- if( row + rowsperstrip > height )
- rows_to_write = height - row;
- else
- rows_to_write = rowsperstrip;
-
- if( TIFFWriteEncodedStrip( out, row / rowsperstrip, raster_strip,
- bytes_per_pixel * rows_to_write * width ) == -1 )
- {
- _TIFFfree( raster );
- return 0;
- }
- }
-
- _TIFFfree( raster );
-
- return 1;
-}
-
-
-static int
-tiffcvt(TIFF* in, TIFF* out)
-{
- uint32 width, height; /* image width & height */
- uint16 shortv;
- float floatv;
- char *stringv;
- uint32 longv;
- uint16 v[1];
-
- TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width);
- TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height);
-
- CopyField(TIFFTAG_SUBFILETYPE, longv);
- TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width);
- TIFFSetField(out, TIFFTAG_IMAGELENGTH, height);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 8);
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
-
- CopyField(TIFFTAG_FILLORDER, shortv);
- TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
-
- if( no_alpha )
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 3);
- else
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 4);
-
- if( !no_alpha )
- {
- v[0] = EXTRASAMPLE_ASSOCALPHA;
- TIFFSetField(out, TIFFTAG_EXTRASAMPLES, 1, v);
- }
-
- CopyField(TIFFTAG_XRESOLUTION, floatv);
- CopyField(TIFFTAG_YRESOLUTION, floatv);
- CopyField(TIFFTAG_RESOLUTIONUNIT, shortv);
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- TIFFSetField(out, TIFFTAG_SOFTWARE, TIFFGetVersion());
- CopyField(TIFFTAG_DOCUMENTNAME, stringv);
-
- if( process_by_block && TIFFIsTiled( in ) )
- return( cvt_by_tile( in, out ) );
- else if( process_by_block )
- return( cvt_by_strip( in, out ) );
- else
- return( cvt_whole_image( in, out ) );
-}
-
-static char* stuff[] = {
- "usage: tiff2rgba [-c comp] [-r rows] [-b] [-n] [-8] input... output",
- "where comp is one of the following compression algorithms:",
- " jpeg\t\tJPEG encoding",
- " zip\t\tZip/Deflate encoding",
- " lzw\t\tLempel-Ziv & Welch encoding",
- " packbits\tPackBits encoding",
- " none\t\tno compression",
- "and the other options are:",
- " -r\trows/strip",
- " -b (progress by block rather than as a whole image)",
- " -n don't emit alpha component.",
- " -8 write BigTIFF file instead of ClassicTIFF",
- NULL
-};
-
-static void
-usage(int code)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(code);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/tiffcmp.c b/tiff/tools/tiffcmp.c
deleted file mode 100755
index 352fe12..0000000
--- a/tiff/tools/tiffcmp.c
+++ /dev/null
@@ -1,657 +0,0 @@
-/* $Id: tiffcmp.c,v 1.17 2014-12-21 18:52:42 erouault Exp $ */
-
-/*
- * Copyright (c) 1988-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffio.h"
-
-#ifndef HAVE_GETOPT
-extern int getopt(int, char**, char*);
-#endif
-
-static int stopondiff = 1;
-static int stoponfirsttag = 1;
-static uint16 bitspersample = 1;
-static uint16 samplesperpixel = 1;
-static uint16 sampleformat = SAMPLEFORMAT_UINT;
-static uint32 imagewidth;
-static uint32 imagelength;
-
-static void usage(void);
-static int tiffcmp(TIFF*, TIFF*);
-static int cmptags(TIFF*, TIFF*);
-static int ContigCompare(int, uint32, unsigned char*, unsigned char*, tsize_t);
-static int SeparateCompare(int, int, uint32, unsigned char*, unsigned char*);
-static void PrintIntDiff(uint32, int, uint32, uint32, uint32);
-static void PrintFloatDiff(uint32, int, uint32, double, double);
-
-static void leof(const char*, uint32, int);
-
-int
-main(int argc, char* argv[])
-{
- TIFF *tif1, *tif2;
- int c, dirnum;
- extern int optind;
- extern char* optarg;
-
- while ((c = getopt(argc, argv, "ltz:")) != -1)
- switch (c) {
- case 'l':
- stopondiff = 0;
- break;
- case 'z':
- stopondiff = atoi(optarg);
- break;
- case 't':
- stoponfirsttag = 0;
- break;
- case '?':
- usage();
- /*NOTREACHED*/
- }
- if (argc - optind < 2)
- usage();
- tif1 = TIFFOpen(argv[optind], "r");
- if (tif1 == NULL)
- return (-1);
- tif2 = TIFFOpen(argv[optind+1], "r");
- if (tif2 == NULL)
- return (-2);
- dirnum = 0;
- while (tiffcmp(tif1, tif2)) {
- if (!TIFFReadDirectory(tif1)) {
- if (!TIFFReadDirectory(tif2))
- break;
- printf("No more directories for %s\n",
- TIFFFileName(tif1));
- return (1);
- } else if (!TIFFReadDirectory(tif2)) {
- printf("No more directories for %s\n",
- TIFFFileName(tif2));
- return (1);
- }
- printf("Directory %d:\n", ++dirnum);
- }
-
- TIFFClose(tif1);
- TIFFClose(tif2);
- return (0);
-}
-
-char* stuff[] = {
-"usage: tiffcmp [options] file1 file2",
-"where options are:",
-" -l list each byte of image data that differs between the files",
-" -z # list specified number of bytes that differs between the files",
-" -t ignore any differences in directory tags",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-#define checkEOF(tif, row, sample) { \
- leof(TIFFFileName(tif), row, sample); \
- goto bad; \
-}
-
-static int CheckShortTag(TIFF*, TIFF*, int, char*);
-static int CheckShort2Tag(TIFF*, TIFF*, int, char*);
-static int CheckShortArrayTag(TIFF*, TIFF*, int, char*);
-static int CheckLongTag(TIFF*, TIFF*, int, char*);
-static int CheckFloatTag(TIFF*, TIFF*, int, char*);
-static int CheckStringTag(TIFF*, TIFF*, int, char*);
-
-static int
-tiffcmp(TIFF* tif1, TIFF* tif2)
-{
- uint16 config1, config2;
- tsize_t size1;
- uint32 row;
- tsample_t s;
- unsigned char *buf1, *buf2;
-
- if (!CheckShortTag(tif1, tif2, TIFFTAG_BITSPERSAMPLE, "BitsPerSample"))
- return (0);
- if (!CheckShortTag(tif1, tif2, TIFFTAG_SAMPLESPERPIXEL, "SamplesPerPixel"))
- return (0);
- if (!CheckLongTag(tif1, tif2, TIFFTAG_IMAGEWIDTH, "ImageWidth"))
- return (0);
- if (!cmptags(tif1, tif2))
- return (1);
- (void) TIFFGetField(tif1, TIFFTAG_BITSPERSAMPLE, &bitspersample);
- (void) TIFFGetField(tif1, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel);
- (void) TIFFGetField(tif1, TIFFTAG_SAMPLEFORMAT, &sampleformat);
- (void) TIFFGetField(tif1, TIFFTAG_IMAGEWIDTH, &imagewidth);
- (void) TIFFGetField(tif1, TIFFTAG_IMAGELENGTH, &imagelength);
- (void) TIFFGetField(tif1, TIFFTAG_PLANARCONFIG, &config1);
- (void) TIFFGetField(tif2, TIFFTAG_PLANARCONFIG, &config2);
- buf1 = (unsigned char *)_TIFFmalloc(size1 = TIFFScanlineSize(tif1));
- buf2 = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(tif2));
- if (buf1 == NULL || buf2 == NULL) {
- fprintf(stderr, "No space for scanline buffers\n");
- exit(-1);
- }
- if (config1 != config2 && bitspersample != 8 && samplesperpixel > 1) {
- fprintf(stderr,
-"Can't handle different planar configuration w/ different bits/sample\n");
- goto bad;
- }
-#define pack(a,b) ((a)<<8)|(b)
- switch (pack(config1, config2)) {
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG):
- for (row = 0; row < imagelength; row++) {
- if (TIFFReadScanline(tif2, buf2, row, 0) < 0)
- checkEOF(tif2, row, -1)
- for (s = 0; s < samplesperpixel; s++) {
- if (TIFFReadScanline(tif1, buf1, row, s) < 0)
- checkEOF(tif1, row, s)
- if (SeparateCompare(1, s, row, buf2, buf1) < 0)
- goto bad1;
- }
- }
- break;
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE):
- for (row = 0; row < imagelength; row++) {
- if (TIFFReadScanline(tif1, buf1, row, 0) < 0)
- checkEOF(tif1, row, -1)
- for (s = 0; s < samplesperpixel; s++) {
- if (TIFFReadScanline(tif2, buf2, row, s) < 0)
- checkEOF(tif2, row, s)
- if (SeparateCompare(0, s, row, buf1, buf2) < 0)
- goto bad1;
- }
- }
- break;
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE):
- for (s = 0; s < samplesperpixel; s++)
- for (row = 0; row < imagelength; row++) {
- if (TIFFReadScanline(tif1, buf1, row, s) < 0)
- checkEOF(tif1, row, s)
- if (TIFFReadScanline(tif2, buf2, row, s) < 0)
- checkEOF(tif2, row, s)
- if (ContigCompare(s, row, buf1, buf2, size1) < 0)
- goto bad1;
- }
- break;
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG):
- for (row = 0; row < imagelength; row++) {
- if (TIFFReadScanline(tif1, buf1, row, 0) < 0)
- checkEOF(tif1, row, -1)
- if (TIFFReadScanline(tif2, buf2, row, 0) < 0)
- checkEOF(tif2, row, -1)
- if (ContigCompare(-1, row, buf1, buf2, size1) < 0)
- goto bad1;
- }
- break;
- }
- if (buf1) _TIFFfree(buf1);
- if (buf2) _TIFFfree(buf2);
- return (1);
-bad:
- if (stopondiff)
- exit(1);
-bad1:
- if (buf1) _TIFFfree(buf1);
- if (buf2) _TIFFfree(buf2);
- return (0);
-}
-
-#define CmpShortField(tag, name) \
- if (!CheckShortTag(tif1, tif2, tag, name) && stoponfirsttag) return (0)
-#define CmpShortField2(tag, name) \
- if (!CheckShort2Tag(tif1, tif2, tag, name) && stoponfirsttag) return (0)
-#define CmpLongField(tag, name) \
- if (!CheckLongTag(tif1, tif2, tag, name) && stoponfirsttag) return (0)
-#define CmpFloatField(tag, name) \
- if (!CheckFloatTag(tif1, tif2, tag, name) && stoponfirsttag) return (0)
-#define CmpStringField(tag, name) \
- if (!CheckStringTag(tif1, tif2, tag, name) && stoponfirsttag) return (0)
-#define CmpShortArrayField(tag, name) \
- if (!CheckShortArrayTag(tif1, tif2, tag, name) && stoponfirsttag) return (0)
-
-static int
-cmptags(TIFF* tif1, TIFF* tif2)
-{
- uint16 compression1, compression2;
- CmpLongField(TIFFTAG_SUBFILETYPE, "SubFileType");
- CmpLongField(TIFFTAG_IMAGEWIDTH, "ImageWidth");
- CmpLongField(TIFFTAG_IMAGELENGTH, "ImageLength");
- CmpShortField(TIFFTAG_BITSPERSAMPLE, "BitsPerSample");
- CmpShortField(TIFFTAG_COMPRESSION, "Compression");
- CmpShortField(TIFFTAG_PREDICTOR, "Predictor");
- CmpShortField(TIFFTAG_PHOTOMETRIC, "PhotometricInterpretation");
- CmpShortField(TIFFTAG_THRESHHOLDING, "Thresholding");
- CmpShortField(TIFFTAG_FILLORDER, "FillOrder");
- CmpShortField(TIFFTAG_ORIENTATION, "Orientation");
- CmpShortField(TIFFTAG_SAMPLESPERPIXEL, "SamplesPerPixel");
- CmpShortField(TIFFTAG_MINSAMPLEVALUE, "MinSampleValue");
- CmpShortField(TIFFTAG_MAXSAMPLEVALUE, "MaxSampleValue");
- CmpShortField(TIFFTAG_SAMPLEFORMAT, "SampleFormat");
- CmpFloatField(TIFFTAG_XRESOLUTION, "XResolution");
- CmpFloatField(TIFFTAG_YRESOLUTION, "YResolution");
- if( TIFFGetField(tif1, TIFFTAG_COMPRESSION, &compression1) &&
- compression1 == COMPRESSION_CCITTFAX3 &&
- TIFFGetField(tif2, TIFFTAG_COMPRESSION, &compression2) &&
- compression2 == COMPRESSION_CCITTFAX3 )
- {
- CmpLongField(TIFFTAG_GROUP3OPTIONS, "Group3Options");
- }
- if( TIFFGetField(tif1, TIFFTAG_COMPRESSION, &compression1) &&
- compression1 == COMPRESSION_CCITTFAX4 &&
- TIFFGetField(tif2, TIFFTAG_COMPRESSION, &compression2) &&
- compression2 == COMPRESSION_CCITTFAX4 )
- {
- CmpLongField(TIFFTAG_GROUP4OPTIONS, "Group4Options");
- }
- CmpShortField(TIFFTAG_RESOLUTIONUNIT, "ResolutionUnit");
- CmpShortField(TIFFTAG_PLANARCONFIG, "PlanarConfiguration");
- CmpLongField(TIFFTAG_ROWSPERSTRIP, "RowsPerStrip");
- CmpFloatField(TIFFTAG_XPOSITION, "XPosition");
- CmpFloatField(TIFFTAG_YPOSITION, "YPosition");
- CmpShortField(TIFFTAG_GRAYRESPONSEUNIT, "GrayResponseUnit");
- CmpShortField(TIFFTAG_COLORRESPONSEUNIT, "ColorResponseUnit");
-#ifdef notdef
- { uint16 *graycurve;
- CmpField(TIFFTAG_GRAYRESPONSECURVE, graycurve);
- }
- { uint16 *red, *green, *blue;
- CmpField3(TIFFTAG_COLORRESPONSECURVE, red, green, blue);
- }
- { uint16 *red, *green, *blue;
- CmpField3(TIFFTAG_COLORMAP, red, green, blue);
- }
-#endif
- CmpShortField2(TIFFTAG_PAGENUMBER, "PageNumber");
- CmpStringField(TIFFTAG_ARTIST, "Artist");
- CmpStringField(TIFFTAG_IMAGEDESCRIPTION,"ImageDescription");
- CmpStringField(TIFFTAG_MAKE, "Make");
- CmpStringField(TIFFTAG_MODEL, "Model");
- CmpStringField(TIFFTAG_SOFTWARE, "Software");
- CmpStringField(TIFFTAG_DATETIME, "DateTime");
- CmpStringField(TIFFTAG_HOSTCOMPUTER, "HostComputer");
- CmpStringField(TIFFTAG_PAGENAME, "PageName");
- CmpStringField(TIFFTAG_DOCUMENTNAME, "DocumentName");
- CmpShortField(TIFFTAG_MATTEING, "Matteing");
- CmpShortArrayField(TIFFTAG_EXTRASAMPLES,"ExtraSamples");
- return (1);
-}
-
-static int
-ContigCompare(int sample, uint32 row,
- unsigned char* p1, unsigned char* p2, tsize_t size)
-{
- uint32 pix;
- int ppb = 8 / bitspersample;
- int samples_to_test;
-
- if (memcmp(p1, p2, size) == 0)
- return 0;
-
- samples_to_test = (sample == -1) ? samplesperpixel : 1;
-
- switch (bitspersample) {
- case 1: case 2: case 4: case 8:
- {
- unsigned char *pix1 = p1, *pix2 = p2;
-
- for (pix = 0; pix < imagewidth; pix += ppb) {
- int s;
-
- for(s = 0; s < samples_to_test; s++) {
- if (*pix1 != *pix2) {
- if( sample == -1 )
- PrintIntDiff(row, s, pix, *pix1, *pix2);
- else
- PrintIntDiff(row, sample, pix, *pix1, *pix2);
- }
-
- pix1++;
- pix2++;
- }
- }
- break;
- }
- case 16:
- {
- uint16 *pix1 = (uint16 *)p1, *pix2 = (uint16 *)p2;
-
- for (pix = 0; pix < imagewidth; pix++) {
- int s;
-
- for(s = 0; s < samples_to_test; s++) {
- if (*pix1 != *pix2)
- PrintIntDiff(row, sample, pix, *pix1, *pix2);
-
- pix1++;
- pix2++;
- }
- }
- break;
- }
- case 32:
- if (sampleformat == SAMPLEFORMAT_UINT
- || sampleformat == SAMPLEFORMAT_INT) {
- uint32 *pix1 = (uint32 *)p1, *pix2 = (uint32 *)p2;
-
- for (pix = 0; pix < imagewidth; pix++) {
- int s;
-
- for(s = 0; s < samples_to_test; s++) {
- if (*pix1 != *pix2) {
- PrintIntDiff(row, sample, pix,
- *pix1, *pix2);
- }
-
- pix1++;
- pix2++;
- }
- }
- } else if (sampleformat == SAMPLEFORMAT_IEEEFP) {
- float *pix1 = (float *)p1, *pix2 = (float *)p2;
-
- for (pix = 0; pix < imagewidth; pix++) {
- int s;
-
- for(s = 0; s < samples_to_test; s++) {
- if (fabs(*pix1 - *pix2) < 0.000000000001) {
- PrintFloatDiff(row, sample, pix,
- *pix1, *pix2);
- }
-
- pix1++;
- pix2++;
- }
- }
- } else {
- fprintf(stderr, "Sample format %d is not supported.\n",
- sampleformat);
- return -1;
- }
- break;
- default:
- fprintf(stderr, "Bit depth %d is not supported.\n", bitspersample);
- return -1;
- }
-
- return 0;
-}
-
-static void
-PrintIntDiff(uint32 row, int sample, uint32 pix, uint32 w1, uint32 w2)
-{
- if (sample < 0)
- sample = 0;
- switch (bitspersample) {
- case 1:
- case 2:
- case 4:
- {
- int32 mask1, mask2, s;
-
- mask1 = ~((-1) << bitspersample);
- s = (8 - bitspersample);
- mask2 = mask1 << s;
- for (; mask2 && pix < imagewidth;
- mask2 >>= bitspersample, s -= bitspersample, pix++) {
- if ((w1 & mask2) ^ (w2 & mask2)) {
- printf(
- "Scanline %lu, pixel %lu, sample %d: %01x %01x\n",
- (unsigned long) row,
- (unsigned long) pix,
- sample,
- (unsigned int)((w1 >> s) & mask1),
- (unsigned int)((w2 >> s) & mask1));
- if (--stopondiff == 0)
- exit(1);
- }
- }
- break;
- }
- case 8:
- printf("Scanline %lu, pixel %lu, sample %d: %02x %02x\n",
- (unsigned long) row, (unsigned long) pix, sample,
- (unsigned int) w1, (unsigned int) w2);
- if (--stopondiff == 0)
- exit(1);
- break;
- case 16:
- printf("Scanline %lu, pixel %lu, sample %d: %04x %04x\n",
- (unsigned long) row, (unsigned long) pix, sample,
- (unsigned int) w1, (unsigned int) w2);
- if (--stopondiff == 0)
- exit(1);
- break;
- case 32:
- printf("Scanline %lu, pixel %lu, sample %d: %08x %08x\n",
- (unsigned long) row, (unsigned long) pix, sample,
- (unsigned int) w1, (unsigned int) w2);
- if (--stopondiff == 0)
- exit(1);
- break;
- default:
- break;
- }
-}
-
-static void
-PrintFloatDiff(uint32 row, int sample, uint32 pix, double w1, double w2)
-{
- if (sample < 0)
- sample = 0;
- switch (bitspersample) {
- case 32:
- printf("Scanline %lu, pixel %lu, sample %d: %g %g\n",
- (long) row, (long) pix, sample, w1, w2);
- if (--stopondiff == 0)
- exit(1);
- break;
- default:
- break;
- }
-}
-
-static int
-SeparateCompare(int reversed, int sample, uint32 row,
- unsigned char* cp1, unsigned char* p2)
-{
- uint32 npixels = imagewidth;
- int pixel;
-
- cp1 += sample;
- for (pixel = 0; npixels-- > 0; pixel++, cp1 += samplesperpixel, p2++) {
- if (*cp1 != *p2) {
- printf("Scanline %lu, pixel %lu, sample %ld: ",
- (long) row, (long) pixel, (long) sample);
- if (reversed)
- printf("%02x %02x\n", *p2, *cp1);
- else
- printf("%02x %02x\n", *cp1, *p2);
- if (--stopondiff == 0)
- exit(1);
- }
- }
-
- return 0;
-}
-
-static int
-checkTag(TIFF* tif1, TIFF* tif2, int tag, char* name, void* p1, void* p2)
-{
-
- if (TIFFGetField(tif1, tag, p1)) {
- if (!TIFFGetField(tif2, tag, p2)) {
- printf("%s tag appears only in %s\n",
- name, TIFFFileName(tif1));
- return (0);
- }
- return (1);
- } else if (TIFFGetField(tif2, tag, p2)) {
- printf("%s tag appears only in %s\n", name, TIFFFileName(tif2));
- return (0);
- }
- return (-1);
-}
-
-#define CHECK(cmp, fmt) { \
- switch (checkTag(tif1,tif2,tag,name,&v1,&v2)) { \
- case 1: if (cmp) \
- case -1: return (1); \
- printf(fmt, name, v1, v2); \
- } \
- return (0); \
-}
-
-static int
-CheckShortTag(TIFF* tif1, TIFF* tif2, int tag, char* name)
-{
- uint16 v1, v2;
- CHECK(v1 == v2, "%s: %u %u\n");
-}
-
-static int
-CheckShort2Tag(TIFF* tif1, TIFF* tif2, int tag, char* name)
-{
- uint16 v11, v12, v21, v22;
-
- if (TIFFGetField(tif1, tag, &v11, &v12)) {
- if (!TIFFGetField(tif2, tag, &v21, &v22)) {
- printf("%s tag appears only in %s\n",
- name, TIFFFileName(tif1));
- return (0);
- }
- if (v11 == v21 && v12 == v22)
- return (1);
- printf("%s: <%u,%u> <%u,%u>\n", name, v11, v12, v21, v22);
- } else if (TIFFGetField(tif2, tag, &v21, &v22))
- printf("%s tag appears only in %s\n", name, TIFFFileName(tif2));
- else
- return (1);
- return (0);
-}
-
-static int
-CheckShortArrayTag(TIFF* tif1, TIFF* tif2, int tag, char* name)
-{
- uint16 n1, *a1;
- uint16 n2, *a2;
-
- if (TIFFGetField(tif1, tag, &n1, &a1)) {
- if (!TIFFGetField(tif2, tag, &n2, &a2)) {
- printf("%s tag appears only in %s\n",
- name, TIFFFileName(tif1));
- return (0);
- }
- if (n1 == n2) {
- char* sep;
- uint16 i;
-
- if (memcmp(a1, a2, n1 * sizeof(uint16)) == 0)
- return (1);
- printf("%s: value mismatch, <%u:", name, n1);
- sep = "";
- for (i = 0; i < n1; i++)
- printf("%s%u", sep, a1[i]), sep = ",";
- printf("> and <%u: ", n2);
- sep = "";
- for (i = 0; i < n2; i++)
- printf("%s%u", sep, a2[i]), sep = ",";
- printf(">\n");
- } else
- printf("%s: %u items in %s, %u items in %s", name,
- n1, TIFFFileName(tif1),
- n2, TIFFFileName(tif2)
- );
- } else if (TIFFGetField(tif2, tag, &n2, &a2))
- printf("%s tag appears only in %s\n", name, TIFFFileName(tif2));
- else
- return (1);
- return (0);
-}
-
-static int
-CheckLongTag(TIFF* tif1, TIFF* tif2, int tag, char* name)
-{
- uint32 v1, v2;
- CHECK(v1 == v2, "%s: %u %u\n");
-}
-
-static int
-CheckFloatTag(TIFF* tif1, TIFF* tif2, int tag, char* name)
-{
- float v1, v2;
- CHECK(v1 == v2, "%s: %g %g\n");
-}
-
-static int
-CheckStringTag(TIFF* tif1, TIFF* tif2, int tag, char* name)
-{
- char *v1, *v2;
- CHECK(strcmp(v1, v2) == 0, "%s: \"%s\" \"%s\"\n");
-}
-
-static void
-leof(const char* name, uint32 row, int s)
-{
-
- printf("%s: EOF at scanline %lu", name, (unsigned long)row);
- if (s >= 0)
- printf(", sample %d", s);
- printf("\n");
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/tiffcp.c b/tiff/tools/tiffcp.c
deleted file mode 100755
index c186b9b..0000000
--- a/tiff/tools/tiffcp.c
+++ /dev/null
@@ -1,1870 +0,0 @@
-/* $Id: tiffcp.c,v 1.51 2014-12-21 16:28:37 erouault Exp $ */
-
-/*
- * Copyright (c) 1988-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Revised: 2/18/01 BAR -- added syntax for extracting single images from
- * multi-image TIFF files.
- *
- * New syntax is: sourceFileName,image#
- *
- * image# ranges from 0..<n-1> where n is the # of images in the file.
- * There may be no white space between the comma and the filename or
- * image number.
- *
- * Example: tiffcp source.tif,1 destination.tif
- *
- * Copies the 2nd image in source.tif to the destination.
- *
- *****
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <ctype.h>
-#include <assert.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#include "tiffio.h"
-
-#ifndef HAVE_GETOPT
-extern int getopt(int, char**, char*);
-#endif
-
-#if defined(VMS)
-# define unlink delete
-#endif
-
-#define streq(a,b) (strcmp(a,b) == 0)
-#define strneq(a,b,n) (strncmp(a,b,n) == 0)
-
-#define TRUE 1
-#define FALSE 0
-
-static int outtiled = -1;
-static uint32 tilewidth;
-static uint32 tilelength;
-
-static uint16 config;
-static uint16 compression;
-static uint16 predictor;
-static int preset;
-static uint16 fillorder;
-static uint16 orientation;
-static uint32 rowsperstrip;
-static uint32 g3opts;
-static int ignore = FALSE; /* if true, ignore read errors */
-static uint32 defg3opts = (uint32) -1;
-static int quality = 75; /* JPEG quality */
-static int jpegcolormode = JPEGCOLORMODE_RGB;
-static uint16 defcompression = (uint16) -1;
-static uint16 defpredictor = (uint16) -1;
-static int defpreset = -1;
-
-static int tiffcp(TIFF*, TIFF*);
-static int processCompressOptions(char*);
-static void usage(void);
-
-static char comma = ','; /* (default) comma separator character */
-static TIFF* bias = NULL;
-static int pageNum = 0;
-static int pageInSeq = 0;
-
-static int nextSrcImage (TIFF *tif, char **imageSpec)
-/*
- seek to the next image specified in *imageSpec
- returns 1 if success, 0 if no more images to process
- *imageSpec=NULL if subsequent images should be processed in sequence
-*/
-{
- if (**imageSpec == comma) { /* if not @comma, we've done all images */
- char *start = *imageSpec + 1;
- tdir_t nextImage = (tdir_t)strtol(start, imageSpec, 0);
- if (start == *imageSpec) nextImage = TIFFCurrentDirectory (tif);
- if (**imageSpec)
- {
- if (**imageSpec == comma) {
- /* a trailing comma denotes remaining images in sequence */
- if ((*imageSpec)[1] == '\0') *imageSpec = NULL;
- }else{
- fprintf (stderr,
- "Expected a %c separated image # list after %s\n",
- comma, TIFFFileName (tif));
- exit (-4); /* syntax error */
- }
- }
- if (TIFFSetDirectory (tif, nextImage)) return 1;
- fprintf (stderr, "%s%c%d not found!\n",
- TIFFFileName(tif), comma, (int) nextImage);
- }
- return 0;
-}
-
-
-static TIFF* openSrcImage (char **imageSpec)
-/*
- imageSpec points to a pointer to a filename followed by optional ,image#'s
- Open the TIFF file and assign *imageSpec to either NULL if there are
- no images specified, or a pointer to the next image number text
-*/
-{
- TIFF *tif;
- char *fn = *imageSpec;
- *imageSpec = strchr (fn, comma);
- if (*imageSpec) { /* there is at least one image number specifier */
- **imageSpec = '\0';
- tif = TIFFOpen (fn, "r");
- /* but, ignore any single trailing comma */
- if (!(*imageSpec)[1]) {*imageSpec = NULL; return tif;}
- if (tif) {
- **imageSpec = comma; /* replace the comma */
- if (!nextSrcImage(tif, imageSpec)) {
- TIFFClose (tif);
- tif = NULL;
- }
- }
- }else
- tif = TIFFOpen (fn, "r");
- return tif;
-}
-
-int
-main(int argc, char* argv[])
-{
- uint16 defconfig = (uint16) -1;
- uint16 deffillorder = 0;
- uint32 deftilewidth = (uint32) -1;
- uint32 deftilelength = (uint32) -1;
- uint32 defrowsperstrip = (uint32) 0;
- uint64 diroff = 0;
- TIFF* in;
- TIFF* out;
- char mode[10];
- char* mp = mode;
- int c;
- extern int optind;
- extern char* optarg;
-
- *mp++ = 'w';
- *mp = '\0';
- while ((c = getopt(argc, argv, ",:b:c:f:l:o:p:r:w:aistBLMC8x")) != -1)
- switch (c) {
- case ',':
- if (optarg[0] != '=') usage();
- comma = optarg[1];
- break;
- case 'b': /* this file is bias image subtracted from others */
- if (bias) {
- fputs ("Only 1 bias image may be specified\n", stderr);
- exit (-2);
- }
- {
- uint16 samples = (uint16) -1;
- char **biasFn = &optarg;
- bias = openSrcImage (biasFn);
- if (!bias) exit (-5);
- if (TIFFIsTiled (bias)) {
- fputs ("Bias image must be organized in strips\n", stderr);
- exit (-7);
- }
- TIFFGetField(bias, TIFFTAG_SAMPLESPERPIXEL, &samples);
- if (samples != 1) {
- fputs ("Bias image must be monochrome\n", stderr);
- exit (-7);
- }
- }
- break;
- case 'a': /* append to output */
- mode[0] = 'a';
- break;
- case 'c': /* compression scheme */
- if (!processCompressOptions(optarg))
- usage();
- break;
- case 'f': /* fill order */
- if (streq(optarg, "lsb2msb"))
- deffillorder = FILLORDER_LSB2MSB;
- else if (streq(optarg, "msb2lsb"))
- deffillorder = FILLORDER_MSB2LSB;
- else
- usage();
- break;
- case 'i': /* ignore errors */
- ignore = TRUE;
- break;
- case 'l': /* tile length */
- outtiled = TRUE;
- deftilelength = atoi(optarg);
- break;
- case 'o': /* initial directory offset */
- diroff = strtoul(optarg, NULL, 0);
- break;
- case 'p': /* planar configuration */
- if (streq(optarg, "separate"))
- defconfig = PLANARCONFIG_SEPARATE;
- else if (streq(optarg, "contig"))
- defconfig = PLANARCONFIG_CONTIG;
- else
- usage();
- break;
- case 'r': /* rows/strip */
- defrowsperstrip = atol(optarg);
- break;
- case 's': /* generate stripped output */
- outtiled = FALSE;
- break;
- case 't': /* generate tiled output */
- outtiled = TRUE;
- break;
- case 'w': /* tile width */
- outtiled = TRUE;
- deftilewidth = atoi(optarg);
- break;
- case 'B':
- *mp++ = 'b'; *mp = '\0';
- break;
- case 'L':
- *mp++ = 'l'; *mp = '\0';
- break;
- case 'M':
- *mp++ = 'm'; *mp = '\0';
- break;
- case 'C':
- *mp++ = 'c'; *mp = '\0';
- break;
- case '8':
- *mp++ = '8'; *mp = '\0';
- break;
- case 'x':
- pageInSeq = 1;
- break;
- case '?':
- usage();
- /*NOTREACHED*/
- }
- if (argc - optind < 2)
- usage();
- out = TIFFOpen(argv[argc-1], mode);
- if (out == NULL)
- return (-2);
- if ((argc - optind) == 2)
- pageNum = -1;
- for (; optind < argc-1 ; optind++) {
- char *imageCursor = argv[optind];
- in = openSrcImage (&imageCursor);
- if (in == NULL) {
- (void) TIFFClose(out);
- return (-3);
- }
- if (diroff != 0 && !TIFFSetSubDirectory(in, diroff)) {
- TIFFError(TIFFFileName(in),
- "Error, setting subdirectory at " TIFF_UINT64_FORMAT, diroff);
- (void) TIFFClose(in);
- (void) TIFFClose(out);
- return (1);
- }
- for (;;) {
- config = defconfig;
- compression = defcompression;
- predictor = defpredictor;
- preset = defpreset;
- fillorder = deffillorder;
- rowsperstrip = defrowsperstrip;
- tilewidth = deftilewidth;
- tilelength = deftilelength;
- g3opts = defg3opts;
- if (!tiffcp(in, out) || !TIFFWriteDirectory(out)) {
- (void) TIFFClose(in);
- (void) TIFFClose(out);
- return (1);
- }
- if (imageCursor) { /* seek next image directory */
- if (!nextSrcImage(in, &imageCursor)) break;
- }else
- if (!TIFFReadDirectory(in)) break;
- }
- (void) TIFFClose(in);
- }
-
- (void) TIFFClose(out);
- return (0);
-}
-
-static void
-processZIPOptions(char* cp)
-{
- if ( (cp = strchr(cp, ':')) ) {
- do {
- cp++;
- if (isdigit((int)*cp))
- defpredictor = atoi(cp);
- else if (*cp == 'p')
- defpreset = atoi(++cp);
- else
- usage();
- } while( (cp = strchr(cp, ':')) );
- }
-}
-
-static void
-processG3Options(char* cp)
-{
- if( (cp = strchr(cp, ':')) ) {
- if (defg3opts == (uint32) -1)
- defg3opts = 0;
- do {
- cp++;
- if (strneq(cp, "1d", 2))
- defg3opts &= ~GROUP3OPT_2DENCODING;
- else if (strneq(cp, "2d", 2))
- defg3opts |= GROUP3OPT_2DENCODING;
- else if (strneq(cp, "fill", 4))
- defg3opts |= GROUP3OPT_FILLBITS;
- else
- usage();
- } while( (cp = strchr(cp, ':')) );
- }
-}
-
-static int
-processCompressOptions(char* opt)
-{
- if (streq(opt, "none")) {
- defcompression = COMPRESSION_NONE;
- } else if (streq(opt, "packbits")) {
- defcompression = COMPRESSION_PACKBITS;
- } else if (strneq(opt, "jpeg", 4)) {
- char* cp = strchr(opt, ':');
-
- defcompression = COMPRESSION_JPEG;
- while( cp )
- {
- if (isdigit((int)cp[1]))
- quality = atoi(cp+1);
- else if (cp[1] == 'r' )
- jpegcolormode = JPEGCOLORMODE_RAW;
- else
- usage();
-
- cp = strchr(cp+1,':');
- }
- } else if (strneq(opt, "g3", 2)) {
- processG3Options(opt);
- defcompression = COMPRESSION_CCITTFAX3;
- } else if (streq(opt, "g4")) {
- defcompression = COMPRESSION_CCITTFAX4;
- } else if (strneq(opt, "lzw", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- defpredictor = atoi(cp+1);
- defcompression = COMPRESSION_LZW;
- } else if (strneq(opt, "zip", 3)) {
- processZIPOptions(opt);
- defcompression = COMPRESSION_ADOBE_DEFLATE;
- } else if (strneq(opt, "lzma", 4)) {
- processZIPOptions(opt);
- defcompression = COMPRESSION_LZMA;
- } else if (strneq(opt, "jbig", 4)) {
- defcompression = COMPRESSION_JBIG;
- } else if (strneq(opt, "sgilog", 6)) {
- defcompression = COMPRESSION_SGILOG;
- } else
- return (0);
- return (1);
-}
-
-char* stuff[] = {
-"usage: tiffcp [options] input... output",
-"where options are:",
-" -a append to output instead of overwriting",
-" -o offset set initial directory offset",
-" -p contig pack samples contiguously (e.g. RGBRGB...)",
-" -p separate store samples separately (e.g. RRR...GGG...BBB...)",
-" -s write output in strips",
-" -t write output in tiles",
-" -x force the merged tiff pages in sequence",
-" -8 write BigTIFF instead of default ClassicTIFF",
-" -B write big-endian instead of native byte order",
-" -L write little-endian instead of native byte order",
-" -M disable use of memory-mapped files",
-" -C disable strip chopping",
-" -i ignore read errors",
-" -b file[,#] bias (dark) monochrome image to be subtracted from all others",
-" -,=% use % rather than , to separate image #'s (per Note below)",
-"",
-" -r # make each strip have no more than # rows",
-" -w # set output tile width (pixels)",
-" -l # set output tile length (pixels)",
-"",
-" -f lsb2msb force lsb-to-msb FillOrder for output",
-" -f msb2lsb force msb-to-lsb FillOrder for output",
-"",
-" -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding",
-" -c zip[:opts] compress output with deflate encoding",
-" -c lzma[:opts] compress output with LZMA2 encoding",
-" -c jpeg[:opts] compress output with JPEG encoding",
-" -c jbig compress output with ISO JBIG encoding",
-" -c packbits compress output with packbits encoding",
-" -c g3[:opts] compress output with CCITT Group 3 encoding",
-" -c g4 compress output with CCITT Group 4 encoding",
-" -c sgilog compress output with SGILOG encoding",
-" -c none use no compression algorithm on output",
-"",
-"Group 3 options:",
-" 1d use default CCITT Group 3 1D-encoding",
-" 2d use optional CCITT Group 3 2D-encoding",
-" fill byte-align EOL codes",
-"For example, -c g3:2d:fill to get G3-2D-encoded data with byte-aligned EOLs",
-"",
-"JPEG options:",
-" # set compression quality level (0-100, default 75)",
-" r output color image as RGB rather than YCbCr",
-"For example, -c jpeg:r:50 to get JPEG-encoded RGB data with 50% comp. quality",
-"",
-"LZW, Deflate (ZIP) and LZMA2 options:",
-" # set predictor value",
-" p# set compression level (preset)",
-"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing,",
-"-c zip:3:p9 for Deflate encoding with maximum compression level and floating",
-"point predictor.",
-"",
-"Note that input filenames may be of the form filename,x,y,z",
-"where x, y, and z specify image numbers in the filename to copy.",
-"example: tiffcp -c none -b esp.tif,1 esp.tif,0 test.tif",
-" subtract 2nd image in esp.tif from 1st yielding uncompressed result test.tif",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-#define CopyField(tag, v) \
- if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v)
-#define CopyField2(tag, v1, v2) \
- if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2)
-#define CopyField3(tag, v1, v2, v3) \
- if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3)
-#define CopyField4(tag, v1, v2, v3, v4) \
- if (TIFFGetField(in, tag, &v1, &v2, &v3, &v4)) TIFFSetField(out, tag, v1, v2, v3, v4)
-
-static void
-cpTag(TIFF* in, TIFF* out, uint16 tag, uint16 count, TIFFDataType type)
-{
- switch (type) {
- case TIFF_SHORT:
- if (count == 1) {
- uint16 shortv;
- CopyField(tag, shortv);
- } else if (count == 2) {
- uint16 shortv1, shortv2;
- CopyField2(tag, shortv1, shortv2);
- } else if (count == 4) {
- uint16 *tr, *tg, *tb, *ta;
- CopyField4(tag, tr, tg, tb, ta);
- } else if (count == (uint16) -1) {
- uint16 shortv1;
- uint16* shortav;
- CopyField2(tag, shortv1, shortav);
- }
- break;
- case TIFF_LONG:
- { uint32 longv;
- CopyField(tag, longv);
- }
- break;
- case TIFF_RATIONAL:
- if (count == 1) {
- float floatv;
- CopyField(tag, floatv);
- } else if (count == (uint16) -1) {
- float* floatav;
- CopyField(tag, floatav);
- }
- break;
- case TIFF_ASCII:
- { char* stringv;
- CopyField(tag, stringv);
- }
- break;
- case TIFF_DOUBLE:
- if (count == 1) {
- double doublev;
- CopyField(tag, doublev);
- } else if (count == (uint16) -1) {
- double* doubleav;
- CopyField(tag, doubleav);
- }
- break;
- default:
- TIFFError(TIFFFileName(in),
- "Data type %d is not supported, tag %d skipped.",
- tag, type);
- }
-}
-
-static struct cpTag {
- uint16 tag;
- uint16 count;
- TIFFDataType type;
-} tags[] = {
- { TIFFTAG_SUBFILETYPE, 1, TIFF_LONG },
- { TIFFTAG_THRESHHOLDING, 1, TIFF_SHORT },
- { TIFFTAG_DOCUMENTNAME, 1, TIFF_ASCII },
- { TIFFTAG_IMAGEDESCRIPTION, 1, TIFF_ASCII },
- { TIFFTAG_MAKE, 1, TIFF_ASCII },
- { TIFFTAG_MODEL, 1, TIFF_ASCII },
- { TIFFTAG_MINSAMPLEVALUE, 1, TIFF_SHORT },
- { TIFFTAG_MAXSAMPLEVALUE, 1, TIFF_SHORT },
- { TIFFTAG_XRESOLUTION, 1, TIFF_RATIONAL },
- { TIFFTAG_YRESOLUTION, 1, TIFF_RATIONAL },
- { TIFFTAG_PAGENAME, 1, TIFF_ASCII },
- { TIFFTAG_XPOSITION, 1, TIFF_RATIONAL },
- { TIFFTAG_YPOSITION, 1, TIFF_RATIONAL },
- { TIFFTAG_RESOLUTIONUNIT, 1, TIFF_SHORT },
- { TIFFTAG_SOFTWARE, 1, TIFF_ASCII },
- { TIFFTAG_DATETIME, 1, TIFF_ASCII },
- { TIFFTAG_ARTIST, 1, TIFF_ASCII },
- { TIFFTAG_HOSTCOMPUTER, 1, TIFF_ASCII },
- { TIFFTAG_WHITEPOINT, (uint16) -1, TIFF_RATIONAL },
- { TIFFTAG_PRIMARYCHROMATICITIES,(uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_HALFTONEHINTS, 2, TIFF_SHORT },
- { TIFFTAG_INKSET, 1, TIFF_SHORT },
- { TIFFTAG_DOTRANGE, 2, TIFF_SHORT },
- { TIFFTAG_TARGETPRINTER, 1, TIFF_ASCII },
- { TIFFTAG_SAMPLEFORMAT, 1, TIFF_SHORT },
- { TIFFTAG_YCBCRCOEFFICIENTS, (uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_YCBCRSUBSAMPLING, 2, TIFF_SHORT },
- { TIFFTAG_YCBCRPOSITIONING, 1, TIFF_SHORT },
- { TIFFTAG_REFERENCEBLACKWHITE, (uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_EXTRASAMPLES, (uint16) -1, TIFF_SHORT },
- { TIFFTAG_SMINSAMPLEVALUE, 1, TIFF_DOUBLE },
- { TIFFTAG_SMAXSAMPLEVALUE, 1, TIFF_DOUBLE },
- { TIFFTAG_STONITS, 1, TIFF_DOUBLE },
-};
-#define NTAGS (sizeof (tags) / sizeof (tags[0]))
-
-#define CopyTag(tag, count, type) cpTag(in, out, tag, count, type)
-
-typedef int (*copyFunc)
- (TIFF* in, TIFF* out, uint32 l, uint32 w, uint16 samplesperpixel);
-static copyFunc pickCopyFunc(TIFF*, TIFF*, uint16, uint16);
-
-/* PODD */
-
-static int
-tiffcp(TIFF* in, TIFF* out)
-{
- uint16 bitspersample, samplesperpixel;
- uint16 input_compression, input_photometric;
- copyFunc cf;
- uint32 width, length;
- struct cpTag* p;
-
- CopyField(TIFFTAG_IMAGEWIDTH, width);
- CopyField(TIFFTAG_IMAGELENGTH, length);
- CopyField(TIFFTAG_BITSPERSAMPLE, bitspersample);
- CopyField(TIFFTAG_SAMPLESPERPIXEL, samplesperpixel);
- if (compression != (uint16)-1)
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- else
- CopyField(TIFFTAG_COMPRESSION, compression);
- TIFFGetFieldDefaulted(in, TIFFTAG_COMPRESSION, &input_compression);
- TIFFGetFieldDefaulted(in, TIFFTAG_PHOTOMETRIC, &input_photometric);
- if (input_compression == COMPRESSION_JPEG) {
- /* Force conversion to RGB */
- TIFFSetField(in, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
- } else if (input_photometric == PHOTOMETRIC_YCBCR) {
- /* Otherwise, can't handle subsampled input */
- uint16 subsamplinghor,subsamplingver;
-
- TIFFGetFieldDefaulted(in, TIFFTAG_YCBCRSUBSAMPLING,
- &subsamplinghor, &subsamplingver);
- if (subsamplinghor!=1 || subsamplingver!=1) {
- fprintf(stderr, "tiffcp: %s: Can't copy/convert subsampled image.\n",
- TIFFFileName(in));
- return FALSE;
- }
- }
- if (compression == COMPRESSION_JPEG) {
- if (input_photometric == PHOTOMETRIC_RGB &&
- jpegcolormode == JPEGCOLORMODE_RGB)
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR);
- else
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, input_photometric);
- }
- else if (compression == COMPRESSION_SGILOG
- || compression == COMPRESSION_SGILOG24)
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC,
- samplesperpixel == 1 ?
- PHOTOMETRIC_LOGL : PHOTOMETRIC_LOGLUV);
- else if (input_compression == COMPRESSION_JPEG &&
- samplesperpixel == 3 ) {
- /* RGB conversion was forced above
- hence the output will be of the same type */
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
- }
- else
- CopyTag(TIFFTAG_PHOTOMETRIC, 1, TIFF_SHORT);
- if (fillorder != 0)
- TIFFSetField(out, TIFFTAG_FILLORDER, fillorder);
- else
- CopyTag(TIFFTAG_FILLORDER, 1, TIFF_SHORT);
- /*
- * Will copy `Orientation' tag from input image
- */
- TIFFGetFieldDefaulted(in, TIFFTAG_ORIENTATION, &orientation);
- switch (orientation) {
- case ORIENTATION_BOTRIGHT:
- case ORIENTATION_RIGHTBOT: /* XXX */
- TIFFWarning(TIFFFileName(in), "using bottom-left orientation");
- orientation = ORIENTATION_BOTLEFT;
- /* fall thru... */
- case ORIENTATION_LEFTBOT: /* XXX */
- case ORIENTATION_BOTLEFT:
- break;
- case ORIENTATION_TOPRIGHT:
- case ORIENTATION_RIGHTTOP: /* XXX */
- default:
- TIFFWarning(TIFFFileName(in), "using top-left orientation");
- orientation = ORIENTATION_TOPLEFT;
- /* fall thru... */
- case ORIENTATION_LEFTTOP: /* XXX */
- case ORIENTATION_TOPLEFT:
- break;
- }
- TIFFSetField(out, TIFFTAG_ORIENTATION, orientation);
- /*
- * Choose tiles/strip for the output image according to
- * the command line arguments (-tiles, -strips) and the
- * structure of the input image.
- */
- if (outtiled == -1)
- outtiled = TIFFIsTiled(in);
- if (outtiled) {
- /*
- * Setup output file's tile width&height. If either
- * is not specified, use either the value from the
- * input image or, if nothing is defined, use the
- * library default.
- */
- if (tilewidth == (uint32) -1)
- TIFFGetField(in, TIFFTAG_TILEWIDTH, &tilewidth);
- if (tilelength == (uint32) -1)
- TIFFGetField(in, TIFFTAG_TILELENGTH, &tilelength);
- TIFFDefaultTileSize(out, &tilewidth, &tilelength);
- TIFFSetField(out, TIFFTAG_TILEWIDTH, tilewidth);
- TIFFSetField(out, TIFFTAG_TILELENGTH, tilelength);
- } else {
- /*
- * RowsPerStrip is left unspecified: use either the
- * value from the input image or, if nothing is defined,
- * use the library default.
- */
- if (rowsperstrip == (uint32) 0) {
- if (!TIFFGetField(in, TIFFTAG_ROWSPERSTRIP,
- &rowsperstrip)) {
- rowsperstrip =
- TIFFDefaultStripSize(out, rowsperstrip);
- }
- if (rowsperstrip > length && rowsperstrip != (uint32)-1)
- rowsperstrip = length;
- }
- else if (rowsperstrip == (uint32) -1)
- rowsperstrip = length;
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
- }
- if (config != (uint16) -1)
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, config);
- else
- CopyField(TIFFTAG_PLANARCONFIG, config);
- if (samplesperpixel <= 4)
- CopyTag(TIFFTAG_TRANSFERFUNCTION, 4, TIFF_SHORT);
- CopyTag(TIFFTAG_COLORMAP, 4, TIFF_SHORT);
-/* SMinSampleValue & SMaxSampleValue */
- switch (compression) {
- case COMPRESSION_JPEG:
- TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality);
- TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode);
- break;
- case COMPRESSION_JBIG:
- CopyTag(TIFFTAG_FAXRECVPARAMS, 1, TIFF_LONG);
- CopyTag(TIFFTAG_FAXRECVTIME, 1, TIFF_LONG);
- CopyTag(TIFFTAG_FAXSUBADDRESS, 1, TIFF_ASCII);
- CopyTag(TIFFTAG_FAXDCS, 1, TIFF_ASCII);
- break;
- case COMPRESSION_LZW:
- case COMPRESSION_ADOBE_DEFLATE:
- case COMPRESSION_DEFLATE:
- case COMPRESSION_LZMA:
- if (predictor != (uint16)-1)
- TIFFSetField(out, TIFFTAG_PREDICTOR, predictor);
- else
- CopyField(TIFFTAG_PREDICTOR, predictor);
- if (preset != -1) {
- if (compression == COMPRESSION_ADOBE_DEFLATE
- || compression == COMPRESSION_DEFLATE)
- TIFFSetField(out, TIFFTAG_ZIPQUALITY, preset);
- else if (compression == COMPRESSION_LZMA)
- TIFFSetField(out, TIFFTAG_LZMAPRESET, preset);
- }
- break;
- case COMPRESSION_CCITTFAX3:
- case COMPRESSION_CCITTFAX4:
- if (compression == COMPRESSION_CCITTFAX3) {
- if (g3opts != (uint32) -1)
- TIFFSetField(out, TIFFTAG_GROUP3OPTIONS,
- g3opts);
- else
- CopyField(TIFFTAG_GROUP3OPTIONS, g3opts);
- } else
- CopyTag(TIFFTAG_GROUP4OPTIONS, 1, TIFF_LONG);
- CopyTag(TIFFTAG_BADFAXLINES, 1, TIFF_LONG);
- CopyTag(TIFFTAG_CLEANFAXDATA, 1, TIFF_LONG);
- CopyTag(TIFFTAG_CONSECUTIVEBADFAXLINES, 1, TIFF_LONG);
- CopyTag(TIFFTAG_FAXRECVPARAMS, 1, TIFF_LONG);
- CopyTag(TIFFTAG_FAXRECVTIME, 1, TIFF_LONG);
- CopyTag(TIFFTAG_FAXSUBADDRESS, 1, TIFF_ASCII);
- break;
- }
- {
- uint32 len32;
- void** data;
- if (TIFFGetField(in, TIFFTAG_ICCPROFILE, &len32, &data))
- TIFFSetField(out, TIFFTAG_ICCPROFILE, len32, data);
- }
- {
- uint16 ninks;
- const char* inknames;
- if (TIFFGetField(in, TIFFTAG_NUMBEROFINKS, &ninks)) {
- TIFFSetField(out, TIFFTAG_NUMBEROFINKS, ninks);
- if (TIFFGetField(in, TIFFTAG_INKNAMES, &inknames)) {
- int inknameslen = strlen(inknames) + 1;
- const char* cp = inknames;
- while (ninks > 1) {
- cp = strchr(cp, '\0');
- cp++;
- inknameslen += (strlen(cp) + 1);
- ninks--;
- }
- TIFFSetField(out, TIFFTAG_INKNAMES, inknameslen, inknames);
- }
- }
- }
- {
- unsigned short pg0, pg1;
-
- if (pageInSeq == 1) {
- if (pageNum < 0) /* only one input file */ {
- if (TIFFGetField(in, TIFFTAG_PAGENUMBER, &pg0, &pg1))
- TIFFSetField(out, TIFFTAG_PAGENUMBER, pg0, pg1);
- } else
- TIFFSetField(out, TIFFTAG_PAGENUMBER, pageNum++, 0);
-
- } else {
- if (TIFFGetField(in, TIFFTAG_PAGENUMBER, &pg0, &pg1)) {
- if (pageNum < 0) /* only one input file */
- TIFFSetField(out, TIFFTAG_PAGENUMBER, pg0, pg1);
- else
- TIFFSetField(out, TIFFTAG_PAGENUMBER, pageNum++, 0);
- }
- }
- }
-
- for (p = tags; p < &tags[NTAGS]; p++)
- CopyTag(p->tag, p->count, p->type);
-
- cf = pickCopyFunc(in, out, bitspersample, samplesperpixel);
- return (cf ? (*cf)(in, out, length, width, samplesperpixel) : FALSE);
-}
-
-/*
- * Copy Functions.
- */
-#define DECLAREcpFunc(x) \
-static int x(TIFF* in, TIFF* out, \
- uint32 imagelength, uint32 imagewidth, tsample_t spp)
-
-#define DECLAREreadFunc(x) \
-static int x(TIFF* in, \
- uint8* buf, uint32 imagelength, uint32 imagewidth, tsample_t spp)
-typedef int (*readFunc)(TIFF*, uint8*, uint32, uint32, tsample_t);
-
-#define DECLAREwriteFunc(x) \
-static int x(TIFF* out, \
- uint8* buf, uint32 imagelength, uint32 imagewidth, tsample_t spp)
-typedef int (*writeFunc)(TIFF*, uint8*, uint32, uint32, tsample_t);
-
-/*
- * Contig -> contig by scanline for rows/strip change.
- */
-DECLAREcpFunc(cpContig2ContigByRow)
-{
- tsize_t scanlinesize = TIFFScanlineSize(in);
- tdata_t buf;
- uint32 row;
-
- buf = _TIFFmalloc(scanlinesize);
- if (!buf)
- return 0;
- _TIFFmemset(buf, 0, scanlinesize);
- (void) imagewidth; (void) spp;
- for (row = 0; row < imagelength; row++) {
- if (TIFFReadScanline(in, buf, row, 0) < 0 && !ignore) {
- TIFFError(TIFFFileName(in),
- "Error, can't read scanline %lu",
- (unsigned long) row);
- goto bad;
- }
- if (TIFFWriteScanline(out, buf, row, 0) < 0) {
- TIFFError(TIFFFileName(out),
- "Error, can't write scanline %lu",
- (unsigned long) row);
- goto bad;
- }
- }
- _TIFFfree(buf);
- return 1;
-bad:
- _TIFFfree(buf);
- return 0;
-}
-
-
-typedef void biasFn (void *image, void *bias, uint32 pixels);
-
-#define subtract(bits) \
-static void subtract##bits (void *i, void *b, uint32 pixels)\
-{\
- uint##bits *image = i;\
- uint##bits *bias = b;\
- while (pixels--) {\
- *image = *image > *bias ? *image-*bias : 0;\
- image++, bias++; \
- } \
-}
-
-subtract(8)
-subtract(16)
-subtract(32)
-
-static biasFn *lineSubtractFn (unsigned bits)
-{
- switch (bits) {
- case 8: return subtract8;
- case 16: return subtract16;
- case 32: return subtract32;
- }
- return NULL;
-}
-
-/*
- * Contig -> contig by scanline while subtracting a bias image.
- */
-DECLAREcpFunc(cpBiasedContig2Contig)
-{
- if (spp == 1) {
- tsize_t biasSize = TIFFScanlineSize(bias);
- tsize_t bufSize = TIFFScanlineSize(in);
- tdata_t buf, biasBuf;
- uint32 biasWidth = 0, biasLength = 0;
- TIFFGetField(bias, TIFFTAG_IMAGEWIDTH, &biasWidth);
- TIFFGetField(bias, TIFFTAG_IMAGELENGTH, &biasLength);
- if (biasSize == bufSize &&
- imagelength == biasLength && imagewidth == biasWidth) {
- uint16 sampleBits = 0;
- biasFn *subtractLine;
- TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &sampleBits);
- subtractLine = lineSubtractFn (sampleBits);
- if (subtractLine) {
- uint32 row;
- buf = _TIFFmalloc(bufSize);
- biasBuf = _TIFFmalloc(bufSize);
- for (row = 0; row < imagelength; row++) {
- if (TIFFReadScanline(in, buf, row, 0) < 0
- && !ignore) {
- TIFFError(TIFFFileName(in),
- "Error, can't read scanline %lu",
- (unsigned long) row);
- goto bad;
- }
- if (TIFFReadScanline(bias, biasBuf, row, 0) < 0
- && !ignore) {
- TIFFError(TIFFFileName(in),
- "Error, can't read biased scanline %lu",
- (unsigned long) row);
- goto bad;
- }
- subtractLine (buf, biasBuf, imagewidth);
- if (TIFFWriteScanline(out, buf, row, 0) < 0) {
- TIFFError(TIFFFileName(out),
- "Error, can't write scanline %lu",
- (unsigned long) row);
- goto bad;
- }
- }
-
- _TIFFfree(buf);
- _TIFFfree(biasBuf);
- TIFFSetDirectory(bias,
- TIFFCurrentDirectory(bias)); /* rewind */
- return 1;
-bad:
- _TIFFfree(buf);
- _TIFFfree(biasBuf);
- return 0;
- } else {
- TIFFError(TIFFFileName(in),
- "No support for biasing %d bit pixels\n",
- sampleBits);
- return 0;
- }
- }
- TIFFError(TIFFFileName(in),
- "Bias image %s,%d\nis not the same size as %s,%d\n",
- TIFFFileName(bias), TIFFCurrentDirectory(bias),
- TIFFFileName(in), TIFFCurrentDirectory(in));
- return 0;
- } else {
- TIFFError(TIFFFileName(in),
- "Can't bias %s,%d as it has >1 Sample/Pixel\n",
- TIFFFileName(in), TIFFCurrentDirectory(in));
- return 0;
- }
-
-}
-
-
-/*
- * Strip -> strip for change in encoding.
- */
-DECLAREcpFunc(cpDecodedStrips)
-{
- tsize_t stripsize = TIFFStripSize(in);
- tdata_t buf = _TIFFmalloc(stripsize);
-
- (void) imagewidth; (void) spp;
- if (buf) {
- tstrip_t s, ns = TIFFNumberOfStrips(in);
- uint32 row = 0;
- _TIFFmemset(buf, 0, stripsize);
- for (s = 0; s < ns; s++) {
- tsize_t cc = (row + rowsperstrip > imagelength) ?
- TIFFVStripSize(in, imagelength - row) : stripsize;
- if (TIFFReadEncodedStrip(in, s, buf, cc) < 0
- && !ignore) {
- TIFFError(TIFFFileName(in),
- "Error, can't read strip %lu",
- (unsigned long) s);
- goto bad;
- }
- if (TIFFWriteEncodedStrip(out, s, buf, cc) < 0) {
- TIFFError(TIFFFileName(out),
- "Error, can't write strip %lu",
- (unsigned long) s);
- goto bad;
- }
- row += rowsperstrip;
- }
- _TIFFfree(buf);
- return 1;
- } else {
- TIFFError(TIFFFileName(in),
- "Error, can't allocate memory buffer of size %lu "
- "to read strips", (unsigned long) stripsize);
- return 0;
- }
-
-bad:
- _TIFFfree(buf);
- return 0;
-}
-
-/*
- * Separate -> separate by row for rows/strip change.
- */
-DECLAREcpFunc(cpSeparate2SeparateByRow)
-{
- tsize_t scanlinesize = TIFFScanlineSize(in);
- tdata_t buf;
- uint32 row;
- tsample_t s;
-
- (void) imagewidth;
- buf = _TIFFmalloc(scanlinesize);
- if (!buf)
- return 0;
- _TIFFmemset(buf, 0, scanlinesize);
- for (s = 0; s < spp; s++) {
- for (row = 0; row < imagelength; row++) {
- if (TIFFReadScanline(in, buf, row, s) < 0 && !ignore) {
- TIFFError(TIFFFileName(in),
- "Error, can't read scanline %lu",
- (unsigned long) row);
- goto bad;
- }
- if (TIFFWriteScanline(out, buf, row, s) < 0) {
- TIFFError(TIFFFileName(out),
- "Error, can't write scanline %lu",
- (unsigned long) row);
- goto bad;
- }
- }
- }
- _TIFFfree(buf);
- return 1;
-bad:
- _TIFFfree(buf);
- return 0;
-}
-
-/*
- * Contig -> separate by row.
- */
-DECLAREcpFunc(cpContig2SeparateByRow)
-{
- tsize_t scanlinesizein = TIFFScanlineSize(in);
- tsize_t scanlinesizeout = TIFFScanlineSize(out);
- tdata_t inbuf;
- tdata_t outbuf;
- register uint8 *inp, *outp;
- register uint32 n;
- uint32 row;
- tsample_t s;
-
- inbuf = _TIFFmalloc(scanlinesizein);
- outbuf = _TIFFmalloc(scanlinesizeout);
- if (!inbuf || !outbuf)
- return 0;
- _TIFFmemset(inbuf, 0, scanlinesizein);
- _TIFFmemset(outbuf, 0, scanlinesizeout);
- /* unpack channels */
- for (s = 0; s < spp; s++) {
- for (row = 0; row < imagelength; row++) {
- if (TIFFReadScanline(in, inbuf, row, 0) < 0
- && !ignore) {
- TIFFError(TIFFFileName(in),
- "Error, can't read scanline %lu",
- (unsigned long) row);
- goto bad;
- }
- inp = ((uint8*)inbuf) + s;
- outp = (uint8*)outbuf;
- for (n = imagewidth; n-- > 0;) {
- *outp++ = *inp;
- inp += spp;
- }
- if (TIFFWriteScanline(out, outbuf, row, s) < 0) {
- TIFFError(TIFFFileName(out),
- "Error, can't write scanline %lu",
- (unsigned long) row);
- goto bad;
- }
- }
- }
- if (inbuf) _TIFFfree(inbuf);
- if (outbuf) _TIFFfree(outbuf);
- return 1;
-bad:
- if (inbuf) _TIFFfree(inbuf);
- if (outbuf) _TIFFfree(outbuf);
- return 0;
-}
-
-/*
- * Separate -> contig by row.
- */
-DECLAREcpFunc(cpSeparate2ContigByRow)
-{
- tsize_t scanlinesizein = TIFFScanlineSize(in);
- tsize_t scanlinesizeout = TIFFScanlineSize(out);
- tdata_t inbuf;
- tdata_t outbuf;
- register uint8 *inp, *outp;
- register uint32 n;
- uint32 row;
- tsample_t s;
-
- inbuf = _TIFFmalloc(scanlinesizein);
- outbuf = _TIFFmalloc(scanlinesizeout);
- if (!inbuf || !outbuf)
- return 0;
- _TIFFmemset(inbuf, 0, scanlinesizein);
- _TIFFmemset(outbuf, 0, scanlinesizeout);
- for (row = 0; row < imagelength; row++) {
- /* merge channels */
- for (s = 0; s < spp; s++) {
- if (TIFFReadScanline(in, inbuf, row, s) < 0
- && !ignore) {
- TIFFError(TIFFFileName(in),
- "Error, can't read scanline %lu",
- (unsigned long) row);
- goto bad;
- }
- inp = (uint8*)inbuf;
- outp = ((uint8*)outbuf) + s;
- for (n = imagewidth; n-- > 0;) {
- *outp = *inp++;
- outp += spp;
- }
- }
- if (TIFFWriteScanline(out, outbuf, row, 0) < 0) {
- TIFFError(TIFFFileName(out),
- "Error, can't write scanline %lu",
- (unsigned long) row);
- goto bad;
- }
- }
- if (inbuf) _TIFFfree(inbuf);
- if (outbuf) _TIFFfree(outbuf);
- return 1;
-bad:
- if (inbuf) _TIFFfree(inbuf);
- if (outbuf) _TIFFfree(outbuf);
- return 0;
-}
-
-static void
-cpStripToTile(uint8* out, uint8* in,
- uint32 rows, uint32 cols, int outskew, int inskew)
-{
- while (rows-- > 0) {
- uint32 j = cols;
- while (j-- > 0)
- *out++ = *in++;
- out += outskew;
- in += inskew;
- }
-}
-
-static void
-cpContigBufToSeparateBuf(uint8* out, uint8* in,
- uint32 rows, uint32 cols, int outskew, int inskew, tsample_t spp,
- int bytes_per_sample )
-{
- while (rows-- > 0) {
- uint32 j = cols;
- while (j-- > 0)
- {
- int n = bytes_per_sample;
-
- while( n-- ) {
- *out++ = *in++;
- }
- in += (spp-1) * bytes_per_sample;
- }
- out += outskew;
- in += inskew;
- }
-}
-
-static void
-cpSeparateBufToContigBuf(uint8* out, uint8* in,
- uint32 rows, uint32 cols, int outskew, int inskew, tsample_t spp,
- int bytes_per_sample)
-{
- while (rows-- > 0) {
- uint32 j = cols;
- while (j-- > 0) {
- int n = bytes_per_sample;
-
- while( n-- ) {
- *out++ = *in++;
- }
- out += (spp-1)*bytes_per_sample;
- }
- out += outskew;
- in += inskew;
- }
-}
-
-static int
-cpImage(TIFF* in, TIFF* out, readFunc fin, writeFunc fout,
- uint32 imagelength, uint32 imagewidth, tsample_t spp)
-{
- int status = 0;
- tdata_t buf = NULL;
- tsize_t scanlinesize = TIFFRasterScanlineSize(in);
- tsize_t bytes = scanlinesize * (tsize_t)imagelength;
- /*
- * XXX: Check for integer overflow.
- */
- if (scanlinesize
- && imagelength
- && bytes / (tsize_t)imagelength == scanlinesize) {
- buf = _TIFFmalloc(bytes);
- if (buf) {
- if ((*fin)(in, (uint8*)buf, imagelength,
- imagewidth, spp)) {
- status = (*fout)(out, (uint8*)buf,
- imagelength, imagewidth, spp);
- }
- _TIFFfree(buf);
- } else {
- TIFFError(TIFFFileName(in),
- "Error, can't allocate space for image buffer");
- }
- } else {
- TIFFError(TIFFFileName(in), "Error, no space for image buffer");
- }
-
- return status;
-}
-
-DECLAREreadFunc(readContigStripsIntoBuffer)
-{
- tsize_t scanlinesize = TIFFScanlineSize(in);
- uint8* bufp = buf;
- uint32 row;
-
- (void) imagewidth; (void) spp;
- for (row = 0; row < imagelength; row++) {
- if (TIFFReadScanline(in, (tdata_t) bufp, row, 0) < 0
- && !ignore) {
- TIFFError(TIFFFileName(in),
- "Error, can't read scanline %lu",
- (unsigned long) row);
- return 0;
- }
- bufp += scanlinesize;
- }
-
- return 1;
-}
-
-DECLAREreadFunc(readSeparateStripsIntoBuffer)
-{
- int status = 1;
- tsize_t scanlinesize = TIFFScanlineSize(in);
- tdata_t scanline;
- if (!scanlinesize)
- return 0;
-
- scanline = _TIFFmalloc(scanlinesize);
- if (!scanline)
- return 0;
- _TIFFmemset(scanline, 0, scanlinesize);
- (void) imagewidth;
- if (scanline) {
- uint8* bufp = (uint8*) buf;
- uint32 row;
- tsample_t s;
- for (row = 0; row < imagelength; row++) {
- /* merge channels */
- for (s = 0; s < spp; s++) {
- uint8* bp = bufp + s;
- tsize_t n = scanlinesize;
- uint8* sbuf = scanline;
-
- if (TIFFReadScanline(in, scanline, row, s) < 0
- && !ignore) {
- TIFFError(TIFFFileName(in),
- "Error, can't read scanline %lu",
- (unsigned long) row);
- status = 0;
- goto done;
- }
- while (n-- > 0)
- *bp = *sbuf++, bp += spp;
- }
- bufp += scanlinesize * spp;
- }
- }
-
-done:
- _TIFFfree(scanline);
- return status;
-}
-
-DECLAREreadFunc(readContigTilesIntoBuffer)
-{
- int status = 1;
- tsize_t tilesize = TIFFTileSize(in);
- tdata_t tilebuf;
- uint32 imagew = TIFFScanlineSize(in);
- uint32 tilew = TIFFTileRowSize(in);
- int iskew = imagew - tilew;
- uint8* bufp = (uint8*) buf;
- uint32 tw, tl;
- uint32 row;
-
- (void) spp;
- tilebuf = _TIFFmalloc(tilesize);
- if (tilebuf == 0)
- return 0;
- _TIFFmemset(tilebuf, 0, tilesize);
- (void) TIFFGetField(in, TIFFTAG_TILEWIDTH, &tw);
- (void) TIFFGetField(in, TIFFTAG_TILELENGTH, &tl);
-
- for (row = 0; row < imagelength; row += tl) {
- uint32 nrow = (row+tl > imagelength) ? imagelength-row : tl;
- uint32 colb = 0;
- uint32 col;
-
- for (col = 0; col < imagewidth; col += tw) {
- if (TIFFReadTile(in, tilebuf, col, row, 0, 0) < 0
- && !ignore) {
- TIFFError(TIFFFileName(in),
- "Error, can't read tile at %lu %lu",
- (unsigned long) col,
- (unsigned long) row);
- status = 0;
- goto done;
- }
- if (colb + tilew > imagew) {
- uint32 width = imagew - colb;
- uint32 oskew = tilew - width;
- cpStripToTile(bufp + colb,
- tilebuf, nrow, width,
- oskew + iskew, oskew );
- } else
- cpStripToTile(bufp + colb,
- tilebuf, nrow, tilew,
- iskew, 0);
- colb += tilew;
- }
- bufp += imagew * nrow;
- }
-done:
- _TIFFfree(tilebuf);
- return status;
-}
-
-DECLAREreadFunc(readSeparateTilesIntoBuffer)
-{
- int status = 1;
- uint32 imagew = TIFFRasterScanlineSize(in);
- uint32 tilew = TIFFTileRowSize(in);
- int iskew = imagew - tilew*spp;
- tsize_t tilesize = TIFFTileSize(in);
- tdata_t tilebuf;
- uint8* bufp = (uint8*) buf;
- uint32 tw, tl;
- uint32 row;
- uint16 bps, bytes_per_sample;
-
- tilebuf = _TIFFmalloc(tilesize);
- if (tilebuf == 0)
- return 0;
- _TIFFmemset(tilebuf, 0, tilesize);
- (void) TIFFGetField(in, TIFFTAG_TILEWIDTH, &tw);
- (void) TIFFGetField(in, TIFFTAG_TILELENGTH, &tl);
- (void) TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bps);
- assert( bps % 8 == 0 );
- bytes_per_sample = bps/8;
-
- for (row = 0; row < imagelength; row += tl) {
- uint32 nrow = (row+tl > imagelength) ? imagelength-row : tl;
- uint32 colb = 0;
- uint32 col;
-
- for (col = 0; col < imagewidth; col += tw) {
- tsample_t s;
-
- for (s = 0; s < spp; s++) {
- if (TIFFReadTile(in, tilebuf, col, row, 0, s) < 0
- && !ignore) {
- TIFFError(TIFFFileName(in),
- "Error, can't read tile at %lu %lu, "
- "sample %lu",
- (unsigned long) col,
- (unsigned long) row,
- (unsigned long) s);
- status = 0;
- goto done;
- }
- /*
- * Tile is clipped horizontally. Calculate
- * visible portion and skewing factors.
- */
- if (colb + tilew*spp > imagew) {
- uint32 width = imagew - colb;
- int oskew = tilew*spp - width;
- cpSeparateBufToContigBuf(
- bufp+colb+s*bytes_per_sample,
- tilebuf, nrow,
- width/(spp*bytes_per_sample),
- oskew + iskew,
- oskew/spp, spp,
- bytes_per_sample);
- } else
- cpSeparateBufToContigBuf(
- bufp+colb+s*bytes_per_sample,
- tilebuf, nrow, tw,
- iskew, 0, spp,
- bytes_per_sample);
- }
- colb += tilew*spp;
- }
- bufp += imagew * nrow;
- }
-done:
- _TIFFfree(tilebuf);
- return status;
-}
-
-DECLAREwriteFunc(writeBufferToContigStrips)
-{
- uint32 row, rowsperstrip;
- tstrip_t strip = 0;
-
- (void) imagewidth; (void) spp;
- (void) TIFFGetFieldDefaulted(out, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
- for (row = 0; row < imagelength; row += rowsperstrip) {
- uint32 nrows = (row+rowsperstrip > imagelength) ?
- imagelength-row : rowsperstrip;
- tsize_t stripsize = TIFFVStripSize(out, nrows);
- if (TIFFWriteEncodedStrip(out, strip++, buf, stripsize) < 0) {
- TIFFError(TIFFFileName(out),
- "Error, can't write strip %u", strip - 1);
- return 0;
- }
- buf += stripsize;
- }
- return 1;
-}
-
-DECLAREwriteFunc(writeBufferToSeparateStrips)
-{
- uint32 rowsize = imagewidth * spp;
- uint32 rowsperstrip;
- tsize_t stripsize = TIFFStripSize(out);
- tdata_t obuf;
- tstrip_t strip = 0;
- tsample_t s;
-
- obuf = _TIFFmalloc(stripsize);
- if (obuf == NULL)
- return (0);
- _TIFFmemset(obuf, 0, stripsize);
- (void) TIFFGetFieldDefaulted(out, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
- for (s = 0; s < spp; s++) {
- uint32 row;
- for (row = 0; row < imagelength; row += rowsperstrip) {
- uint32 nrows = (row+rowsperstrip > imagelength) ?
- imagelength-row : rowsperstrip;
- tsize_t stripsize = TIFFVStripSize(out, nrows);
-
- cpContigBufToSeparateBuf(
- obuf, (uint8*) buf + row*rowsize + s,
- nrows, imagewidth, 0, 0, spp, 1);
- if (TIFFWriteEncodedStrip(out, strip++, obuf, stripsize) < 0) {
- TIFFError(TIFFFileName(out),
- "Error, can't write strip %u",
- strip - 1);
- _TIFFfree(obuf);
- return 0;
- }
- }
- }
- _TIFFfree(obuf);
- return 1;
-
-}
-
-DECLAREwriteFunc(writeBufferToContigTiles)
-{
- uint32 imagew = TIFFScanlineSize(out);
- uint32 tilew = TIFFTileRowSize(out);
- int iskew = imagew - tilew;
- tsize_t tilesize = TIFFTileSize(out);
- tdata_t obuf;
- uint8* bufp = (uint8*) buf;
- uint32 tl, tw;
- uint32 row;
-
- (void) spp;
-
- obuf = _TIFFmalloc(TIFFTileSize(out));
- if (obuf == NULL)
- return 0;
- _TIFFmemset(obuf, 0, tilesize);
- (void) TIFFGetField(out, TIFFTAG_TILELENGTH, &tl);
- (void) TIFFGetField(out, TIFFTAG_TILEWIDTH, &tw);
- for (row = 0; row < imagelength; row += tilelength) {
- uint32 nrow = (row+tl > imagelength) ? imagelength-row : tl;
- uint32 colb = 0;
- uint32 col;
-
- for (col = 0; col < imagewidth; col += tw) {
- /*
- * Tile is clipped horizontally. Calculate
- * visible portion and skewing factors.
- */
- if (colb + tilew > imagew) {
- uint32 width = imagew - colb;
- int oskew = tilew - width;
- cpStripToTile(obuf, bufp + colb, nrow, width,
- oskew, oskew + iskew);
- } else
- cpStripToTile(obuf, bufp + colb, nrow, tilew,
- 0, iskew);
- if (TIFFWriteTile(out, obuf, col, row, 0, 0) < 0) {
- TIFFError(TIFFFileName(out),
- "Error, can't write tile at %lu %lu",
- (unsigned long) col,
- (unsigned long) row);
- _TIFFfree(obuf);
- return 0;
- }
- colb += tilew;
- }
- bufp += nrow * imagew;
- }
- _TIFFfree(obuf);
- return 1;
-}
-
-DECLAREwriteFunc(writeBufferToSeparateTiles)
-{
- uint32 imagew = TIFFScanlineSize(out);
- tsize_t tilew = TIFFTileRowSize(out);
- uint32 iimagew = TIFFRasterScanlineSize(out);
- int iskew = iimagew - tilew*spp;
- tsize_t tilesize = TIFFTileSize(out);
- tdata_t obuf;
- uint8* bufp = (uint8*) buf;
- uint32 tl, tw;
- uint32 row;
- uint16 bps, bytes_per_sample;
-
- obuf = _TIFFmalloc(TIFFTileSize(out));
- if (obuf == NULL)
- return 0;
- _TIFFmemset(obuf, 0, tilesize);
- (void) TIFFGetField(out, TIFFTAG_TILELENGTH, &tl);
- (void) TIFFGetField(out, TIFFTAG_TILEWIDTH, &tw);
- (void) TIFFGetField(out, TIFFTAG_BITSPERSAMPLE, &bps);
- assert( bps % 8 == 0 );
- bytes_per_sample = bps/8;
-
- for (row = 0; row < imagelength; row += tl) {
- uint32 nrow = (row+tl > imagelength) ? imagelength-row : tl;
- uint32 colb = 0;
- uint32 col;
-
- for (col = 0; col < imagewidth; col += tw) {
- tsample_t s;
- for (s = 0; s < spp; s++) {
- /*
- * Tile is clipped horizontally. Calculate
- * visible portion and skewing factors.
- */
- if (colb + tilew > imagew) {
- uint32 width = (imagew - colb);
- int oskew = tilew - width;
-
- cpContigBufToSeparateBuf(obuf,
- bufp + (colb*spp) + s,
- nrow, width/bytes_per_sample,
- oskew, (oskew*spp)+iskew, spp,
- bytes_per_sample);
- } else
- cpContigBufToSeparateBuf(obuf,
- bufp + (colb*spp) + s,
- nrow, tilewidth,
- 0, iskew, spp,
- bytes_per_sample);
- if (TIFFWriteTile(out, obuf, col, row, 0, s) < 0) {
- TIFFError(TIFFFileName(out),
- "Error, can't write tile at %lu %lu "
- "sample %lu",
- (unsigned long) col,
- (unsigned long) row,
- (unsigned long) s);
- _TIFFfree(obuf);
- return 0;
- }
- }
- colb += tilew;
- }
- bufp += nrow * iimagew;
- }
- _TIFFfree(obuf);
- return 1;
-}
-
-/*
- * Contig strips -> contig tiles.
- */
-DECLAREcpFunc(cpContigStrips2ContigTiles)
-{
- return cpImage(in, out,
- readContigStripsIntoBuffer,
- writeBufferToContigTiles,
- imagelength, imagewidth, spp);
-}
-
-/*
- * Contig strips -> separate tiles.
- */
-DECLAREcpFunc(cpContigStrips2SeparateTiles)
-{
- return cpImage(in, out,
- readContigStripsIntoBuffer,
- writeBufferToSeparateTiles,
- imagelength, imagewidth, spp);
-}
-
-/*
- * Separate strips -> contig tiles.
- */
-DECLAREcpFunc(cpSeparateStrips2ContigTiles)
-{
- return cpImage(in, out,
- readSeparateStripsIntoBuffer,
- writeBufferToContigTiles,
- imagelength, imagewidth, spp);
-}
-
-/*
- * Separate strips -> separate tiles.
- */
-DECLAREcpFunc(cpSeparateStrips2SeparateTiles)
-{
- return cpImage(in, out,
- readSeparateStripsIntoBuffer,
- writeBufferToSeparateTiles,
- imagelength, imagewidth, spp);
-}
-
-/*
- * Contig strips -> contig tiles.
- */
-DECLAREcpFunc(cpContigTiles2ContigTiles)
-{
- return cpImage(in, out,
- readContigTilesIntoBuffer,
- writeBufferToContigTiles,
- imagelength, imagewidth, spp);
-}
-
-/*
- * Contig tiles -> separate tiles.
- */
-DECLAREcpFunc(cpContigTiles2SeparateTiles)
-{
- return cpImage(in, out,
- readContigTilesIntoBuffer,
- writeBufferToSeparateTiles,
- imagelength, imagewidth, spp);
-}
-
-/*
- * Separate tiles -> contig tiles.
- */
-DECLAREcpFunc(cpSeparateTiles2ContigTiles)
-{
- return cpImage(in, out,
- readSeparateTilesIntoBuffer,
- writeBufferToContigTiles,
- imagelength, imagewidth, spp);
-}
-
-/*
- * Separate tiles -> separate tiles (tile dimension change).
- */
-DECLAREcpFunc(cpSeparateTiles2SeparateTiles)
-{
- return cpImage(in, out,
- readSeparateTilesIntoBuffer,
- writeBufferToSeparateTiles,
- imagelength, imagewidth, spp);
-}
-
-/*
- * Contig tiles -> contig tiles (tile dimension change).
- */
-DECLAREcpFunc(cpContigTiles2ContigStrips)
-{
- return cpImage(in, out,
- readContigTilesIntoBuffer,
- writeBufferToContigStrips,
- imagelength, imagewidth, spp);
-}
-
-/*
- * Contig tiles -> separate strips.
- */
-DECLAREcpFunc(cpContigTiles2SeparateStrips)
-{
- return cpImage(in, out,
- readContigTilesIntoBuffer,
- writeBufferToSeparateStrips,
- imagelength, imagewidth, spp);
-}
-
-/*
- * Separate tiles -> contig strips.
- */
-DECLAREcpFunc(cpSeparateTiles2ContigStrips)
-{
- return cpImage(in, out,
- readSeparateTilesIntoBuffer,
- writeBufferToContigStrips,
- imagelength, imagewidth, spp);
-}
-
-/*
- * Separate tiles -> separate strips.
- */
-DECLAREcpFunc(cpSeparateTiles2SeparateStrips)
-{
- return cpImage(in, out,
- readSeparateTilesIntoBuffer,
- writeBufferToSeparateStrips,
- imagelength, imagewidth, spp);
-}
-
-/*
- * Select the appropriate copy function to use.
- */
-static copyFunc
-pickCopyFunc(TIFF* in, TIFF* out, uint16 bitspersample, uint16 samplesperpixel)
-{
- uint16 shortv;
- uint32 w, l, tw, tl;
- int bychunk;
-
- (void) TIFFGetField(in, TIFFTAG_PLANARCONFIG, &shortv);
- if (shortv != config && bitspersample != 8 && samplesperpixel > 1) {
- fprintf(stderr,
- "%s: Cannot handle different planar configuration w/ bits/sample != 8\n",
- TIFFFileName(in));
- return (NULL);
- }
- TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &w);
- TIFFGetField(in, TIFFTAG_IMAGELENGTH, &l);
- if (!(TIFFIsTiled(out) || TIFFIsTiled(in))) {
- uint32 irps = (uint32) -1L;
- TIFFGetField(in, TIFFTAG_ROWSPERSTRIP, &irps);
- /* if biased, force decoded copying to allow image subtraction */
- bychunk = !bias && (rowsperstrip == irps);
- }else{ /* either in or out is tiled */
- if (bias) {
- fprintf(stderr,
- "%s: Cannot handle tiled configuration w/bias image\n",
- TIFFFileName(in));
- return (NULL);
- }
- if (TIFFIsTiled(out)) {
- if (!TIFFGetField(in, TIFFTAG_TILEWIDTH, &tw))
- tw = w;
- if (!TIFFGetField(in, TIFFTAG_TILELENGTH, &tl))
- tl = l;
- bychunk = (tw == tilewidth && tl == tilelength);
- } else { /* out's not, so in must be tiled */
- TIFFGetField(in, TIFFTAG_TILEWIDTH, &tw);
- TIFFGetField(in, TIFFTAG_TILELENGTH, &tl);
- bychunk = (tw == w && tl == rowsperstrip);
- }
- }
-#define T 1
-#define F 0
-#define pack(a,b,c,d,e) ((long)(((a)<<11)|((b)<<3)|((c)<<2)|((d)<<1)|(e)))
- switch(pack(shortv,config,TIFFIsTiled(in),TIFFIsTiled(out),bychunk)) {
- /* Strips -> Tiles */
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, F,T,F):
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, F,T,T):
- return cpContigStrips2ContigTiles;
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, F,T,F):
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, F,T,T):
- return cpContigStrips2SeparateTiles;
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, F,T,F):
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, F,T,T):
- return cpSeparateStrips2ContigTiles;
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, F,T,F):
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, F,T,T):
- return cpSeparateStrips2SeparateTiles;
- /* Tiles -> Tiles */
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, T,T,F):
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, T,T,T):
- return cpContigTiles2ContigTiles;
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, T,T,F):
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, T,T,T):
- return cpContigTiles2SeparateTiles;
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, T,T,F):
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, T,T,T):
- return cpSeparateTiles2ContigTiles;
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, T,T,F):
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, T,T,T):
- return cpSeparateTiles2SeparateTiles;
- /* Tiles -> Strips */
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, T,F,F):
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, T,F,T):
- return cpContigTiles2ContigStrips;
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, T,F,F):
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, T,F,T):
- return cpContigTiles2SeparateStrips;
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, T,F,F):
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, T,F,T):
- return cpSeparateTiles2ContigStrips;
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, T,F,F):
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, T,F,T):
- return cpSeparateTiles2SeparateStrips;
- /* Strips -> Strips */
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, F,F,F):
- return bias ? cpBiasedContig2Contig : cpContig2ContigByRow;
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, F,F,T):
- return cpDecodedStrips;
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, F,F,F):
- case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, F,F,T):
- return cpContig2SeparateByRow;
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, F,F,F):
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, F,F,T):
- return cpSeparate2ContigByRow;
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, F,F,F):
- case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, F,F,T):
- return cpSeparate2SeparateByRow;
- }
-#undef pack
-#undef F
-#undef T
- fprintf(stderr, "tiffcp: %s: Don't know how to copy/convert image.\n",
- TIFFFileName(in));
- return (NULL);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/tiffcrop.c b/tiff/tools/tiffcrop.c
deleted file mode 100755
index 1d6b561..0000000
--- a/tiff/tools/tiffcrop.c
+++ /dev/null
@@ -1,9091 +0,0 @@
-/* $Id: tiffcrop.c,v 1.25 2014-12-26 16:32:32 bfriesen Exp $ */
-
-/* tiffcrop.c -- a port of tiffcp.c extended to include manipulations of
- * the image data through additional options listed below
- *
- * Original code:
- * Copyright (c) 1988-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- * Additions (c) Richard Nolde 2006-2010
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS OR ANY OTHER COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL
- * DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
- * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE
- * OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Some portions of the current code are derived from tiffcp, primarly in
- * the areas of lowlevel reading and writing of TAGS, scanlines and tiles though
- * some of the original functions have been extended to support arbitrary bit
- * depths. These functions are presented at the top of this file.
- *
- * Add support for the options below to extract sections of image(s)
- * and to modify the whole image or selected portions of each image by
- * rotations, mirroring, and colorscale/colormap inversion of selected
- * types of TIFF images when appropriate. Some color model dependent
- * functions are restricted to bilevel or 8 bit per sample data.
- * See the man page for the full explanations.
- *
- * New Options:
- * -h Display the syntax guide.
- * -v Report the version and last build date for tiffcrop and libtiff.
- * -z x1,y1,x2,y2:x3,y3,x4,y4:..xN,yN,xN + 1, yN + 1
- * Specify a series of coordinates to define rectangular
- * regions by the top left and lower right corners.
- * -e c|d|i|m|s export mode for images and selections from input images
- * combined All images and selections are written to a single file (default)
- * with multiple selections from one image combined into a single image
- * divided All images and selections are written to a single file
- * with each selection from one image written to a new image
- * image Each input image is written to a new file (numeric filename sequence)
- * with multiple selections from the image combined into one image
- * multiple Each input image is written to a new file (numeric filename sequence)
- * with each selection from the image written to a new image
- * separated Individual selections from each image are written to separate files
- * -U units [in, cm, px ] inches, centimeters or pixels
- * -H # Set horizontal resolution of output images to #
- * -V # Set vertical resolution of output images to #
- * -J # Horizontal margin of output page to # expressed in current
- * units when sectioning image into columns x rows
- * using the -S cols:rows option.
- * -K # Vertical margin of output page to # expressed in current
- * units when sectioning image into columns x rows
- * using the -S cols:rows option.
- * -X # Horizontal dimension of region to extract expressed in current
- * units
- * -Y # Vertical dimension of region to extract expressed in current
- * units
- * -O orient Orientation for output image, portrait, landscape, auto
- * -P page Page size for output image segments, eg letter, legal, tabloid,
- * etc.
- * -S cols:rows Divide the image into equal sized segments using cols across
- * and rows down
- * -E t|l|r|b Edge to use as origin
- * -m #,#,#,# Margins from edges for selection: top, left, bottom, right
- * (commas separated)
- * -Z #:#,#:# Zones of the image designated as zone X of Y,
- * eg 1:3 would be first of three equal portions measured
- * from reference edge
- * -N odd|even|#,#-#,#|last
- * Select sequences and/or ranges of images within file
- * to process. The words odd or even may be used to specify
- * all odd or even numbered images the word last may be used
- * in place of a number in the sequence to indicate the final
- * image in the file without knowing how many images there are.
- * -R # Rotate image or crop selection by 90,180,or 270 degrees
- * clockwise
- * -F h|v Flip (mirror) image or crop selection horizontally
- * or vertically
- * -I [black|white|data|both]
- * Invert color space, eg dark to light for bilevel and grayscale images
- * If argument is white or black, set the PHOTOMETRIC_INTERPRETATION
- * tag to MinIsBlack or MinIsWhite without altering the image data
- * If the argument is data or both, the image data are modified:
- * both inverts the data and the PHOTOMETRIC_INTERPRETATION tag,
- * data inverts the data but not the PHOTOMETRIC_INTERPRETATION tag
- * -D input:<filename1>,output:<filename2>,format:<raw|txt>,level:N,debug:N
- * Dump raw data for input and/or output images to individual files
- * in raw (binary) format or text (ASCII) representing binary data
- * as strings of 1s and 0s. The filename arguments are used as stems
- * from which individual files are created for each image. Text format
- * includes annotations for image parameters and scanline info. Level
- * selects which functions dump data, with higher numbers selecting
- * lower level, scanline level routines. Debug reports a limited set
- * of messages to monitor progess without enabling dump logs.
- */
-
-static char tiffcrop_version_id[] = "2.4";
-static char tiffcrop_rev_date[] = "12-13-2010";
-
-#include "tif_config.h"
-#include "tiffiop.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <ctype.h>
-#include <limits.h>
-#include <sys/stat.h>
-#include <assert.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-
-#ifndef HAVE_GETOPT
-extern int getopt(int, char**, char*);
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffio.h"
-
-#if defined(VMS)
-# define unlink delete
-#endif
-
-#ifndef PATH_MAX
-#define PATH_MAX 1024
-#endif
-
-#ifndef streq
-#define streq(a,b) (strcmp((a),(b)) == 0)
-#endif
-#define strneq(a,b,n) (strncmp((a),(b),(n)) == 0)
-
-#define TRUE 1
-#define FALSE 0
-
-#ifndef TIFFhowmany
-#define TIFFhowmany(x, y) ((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y)))
-#define TIFFhowmany8(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3)
-#endif
-
-/*
- * Definitions and data structures required to support cropping and image
- * manipulations.
- */
-
-#define EDGE_TOP 1
-#define EDGE_LEFT 2
-#define EDGE_BOTTOM 3
-#define EDGE_RIGHT 4
-#define EDGE_CENTER 5
-
-#define MIRROR_HORIZ 1
-#define MIRROR_VERT 2
-#define MIRROR_BOTH 3
-#define ROTATECW_90 8
-#define ROTATECW_180 16
-#define ROTATECW_270 32
-#define ROTATE_ANY ROTATECW_90 || ROTATECW_180 || ROTATECW_270
-
-#define CROP_NONE 0
-#define CROP_MARGINS 1
-#define CROP_WIDTH 2
-#define CROP_LENGTH 4
-#define CROP_ZONES 8
-#define CROP_REGIONS 16
-#define CROP_ROTATE 32
-#define CROP_MIRROR 64
-#define CROP_INVERT 128
-
-/* Modes for writing out images and selections */
-#define ONE_FILE_COMPOSITE 0 /* One file, sections combined sections */
-#define ONE_FILE_SEPARATED 1 /* One file, sections to new IFDs */
-#define FILE_PER_IMAGE_COMPOSITE 2 /* One file per image, combined sections */
-#define FILE_PER_IMAGE_SEPARATED 3 /* One file per input image */
-#define FILE_PER_SELECTION 4 /* One file per selection */
-
-#define COMPOSITE_IMAGES 0 /* Selections combined into one image */
-#define SEPARATED_IMAGES 1 /* Selections saved to separate images */
-
-#define STRIP 1
-#define TILE 2
-
-#define MAX_REGIONS 8 /* number of regions to extract from a single page */
-#define MAX_OUTBUFFS 8 /* must match larger of zones or regions */
-#define MAX_SECTIONS 32 /* number of sections per page to write to output */
-#define MAX_IMAGES 2048 /* number of images in descrete list, not in the file */
-#define MAX_SAMPLES 8 /* maximum number of samples per pixel supported */
-#define MAX_BITS_PER_SAMPLE 64 /* maximum bit depth supported */
-#define MAX_EXPORT_PAGES 999999 /* maximum number of export pages per file */
-
-#define DUMP_NONE 0
-#define DUMP_TEXT 1
-#define DUMP_RAW 2
-
-/* Offsets into buffer for margins and fixed width and length segments */
-struct offset {
- uint32 tmargin;
- uint32 lmargin;
- uint32 bmargin;
- uint32 rmargin;
- uint32 crop_width;
- uint32 crop_length;
- uint32 startx;
- uint32 endx;
- uint32 starty;
- uint32 endy;
-};
-
-/* Description of a zone within the image. Position 1 of 3 zones would be
- * the first third of the image. These are computed after margins and
- * width/length requests are applied so that you can extract multiple
- * zones from within a larger region for OCR or barcode recognition.
- */
-
-struct buffinfo {
- uint32 size; /* size of this buffer */
- unsigned char *buffer; /* address of the allocated buffer */
-};
-
-struct zone {
- int position; /* ordinal of segment to be extracted */
- int total; /* total equal sized divisions of crop area */
- };
-
-struct pageseg {
- uint32 x1; /* index of left edge */
- uint32 x2; /* index of right edge */
- uint32 y1; /* index of top edge */
- uint32 y2; /* index of bottom edge */
- int position; /* ordinal of segment to be extracted */
- int total; /* total equal sized divisions of crop area */
- uint32 buffsize; /* size of buffer needed to hold the cropped zone */
-};
-
-struct coordpairs {
- double X1; /* index of left edge in current units */
- double X2; /* index of right edge in current units */
- double Y1; /* index of top edge in current units */
- double Y2; /* index of bottom edge in current units */
-};
-
-struct region {
- uint32 x1; /* pixel offset of left edge */
- uint32 x2; /* pixel offset of right edge */
- uint32 y1; /* pixel offset of top edge */
- uint32 y2; /* picel offset of bottom edge */
- uint32 width; /* width in pixels */
- uint32 length; /* length in pixels */
- uint32 buffsize; /* size of buffer needed to hold the cropped region */
- unsigned char *buffptr; /* address of start of the region */
-};
-
-/* Cropping parameters from command line and image data
- * Note: This should be renamed to proc_opts and expanded to include all current globals
- * if possible, but each function that accesses global variables will have to be redone.
- */
-struct crop_mask {
- double width; /* Selection width for master crop region in requested units */
- double length; /* Selection length for master crop region in requesed units */
- double margins[4]; /* Top, left, bottom, right margins */
- float xres; /* Horizontal resolution read from image*/
- float yres; /* Vertical resolution read from image */
- uint32 combined_width; /* Width of combined cropped zones */
- uint32 combined_length; /* Length of combined cropped zones */
- uint32 bufftotal; /* Size of buffer needed to hold all the cropped region */
- uint16 img_mode; /* Composite or separate images created from zones or regions */
- uint16 exp_mode; /* Export input images or selections to one or more files */
- uint16 crop_mode; /* Crop options to be applied */
- uint16 res_unit; /* Resolution unit for margins and selections */
- uint16 edge_ref; /* Reference edge for sections extraction and combination */
- uint16 rotation; /* Clockwise rotation of the extracted region or image */
- uint16 mirror; /* Mirror extracted region or image horizontally or vertically */
- uint16 invert; /* Invert the color map of image or region */
- uint16 photometric; /* Status of photometric interpretation for inverted image */
- uint16 selections; /* Number of regions or zones selected */
- uint16 regions; /* Number of regions delimited by corner coordinates */
- struct region regionlist[MAX_REGIONS]; /* Regions within page or master crop region */
- uint16 zones; /* Number of zones delimited by Ordinal:Total requested */
- struct zone zonelist[MAX_REGIONS]; /* Zones indices to define a region */
- struct coordpairs corners[MAX_REGIONS]; /* Coordinates of upper left and lower right corner */
-};
-
-#define MAX_PAPERNAMES 49
-#define MAX_PAPERNAME_LENGTH 15
-#define DEFAULT_RESUNIT RESUNIT_INCH
-#define DEFAULT_PAGE_HEIGHT 14.0
-#define DEFAULT_PAGE_WIDTH 8.5
-#define DEFAULT_RESOLUTION 300
-#define DEFAULT_PAPER_SIZE "legal"
-
-#define ORIENTATION_NONE 0
-#define ORIENTATION_PORTRAIT 1
-#define ORIENTATION_LANDSCAPE 2
-#define ORIENTATION_SEASCAPE 4
-#define ORIENTATION_AUTO 16
-
-#define PAGE_MODE_NONE 0
-#define PAGE_MODE_RESOLUTION 1
-#define PAGE_MODE_PAPERSIZE 2
-#define PAGE_MODE_MARGINS 4
-#define PAGE_MODE_ROWSCOLS 8
-
-#define INVERT_DATA_ONLY 10
-#define INVERT_DATA_AND_TAG 11
-
-struct paperdef {
- char name[MAX_PAPERNAME_LENGTH];
- double width;
- double length;
- double asratio;
- };
-
-/* European page sizes corrected from update sent by
- * thomas . jarosch @ intra2net . com on 5/7/2010
- * Paper Size Width Length Aspect Ratio */
-struct paperdef PaperTable[MAX_PAPERNAMES] = {
- {"default", 8.500, 14.000, 0.607},
- {"pa4", 8.264, 11.000, 0.751},
- {"letter", 8.500, 11.000, 0.773},
- {"legal", 8.500, 14.000, 0.607},
- {"half-letter", 8.500, 5.514, 1.542},
- {"executive", 7.264, 10.528, 0.690},
- {"tabloid", 11.000, 17.000, 0.647},
- {"11x17", 11.000, 17.000, 0.647},
- {"ledger", 17.000, 11.000, 1.545},
- {"archa", 9.000, 12.000, 0.750},
- {"archb", 12.000, 18.000, 0.667},
- {"archc", 18.000, 24.000, 0.750},
- {"archd", 24.000, 36.000, 0.667},
- {"arche", 36.000, 48.000, 0.750},
- {"csheet", 17.000, 22.000, 0.773},
- {"dsheet", 22.000, 34.000, 0.647},
- {"esheet", 34.000, 44.000, 0.773},
- {"superb", 11.708, 17.042, 0.687},
- {"commercial", 4.139, 9.528, 0.434},
- {"monarch", 3.889, 7.528, 0.517},
- {"envelope-dl", 4.333, 8.681, 0.499},
- {"envelope-c5", 6.389, 9.028, 0.708},
- {"europostcard", 4.139, 5.833, 0.710},
- {"a0", 33.110, 46.811, 0.707},
- {"a1", 23.386, 33.110, 0.706},
- {"a2", 16.535, 23.386, 0.707},
- {"a3", 11.693, 16.535, 0.707},
- {"a4", 8.268, 11.693, 0.707},
- {"a5", 5.827, 8.268, 0.705},
- {"a6", 4.134, 5.827, 0.709},
- {"a7", 2.913, 4.134, 0.705},
- {"a8", 2.047, 2.913, 0.703},
- {"a9", 1.457, 2.047, 0.712},
- {"a10", 1.024, 1.457, 0.703},
- {"b0", 39.370, 55.669, 0.707},
- {"b1", 27.835, 39.370, 0.707},
- {"b2", 19.685, 27.835, 0.707},
- {"b3", 13.898, 19.685, 0.706},
- {"b4", 9.843, 13.898, 0.708},
- {"b5", 6.929, 9.843, 0.704},
- {"b6", 4.921, 6.929, 0.710},
- {"c0", 36.102, 51.063, 0.707},
- {"c1", 25.512, 36.102, 0.707},
- {"c2", 18.031, 25.512, 0.707},
- {"c3", 12.756, 18.031, 0.707},
- {"c4", 9.016, 12.756, 0.707},
- {"c5", 6.378, 9.016, 0.707},
- {"c6", 4.488, 6.378, 0.704},
- {"", 0.000, 0.000, 1.000}
-};
-
-/* Structure to define input image parameters */
-struct image_data {
- float xres;
- float yres;
- uint32 width;
- uint32 length;
- uint16 res_unit;
- uint16 bps;
- uint16 spp;
- uint16 planar;
- uint16 photometric;
- uint16 orientation;
- uint16 compression;
- uint16 adjustments;
-};
-
-/* Structure to define the output image modifiers */
-struct pagedef {
- char name[16];
- double width; /* width in pixels */
- double length; /* length in pixels */
- double hmargin; /* margins to subtract from width of sections */
- double vmargin; /* margins to subtract from height of sections */
- double hres; /* horizontal resolution for output */
- double vres; /* vertical resolution for output */
- uint32 mode; /* bitmask of modifiers to page format */
- uint16 res_unit; /* resolution unit for output image */
- unsigned int rows; /* number of section rows */
- unsigned int cols; /* number of section cols */
- unsigned int orient; /* portrait, landscape, seascape, auto */
-};
-
-struct dump_opts {
- int debug;
- int format;
- int level;
- char mode[4];
- char infilename[PATH_MAX + 1];
- char outfilename[PATH_MAX + 1];
- FILE *infile;
- FILE *outfile;
- };
-
-/* globals */
-static int outtiled = -1;
-static uint32 tilewidth = 0;
-static uint32 tilelength = 0;
-
-static uint16 config = 0;
-static uint16 compression = 0;
-static uint16 predictor = 0;
-static uint16 fillorder = 0;
-static uint32 rowsperstrip = 0;
-static uint32 g3opts = 0;
-static int ignore = FALSE; /* if true, ignore read errors */
-static uint32 defg3opts = (uint32) -1;
-static int quality = 100; /* JPEG quality */
-/* static int jpegcolormode = -1; was JPEGCOLORMODE_RGB; */
-static int jpegcolormode = JPEGCOLORMODE_RGB;
-static uint16 defcompression = (uint16) -1;
-static uint16 defpredictor = (uint16) -1;
-static int pageNum = 0;
-static int little_endian = 1;
-
-/* Functions adapted from tiffcp with additions or significant modifications */
-static int readContigStripsIntoBuffer (TIFF*, uint8*);
-static int readSeparateStripsIntoBuffer (TIFF*, uint8*, uint32, uint32, tsample_t, struct dump_opts *);
-static int readContigTilesIntoBuffer (TIFF*, uint8*, uint32, uint32, uint32, uint32, tsample_t, uint16);
-static int readSeparateTilesIntoBuffer (TIFF*, uint8*, uint32, uint32, uint32, uint32, tsample_t, uint16);
-static int writeBufferToContigStrips (TIFF*, uint8*, uint32);
-static int writeBufferToContigTiles (TIFF*, uint8*, uint32, uint32, tsample_t, struct dump_opts *);
-static int writeBufferToSeparateStrips (TIFF*, uint8*, uint32, uint32, tsample_t, struct dump_opts *);
-static int writeBufferToSeparateTiles (TIFF*, uint8*, uint32, uint32, tsample_t, struct dump_opts *);
-static int extractContigSamplesToBuffer (uint8 *, uint8 *, uint32, uint32, tsample_t,
- uint16, uint16, struct dump_opts *);
-static int processCompressOptions(char*);
-static void usage(void);
-
-/* All other functions by Richard Nolde, not found in tiffcp */
-static void initImageData (struct image_data *);
-static void initCropMasks (struct crop_mask *);
-static void initPageSetup (struct pagedef *, struct pageseg *, struct buffinfo []);
-static void initDumpOptions(struct dump_opts *);
-
-/* Command line and file naming functions */
-void process_command_opts (int, char *[], char *, char *, uint32 *,
- uint16 *, uint16 *, uint32 *, uint32 *, uint32 *,
- struct crop_mask *, struct pagedef *,
- struct dump_opts *,
- unsigned int *, unsigned int *);
-static int update_output_file (TIFF **, char *, int, char *, unsigned int *);
-
-
-/* * High level functions for whole image manipulation */
-static int get_page_geometry (char *, struct pagedef*);
-static int computeInputPixelOffsets(struct crop_mask *, struct image_data *,
- struct offset *);
-static int computeOutputPixelOffsets (struct crop_mask *, struct image_data *,
- struct pagedef *, struct pageseg *,
- struct dump_opts *);
-static int loadImage(TIFF *, struct image_data *, struct dump_opts *, unsigned char **);
-static int correct_orientation(struct image_data *, unsigned char **);
-static int getCropOffsets(struct image_data *, struct crop_mask *, struct dump_opts *);
-static int processCropSelections(struct image_data *, struct crop_mask *,
- unsigned char **, struct buffinfo []);
-static int writeSelections(TIFF *, TIFF **, struct crop_mask *, struct image_data *,
- struct dump_opts *, struct buffinfo [],
- char *, char *, unsigned int*, unsigned int);
-
-/* Section functions */
-static int createImageSection(uint32, unsigned char **);
-static int extractImageSection(struct image_data *, struct pageseg *,
- unsigned char *, unsigned char *);
-static int writeSingleSection(TIFF *, TIFF *, struct image_data *,
- struct dump_opts *, uint32, uint32,
- double, double, unsigned char *);
-static int writeImageSections(TIFF *, TIFF *, struct image_data *,
- struct pagedef *, struct pageseg *,
- struct dump_opts *, unsigned char *,
- unsigned char **);
-/* Whole image functions */
-static int createCroppedImage(struct image_data *, struct crop_mask *,
- unsigned char **, unsigned char **);
-static int writeCroppedImage(TIFF *, TIFF *, struct image_data *image,
- struct dump_opts * dump,
- uint32, uint32, unsigned char *, int, int);
-
-/* Image manipulation functions */
-static int rotateContigSamples8bits(uint16, uint16, uint16, uint32,
- uint32, uint32, uint8 *, uint8 *);
-static int rotateContigSamples16bits(uint16, uint16, uint16, uint32,
- uint32, uint32, uint8 *, uint8 *);
-static int rotateContigSamples24bits(uint16, uint16, uint16, uint32,
- uint32, uint32, uint8 *, uint8 *);
-static int rotateContigSamples32bits(uint16, uint16, uint16, uint32,
- uint32, uint32, uint8 *, uint8 *);
-static int rotateImage(uint16, struct image_data *, uint32 *, uint32 *,
- unsigned char **);
-static int mirrorImage(uint16, uint16, uint16, uint32, uint32,
- unsigned char *);
-static int invertImage(uint16, uint16, uint16, uint32, uint32,
- unsigned char *);
-
-/* Functions to reverse the sequence of samples in a scanline */
-static int reverseSamples8bits (uint16, uint16, uint32, uint8 *, uint8 *);
-static int reverseSamples16bits (uint16, uint16, uint32, uint8 *, uint8 *);
-static int reverseSamples24bits (uint16, uint16, uint32, uint8 *, uint8 *);
-static int reverseSamples32bits (uint16, uint16, uint32, uint8 *, uint8 *);
-static int reverseSamplesBytes (uint16, uint16, uint32, uint8 *, uint8 *);
-
-/* Functions for manipulating individual samples in an image */
-static int extractSeparateRegion(struct image_data *, struct crop_mask *,
- unsigned char *, unsigned char *, int);
-static int extractCompositeRegions(struct image_data *, struct crop_mask *,
- unsigned char *, unsigned char *);
-static int extractContigSamples8bits (uint8 *, uint8 *, uint32,
- tsample_t, uint16, uint16,
- tsample_t, uint32, uint32);
-static int extractContigSamples16bits (uint8 *, uint8 *, uint32,
- tsample_t, uint16, uint16,
- tsample_t, uint32, uint32);
-static int extractContigSamples24bits (uint8 *, uint8 *, uint32,
- tsample_t, uint16, uint16,
- tsample_t, uint32, uint32);
-static int extractContigSamples32bits (uint8 *, uint8 *, uint32,
- tsample_t, uint16, uint16,
- tsample_t, uint32, uint32);
-static int extractContigSamplesBytes (uint8 *, uint8 *, uint32,
- tsample_t, uint16, uint16,
- tsample_t, uint32, uint32);
-static int extractContigSamplesShifted8bits (uint8 *, uint8 *, uint32,
- tsample_t, uint16, uint16,
- tsample_t, uint32, uint32,
- int);
-static int extractContigSamplesShifted16bits (uint8 *, uint8 *, uint32,
- tsample_t, uint16, uint16,
- tsample_t, uint32, uint32,
- int);
-static int extractContigSamplesShifted24bits (uint8 *, uint8 *, uint32,
- tsample_t, uint16, uint16,
- tsample_t, uint32, uint32,
- int);
-static int extractContigSamplesShifted32bits (uint8 *, uint8 *, uint32,
- tsample_t, uint16, uint16,
- tsample_t, uint32, uint32,
- int);
-static int extractContigSamplesToTileBuffer(uint8 *, uint8 *, uint32, uint32,
- uint32, uint32, tsample_t, uint16,
- uint16, uint16, struct dump_opts *);
-
-/* Functions to combine separate planes into interleaved planes */
-static int combineSeparateSamples8bits (uint8 *[], uint8 *, uint32, uint32,
- uint16, uint16, FILE *, int, int);
-static int combineSeparateSamples16bits (uint8 *[], uint8 *, uint32, uint32,
- uint16, uint16, FILE *, int, int);
-static int combineSeparateSamples24bits (uint8 *[], uint8 *, uint32, uint32,
- uint16, uint16, FILE *, int, int);
-static int combineSeparateSamples32bits (uint8 *[], uint8 *, uint32, uint32,
- uint16, uint16, FILE *, int, int);
-static int combineSeparateSamplesBytes (unsigned char *[], unsigned char *,
- uint32, uint32, tsample_t, uint16,
- FILE *, int, int);
-
-static int combineSeparateTileSamples8bits (uint8 *[], uint8 *, uint32, uint32,
- uint32, uint32, uint16, uint16,
- FILE *, int, int);
-static int combineSeparateTileSamples16bits (uint8 *[], uint8 *, uint32, uint32,
- uint32, uint32, uint16, uint16,
- FILE *, int, int);
-static int combineSeparateTileSamples24bits (uint8 *[], uint8 *, uint32, uint32,
- uint32, uint32, uint16, uint16,
- FILE *, int, int);
-static int combineSeparateTileSamples32bits (uint8 *[], uint8 *, uint32, uint32,
- uint32, uint32, uint16, uint16,
- FILE *, int, int);
-static int combineSeparateTileSamplesBytes (unsigned char *[], unsigned char *,
- uint32, uint32, uint32, uint32,
- tsample_t, uint16, FILE *, int, int);
-
-/* Dump functions for debugging */
-static void dump_info (FILE *, int, char *, char *, ...);
-static int dump_data (FILE *, int, char *, unsigned char *, uint32);
-static int dump_byte (FILE *, int, char *, unsigned char);
-static int dump_short (FILE *, int, char *, uint16);
-static int dump_long (FILE *, int, char *, uint32);
-static int dump_wide (FILE *, int, char *, uint64);
-static int dump_buffer (FILE *, int, uint32, uint32, uint32, unsigned char *);
-
-/* End function declarations */
-/* Functions derived in whole or in part from tiffcp */
-/* The following functions are taken largely intact from tiffcp */
-
-static char* usage_info[] = {
-"usage: tiffcrop [options] source1 ... sourceN destination",
-"where options are:",
-" -h Print this syntax listing",
-" -v Print tiffcrop version identifier and last revision date",
-" ",
-" -a Append to output instead of overwriting",
-" -d offset Set initial directory offset, counting first image as one, not zero",
-" -p contig Pack samples contiguously (e.g. RGBRGB...)",
-" -p separate Store samples separately (e.g. RRR...GGG...BBB...)",
-" -s Write output in strips",
-" -t Write output in tiles",
-" -i Ignore read errors",
-" ",
-" -r # Make each strip have no more than # rows",
-" -w # Set output tile width (pixels)",
-" -l # Set output tile length (pixels)",
-" ",
-" -f lsb2msb Force lsb-to-msb FillOrder for output",
-" -f msb2lsb Force msb-to-lsb FillOrder for output",
-"",
-" -c lzw[:opts] Compress output with Lempel-Ziv & Welch encoding",
-" -c zip[:opts] Compress output with deflate encoding",
-" -c jpeg[:opts] Compress output with JPEG encoding",
-" -c packbits Compress output with packbits encoding",
-" -c g3[:opts] Compress output with CCITT Group 3 encoding",
-" -c g4 Compress output with CCITT Group 4 encoding",
-" -c none Use no compression algorithm on output",
-" ",
-"Group 3 options:",
-" 1d Use default CCITT Group 3 1D-encoding",
-" 2d Use optional CCITT Group 3 2D-encoding",
-" fill Byte-align EOL codes",
-"For example, -c g3:2d:fill to get G3-2D-encoded data with byte-aligned EOLs",
-" ",
-"JPEG options:",
-" # Set compression quality level (0-100, default 100)",
-" raw Output color image as raw YCbCr",
-" rgb Output color image as RGB",
-"For example, -c jpeg:rgb:50 to get JPEG-encoded RGB data with 50% comp. quality",
-" ",
-"LZW and deflate options:",
-" # Set predictor value",
-"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing",
-" ",
-"Page and selection options:",
-" -N odd|even|#,#-#,#|last sequences and ranges of images within file to process",
-" The words odd or even may be used to specify all odd or even numbered images.",
-" The word last may be used in place of a number in the sequence to indicate.",
-" The final image in the file without knowing how many images there are.",
-" Numbers are counted from one even though TIFF IFDs are counted from zero.",
-" ",
-" -E t|l|r|b edge to use as origin for width and length of crop region",
-" -U units [in, cm, px ] inches, centimeters or pixels",
-" ",
-" -m #,#,#,# margins from edges for selection: top, left, bottom, right separated by commas",
-" -X # horizontal dimension of region to extract expressed in current units",
-" -Y # vertical dimension of region to extract expressed in current units",
-" -Z #:#,#:# zones of the image designated as position X of Y,",
-" eg 1:3 would be first of three equal portions measured from reference edge",
-" -z x1,y1,x2,y2:...:xN,yN,xN+1,yN+1",
-" regions of the image designated by upper left and lower right coordinates",
-"",
-"Export grouping options:",
-" -e c|d|i|m|s export mode for images and selections from input images.",
-" When exporting a composite image from multiple zones or regions",
-" (combined and image modes), the selections must have equal sizes",
-" for the axis perpendicular to the edge specified with -E.",
-" c|combined All images and selections are written to a single file (default).",
-" with multiple selections from one image combined into a single image.",
-" d|divided All images and selections are written to a single file",
-" with each selection from one image written to a new image.",
-" i|image Each input image is written to a new file (numeric filename sequence)",
-" with multiple selections from the image combined into one image.",
-" m|multiple Each input image is written to a new file (numeric filename sequence)",
-" with each selection from the image written to a new image.",
-" s|separated Individual selections from each image are written to separate files.",
-"",
-"Output options:",
-" -H # Set horizontal resolution of output images to #",
-" -V # Set vertical resolution of output images to #",
-" -J # Set horizontal margin of output page to # expressed in current units",
-" when sectioning image into columns x rows using the -S cols:rows option",
-" -K # Set verticalal margin of output page to # expressed in current units",
-" when sectioning image into columns x rows using the -S cols:rows option",
-" ",
-" -O orient orientation for output image, portrait, landscape, auto",
-" -P page page size for output image segments, eg letter, legal, tabloid, etc",
-" use #.#x#.# to specify a custom page size in the currently defined units",
-" where #.# represents the width and length",
-" -S cols:rows Divide the image into equal sized segments using cols across and rows down.",
-" ",
-" -F hor|vert|both",
-" flip (mirror) image or region horizontally, vertically, or both",
-" -R # [90,180,or 270] degrees clockwise rotation of image or extracted region",
-" -I [black|white|data|both]",
-" invert color space, eg dark to light for bilevel and grayscale images",
-" If argument is white or black, set the PHOTOMETRIC_INTERPRETATION ",
-" tag to MinIsBlack or MinIsWhite without altering the image data",
-" If the argument is data or both, the image data are modified:",
-" both inverts the data and the PHOTOMETRIC_INTERPRETATION tag,",
-" data inverts the data but not the PHOTOMETRIC_INTERPRETATION tag",
-" ",
-"-D opt1:value1,opt2:value2,opt3:value3:opt4:value4",
-" Debug/dump program progress and/or data to non-TIFF files.",
-" Options include the following and must be joined as a comma",
-" separate list. The use of this option is generally limited to",
-" program debugging and development of future options.",
-" ",
-" debug:N Display limited program progress indicators where larger N",
-" increase the level of detail. Note: Tiffcrop may be compiled with",
-" -DDEVELMODE to enable additional very low level debug reporting.",
-"",
-" Format:txt|raw Format any logged data as ASCII text or raw binary ",
-" values. ASCII text dumps include strings of ones and zeroes",
-" representing the binary values in the image data plus identifying headers.",
-" ",
-" level:N Specify the level of detail presented in the dump files.",
-" This can vary from dumps of the entire input or output image data to dumps",
-" of data processed by specific functions. Current range of levels is 1 to 3.",
-" ",
-" input:full-path-to-directory/input-dumpname",
-" ",
-" output:full-path-to-directory/output-dumpnaem",
-" ",
-" When dump files are being written, each image will be written to a separate",
-" file with the name built by adding a numeric sequence value to the dumpname",
-" and an extension of .txt for ASCII dumps or .bin for binary dumps.",
-" ",
-" The four debug/dump options are independent, though it makes little sense to",
-" specify a dump file without specifying a detail level.",
-" ",
-NULL
-};
-
-/* This function could be modified to pass starting sample offset
- * and number of samples as args to select fewer than spp
- * from input image. These would then be passed to individual
- * extractContigSampleXX routines.
- */
-static int readContigTilesIntoBuffer (TIFF* in, uint8* buf,
- uint32 imagelength,
- uint32 imagewidth,
- uint32 tw, uint32 tl,
- tsample_t spp, uint16 bps)
- {
- int status = 1;
- tsample_t sample = 0;
- tsample_t count = spp;
- uint32 row, col, trow;
- uint32 nrow, ncol;
- uint32 dst_rowsize, shift_width;
- uint32 bytes_per_sample, bytes_per_pixel;
- uint32 trailing_bits, prev_trailing_bits;
- uint32 tile_rowsize = TIFFTileRowSize(in);
- uint32 src_offset, dst_offset;
- uint32 row_offset, col_offset;
- uint8 *bufp = (uint8*) buf;
- unsigned char *src = NULL;
- unsigned char *dst = NULL;
- tsize_t tbytes = 0, tile_buffsize = 0;
- tsize_t tilesize = TIFFTileSize(in);
- unsigned char *tilebuf = NULL;
-
- bytes_per_sample = (bps + 7) / 8;
- bytes_per_pixel = ((bps * spp) + 7) / 8;
-
- if ((bps % 8) == 0)
- shift_width = 0;
- else
- {
- if (bytes_per_pixel < (bytes_per_sample + 1))
- shift_width = bytes_per_pixel;
- else
- shift_width = bytes_per_sample + 1;
- }
-
- tile_buffsize = tilesize;
-
- if (tilesize < (tsize_t)(tl * tile_rowsize))
- {
-#ifdef DEBUG2
- TIFFError("readContigTilesIntoBuffer",
- "Tilesize %lu is too small, using alternate calculation %u",
- tilesize, tl * tile_rowsize);
-#endif
- tile_buffsize = tl * tile_rowsize;
- }
-
- tilebuf = _TIFFmalloc(tile_buffsize);
- if (tilebuf == 0)
- return 0;
-
- dst_rowsize = ((imagewidth * bps * spp) + 7) / 8;
- for (row = 0; row < imagelength; row += tl)
- {
- nrow = (row + tl > imagelength) ? imagelength - row : tl;
- for (col = 0; col < imagewidth; col += tw)
- {
- tbytes = TIFFReadTile(in, tilebuf, col, row, 0, 0);
- if (tbytes < tilesize && !ignore)
- {
- TIFFError(TIFFFileName(in),
- "Error, can't read tile at row %lu col %lu, Read %lu bytes of %lu",
- (unsigned long) col, (unsigned long) row, (unsigned long)tbytes,
- (unsigned long)tilesize);
- status = 0;
- _TIFFfree(tilebuf);
- return status;
- }
-
- row_offset = row * dst_rowsize;
- col_offset = ((col * bps * spp) + 7)/ 8;
- bufp = buf + row_offset + col_offset;
-
- if (col + tw > imagewidth)
- ncol = imagewidth - col;
- else
- ncol = tw;
-
- /* Each tile scanline will start on a byte boundary but it
- * has to be merged into the scanline for the entire
- * image buffer and the previous segment may not have
- * ended on a byte boundary
- */
- /* Optimization for common bit depths, all samples */
- if (((bps % 8) == 0) && (count == spp))
- {
- for (trow = 0; trow < nrow; trow++)
- {
- src_offset = trow * tile_rowsize;
- _TIFFmemcpy (bufp, tilebuf + src_offset, (ncol * spp * bps) / 8);
- bufp += (imagewidth * bps * spp) / 8;
- }
- }
- else
- {
- /* Bit depths not a multiple of 8 and/or extract fewer than spp samples */
- prev_trailing_bits = trailing_bits = 0;
- trailing_bits = (ncol * bps * spp) % 8;
-
- /* for (trow = 0; tl < nrow; trow++) */
- for (trow = 0; trow < nrow; trow++)
- {
- src_offset = trow * tile_rowsize;
- src = tilebuf + src_offset;
- dst_offset = (row + trow) * dst_rowsize;
- dst = buf + dst_offset + col_offset;
- switch (shift_width)
- {
- case 0: if (extractContigSamplesBytes (src, dst, ncol, sample,
- spp, bps, count, 0, ncol))
- {
- TIFFError("readContigTilesIntoBuffer",
- "Unable to extract row %d from tile %lu",
- row, (unsigned long)TIFFCurrentTile(in));
- return 1;
- }
- break;
- case 1: if (bps == 1)
- {
- if (extractContigSamplesShifted8bits (src, dst, ncol,
- sample, spp,
- bps, count,
- 0, ncol,
- prev_trailing_bits))
- {
- TIFFError("readContigTilesIntoBuffer",
- "Unable to extract row %d from tile %lu",
- row, (unsigned long)TIFFCurrentTile(in));
- return 1;
- }
- break;
- }
- else
- if (extractContigSamplesShifted16bits (src, dst, ncol,
- sample, spp,
- bps, count,
- 0, ncol,
- prev_trailing_bits))
- {
- TIFFError("readContigTilesIntoBuffer",
- "Unable to extract row %d from tile %lu",
- row, (unsigned long)TIFFCurrentTile(in));
- return 1;
- }
- break;
- case 2: if (extractContigSamplesShifted24bits (src, dst, ncol,
- sample, spp,
- bps, count,
- 0, ncol,
- prev_trailing_bits))
- {
- TIFFError("readContigTilesIntoBuffer",
- "Unable to extract row %d from tile %lu",
- row, (unsigned long)TIFFCurrentTile(in));
- return 1;
- }
- break;
- case 3:
- case 4:
- case 5: if (extractContigSamplesShifted32bits (src, dst, ncol,
- sample, spp,
- bps, count,
- 0, ncol,
- prev_trailing_bits))
- {
- TIFFError("readContigTilesIntoBuffer",
- "Unable to extract row %d from tile %lu",
- row, (unsigned long)TIFFCurrentTile(in));
- return 1;
- }
- break;
- default: TIFFError("readContigTilesIntoBuffer", "Unsupported bit depth %d", bps);
- return 1;
- }
- }
- prev_trailing_bits += trailing_bits;
- if (prev_trailing_bits > 7)
- prev_trailing_bits-= 8;
- }
- }
- }
-
- _TIFFfree(tilebuf);
- return status;
- }
-
-static int readSeparateTilesIntoBuffer (TIFF* in, uint8 *obuf,
- uint32 imagelength, uint32 imagewidth,
- uint32 tw, uint32 tl,
- uint16 spp, uint16 bps)
- {
- int i, status = 1, sample;
- int shift_width, bytes_per_pixel;
- uint16 bytes_per_sample;
- uint32 row, col; /* Current row and col of image */
- uint32 nrow, ncol; /* Number of rows and cols in current tile */
- uint32 row_offset, col_offset; /* Output buffer offsets */
- tsize_t tbytes = 0, tilesize = TIFFTileSize(in);
- tsample_t s;
- uint8* bufp = (uint8*)obuf;
- unsigned char *srcbuffs[MAX_SAMPLES];
- unsigned char *tbuff = NULL;
-
- bytes_per_sample = (bps + 7) / 8;
-
- for (sample = 0; (sample < spp) && (sample < MAX_SAMPLES); sample++)
- {
- srcbuffs[sample] = NULL;
- tbuff = (unsigned char *)_TIFFmalloc(tilesize + 8);
- if (!tbuff)
- {
- TIFFError ("readSeparateTilesIntoBuffer",
- "Unable to allocate tile read buffer for sample %d", sample);
- for (i = 0; i < sample; i++)
- _TIFFfree (srcbuffs[i]);
- return 0;
- }
- srcbuffs[sample] = tbuff;
- }
- /* Each tile contains only the data for a single plane
- * arranged in scanlines of tw * bytes_per_sample bytes.
- */
- for (row = 0; row < imagelength; row += tl)
- {
- nrow = (row + tl > imagelength) ? imagelength - row : tl;
- for (col = 0; col < imagewidth; col += tw)
- {
- for (s = 0; s < spp; s++)
- { /* Read each plane of a tile set into srcbuffs[s] */
- tbytes = TIFFReadTile(in, srcbuffs[s], col, row, 0, s);
- if (tbytes < 0 && !ignore)
- {
- TIFFError(TIFFFileName(in),
- "Error, can't read tile for row %lu col %lu, "
- "sample %lu",
- (unsigned long) col, (unsigned long) row,
- (unsigned long) s);
- status = 0;
- for (sample = 0; (sample < spp) && (sample < MAX_SAMPLES); sample++)
- {
- tbuff = srcbuffs[sample];
- if (tbuff != NULL)
- _TIFFfree(tbuff);
- }
- return status;
- }
- }
- /* Tiles on the right edge may be padded out to tw
- * which must be a multiple of 16.
- * Ncol represents the visible (non padding) portion.
- */
- if (col + tw > imagewidth)
- ncol = imagewidth - col;
- else
- ncol = tw;
-
- row_offset = row * (((imagewidth * spp * bps) + 7) / 8);
- col_offset = ((col * spp * bps) + 7) / 8;
- bufp = obuf + row_offset + col_offset;
-
- if ((bps % 8) == 0)
- {
- if (combineSeparateTileSamplesBytes(srcbuffs, bufp, ncol, nrow, imagewidth,
- tw, spp, bps, NULL, 0, 0))
- {
- status = 0;
- break;
- }
- }
- else
- {
- bytes_per_pixel = ((bps * spp) + 7) / 8;
- if (bytes_per_pixel < (bytes_per_sample + 1))
- shift_width = bytes_per_pixel;
- else
- shift_width = bytes_per_sample + 1;
-
- switch (shift_width)
- {
- case 1: if (combineSeparateTileSamples8bits (srcbuffs, bufp, ncol, nrow,
- imagewidth, tw, spp, bps,
- NULL, 0, 0))
- {
- status = 0;
- break;
- }
- break;
- case 2: if (combineSeparateTileSamples16bits (srcbuffs, bufp, ncol, nrow,
- imagewidth, tw, spp, bps,
- NULL, 0, 0))
- {
- status = 0;
- break;
- }
- break;
- case 3: if (combineSeparateTileSamples24bits (srcbuffs, bufp, ncol, nrow,
- imagewidth, tw, spp, bps,
- NULL, 0, 0))
- {
- status = 0;
- break;
- }
- break;
- case 4:
- case 5:
- case 6:
- case 7:
- case 8: if (combineSeparateTileSamples32bits (srcbuffs, bufp, ncol, nrow,
- imagewidth, tw, spp, bps,
- NULL, 0, 0))
- {
- status = 0;
- break;
- }
- break;
- default: TIFFError ("readSeparateTilesIntoBuffer", "Unsupported bit depth: %d", bps);
- status = 0;
- break;
- }
- }
- }
- }
-
- for (sample = 0; (sample < spp) && (sample < MAX_SAMPLES); sample++)
- {
- tbuff = srcbuffs[sample];
- if (tbuff != NULL)
- _TIFFfree(tbuff);
- }
-
- return status;
- }
-
-static int writeBufferToContigStrips(TIFF* out, uint8* buf, uint32 imagelength)
- {
- uint32 row, nrows, rowsperstrip;
- tstrip_t strip = 0;
- tsize_t stripsize;
-
- TIFFGetFieldDefaulted(out, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
- for (row = 0; row < imagelength; row += rowsperstrip)
- {
- nrows = (row + rowsperstrip > imagelength) ?
- imagelength - row : rowsperstrip;
- stripsize = TIFFVStripSize(out, nrows);
- if (TIFFWriteEncodedStrip(out, strip++, buf, stripsize) < 0)
- {
- TIFFError(TIFFFileName(out), "Error, can't write strip %u", strip - 1);
- return 1;
- }
- buf += stripsize;
- }
-
- return 0;
- }
-
-/* Abandon plans to modify code so that plannar orientation separate images
- * do not have all samples for each channel written before all samples
- * for the next channel have been abandoned.
- * Libtiff internals seem to depend on all data for a given sample
- * being contiguous within a strip or tile when PLANAR_CONFIG is
- * separate. All strips or tiles of a given plane are written
- * before any strips or tiles of a different plane are stored.
- */
-static int
-writeBufferToSeparateStrips (TIFF* out, uint8* buf,
- uint32 length, uint32 width, uint16 spp,
- struct dump_opts *dump)
- {
- uint8 *src;
- uint16 bps;
- uint32 row, nrows, rowsize, rowsperstrip;
- uint32 bytes_per_sample;
- tsample_t s;
- tstrip_t strip = 0;
- tsize_t stripsize = TIFFStripSize(out);
- tsize_t rowstripsize, scanlinesize = TIFFScanlineSize(out);
- tsize_t total_bytes = 0;
- tdata_t obuf;
-
- (void) TIFFGetFieldDefaulted(out, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
- (void) TIFFGetField(out, TIFFTAG_BITSPERSAMPLE, &bps);
- bytes_per_sample = (bps + 7) / 8;
- rowsize = ((bps * spp * width) + 7) / 8; /* source has interleaved samples */
- rowstripsize = rowsperstrip * bytes_per_sample * (width + 1);
-
- obuf = _TIFFmalloc (rowstripsize);
- if (obuf == NULL)
- return 1;
-
- for (s = 0; s < spp; s++)
- {
- for (row = 0; row < length; row += rowsperstrip)
- {
- nrows = (row + rowsperstrip > length) ? length - row : rowsperstrip;
-
- stripsize = TIFFVStripSize(out, nrows);
- src = buf + (row * rowsize);
- total_bytes += stripsize;
- memset (obuf, '\0', rowstripsize);
- if (extractContigSamplesToBuffer(obuf, src, nrows, width, s, spp, bps, dump))
- {
- _TIFFfree(obuf);
- return 1;
- }
- if ((dump->outfile != NULL) && (dump->level == 1))
- {
- dump_info(dump->outfile, dump->format,"",
- "Sample %2d, Strip: %2d, bytes: %4d, Row %4d, bytes: %4d, Input offset: %6d",
- s + 1, strip + 1, stripsize, row + 1, scanlinesize, src - buf);
- dump_buffer(dump->outfile, dump->format, nrows, scanlinesize, row, obuf);
- }
-
- if (TIFFWriteEncodedStrip(out, strip++, obuf, stripsize) < 0)
- {
- TIFFError(TIFFFileName(out), "Error, can't write strip %u", strip - 1);
- _TIFFfree(obuf);
- return 1;
- }
- }
- }
-
- _TIFFfree(obuf);
- return 0;
-}
-
-/* Extract all planes from contiguous buffer into a single tile buffer
- * to be written out as a tile.
- */
-static int writeBufferToContigTiles (TIFF* out, uint8* buf, uint32 imagelength,
- uint32 imagewidth, tsample_t spp,
- struct dump_opts* dump)
- {
- uint16 bps;
- uint32 tl, tw;
- uint32 row, col, nrow, ncol;
- uint32 src_rowsize, col_offset;
- uint32 tile_rowsize = TIFFTileRowSize(out);
- uint8* bufp = (uint8*) buf;
- tsize_t tile_buffsize = 0;
- tsize_t tilesize = TIFFTileSize(out);
- unsigned char *tilebuf = NULL;
-
- if( !TIFFGetField(out, TIFFTAG_TILELENGTH, &tl) ||
- !TIFFGetField(out, TIFFTAG_TILEWIDTH, &tw) ||
- !TIFFGetField(out, TIFFTAG_BITSPERSAMPLE, &bps) )
- return 1;
-
- tile_buffsize = tilesize;
- if (tilesize < (tsize_t)(tl * tile_rowsize))
- {
-#ifdef DEBUG2
- TIFFError("writeBufferToContigTiles",
- "Tilesize %lu is too small, using alternate calculation %u",
- tilesize, tl * tile_rowsize);
-#endif
- tile_buffsize = tl * tile_rowsize;
- }
-
- tilebuf = _TIFFmalloc(tile_buffsize);
- if (tilebuf == 0)
- return 1;
-
- src_rowsize = ((imagewidth * spp * bps) + 7) / 8;
- for (row = 0; row < imagelength; row += tl)
- {
- nrow = (row + tl > imagelength) ? imagelength - row : tl;
- for (col = 0; col < imagewidth; col += tw)
- {
- /* Calculate visible portion of tile. */
- if (col + tw > imagewidth)
- ncol = imagewidth - col;
- else
- ncol = tw;
-
- col_offset = (((col * bps * spp) + 7) / 8);
- bufp = buf + (row * src_rowsize) + col_offset;
- if (extractContigSamplesToTileBuffer(tilebuf, bufp, nrow, ncol, imagewidth,
- tw, 0, spp, spp, bps, dump) > 0)
- {
- TIFFError("writeBufferToContigTiles",
- "Unable to extract data to tile for row %lu, col %lu",
- (unsigned long) row, (unsigned long)col);
- _TIFFfree(tilebuf);
- return 1;
- }
-
- if (TIFFWriteTile(out, tilebuf, col, row, 0, 0) < 0)
- {
- TIFFError("writeBufferToContigTiles",
- "Cannot write tile at %lu %lu",
- (unsigned long) col, (unsigned long) row);
- _TIFFfree(tilebuf);
- return 1;
- }
- }
- }
- _TIFFfree(tilebuf);
-
- return 0;
- } /* end writeBufferToContigTiles */
-
-/* Extract each plane from contiguous buffer into a single tile buffer
- * to be written out as a tile.
- */
-static int writeBufferToSeparateTiles (TIFF* out, uint8* buf, uint32 imagelength,
- uint32 imagewidth, tsample_t spp,
- struct dump_opts * dump)
- {
- tdata_t obuf = _TIFFmalloc(TIFFTileSize(out));
- uint32 tl, tw;
- uint32 row, col, nrow, ncol;
- uint32 src_rowsize, col_offset;
- uint16 bps;
- tsample_t s;
- uint8* bufp = (uint8*) buf;
-
- if (obuf == NULL)
- return 1;
-
- TIFFGetField(out, TIFFTAG_TILELENGTH, &tl);
- TIFFGetField(out, TIFFTAG_TILEWIDTH, &tw);
- TIFFGetField(out, TIFFTAG_BITSPERSAMPLE, &bps);
- src_rowsize = ((imagewidth * spp * bps) + 7) / 8;
-
- for (row = 0; row < imagelength; row += tl)
- {
- nrow = (row + tl > imagelength) ? imagelength - row : tl;
- for (col = 0; col < imagewidth; col += tw)
- {
- /* Calculate visible portion of tile. */
- if (col + tw > imagewidth)
- ncol = imagewidth - col;
- else
- ncol = tw;
-
- col_offset = (((col * bps * spp) + 7) / 8);
- bufp = buf + (row * src_rowsize) + col_offset;
-
- for (s = 0; s < spp; s++)
- {
- if (extractContigSamplesToTileBuffer(obuf, bufp, nrow, ncol, imagewidth,
- tw, s, 1, spp, bps, dump) > 0)
- {
- TIFFError("writeBufferToSeparateTiles",
- "Unable to extract data to tile for row %lu, col %lu sample %d",
- (unsigned long) row, (unsigned long)col, (int)s);
- _TIFFfree(obuf);
- return 1;
- }
-
- if (TIFFWriteTile(out, obuf, col, row, 0, s) < 0)
- {
- TIFFError("writeBufferToseparateTiles",
- "Cannot write tile at %lu %lu sample %lu",
- (unsigned long) col, (unsigned long) row,
- (unsigned long) s);
- _TIFFfree(obuf);
- return 1;
- }
- }
- }
- }
- _TIFFfree(obuf);
-
- return 0;
- } /* end writeBufferToSeparateTiles */
-
-static void
-processG3Options(char* cp)
-{
- if( (cp = strchr(cp, ':')) ) {
- if (defg3opts == (uint32) -1)
- defg3opts = 0;
- do {
- cp++;
- if (strneq(cp, "1d", 2))
- defg3opts &= ~GROUP3OPT_2DENCODING;
- else if (strneq(cp, "2d", 2))
- defg3opts |= GROUP3OPT_2DENCODING;
- else if (strneq(cp, "fill", 4))
- defg3opts |= GROUP3OPT_FILLBITS;
- else
- usage();
- } while( (cp = strchr(cp, ':')) );
- }
-}
-
-static int
-processCompressOptions(char* opt)
- {
- char* cp = NULL;
-
- if (strneq(opt, "none",4))
- {
- defcompression = COMPRESSION_NONE;
- }
- else if (streq(opt, "packbits"))
- {
- defcompression = COMPRESSION_PACKBITS;
- }
- else if (strneq(opt, "jpeg", 4))
- {
- cp = strchr(opt, ':');
- defcompression = COMPRESSION_JPEG;
-
- while (cp)
- {
- if (isdigit((int)cp[1]))
- quality = atoi(cp + 1);
- else if (strneq(cp + 1, "raw", 3 ))
- jpegcolormode = JPEGCOLORMODE_RAW;
- else if (strneq(cp + 1, "rgb", 3 ))
- jpegcolormode = JPEGCOLORMODE_RGB;
- else
- usage();
- cp = strchr(cp + 1, ':');
- }
- }
- else if (strneq(opt, "g3", 2))
- {
- processG3Options(opt);
- defcompression = COMPRESSION_CCITTFAX3;
- }
- else if (streq(opt, "g4"))
- {
- defcompression = COMPRESSION_CCITTFAX4;
- }
- else if (strneq(opt, "lzw", 3))
- {
- cp = strchr(opt, ':');
- if (cp)
- defpredictor = atoi(cp+1);
- defcompression = COMPRESSION_LZW;
- }
- else if (strneq(opt, "zip", 3))
- {
- cp = strchr(opt, ':');
- if (cp)
- defpredictor = atoi(cp+1);
- defcompression = COMPRESSION_ADOBE_DEFLATE;
- }
- else
- return (0);
-
- return (1);
- }
-
-static void
-usage(void)
- {
- int i;
-
- fprintf(stderr, "\n%s\n", TIFFGetVersion());
- for (i = 0; usage_info[i] != NULL; i++)
- fprintf(stderr, "%s\n", usage_info[i]);
- exit(-1);
- }
-
-#define CopyField(tag, v) \
- if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v)
-#define CopyField2(tag, v1, v2) \
- if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2)
-#define CopyField3(tag, v1, v2, v3) \
- if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3)
-#define CopyField4(tag, v1, v2, v3, v4) \
- if (TIFFGetField(in, tag, &v1, &v2, &v3, &v4)) TIFFSetField(out, tag, v1, v2, v3, v4)
-
-static void
-cpTag(TIFF* in, TIFF* out, uint16 tag, uint16 count, TIFFDataType type)
-{
- switch (type) {
- case TIFF_SHORT:
- if (count == 1) {
- uint16 shortv;
- CopyField(tag, shortv);
- } else if (count == 2) {
- uint16 shortv1, shortv2;
- CopyField2(tag, shortv1, shortv2);
- } else if (count == 4) {
- uint16 *tr, *tg, *tb, *ta;
- CopyField4(tag, tr, tg, tb, ta);
- } else if (count == (uint16) -1) {
- uint16 shortv1;
- uint16* shortav;
- CopyField2(tag, shortv1, shortav);
- }
- break;
- case TIFF_LONG:
- { uint32 longv;
- CopyField(tag, longv);
- }
- break;
- case TIFF_RATIONAL:
- if (count == 1) {
- float floatv;
- CopyField(tag, floatv);
- } else if (count == (uint16) -1) {
- float* floatav;
- CopyField(tag, floatav);
- }
- break;
- case TIFF_ASCII:
- { char* stringv;
- CopyField(tag, stringv);
- }
- break;
- case TIFF_DOUBLE:
- if (count == 1) {
- double doublev;
- CopyField(tag, doublev);
- } else if (count == (uint16) -1) {
- double* doubleav;
- CopyField(tag, doubleav);
- }
- break;
- default:
- TIFFError(TIFFFileName(in),
- "Data type %d is not supported, tag %d skipped",
- tag, type);
- }
-}
-
-static struct cpTag {
- uint16 tag;
- uint16 count;
- TIFFDataType type;
-} tags[] = {
- { TIFFTAG_SUBFILETYPE, 1, TIFF_LONG },
- { TIFFTAG_THRESHHOLDING, 1, TIFF_SHORT },
- { TIFFTAG_DOCUMENTNAME, 1, TIFF_ASCII },
- { TIFFTAG_IMAGEDESCRIPTION, 1, TIFF_ASCII },
- { TIFFTAG_MAKE, 1, TIFF_ASCII },
- { TIFFTAG_MODEL, 1, TIFF_ASCII },
- { TIFFTAG_MINSAMPLEVALUE, 1, TIFF_SHORT },
- { TIFFTAG_MAXSAMPLEVALUE, 1, TIFF_SHORT },
- { TIFFTAG_XRESOLUTION, 1, TIFF_RATIONAL },
- { TIFFTAG_YRESOLUTION, 1, TIFF_RATIONAL },
- { TIFFTAG_PAGENAME, 1, TIFF_ASCII },
- { TIFFTAG_XPOSITION, 1, TIFF_RATIONAL },
- { TIFFTAG_YPOSITION, 1, TIFF_RATIONAL },
- { TIFFTAG_RESOLUTIONUNIT, 1, TIFF_SHORT },
- { TIFFTAG_SOFTWARE, 1, TIFF_ASCII },
- { TIFFTAG_DATETIME, 1, TIFF_ASCII },
- { TIFFTAG_ARTIST, 1, TIFF_ASCII },
- { TIFFTAG_HOSTCOMPUTER, 1, TIFF_ASCII },
- { TIFFTAG_WHITEPOINT, (uint16) -1, TIFF_RATIONAL },
- { TIFFTAG_PRIMARYCHROMATICITIES,(uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_HALFTONEHINTS, 2, TIFF_SHORT },
- { TIFFTAG_INKSET, 1, TIFF_SHORT },
- { TIFFTAG_DOTRANGE, 2, TIFF_SHORT },
- { TIFFTAG_TARGETPRINTER, 1, TIFF_ASCII },
- { TIFFTAG_SAMPLEFORMAT, 1, TIFF_SHORT },
- { TIFFTAG_YCBCRCOEFFICIENTS, (uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_YCBCRSUBSAMPLING, 2, TIFF_SHORT },
- { TIFFTAG_YCBCRPOSITIONING, 1, TIFF_SHORT },
- { TIFFTAG_REFERENCEBLACKWHITE, (uint16) -1,TIFF_RATIONAL },
- { TIFFTAG_EXTRASAMPLES, (uint16) -1, TIFF_SHORT },
- { TIFFTAG_SMINSAMPLEVALUE, 1, TIFF_DOUBLE },
- { TIFFTAG_SMAXSAMPLEVALUE, 1, TIFF_DOUBLE },
- { TIFFTAG_STONITS, 1, TIFF_DOUBLE },
-};
-#define NTAGS (sizeof (tags) / sizeof (tags[0]))
-
-#define CopyTag(tag, count, type) cpTag(in, out, tag, count, type)
-
-/* Functions written by Richard Nolde, with exceptions noted. */
-void process_command_opts (int argc, char *argv[], char *mp, char *mode, uint32 *dirnum,
- uint16 *defconfig, uint16 *deffillorder, uint32 *deftilewidth,
- uint32 *deftilelength, uint32 *defrowsperstrip,
- struct crop_mask *crop_data, struct pagedef *page,
- struct dump_opts *dump,
- unsigned int *imagelist, unsigned int *image_count )
- {
- int c, good_args = 0;
- char *opt_offset = NULL; /* Position in string of value sought */
- char *opt_ptr = NULL; /* Pointer to next token in option set */
- char *sep = NULL; /* Pointer to a token separator */
- unsigned int i, j, start, end;
- extern int optind;
- extern char* optarg;
-
- *mp++ = 'w';
- *mp = '\0';
- while ((c = getopt(argc, argv,
- "ac:d:e:f:hil:m:p:r:stvw:z:BCD:E:F:H:I:J:K:LMN:O:P:R:S:U:V:X:Y:Z:")) != -1)
- {
- good_args++;
- switch (c) {
- case 'a': mode[0] = 'a'; /* append to output */
- break;
- case 'c': if (!processCompressOptions(optarg)) /* compression scheme */
- {
- TIFFError ("Unknown compression option", "%s", optarg);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
- break;
- case 'd': start = strtoul(optarg, NULL, 0); /* initial IFD offset */
- if (start == 0)
- {
- TIFFError ("","Directory offset must be greater than zero");
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
- *dirnum = start - 1;
- break;
- case 'e': switch (tolower(optarg[0])) /* image export modes*/
- {
- case 'c': crop_data->exp_mode = ONE_FILE_COMPOSITE;
- crop_data->img_mode = COMPOSITE_IMAGES;
- break; /* Composite */
- case 'd': crop_data->exp_mode = ONE_FILE_SEPARATED;
- crop_data->img_mode = SEPARATED_IMAGES;
- break; /* Divided */
- case 'i': crop_data->exp_mode = FILE_PER_IMAGE_COMPOSITE;
- crop_data->img_mode = COMPOSITE_IMAGES;
- break; /* Image */
- case 'm': crop_data->exp_mode = FILE_PER_IMAGE_SEPARATED;
- crop_data->img_mode = SEPARATED_IMAGES;
- break; /* Multiple */
- case 's': crop_data->exp_mode = FILE_PER_SELECTION;
- crop_data->img_mode = SEPARATED_IMAGES;
- break; /* Sections */
- default: TIFFError ("Unknown export mode","%s", optarg);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
- break;
- case 'f': if (streq(optarg, "lsb2msb")) /* fill order */
- *deffillorder = FILLORDER_LSB2MSB;
- else if (streq(optarg, "msb2lsb"))
- *deffillorder = FILLORDER_MSB2LSB;
- else
- {
- TIFFError ("Unknown fill order", "%s", optarg);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
- break;
- case 'h': usage();
- break;
- case 'i': ignore = TRUE; /* ignore errors */
- break;
- case 'l': outtiled = TRUE; /* tile length */
- *deftilelength = atoi(optarg);
- break;
- case 'p': /* planar configuration */
- if (streq(optarg, "separate"))
- *defconfig = PLANARCONFIG_SEPARATE;
- else if (streq(optarg, "contig"))
- *defconfig = PLANARCONFIG_CONTIG;
- else
- {
- TIFFError ("Unkown planar configuration", "%s", optarg);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
- break;
- case 'r': /* rows/strip */
- *defrowsperstrip = atol(optarg);
- break;
- case 's': /* generate stripped output */
- outtiled = FALSE;
- break;
- case 't': /* generate tiled output */
- outtiled = TRUE;
- break;
- case 'v': TIFFError("Library Release", "%s", TIFFGetVersion());
- TIFFError ("Tiffcrop version", "%s, last updated: %s",
- tiffcrop_version_id, tiffcrop_rev_date);
- TIFFError ("Tiffcp code", "Copyright (c) 1988-1997 Sam Leffler");
- TIFFError (" ", "Copyright (c) 1991-1997 Silicon Graphics, Inc");
- TIFFError ("Tiffcrop additions", "Copyright (c) 2007-2010 Richard Nolde");
- exit (0);
- break;
- case 'w': /* tile width */
- outtiled = TRUE;
- *deftilewidth = atoi(optarg);
- break;
- case 'z': /* regions of an image specified as x1,y1,x2,y2:x3,y3,x4,y4 etc */
- crop_data->crop_mode |= CROP_REGIONS;
- for (i = 0, opt_ptr = strtok (optarg, ":");
- ((opt_ptr != NULL) && (i < MAX_REGIONS));
- (opt_ptr = strtok (NULL, ":")), i++)
- {
- crop_data->regions++;
- if (sscanf(opt_ptr, "%lf,%lf,%lf,%lf",
- &crop_data->corners[i].X1, &crop_data->corners[i].Y1,
- &crop_data->corners[i].X2, &crop_data->corners[i].Y2) != 4)
- {
- TIFFError ("Unable to parse coordinates for region", "%d %s", i, optarg);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
- }
- /* check for remaining elements over MAX_REGIONS */
- if ((opt_ptr != NULL) && (i >= MAX_REGIONS))
- {
- TIFFError ("Region list exceeds limit of", "%d regions %s", MAX_REGIONS, optarg);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);;
- }
- break;
- /* options for file open modes */
- case 'B': *mp++ = 'b'; *mp = '\0';
- break;
- case 'L': *mp++ = 'l'; *mp = '\0';
- break;
- case 'M': *mp++ = 'm'; *mp = '\0';
- break;
- case 'C': *mp++ = 'c'; *mp = '\0';
- break;
- /* options for Debugging / data dump */
- case 'D': for (i = 0, opt_ptr = strtok (optarg, ",");
- (opt_ptr != NULL);
- (opt_ptr = strtok (NULL, ",")), i++)
- {
- opt_offset = strpbrk(opt_ptr, ":=");
- if (opt_offset == NULL)
- {
- TIFFError("Invalid dump option", "%s", optarg);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
-
- *opt_offset = '\0';
- /* convert option to lowercase */
- end = strlen (opt_ptr);
- for (i = 0; i < end; i++)
- *(opt_ptr + i) = tolower(*(opt_ptr + i));
- /* Look for dump format specification */
- if (strncmp(opt_ptr, "for", 3) == 0)
- {
- /* convert value to lowercase */
- end = strlen (opt_offset + 1);
- for (i = 1; i <= end; i++)
- *(opt_offset + i) = tolower(*(opt_offset + i));
- /* check dump format value */
- if (strncmp (opt_offset + 1, "txt", 3) == 0)
- {
- dump->format = DUMP_TEXT;
- strcpy (dump->mode, "w");
- }
- else
- {
- if (strncmp(opt_offset + 1, "raw", 3) == 0)
- {
- dump->format = DUMP_RAW;
- strcpy (dump->mode, "wb");
- }
- else
- {
- TIFFError("parse_command_opts", "Unknown dump format %s", opt_offset + 1);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
- }
- }
- else
- { /* Look for dump level specification */
- if (strncmp (opt_ptr, "lev", 3) == 0)
- dump->level = atoi(opt_offset + 1);
- /* Look for input data dump file name */
- if (strncmp (opt_ptr, "in", 2) == 0)
- {
- strncpy (dump->infilename, opt_offset + 1, PATH_MAX - 20);
- dump->infilename[PATH_MAX - 20] = '\0';
- }
- /* Look for output data dump file name */
- if (strncmp (opt_ptr, "out", 3) == 0)
- {
- strncpy (dump->outfilename, opt_offset + 1, PATH_MAX - 20);
- dump->outfilename[PATH_MAX - 20] = '\0';
- }
- if (strncmp (opt_ptr, "deb", 3) == 0)
- dump->debug = atoi(opt_offset + 1);
- }
- }
- if ((strlen(dump->infilename)) || (strlen(dump->outfilename)))
- {
- if (dump->level == 1)
- TIFFError("","Defaulting to dump level 1, no data.");
- if (dump->format == DUMP_NONE)
- {
- TIFFError("", "You must specify a dump format for dump files");
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
- }
- break;
-
- /* image manipulation routine options */
- case 'm': /* margins to exclude from selection, uppercase M was already used */
- /* order of values must be TOP, LEFT, BOTTOM, RIGHT */
- crop_data->crop_mode |= CROP_MARGINS;
- for (i = 0, opt_ptr = strtok (optarg, ",:");
- ((opt_ptr != NULL) && (i < 4));
- (opt_ptr = strtok (NULL, ",:")), i++)
- {
- crop_data->margins[i] = atof(opt_ptr);
- }
- break;
- case 'E': /* edge reference */
- switch (tolower(optarg[0]))
- {
- case 't': crop_data->edge_ref = EDGE_TOP;
- break;
- case 'b': crop_data->edge_ref = EDGE_BOTTOM;
- break;
- case 'l': crop_data->edge_ref = EDGE_LEFT;
- break;
- case 'r': crop_data->edge_ref = EDGE_RIGHT;
- break;
- default: TIFFError ("Edge reference must be top, bottom, left, or right", "%s", optarg);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
- break;
- case 'F': /* flip eg mirror image or cropped segment, M was already used */
- crop_data->crop_mode |= CROP_MIRROR;
- switch (tolower(optarg[0]))
- {
- case 'h': crop_data->mirror = MIRROR_HORIZ;
- break;
- case 'v': crop_data->mirror = MIRROR_VERT;
- break;
- case 'b': crop_data->mirror = MIRROR_BOTH;
- break;
- default: TIFFError ("Flip mode must be horiz, vert, or both", "%s", optarg);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
- break;
- case 'H': /* set horizontal resolution to new value */
- page->hres = atof (optarg);
- page->mode |= PAGE_MODE_RESOLUTION;
- break;
- case 'I': /* invert the color space, eg black to white */
- crop_data->crop_mode |= CROP_INVERT;
- /* The PHOTOMETIC_INTERPRETATION tag may be updated */
- if (streq(optarg, "black"))
- {
- crop_data->photometric = PHOTOMETRIC_MINISBLACK;
- continue;
- }
- if (streq(optarg, "white"))
- {
- crop_data->photometric = PHOTOMETRIC_MINISWHITE;
- continue;
- }
- if (streq(optarg, "data"))
- {
- crop_data->photometric = INVERT_DATA_ONLY;
- continue;
- }
- if (streq(optarg, "both"))
- {
- crop_data->photometric = INVERT_DATA_AND_TAG;
- continue;
- }
-
- TIFFError("Missing or unknown option for inverting PHOTOMETRIC_INTERPRETATION", "%s", optarg);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- break;
- case 'J': /* horizontal margin for sectioned ouput pages */
- page->hmargin = atof(optarg);
- page->mode |= PAGE_MODE_MARGINS;
- break;
- case 'K': /* vertical margin for sectioned ouput pages*/
- page->vmargin = atof(optarg);
- page->mode |= PAGE_MODE_MARGINS;
- break;
- case 'N': /* list of images to process */
- for (i = 0, opt_ptr = strtok (optarg, ",");
- ((opt_ptr != NULL) && (i < MAX_IMAGES));
- (opt_ptr = strtok (NULL, ",")))
- { /* We do not know how many images are in file yet
- * so we build a list to include the maximum allowed
- * and follow it until we hit the end of the file.
- * Image count is not accurate for odd, even, last
- * so page numbers won't be valid either.
- */
- if (streq(opt_ptr, "odd"))
- {
- for (j = 1; j <= MAX_IMAGES; j += 2)
- imagelist[i++] = j;
- *image_count = (MAX_IMAGES - 1) / 2;
- break;
- }
- else
- {
- if (streq(opt_ptr, "even"))
- {
- for (j = 2; j <= MAX_IMAGES; j += 2)
- imagelist[i++] = j;
- *image_count = MAX_IMAGES / 2;
- break;
- }
- else
- {
- if (streq(opt_ptr, "last"))
- imagelist[i++] = MAX_IMAGES;
- else /* single value between commas */
- {
- sep = strpbrk(opt_ptr, ":-");
- if (!sep)
- imagelist[i++] = atoi(opt_ptr);
- else
- {
- *sep = '\0';
- start = atoi (opt_ptr);
- if (!strcmp((sep + 1), "last"))
- end = MAX_IMAGES;
- else
- end = atoi (sep + 1);
- for (j = start; j <= end && j - start + i < MAX_IMAGES; j++)
- imagelist[i++] = j;
- }
- }
- }
- }
- }
- *image_count = i;
- break;
- case 'O': /* page orientation */
- switch (tolower(optarg[0]))
- {
- case 'a': page->orient = ORIENTATION_AUTO;
- break;
- case 'p': page->orient = ORIENTATION_PORTRAIT;
- break;
- case 'l': page->orient = ORIENTATION_LANDSCAPE;
- break;
- default: TIFFError ("Orientation must be portrait, landscape, or auto.", "%s", optarg);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
- break;
- case 'P': /* page size selection */
- if (sscanf(optarg, "%lfx%lf", &page->width, &page->length) == 2)
- {
- strcpy (page->name, "Custom");
- page->mode |= PAGE_MODE_PAPERSIZE;
- break;
- }
- if (get_page_geometry (optarg, page))
- {
- if (!strcmp(optarg, "list"))
- {
- TIFFError("", "Name Width Length (in inches)");
- for (i = 0; i < MAX_PAPERNAMES - 1; i++)
- TIFFError ("", "%-15.15s %5.2f %5.2f",
- PaperTable[i].name, PaperTable[i].width,
- PaperTable[i].length);
- exit (-1);
- }
-
- TIFFError ("Invalid paper size", "%s", optarg);
- TIFFError ("", "Select one of:");
- TIFFError("", "Name Width Length (in inches)");
- for (i = 0; i < MAX_PAPERNAMES - 1; i++)
- TIFFError ("", "%-15.15s %5.2f %5.2f",
- PaperTable[i].name, PaperTable[i].width,
- PaperTable[i].length);
- exit (-1);
- }
- else
- {
- page->mode |= PAGE_MODE_PAPERSIZE;
- }
- break;
- case 'R': /* rotate image or cropped segment */
- crop_data->crop_mode |= CROP_ROTATE;
- switch (strtoul(optarg, NULL, 0))
- {
- case 90: crop_data->rotation = (uint16)90;
- break;
- case 180: crop_data->rotation = (uint16)180;
- break;
- case 270: crop_data->rotation = (uint16)270;
- break;
- default: TIFFError ("Rotation must be 90, 180, or 270 degrees clockwise", "%s", optarg);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
- break;
- case 'S': /* subdivide into Cols:Rows sections, eg 3:2 would be 3 across and 2 down */
- sep = strpbrk(optarg, ",:");
- if (sep)
- {
- *sep = '\0';
- page->cols = atoi(optarg);
- page->rows = atoi(sep +1);
- }
- else
- {
- page->cols = atoi(optarg);
- page->rows = atoi(optarg);
- }
- if ((page->cols * page->rows) > MAX_SECTIONS)
- {
- TIFFError ("Limit for subdivisions, ie rows x columns, exceeded", "%d", MAX_SECTIONS);
- exit (-1);
- }
- page->mode |= PAGE_MODE_ROWSCOLS;
- break;
- case 'U': /* units for measurements and offsets */
- if (streq(optarg, "in"))
- {
- crop_data->res_unit = RESUNIT_INCH;
- page->res_unit = RESUNIT_INCH;
- }
- else if (streq(optarg, "cm"))
- {
- crop_data->res_unit = RESUNIT_CENTIMETER;
- page->res_unit = RESUNIT_CENTIMETER;
- }
- else if (streq(optarg, "px"))
- {
- crop_data->res_unit = RESUNIT_NONE;
- page->res_unit = RESUNIT_NONE;
- }
- else
- {
- TIFFError ("Illegal unit of measure","%s", optarg);
- TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- }
- break;
- case 'V': /* set vertical resolution to new value */
- page->vres = atof (optarg);
- page->mode |= PAGE_MODE_RESOLUTION;
- break;
- case 'X': /* selection width */
- crop_data->crop_mode |= CROP_WIDTH;
- crop_data->width = atof(optarg);
- break;
- case 'Y': /* selection length */
- crop_data->crop_mode |= CROP_LENGTH;
- crop_data->length = atof(optarg);
- break;
- case 'Z': /* zones of an image X:Y read as zone X of Y */
- crop_data->crop_mode |= CROP_ZONES;
- for (i = 0, opt_ptr = strtok (optarg, ",");
- ((opt_ptr != NULL) && (i < MAX_REGIONS));
- (opt_ptr = strtok (NULL, ",")), i++)
- {
- crop_data->zones++;
- opt_offset = strchr(opt_ptr, ':');
- if (!opt_offset) {
- TIFFError("Wrong parameter syntax for -Z", "tiffcrop -h");
- exit(-1);
- }
- *opt_offset = '\0';
- crop_data->zonelist[i].position = atoi(opt_ptr);
- crop_data->zonelist[i].total = atoi(opt_offset + 1);
- }
- /* check for remaining elements over MAX_REGIONS */
- if ((opt_ptr != NULL) && (i >= MAX_REGIONS))
- {
- TIFFError("Zone list exceeds region limit", "%d", MAX_REGIONS);
- exit (-1);
- }
- break;
- case '?': TIFFError ("For valid options type", "tiffcrop -h");
- exit (-1);
- /*NOTREACHED*/
- }
- }
- } /* end process_command_opts */
-
-/* Start a new output file if one has not been previously opened or
- * autoindex is set to non-zero. Update page and file counters
- * so TIFFTAG PAGENUM will be correct in image.
- */
-static int
-update_output_file (TIFF **tiffout, char *mode, int autoindex,
- char *outname, unsigned int *page)
- {
- static int findex = 0; /* file sequence indicator */
- char *sep;
- char filenum[16];
- char export_ext[16];
- char exportname[PATH_MAX];
-
- if (autoindex && (*tiffout != NULL))
- {
- /* Close any export file that was previously opened */
- TIFFClose (*tiffout);
- *tiffout = NULL;
- }
-
- strcpy (export_ext, ".tiff");
- memset (exportname, '\0', PATH_MAX);
-
- /* Leave room for page number portion of the new filename */
- strncpy (exportname, outname, PATH_MAX - 16);
- if (*tiffout == NULL) /* This is a new export file */
- {
- if (autoindex)
- { /* create a new filename for each export */
- findex++;
- if ((sep = strstr(exportname, ".tif")) || (sep = strstr(exportname, ".TIF")))
- {
- strncpy (export_ext, sep, 5);
- *sep = '\0';
- }
- else
- strncpy (export_ext, ".tiff", 5);
- export_ext[5] = '\0';
-
- /* MAX_EXPORT_PAGES limited to 6 digits to prevent string overflow of pathname */
- if (findex > MAX_EXPORT_PAGES)
- {
- TIFFError("update_output_file", "Maximum of %d pages per file exceeded", MAX_EXPORT_PAGES);
- return 1;
- }
-
- snprintf(filenum, sizeof(filenum), "-%03d%s", findex, export_ext);
- filenum[14] = '\0';
- strncat (exportname, filenum, 15);
- }
- exportname[PATH_MAX - 1] = '\0';
-
- *tiffout = TIFFOpen(exportname, mode);
- if (*tiffout == NULL)
- {
- TIFFError("update_output_file", "Unable to open output file %s", exportname);
- return 1;
- }
- *page = 0;
-
- return 0;
- }
- else
- (*page)++;
-
- return 0;
- } /* end update_output_file */
-
-
-int
-main(int argc, char* argv[])
- {
- extern int optind;
- uint16 defconfig = (uint16) -1;
- uint16 deffillorder = 0;
- uint32 deftilewidth = (uint32) 0;
- uint32 deftilelength = (uint32) 0;
- uint32 defrowsperstrip = (uint32) 0;
- uint32 dirnum = 0;
-
- TIFF *in = NULL;
- TIFF *out = NULL;
- char mode[10];
- char *mp = mode;
-
- /** RJN additions **/
- struct image_data image; /* Image parameters for one image */
- struct crop_mask crop; /* Cropping parameters for all images */
- struct pagedef page; /* Page definition for output pages */
- struct pageseg sections[MAX_SECTIONS]; /* Sections of one output page */
- struct buffinfo seg_buffs[MAX_SECTIONS]; /* Segment buffer sizes and pointers */
- struct dump_opts dump; /* Data dump options */
- unsigned char *read_buff = NULL; /* Input image data buffer */
- unsigned char *crop_buff = NULL; /* Crop area buffer */
- unsigned char *sect_buff = NULL; /* Image section buffer */
- unsigned char *sect_src = NULL; /* Image section buffer pointer */
- unsigned int imagelist[MAX_IMAGES + 1]; /* individually specified images */
- unsigned int image_count = 0;
- unsigned int dump_images = 0;
- unsigned int next_image = 0;
- unsigned int next_page = 0;
- unsigned int total_pages = 0;
- unsigned int total_images = 0;
- unsigned int end_of_input = FALSE;
- int seg, length;
- char temp_filename[PATH_MAX + 1];
-
- little_endian = *((unsigned char *)&little_endian) & '1';
-
- initImageData(&image);
- initCropMasks(&crop);
- initPageSetup(&page, sections, seg_buffs);
- initDumpOptions(&dump);
-
- process_command_opts (argc, argv, mp, mode, &dirnum, &defconfig,
- &deffillorder, &deftilewidth, &deftilelength, &defrowsperstrip,
- &crop, &page, &dump, imagelist, &image_count);
-
- if (argc - optind < 2)
- usage();
-
- if ((argc - optind) == 2)
- pageNum = -1;
- else
- total_images = 0;
- /* read multiple input files and write to output file(s) */
- while (optind < argc - 1)
- {
- in = TIFFOpen (argv[optind], "r");
- if (in == NULL)
- return (-3);
-
- /* If only one input file is specified, we can use directory count */
- total_images = TIFFNumberOfDirectories(in);
- if (image_count == 0)
- {
- dirnum = 0;
- total_pages = total_images; /* Only valid with single input file */
- }
- else
- {
- dirnum = (tdir_t)(imagelist[next_image] - 1);
- next_image++;
-
- /* Total pages only valid for enumerated list of pages not derived
- * using odd, even, or last keywords.
- */
- if (image_count > total_images)
- image_count = total_images;
-
- total_pages = image_count;
- }
-
- /* MAX_IMAGES is used for special case "last" in selection list */
- if (dirnum == (MAX_IMAGES - 1))
- dirnum = total_images - 1;
-
- if (dirnum > (total_images))
- {
- TIFFError (TIFFFileName(in),
- "Invalid image number %d, File contains only %d images",
- (int)dirnum + 1, total_images);
- if (out != NULL)
- (void) TIFFClose(out);
- return (1);
- }
-
- if (dirnum != 0 && !TIFFSetDirectory(in, (tdir_t)dirnum))
- {
- TIFFError(TIFFFileName(in),"Error, setting subdirectory at %d", dirnum);
- if (out != NULL)
- (void) TIFFClose(out);
- return (1);
- }
-
- end_of_input = FALSE;
- while (end_of_input == FALSE)
- {
- config = defconfig;
- compression = defcompression;
- predictor = defpredictor;
- fillorder = deffillorder;
- rowsperstrip = defrowsperstrip;
- tilewidth = deftilewidth;
- tilelength = deftilelength;
- g3opts = defg3opts;
-
- if (dump.format != DUMP_NONE)
- {
- /* manage input and/or output dump files here */
- dump_images++;
- length = strlen(dump.infilename);
- if (length > 0)
- {
- if (dump.infile != NULL)
- fclose (dump.infile);
-
- /* dump.infilename is guaranteed to be NUL termimated and have 20 bytes
- fewer than PATH_MAX */
- snprintf(temp_filename, sizeof(temp_filename), "%s-read-%03d.%s",
- dump.infilename, dump_images,
- (dump.format == DUMP_TEXT) ? "txt" : "raw");
- if ((dump.infile = fopen(temp_filename, dump.mode)) == NULL)
- {
- TIFFError ("Unable to open dump file for writing", "%s", temp_filename);
- exit (-1);
- }
- dump_info(dump.infile, dump.format, "Reading image","%d from %s",
- dump_images, TIFFFileName(in));
- }
- length = strlen(dump.outfilename);
- if (length > 0)
- {
- if (dump.outfile != NULL)
- fclose (dump.outfile);
-
- /* dump.outfilename is guaranteed to be NUL termimated and have 20 bytes
- fewer than PATH_MAX */
- snprintf(temp_filename, sizeof(temp_filename), "%s-write-%03d.%s",
- dump.outfilename, dump_images,
- (dump.format == DUMP_TEXT) ? "txt" : "raw");
- if ((dump.outfile = fopen(temp_filename, dump.mode)) == NULL)
- {
- TIFFError ("Unable to open dump file for writing", "%s", temp_filename);
- exit (-1);
- }
- dump_info(dump.outfile, dump.format, "Writing image","%d from %s",
- dump_images, TIFFFileName(in));
- }
- }
-
- if (dump.debug)
- TIFFError("main", "Reading image %4d of %4d total pages.", dirnum + 1, total_pages);
-
- if (loadImage(in, &image, &dump, &read_buff))
- {
- TIFFError("main", "Unable to load source image");
- exit (-1);
- }
-
- /* Correct the image orientation if it was not ORIENTATION_TOPLEFT.
- */
- if (image.adjustments != 0)
- {
- if (correct_orientation(&image, &read_buff))
- TIFFError("main", "Unable to correct image orientation");
- }
-
- if (getCropOffsets(&image, &crop, &dump))
- {
- TIFFError("main", "Unable to define crop regions");
- exit (-1);
- }
-
- if (crop.selections > 0)
- {
- if (processCropSelections(&image, &crop, &read_buff, seg_buffs))
- {
- TIFFError("main", "Unable to process image selections");
- exit (-1);
- }
- }
- else /* Single image segment without zones or regions */
- {
- if (createCroppedImage(&image, &crop, &read_buff, &crop_buff))
- {
- TIFFError("main", "Unable to create output image");
- exit (-1);
- }
- }
- if (page.mode == PAGE_MODE_NONE)
- { /* Whole image or sections not based on output page size */
- if (crop.selections > 0)
- {
- writeSelections(in, &out, &crop, &image, &dump, seg_buffs,
- mp, argv[argc - 1], &next_page, total_pages);
- }
- else /* One file all images and sections */
- {
- if (update_output_file (&out, mp, crop.exp_mode, argv[argc - 1],
- &next_page))
- exit (1);
- if (writeCroppedImage(in, out, &image, &dump,crop.combined_width,
- crop.combined_length, crop_buff, next_page, total_pages))
- {
- TIFFError("main", "Unable to write new image");
- exit (-1);
- }
- }
- }
- else
- {
- /* If we used a crop buffer, our data is there, otherwise it is
- * in the read_buffer
- */
- if (crop_buff != NULL)
- sect_src = crop_buff;
- else
- sect_src = read_buff;
- /* Break input image into pages or rows and columns */
- if (computeOutputPixelOffsets(&crop, &image, &page, sections, &dump))
- {
- TIFFError("main", "Unable to compute output section data");
- exit (-1);
- }
- /* If there are multiple files on the command line, the final one is assumed
- * to be the output filename into which the images are written.
- */
- if (update_output_file (&out, mp, crop.exp_mode, argv[argc - 1], &next_page))
- exit (1);
-
- if (writeImageSections(in, out, &image, &page, sections, &dump, sect_src, &sect_buff))
- {
- TIFFError("main", "Unable to write image sections");
- exit (-1);
- }
- }
-
- /* No image list specified, just read the next image */
- if (image_count == 0)
- dirnum++;
- else
- {
- dirnum = (tdir_t)(imagelist[next_image] - 1);
- next_image++;
- }
-
- if (dirnum == MAX_IMAGES - 1)
- dirnum = TIFFNumberOfDirectories(in) - 1;
-
- if (!TIFFSetDirectory(in, (tdir_t)dirnum))
- end_of_input = TRUE;
- }
- TIFFClose(in);
- optind++;
- }
-
- /* If we did not use the read buffer as the crop buffer */
- if (read_buff)
- _TIFFfree(read_buff);
-
- if (crop_buff)
- _TIFFfree(crop_buff);
-
- if (sect_buff)
- _TIFFfree(sect_buff);
-
- /* Clean up any segment buffers used for zones or regions */
- for (seg = 0; seg < crop.selections; seg++)
- _TIFFfree (seg_buffs[seg].buffer);
-
- if (dump.format != DUMP_NONE)
- {
- if (dump.infile != NULL)
- fclose (dump.infile);
-
- if (dump.outfile != NULL)
- {
- dump_info (dump.outfile, dump.format, "", "Completed run for %s", TIFFFileName(out));
- fclose (dump.outfile);
- }
- }
-
- TIFFClose(out);
-
- return (0);
- } /* end main */
-
-
-/* Debugging functions */
-static int dump_data (FILE *dumpfile, int format, char *dump_tag, unsigned char *data, uint32 count)
- {
- int j, k;
- uint32 i;
- char dump_array[10];
- unsigned char bitset;
-
- if (dumpfile == NULL)
- {
- TIFFError ("", "Invalid FILE pointer for dump file");
- return (1);
- }
-
- if (format == DUMP_TEXT)
- {
- fprintf (dumpfile," %s ", dump_tag);
- for (i = 0; i < count; i++)
- {
- for (j = 0, k = 7; j < 8; j++, k--)
- {
- bitset = (*(data + i)) & (((unsigned char)1 << k)) ? 1 : 0;
- sprintf(&dump_array[j], (bitset) ? "1" : "0");
- }
- dump_array[8] = '\0';
- fprintf (dumpfile," %s", dump_array);
- }
- fprintf (dumpfile,"\n");
- }
- else
- {
- if ((fwrite (data, 1, count, dumpfile)) != count)
- {
- TIFFError ("", "Unable to write binary data to dump file");
- return (1);
- }
- }
-
- return (0);
- }
-
-static int dump_byte (FILE *dumpfile, int format, char *dump_tag, unsigned char data)
- {
- int j, k;
- char dump_array[10];
- unsigned char bitset;
-
- if (dumpfile == NULL)
- {
- TIFFError ("", "Invalid FILE pointer for dump file");
- return (1);
- }
-
- if (format == DUMP_TEXT)
- {
- fprintf (dumpfile," %s ", dump_tag);
- for (j = 0, k = 7; j < 8; j++, k--)
- {
- bitset = data & (((unsigned char)1 << k)) ? 1 : 0;
- sprintf(&dump_array[j], (bitset) ? "1" : "0");
- }
- dump_array[8] = '\0';
- fprintf (dumpfile," %s\n", dump_array);
- }
- else
- {
- if ((fwrite (&data, 1, 1, dumpfile)) != 1)
- {
- TIFFError ("", "Unable to write binary data to dump file");
- return (1);
- }
- }
-
- return (0);
- }
-
-static int dump_short (FILE *dumpfile, int format, char *dump_tag, uint16 data)
- {
- int j, k;
- char dump_array[20];
- unsigned char bitset;
-
- if (dumpfile == NULL)
- {
- TIFFError ("", "Invalid FILE pointer for dump file");
- return (1);
- }
-
- if (format == DUMP_TEXT)
- {
- fprintf (dumpfile," %s ", dump_tag);
- for (j = 0, k = 15; k >= 0; j++, k--)
- {
- bitset = data & (((unsigned char)1 << k)) ? 1 : 0;
- sprintf(&dump_array[j], (bitset) ? "1" : "0");
- if ((k % 8) == 0)
- sprintf(&dump_array[++j], " ");
- }
- dump_array[17] = '\0';
- fprintf (dumpfile," %s\n", dump_array);
- }
- else
- {
- if ((fwrite (&data, 2, 1, dumpfile)) != 2)
- {
- TIFFError ("", "Unable to write binary data to dump file");
- return (1);
- }
- }
-
- return (0);
- }
-
-static int dump_long (FILE *dumpfile, int format, char *dump_tag, uint32 data)
- {
- int j, k;
- char dump_array[40];
- unsigned char bitset;
-
- if (dumpfile == NULL)
- {
- TIFFError ("", "Invalid FILE pointer for dump file");
- return (1);
- }
-
- if (format == DUMP_TEXT)
- {
- fprintf (dumpfile," %s ", dump_tag);
- for (j = 0, k = 31; k >= 0; j++, k--)
- {
- bitset = data & (((uint32)1 << k)) ? 1 : 0;
- sprintf(&dump_array[j], (bitset) ? "1" : "0");
- if ((k % 8) == 0)
- sprintf(&dump_array[++j], " ");
- }
- dump_array[35] = '\0';
- fprintf (dumpfile," %s\n", dump_array);
- }
- else
- {
- if ((fwrite (&data, 4, 1, dumpfile)) != 4)
- {
- TIFFError ("", "Unable to write binary data to dump file");
- return (1);
- }
- }
- return (0);
- }
-
-static int dump_wide (FILE *dumpfile, int format, char *dump_tag, uint64 data)
- {
- int j, k;
- char dump_array[80];
- unsigned char bitset;
-
- if (dumpfile == NULL)
- {
- TIFFError ("", "Invalid FILE pointer for dump file");
- return (1);
- }
-
- if (format == DUMP_TEXT)
- {
- fprintf (dumpfile," %s ", dump_tag);
- for (j = 0, k = 63; k >= 0; j++, k--)
- {
- bitset = data & (((uint64)1 << k)) ? 1 : 0;
- sprintf(&dump_array[j], (bitset) ? "1" : "0");
- if ((k % 8) == 0)
- sprintf(&dump_array[++j], " ");
- }
- dump_array[71] = '\0';
- fprintf (dumpfile," %s\n", dump_array);
- }
- else
- {
- if ((fwrite (&data, 8, 1, dumpfile)) != 8)
- {
- TIFFError ("", "Unable to write binary data to dump file");
- return (1);
- }
- }
-
- return (0);
- }
-
-static void dump_info(FILE *dumpfile, int format, char *prefix, char *msg, ...)
- {
- if (format == DUMP_TEXT)
- {
- va_list ap;
- va_start(ap, msg);
- fprintf(dumpfile, "%s ", prefix);
- vfprintf(dumpfile, msg, ap);
- fprintf(dumpfile, "\n");
- va_end(ap);
- }
- }
-
-static int dump_buffer (FILE* dumpfile, int format, uint32 rows, uint32 width,
- uint32 row, unsigned char *buff)
- {
- int j, k;
- uint32 i;
- unsigned char * dump_ptr;
-
- if (dumpfile == NULL)
- {
- TIFFError ("", "Invalid FILE pointer for dump file");
- return (1);
- }
-
- for (i = 0; i < rows; i++)
- {
- dump_ptr = buff + (i * width);
- if (format == DUMP_TEXT)
- dump_info (dumpfile, format, "",
- "Row %4d, %d bytes at offset %d",
- row + i + 1, width, row * width);
-
- for (j = 0, k = width; k >= 10; j += 10, k -= 10, dump_ptr += 10)
- dump_data (dumpfile, format, "", dump_ptr, 10);
- if (k > 0)
- dump_data (dumpfile, format, "", dump_ptr, k);
- }
- return (0);
- }
-
-/* Extract one or more samples from an interleaved buffer. If count == 1,
- * only the sample plane indicated by sample will be extracted. If count > 1,
- * count samples beginning at sample will be extracted. Portions of a
- * scanline can be extracted by specifying a start and end value.
- */
-
-static int
-extractContigSamplesBytes (uint8 *in, uint8 *out, uint32 cols,
- tsample_t sample, uint16 spp, uint16 bps,
- tsample_t count, uint32 start, uint32 end)
- {
- int i, bytes_per_sample, sindex;
- uint32 col, dst_rowsize, bit_offset;
- uint32 src_byte /*, src_bit */;
- uint8 *src = in;
- uint8 *dst = out;
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("extractContigSamplesBytes","Invalid input or output buffer");
- return (1);
- }
-
- if ((start > end) || (start > cols))
- {
- TIFFError ("extractContigSamplesBytes",
- "Invalid start column value %d ignored", start);
- start = 0;
- }
- if ((end == 0) || (end > cols))
- {
- TIFFError ("extractContigSamplesBytes",
- "Invalid end column value %d ignored", end);
- end = cols;
- }
-
- dst_rowsize = (bps * (end - start) * count) / 8;
-
- bytes_per_sample = (bps + 7) / 8;
- /* Optimize case for copying all samples */
- if (count == spp)
- {
- src = in + (start * spp * bytes_per_sample);
- _TIFFmemcpy (dst, src, dst_rowsize);
- }
- else
- {
- for (col = start; col < end; col++)
- {
- for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++)
- {
- bit_offset = col * bps * spp;
- if (sindex == 0)
- {
- src_byte = bit_offset / 8;
- /* src_bit = bit_offset % 8; */
- }
- else
- {
- src_byte = (bit_offset + (sindex * bps)) / 8;
- /* src_bit = (bit_offset + (sindex * bps)) % 8; */
- }
- src = in + src_byte;
- for (i = 0; i < bytes_per_sample; i++)
- *dst++ = *src++;
- }
- }
- }
-
- return (0);
- } /* end extractContigSamplesBytes */
-
-static int
-extractContigSamples8bits (uint8 *in, uint8 *out, uint32 cols,
- tsample_t sample, uint16 spp, uint16 bps,
- tsample_t count, uint32 start, uint32 end)
- {
- int ready_bits = 0, sindex = 0;
- uint32 col, src_byte, src_bit, bit_offset;
- uint8 maskbits = 0, matchbits = 0;
- uint8 buff1 = 0, buff2 = 0;
- uint8 *src = in;
- uint8 *dst = out;
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("extractContigSamples8bits","Invalid input or output buffer");
- return (1);
- }
-
- if ((start > end) || (start > cols))
- {
- TIFFError ("extractContigSamples8bits",
- "Invalid start column value %d ignored", start);
- start = 0;
- }
- if ((end == 0) || (end > cols))
- {
- TIFFError ("extractContigSamples8bits",
- "Invalid end column value %d ignored", end);
- end = cols;
- }
-
- ready_bits = 0;
- maskbits = (uint8)-1 >> ( 8 - bps);
- buff1 = buff2 = 0;
- for (col = start; col < end; col++)
- { /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps * spp;
- for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++)
- {
- if (sindex == 0)
- {
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sindex * bps)) / 8;
- src_bit = (bit_offset + (sindex * bps)) % 8;
- }
-
- src = in + src_byte;
- matchbits = maskbits << (8 - src_bit - bps);
- buff1 = ((*src) & matchbits) << (src_bit);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 8)
- {
- *dst++ = buff2;
- buff2 = buff1;
- ready_bits -= 8;
- }
- else
- buff2 = (buff2 | (buff1 >> ready_bits));
- ready_bits += bps;
- }
- }
-
- while (ready_bits > 0)
- {
- buff1 = (buff2 & ((unsigned int)255 << (8 - ready_bits)));
- *dst++ = buff1;
- ready_bits -= 8;
- }
-
- return (0);
- } /* end extractContigSamples8bits */
-
-static int
-extractContigSamples16bits (uint8 *in, uint8 *out, uint32 cols,
- tsample_t sample, uint16 spp, uint16 bps,
- tsample_t count, uint32 start, uint32 end)
- {
- int ready_bits = 0, sindex = 0;
- uint32 col, src_byte, src_bit, bit_offset;
- uint16 maskbits = 0, matchbits = 0;
- uint16 buff1 = 0, buff2 = 0;
- uint8 bytebuff = 0;
- uint8 *src = in;
- uint8 *dst = out;
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("extractContigSamples16bits","Invalid input or output buffer");
- return (1);
- }
-
- if ((start > end) || (start > cols))
- {
- TIFFError ("extractContigSamples16bits",
- "Invalid start column value %d ignored", start);
- start = 0;
- }
- if ((end == 0) || (end > cols))
- {
- TIFFError ("extractContigSamples16bits",
- "Invalid end column value %d ignored", end);
- end = cols;
- }
-
- ready_bits = 0;
- maskbits = (uint16)-1 >> (16 - bps);
-
- for (col = start; col < end; col++)
- { /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps * spp;
- for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++)
- {
- if (sindex == 0)
- {
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sindex * bps)) / 8;
- src_bit = (bit_offset + (sindex * bps)) % 8;
- }
-
- src = in + src_byte;
- matchbits = maskbits << (16 - src_bit - bps);
-
- if (little_endian)
- buff1 = (src[0] << 8) | src[1];
- else
- buff1 = (src[1] << 8) | src[0];
-
- buff1 = (buff1 & matchbits) << (src_bit);
- if (ready_bits < 8) /* add another bps bits to the buffer */
- {
- bytebuff = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- }
- else /* If we have a full buffer's worth, write it out */
- {
- bytebuff = (buff2 >> 8);
- *dst++ = bytebuff;
- ready_bits -= 8;
- /* shift in new bits */
- buff2 = ((buff2 << 8) | (buff1 >> ready_bits));
- }
- ready_bits += bps;
- }
- }
-
- /* catch any trailing bits at the end of the line */
- while (ready_bits > 0)
- {
- bytebuff = (buff2 >> 8);
- *dst++ = bytebuff;
- ready_bits -= 8;
- }
-
- return (0);
- } /* end extractContigSamples16bits */
-
-
-static int
-extractContigSamples24bits (uint8 *in, uint8 *out, uint32 cols,
- tsample_t sample, uint16 spp, uint16 bps,
- tsample_t count, uint32 start, uint32 end)
- {
- int ready_bits = 0, sindex = 0;
- uint32 col, src_byte, src_bit, bit_offset;
- uint32 maskbits = 0, matchbits = 0;
- uint32 buff1 = 0, buff2 = 0;
- uint8 bytebuff1 = 0, bytebuff2 = 0;
- uint8 *src = in;
- uint8 *dst = out;
-
- if ((in == NULL) || (out == NULL))
- {
- TIFFError("extractContigSamples24bits","Invalid input or output buffer");
- return (1);
- }
-
- if ((start > end) || (start > cols))
- {
- TIFFError ("extractContigSamples24bits",
- "Invalid start column value %d ignored", start);
- start = 0;
- }
- if ((end == 0) || (end > cols))
- {
- TIFFError ("extractContigSamples24bits",
- "Invalid end column value %d ignored", end);
- end = cols;
- }
-
- ready_bits = 0;
- maskbits = (uint32)-1 >> ( 32 - bps);
- for (col = start; col < end; col++)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps * spp;
- for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++)
- {
- if (sindex == 0)
- {
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sindex * bps)) / 8;
- src_bit = (bit_offset + (sindex * bps)) % 8;
- }
-
- src = in + src_byte;
- matchbits = maskbits << (32 - src_bit - bps);
- if (little_endian)
- buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
- else
- buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0];
- buff1 = (buff1 & matchbits) << (src_bit);
-
- if (ready_bits < 16) /* add another bps bits to the buffer */
- {
- bytebuff1 = bytebuff2 = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- }
- else /* If we have a full buffer's worth, write it out */
- {
- bytebuff1 = (buff2 >> 24);
- *dst++ = bytebuff1;
- bytebuff2 = (buff2 >> 16);
- *dst++ = bytebuff2;
- ready_bits -= 16;
-
- /* shift in new bits */
- buff2 = ((buff2 << 16) | (buff1 >> ready_bits));
- }
- ready_bits += bps;
- }
- }
-
- /* catch any trailing bits at the end of the line */
- while (ready_bits > 0)
- {
- bytebuff1 = (buff2 >> 24);
- *dst++ = bytebuff1;
-
- buff2 = (buff2 << 8);
- bytebuff2 = bytebuff1;
- ready_bits -= 8;
- }
-
- return (0);
- } /* end extractContigSamples24bits */
-
-static int
-extractContigSamples32bits (uint8 *in, uint8 *out, uint32 cols,
- tsample_t sample, uint16 spp, uint16 bps,
- tsample_t count, uint32 start, uint32 end)
- {
- int ready_bits = 0, sindex = 0 /*, shift_width = 0 */;
- uint32 col, src_byte, src_bit, bit_offset;
- uint32 longbuff1 = 0, longbuff2 = 0;
- uint64 maskbits = 0, matchbits = 0;
- uint64 buff1 = 0, buff2 = 0, buff3 = 0;
- uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0;
- uint8 *src = in;
- uint8 *dst = out;
-
- if ((in == NULL) || (out == NULL))
- {
- TIFFError("extractContigSamples32bits","Invalid input or output buffer");
- return (1);
- }
-
-
- if ((start > end) || (start > cols))
- {
- TIFFError ("extractContigSamples32bits",
- "Invalid start column value %d ignored", start);
- start = 0;
- }
- if ((end == 0) || (end > cols))
- {
- TIFFError ("extractContigSamples32bits",
- "Invalid end column value %d ignored", end);
- end = cols;
- }
-
- /* shift_width = ((bps + 7) / 8) + 1; */
- ready_bits = 0;
- maskbits = (uint64)-1 >> ( 64 - bps);
- for (col = start; col < end; col++)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps * spp;
- for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++)
- {
- if (sindex == 0)
- {
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sindex * bps)) / 8;
- src_bit = (bit_offset + (sindex * bps)) % 8;
- }
-
- src = in + src_byte;
- matchbits = maskbits << (64 - src_bit - bps);
- if (little_endian)
- {
- longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
- longbuff2 = longbuff1;
- }
- else
- {
- longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0];
- longbuff2 = longbuff1;
- }
-
- buff3 = ((uint64)longbuff1 << 32) | longbuff2;
- buff1 = (buff3 & matchbits) << (src_bit);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 32)
- {
- bytebuff1 = (buff2 >> 56);
- *dst++ = bytebuff1;
- bytebuff2 = (buff2 >> 48);
- *dst++ = bytebuff2;
- bytebuff3 = (buff2 >> 40);
- *dst++ = bytebuff3;
- bytebuff4 = (buff2 >> 32);
- *dst++ = bytebuff4;
- ready_bits -= 32;
-
- /* shift in new bits */
- buff2 = ((buff2 << 32) | (buff1 >> ready_bits));
- }
- else
- { /* add another bps bits to the buffer */
- bytebuff1 = bytebuff2 = bytebuff3 = bytebuff4 = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- }
- ready_bits += bps;
- }
- }
- while (ready_bits > 0)
- {
- bytebuff1 = (buff2 >> 56);
- *dst++ = bytebuff1;
- buff2 = (buff2 << 8);
- ready_bits -= 8;
- }
-
- return (0);
- } /* end extractContigSamples32bits */
-
-static int
-extractContigSamplesShifted8bits (uint8 *in, uint8 *out, uint32 cols,
- tsample_t sample, uint16 spp, uint16 bps,
- tsample_t count, uint32 start, uint32 end,
- int shift)
- {
- int ready_bits = 0, sindex = 0;
- uint32 col, src_byte, src_bit, bit_offset;
- uint8 maskbits = 0, matchbits = 0;
- uint8 buff1 = 0, buff2 = 0;
- uint8 *src = in;
- uint8 *dst = out;
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("extractContigSamplesShifted8bits","Invalid input or output buffer");
- return (1);
- }
-
- if ((start > end) || (start > cols))
- {
- TIFFError ("extractContigSamplesShifted8bits",
- "Invalid start column value %d ignored", start);
- start = 0;
- }
- if ((end == 0) || (end > cols))
- {
- TIFFError ("extractContigSamplesShifted8bits",
- "Invalid end column value %d ignored", end);
- end = cols;
- }
-
- ready_bits = shift;
- maskbits = (uint8)-1 >> ( 8 - bps);
- buff1 = buff2 = 0;
- for (col = start; col < end; col++)
- { /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps * spp;
- for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++)
- {
- if (sindex == 0)
- {
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sindex * bps)) / 8;
- src_bit = (bit_offset + (sindex * bps)) % 8;
- }
-
- src = in + src_byte;
- matchbits = maskbits << (8 - src_bit - bps);
- buff1 = ((*src) & matchbits) << (src_bit);
- if ((col == start) && (sindex == sample))
- buff2 = *src & ((uint8)-1) << (shift);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 8)
- {
- *dst++ |= buff2;
- buff2 = buff1;
- ready_bits -= 8;
- }
- else
- buff2 = buff2 | (buff1 >> ready_bits);
- ready_bits += bps;
- }
- }
-
- while (ready_bits > 0)
- {
- buff1 = (buff2 & ((unsigned int)255 << (8 - ready_bits)));
- *dst++ = buff1;
- ready_bits -= 8;
- }
-
- return (0);
- } /* end extractContigSamplesShifted8bits */
-
-static int
-extractContigSamplesShifted16bits (uint8 *in, uint8 *out, uint32 cols,
- tsample_t sample, uint16 spp, uint16 bps,
- tsample_t count, uint32 start, uint32 end,
- int shift)
- {
- int ready_bits = 0, sindex = 0;
- uint32 col, src_byte, src_bit, bit_offset;
- uint16 maskbits = 0, matchbits = 0;
- uint16 buff1 = 0, buff2 = 0;
- uint8 bytebuff = 0;
- uint8 *src = in;
- uint8 *dst = out;
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("extractContigSamplesShifted16bits","Invalid input or output buffer");
- return (1);
- }
-
- if ((start > end) || (start > cols))
- {
- TIFFError ("extractContigSamplesShifted16bits",
- "Invalid start column value %d ignored", start);
- start = 0;
- }
- if ((end == 0) || (end > cols))
- {
- TIFFError ("extractContigSamplesShifted16bits",
- "Invalid end column value %d ignored", end);
- end = cols;
- }
-
- ready_bits = shift;
- maskbits = (uint16)-1 >> (16 - bps);
- for (col = start; col < end; col++)
- { /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps * spp;
- for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++)
- {
- if (sindex == 0)
- {
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sindex * bps)) / 8;
- src_bit = (bit_offset + (sindex * bps)) % 8;
- }
-
- src = in + src_byte;
- matchbits = maskbits << (16 - src_bit - bps);
- if (little_endian)
- buff1 = (src[0] << 8) | src[1];
- else
- buff1 = (src[1] << 8) | src[0];
-
- if ((col == start) && (sindex == sample))
- buff2 = buff1 & ((uint16)-1) << (8 - shift);
-
- buff1 = (buff1 & matchbits) << (src_bit);
-
- if (ready_bits < 8) /* add another bps bits to the buffer */
- buff2 = buff2 | (buff1 >> ready_bits);
- else /* If we have a full buffer's worth, write it out */
- {
- bytebuff = (buff2 >> 8);
- *dst++ = bytebuff;
- ready_bits -= 8;
- /* shift in new bits */
- buff2 = ((buff2 << 8) | (buff1 >> ready_bits));
- }
-
- ready_bits += bps;
- }
- }
-
- /* catch any trailing bits at the end of the line */
- while (ready_bits > 0)
- {
- bytebuff = (buff2 >> 8);
- *dst++ = bytebuff;
- ready_bits -= 8;
- }
-
- return (0);
- } /* end extractContigSamplesShifted16bits */
-
-
-static int
-extractContigSamplesShifted24bits (uint8 *in, uint8 *out, uint32 cols,
- tsample_t sample, uint16 spp, uint16 bps,
- tsample_t count, uint32 start, uint32 end,
- int shift)
- {
- int ready_bits = 0, sindex = 0;
- uint32 col, src_byte, src_bit, bit_offset;
- uint32 maskbits = 0, matchbits = 0;
- uint32 buff1 = 0, buff2 = 0;
- uint8 bytebuff1 = 0, bytebuff2 = 0;
- uint8 *src = in;
- uint8 *dst = out;
-
- if ((in == NULL) || (out == NULL))
- {
- TIFFError("extractContigSamplesShifted24bits","Invalid input or output buffer");
- return (1);
- }
-
- if ((start > end) || (start > cols))
- {
- TIFFError ("extractContigSamplesShifted24bits",
- "Invalid start column value %d ignored", start);
- start = 0;
- }
- if ((end == 0) || (end > cols))
- {
- TIFFError ("extractContigSamplesShifted24bits",
- "Invalid end column value %d ignored", end);
- end = cols;
- }
-
- ready_bits = shift;
- maskbits = (uint32)-1 >> ( 32 - bps);
- for (col = start; col < end; col++)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps * spp;
- for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++)
- {
- if (sindex == 0)
- {
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sindex * bps)) / 8;
- src_bit = (bit_offset + (sindex * bps)) % 8;
- }
-
- src = in + src_byte;
- matchbits = maskbits << (32 - src_bit - bps);
- if (little_endian)
- buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
- else
- buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0];
-
- if ((col == start) && (sindex == sample))
- buff2 = buff1 & ((uint32)-1) << (16 - shift);
-
- buff1 = (buff1 & matchbits) << (src_bit);
-
- if (ready_bits < 16) /* add another bps bits to the buffer */
- {
- bytebuff1 = bytebuff2 = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- }
- else /* If we have a full buffer's worth, write it out */
- {
- bytebuff1 = (buff2 >> 24);
- *dst++ = bytebuff1;
- bytebuff2 = (buff2 >> 16);
- *dst++ = bytebuff2;
- ready_bits -= 16;
-
- /* shift in new bits */
- buff2 = ((buff2 << 16) | (buff1 >> ready_bits));
- }
- ready_bits += bps;
- }
- }
-
- /* catch any trailing bits at the end of the line */
- while (ready_bits > 0)
- {
- bytebuff1 = (buff2 >> 24);
- *dst++ = bytebuff1;
-
- buff2 = (buff2 << 8);
- bytebuff2 = bytebuff1;
- ready_bits -= 8;
- }
-
- return (0);
- } /* end extractContigSamplesShifted24bits */
-
-static int
-extractContigSamplesShifted32bits (uint8 *in, uint8 *out, uint32 cols,
- tsample_t sample, uint16 spp, uint16 bps,
- tsample_t count, uint32 start, uint32 end,
- int shift)
- {
- int ready_bits = 0, sindex = 0 /*, shift_width = 0 */;
- uint32 col, src_byte, src_bit, bit_offset;
- uint32 longbuff1 = 0, longbuff2 = 0;
- uint64 maskbits = 0, matchbits = 0;
- uint64 buff1 = 0, buff2 = 0, buff3 = 0;
- uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0;
- uint8 *src = in;
- uint8 *dst = out;
-
- if ((in == NULL) || (out == NULL))
- {
- TIFFError("extractContigSamplesShifted32bits","Invalid input or output buffer");
- return (1);
- }
-
-
- if ((start > end) || (start > cols))
- {
- TIFFError ("extractContigSamplesShifted32bits",
- "Invalid start column value %d ignored", start);
- start = 0;
- }
- if ((end == 0) || (end > cols))
- {
- TIFFError ("extractContigSamplesShifted32bits",
- "Invalid end column value %d ignored", end);
- end = cols;
- }
-
- /* shift_width = ((bps + 7) / 8) + 1; */
- ready_bits = shift;
- maskbits = (uint64)-1 >> ( 64 - bps);
- for (col = start; col < end; col++)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps * spp;
- for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++)
- {
- if (sindex == 0)
- {
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sindex * bps)) / 8;
- src_bit = (bit_offset + (sindex * bps)) % 8;
- }
-
- src = in + src_byte;
- matchbits = maskbits << (64 - src_bit - bps);
- if (little_endian)
- {
- longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
- longbuff2 = longbuff1;
- }
- else
- {
- longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0];
- longbuff2 = longbuff1;
- }
-
- buff3 = ((uint64)longbuff1 << 32) | longbuff2;
- if ((col == start) && (sindex == sample))
- buff2 = buff3 & ((uint64)-1) << (32 - shift);
-
- buff1 = (buff3 & matchbits) << (src_bit);
-
- if (ready_bits < 32)
- { /* add another bps bits to the buffer */
- bytebuff1 = bytebuff2 = bytebuff3 = bytebuff4 = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- }
- else /* If we have a full buffer's worth, write it out */
- {
- bytebuff1 = (buff2 >> 56);
- *dst++ = bytebuff1;
- bytebuff2 = (buff2 >> 48);
- *dst++ = bytebuff2;
- bytebuff3 = (buff2 >> 40);
- *dst++ = bytebuff3;
- bytebuff4 = (buff2 >> 32);
- *dst++ = bytebuff4;
- ready_bits -= 32;
-
- /* shift in new bits */
- buff2 = ((buff2 << 32) | (buff1 >> ready_bits));
- }
- ready_bits += bps;
- }
- }
- while (ready_bits > 0)
- {
- bytebuff1 = (buff2 >> 56);
- *dst++ = bytebuff1;
- buff2 = (buff2 << 8);
- ready_bits -= 8;
- }
-
- return (0);
- } /* end extractContigSamplesShifted32bits */
-
-static int
-extractContigSamplesToBuffer(uint8 *out, uint8 *in, uint32 rows, uint32 cols,
- tsample_t sample, uint16 spp, uint16 bps,
- struct dump_opts *dump)
- {
- int shift_width, bytes_per_sample, bytes_per_pixel;
- uint32 src_rowsize, src_offset, row, first_col = 0;
- uint32 dst_rowsize, dst_offset;
- tsample_t count = 1;
- uint8 *src, *dst;
-
- bytes_per_sample = (bps + 7) / 8;
- bytes_per_pixel = ((bps * spp) + 7) / 8;
- if ((bps % 8) == 0)
- shift_width = 0;
- else
- {
- if (bytes_per_pixel < (bytes_per_sample + 1))
- shift_width = bytes_per_pixel;
- else
- shift_width = bytes_per_sample + 1;
- }
- src_rowsize = ((bps * spp * cols) + 7) / 8;
- dst_rowsize = ((bps * cols) + 7) / 8;
-
- if ((dump->outfile != NULL) && (dump->level == 4))
- {
- dump_info (dump->outfile, dump->format, "extractContigSamplesToBuffer",
- "Sample %d, %d rows", sample + 1, rows + 1);
- }
- for (row = 0; row < rows; row++)
- {
- src_offset = row * src_rowsize;
- dst_offset = row * dst_rowsize;
- src = in + src_offset;
- dst = out + dst_offset;
-
- /* pack the data into the scanline */
- switch (shift_width)
- {
- case 0: if (extractContigSamplesBytes (src, dst, cols, sample,
- spp, bps, count, first_col, cols))
- return (1);
- break;
- case 1: if (bps == 1)
- {
- if (extractContigSamples8bits (src, dst, cols, sample,
- spp, bps, count, first_col, cols))
- return (1);
- break;
- }
- else
- if (extractContigSamples16bits (src, dst, cols, sample,
- spp, bps, count, first_col, cols))
- return (1);
- break;
- case 2: if (extractContigSamples24bits (src, dst, cols, sample,
- spp, bps, count, first_col, cols))
- return (1);
- break;
- case 3:
- case 4:
- case 5: if (extractContigSamples32bits (src, dst, cols, sample,
- spp, bps, count, first_col, cols))
- return (1);
- break;
- default: TIFFError ("extractContigSamplesToBuffer", "Unsupported bit depth: %d", bps);
- return (1);
- }
- if ((dump->outfile != NULL) && (dump->level == 4))
- dump_buffer(dump->outfile, dump->format, 1, dst_rowsize, row, dst);
- }
-
- return (0);
- } /* end extractContigSamplesToBuffer */
-
-static int
-extractContigSamplesToTileBuffer(uint8 *out, uint8 *in, uint32 rows, uint32 cols,
- uint32 imagewidth, uint32 tilewidth, tsample_t sample,
- uint16 count, uint16 spp, uint16 bps, struct dump_opts *dump)
- {
- int shift_width, bytes_per_sample, bytes_per_pixel;
- uint32 src_rowsize, src_offset, row;
- uint32 dst_rowsize, dst_offset;
- uint8 *src, *dst;
-
- bytes_per_sample = (bps + 7) / 8;
- bytes_per_pixel = ((bps * spp) + 7) / 8;
- if ((bps % 8) == 0)
- shift_width = 0;
- else
- {
- if (bytes_per_pixel < (bytes_per_sample + 1))
- shift_width = bytes_per_pixel;
- else
- shift_width = bytes_per_sample + 1;
- }
-
- if ((dump->outfile != NULL) && (dump->level == 4))
- {
- dump_info (dump->outfile, dump->format, "extractContigSamplesToTileBuffer",
- "Sample %d, %d rows", sample + 1, rows + 1);
- }
-
- src_rowsize = ((bps * spp * imagewidth) + 7) / 8;
- dst_rowsize = ((bps * tilewidth * count) + 7) / 8;
-
- for (row = 0; row < rows; row++)
- {
- src_offset = row * src_rowsize;
- dst_offset = row * dst_rowsize;
- src = in + src_offset;
- dst = out + dst_offset;
-
- /* pack the data into the scanline */
- switch (shift_width)
- {
- case 0: if (extractContigSamplesBytes (src, dst, cols, sample,
- spp, bps, count, 0, cols))
- return (1);
- break;
- case 1: if (bps == 1)
- {
- if (extractContigSamples8bits (src, dst, cols, sample,
- spp, bps, count, 0, cols))
- return (1);
- break;
- }
- else
- if (extractContigSamples16bits (src, dst, cols, sample,
- spp, bps, count, 0, cols))
- return (1);
- break;
- case 2: if (extractContigSamples24bits (src, dst, cols, sample,
- spp, bps, count, 0, cols))
- return (1);
- break;
- case 3:
- case 4:
- case 5: if (extractContigSamples32bits (src, dst, cols, sample,
- spp, bps, count, 0, cols))
- return (1);
- break;
- default: TIFFError ("extractContigSamplesToTileBuffer", "Unsupported bit depth: %d", bps);
- return (1);
- }
- if ((dump->outfile != NULL) && (dump->level == 4))
- dump_buffer(dump->outfile, dump->format, 1, dst_rowsize, row, dst);
- }
-
- return (0);
- } /* end extractContigSamplesToTileBuffer */
-
-static int readContigStripsIntoBuffer (TIFF* in, uint8* buf)
- {
- uint8* bufp = buf;
- int32 bytes_read = 0;
- uint16 strip, nstrips = TIFFNumberOfStrips(in);
- uint32 stripsize = TIFFStripSize(in);
- uint32 rows = 0;
- uint32 rps = TIFFGetFieldDefaulted(in, TIFFTAG_ROWSPERSTRIP, &rps);
- tsize_t scanline_size = TIFFScanlineSize(in);
-
- for (strip = 0; strip < nstrips; strip++)
- {
- bytes_read = TIFFReadEncodedStrip (in, strip, bufp, -1);
- rows = bytes_read / scanline_size;
- if ((strip < (nstrips - 1)) && (bytes_read != (int32)stripsize))
- TIFFError("", "Strip %d: read %lu bytes, strip size %lu",
- (int)strip + 1, (unsigned long) bytes_read, (unsigned long)stripsize);
-
- if (bytes_read < 0 && !ignore)
- {
- TIFFError("", "Error reading strip %lu after %lu rows",
- (unsigned long) strip, (unsigned long)rows);
- return 0;
- }
- bufp += bytes_read;
- }
-
- return 1;
- } /* end readContigStripsIntoBuffer */
-
-static int
-combineSeparateSamplesBytes (unsigned char *srcbuffs[], unsigned char *out,
- uint32 cols, uint32 rows, uint16 spp, uint16 bps,
- FILE *dumpfile, int format, int level)
- {
- int i, bytes_per_sample;
- uint32 row, col, col_offset, src_rowsize, dst_rowsize, row_offset;
- unsigned char *src;
- unsigned char *dst;
- tsample_t s;
-
- src = srcbuffs[0];
- dst = out;
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("combineSeparateSamplesBytes","Invalid buffer address");
- return (1);
- }
-
- bytes_per_sample = (bps + 7) / 8;
-
- src_rowsize = ((bps * cols) + 7) / 8;
- dst_rowsize = ((bps * spp * cols) + 7) / 8;
- for (row = 0; row < rows; row++)
- {
- if ((dumpfile != NULL) && (level == 2))
- {
- for (s = 0; s < spp; s++)
- {
- dump_info (dumpfile, format, "combineSeparateSamplesBytes","Input data, Sample %d", s);
- dump_buffer(dumpfile, format, 1, cols, row, srcbuffs[s] + (row * src_rowsize));
- }
- }
- dst = out + (row * dst_rowsize);
- row_offset = row * src_rowsize;
- for (col = 0; col < cols; col++)
- {
- col_offset = row_offset + (col * (bps / 8));
- for (s = 0; (s < spp) && (s < MAX_SAMPLES); s++)
- {
- src = srcbuffs[s] + col_offset;
- for (i = 0; i < bytes_per_sample; i++)
- *(dst + i) = *(src + i);
- src += bytes_per_sample;
- dst += bytes_per_sample;
- }
- }
-
- if ((dumpfile != NULL) && (level == 2))
- {
- dump_info (dumpfile, format, "combineSeparateSamplesBytes","Output data, combined samples");
- dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize));
- }
- }
-
- return (0);
- } /* end combineSeparateSamplesBytes */
-
-static int
-combineSeparateSamples8bits (uint8 *in[], uint8 *out, uint32 cols,
- uint32 rows, uint16 spp, uint16 bps,
- FILE *dumpfile, int format, int level)
- {
- int ready_bits = 0;
- /* int bytes_per_sample = 0; */
- uint32 src_rowsize, dst_rowsize, src_offset;
- uint32 bit_offset;
- uint32 row, col, src_byte = 0, src_bit = 0;
- uint8 maskbits = 0, matchbits = 0;
- uint8 buff1 = 0, buff2 = 0;
- tsample_t s;
- unsigned char *src = in[0];
- unsigned char *dst = out;
- char action[32];
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("combineSeparateSamples8bits","Invalid input or output buffer");
- return (1);
- }
-
- /* bytes_per_sample = (bps + 7) / 8; */
- src_rowsize = ((bps * cols) + 7) / 8;
- dst_rowsize = ((bps * cols * spp) + 7) / 8;
- maskbits = (uint8)-1 >> ( 8 - bps);
-
- for (row = 0; row < rows; row++)
- {
- ready_bits = 0;
- buff1 = buff2 = 0;
- dst = out + (row * dst_rowsize);
- src_offset = row * src_rowsize;
- for (col = 0; col < cols; col++)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps;
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
-
- matchbits = maskbits << (8 - src_bit - bps);
- /* load up next sample from each plane */
- for (s = 0; s < spp; s++)
- {
- src = in[s] + src_offset + src_byte;
- buff1 = ((*src) & matchbits) << (src_bit);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 8)
- {
- *dst++ = buff2;
- buff2 = buff1;
- ready_bits -= 8;
- strcpy (action, "Flush");
- }
- else
- {
- buff2 = (buff2 | (buff1 >> ready_bits));
- strcpy (action, "Update");
- }
- ready_bits += bps;
-
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Samples %d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, s, src_byte, src_bit, dst - out);
- dump_byte (dumpfile, format, "Match bits", matchbits);
- dump_byte (dumpfile, format, "Src bits", *src);
- dump_byte (dumpfile, format, "Buff1 bits", buff1);
- dump_byte (dumpfile, format, "Buff2 bits", buff2);
- dump_info (dumpfile, format, "","%s", action);
- }
- }
- }
-
- if (ready_bits > 0)
- {
- buff1 = (buff2 & ((unsigned int)255 << (8 - ready_bits)));
- *dst++ = buff1;
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, src_byte, src_bit, dst - out);
- dump_byte (dumpfile, format, "Final bits", buff1);
- }
- }
-
- if ((dumpfile != NULL) && (level >= 2))
- {
- dump_info (dumpfile, format, "combineSeparateSamples8bits","Output data");
- dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize));
- }
- }
-
- return (0);
- } /* end combineSeparateSamples8bits */
-
-static int
-combineSeparateSamples16bits (uint8 *in[], uint8 *out, uint32 cols,
- uint32 rows, uint16 spp, uint16 bps,
- FILE *dumpfile, int format, int level)
- {
- int ready_bits = 0 /*, bytes_per_sample = 0 */;
- uint32 src_rowsize, dst_rowsize;
- uint32 bit_offset, src_offset;
- uint32 row, col, src_byte = 0, src_bit = 0;
- uint16 maskbits = 0, matchbits = 0;
- uint16 buff1 = 0, buff2 = 0;
- uint8 bytebuff = 0;
- tsample_t s;
- unsigned char *src = in[0];
- unsigned char *dst = out;
- char action[8];
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("combineSeparateSamples16bits","Invalid input or output buffer");
- return (1);
- }
-
- /* bytes_per_sample = (bps + 7) / 8; */
- src_rowsize = ((bps * cols) + 7) / 8;
- dst_rowsize = ((bps * cols * spp) + 7) / 8;
- maskbits = (uint16)-1 >> (16 - bps);
-
- for (row = 0; row < rows; row++)
- {
- ready_bits = 0;
- buff1 = buff2 = 0;
- dst = out + (row * dst_rowsize);
- src_offset = row * src_rowsize;
- for (col = 0; col < cols; col++)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps;
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
-
- matchbits = maskbits << (16 - src_bit - bps);
- for (s = 0; s < spp; s++)
- {
- src = in[s] + src_offset + src_byte;
- if (little_endian)
- buff1 = (src[0] << 8) | src[1];
- else
- buff1 = (src[1] << 8) | src[0];
-
- buff1 = (buff1 & matchbits) << (src_bit);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 8)
- {
- bytebuff = (buff2 >> 8);
- *dst++ = bytebuff;
- ready_bits -= 8;
- /* shift in new bits */
- buff2 = ((buff2 << 8) | (buff1 >> ready_bits));
- strcpy (action, "Flush");
- }
- else
- { /* add another bps bits to the buffer */
- bytebuff = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- strcpy (action, "Update");
- }
- ready_bits += bps;
-
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Samples %d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, s, src_byte, src_bit, dst - out);
-
- dump_short (dumpfile, format, "Match bits", matchbits);
- dump_data (dumpfile, format, "Src bits", src, 2);
- dump_short (dumpfile, format, "Buff1 bits", buff1);
- dump_short (dumpfile, format, "Buff2 bits", buff2);
- dump_byte (dumpfile, format, "Write byte", bytebuff);
- dump_info (dumpfile, format, "","Ready bits: %d, %s", ready_bits, action);
- }
- }
- }
-
- /* catch any trailing bits at the end of the line */
- if (ready_bits > 0)
- {
- bytebuff = (buff2 >> 8);
- *dst++ = bytebuff;
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, src_byte, src_bit, dst - out);
- dump_byte (dumpfile, format, "Final bits", bytebuff);
- }
- }
-
- if ((dumpfile != NULL) && (level == 2))
- {
- dump_info (dumpfile, format, "combineSeparateSamples16bits","Output data");
- dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize));
- }
- }
-
- return (0);
- } /* end combineSeparateSamples16bits */
-
-static int
-combineSeparateSamples24bits (uint8 *in[], uint8 *out, uint32 cols,
- uint32 rows, uint16 spp, uint16 bps,
- FILE *dumpfile, int format, int level)
- {
- int ready_bits = 0 /*, bytes_per_sample = 0 */;
- uint32 src_rowsize, dst_rowsize;
- uint32 bit_offset, src_offset;
- uint32 row, col, src_byte = 0, src_bit = 0;
- uint32 maskbits = 0, matchbits = 0;
- uint32 buff1 = 0, buff2 = 0;
- uint8 bytebuff1 = 0, bytebuff2 = 0;
- tsample_t s;
- unsigned char *src = in[0];
- unsigned char *dst = out;
- char action[8];
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("combineSeparateSamples24bits","Invalid input or output buffer");
- return (1);
- }
-
- /* bytes_per_sample = (bps + 7) / 8; */
- src_rowsize = ((bps * cols) + 7) / 8;
- dst_rowsize = ((bps * cols * spp) + 7) / 8;
- maskbits = (uint32)-1 >> ( 32 - bps);
-
- for (row = 0; row < rows; row++)
- {
- ready_bits = 0;
- buff1 = buff2 = 0;
- dst = out + (row * dst_rowsize);
- src_offset = row * src_rowsize;
- for (col = 0; col < cols; col++)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps;
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
-
- matchbits = maskbits << (32 - src_bit - bps);
- for (s = 0; s < spp; s++)
- {
- src = in[s] + src_offset + src_byte;
- if (little_endian)
- buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
- else
- buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0];
- buff1 = (buff1 & matchbits) << (src_bit);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 16)
- {
- bytebuff1 = (buff2 >> 24);
- *dst++ = bytebuff1;
- bytebuff2 = (buff2 >> 16);
- *dst++ = bytebuff2;
- ready_bits -= 16;
-
- /* shift in new bits */
- buff2 = ((buff2 << 16) | (buff1 >> ready_bits));
- strcpy (action, "Flush");
- }
- else
- { /* add another bps bits to the buffer */
- bytebuff1 = bytebuff2 = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- strcpy (action, "Update");
- }
- ready_bits += bps;
-
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Samples %d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, s, src_byte, src_bit, dst - out);
- dump_long (dumpfile, format, "Match bits ", matchbits);
- dump_data (dumpfile, format, "Src bits ", src, 4);
- dump_long (dumpfile, format, "Buff1 bits ", buff1);
- dump_long (dumpfile, format, "Buff2 bits ", buff2);
- dump_byte (dumpfile, format, "Write bits1", bytebuff1);
- dump_byte (dumpfile, format, "Write bits2", bytebuff2);
- dump_info (dumpfile, format, "","Ready bits: %d, %s", ready_bits, action);
- }
- }
- }
-
- /* catch any trailing bits at the end of the line */
- while (ready_bits > 0)
- {
- bytebuff1 = (buff2 >> 24);
- *dst++ = bytebuff1;
-
- buff2 = (buff2 << 8);
- bytebuff2 = bytebuff1;
- ready_bits -= 8;
- }
-
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, src_byte, src_bit, dst - out);
-
- dump_long (dumpfile, format, "Match bits ", matchbits);
- dump_data (dumpfile, format, "Src bits ", src, 4);
- dump_long (dumpfile, format, "Buff1 bits ", buff1);
- dump_long (dumpfile, format, "Buff2 bits ", buff2);
- dump_byte (dumpfile, format, "Write bits1", bytebuff1);
- dump_byte (dumpfile, format, "Write bits2", bytebuff2);
- dump_info (dumpfile, format, "", "Ready bits: %2d", ready_bits);
- }
-
- if ((dumpfile != NULL) && (level == 2))
- {
- dump_info (dumpfile, format, "combineSeparateSamples24bits","Output data");
- dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize));
- }
- }
-
- return (0);
- } /* end combineSeparateSamples24bits */
-
-static int
-combineSeparateSamples32bits (uint8 *in[], uint8 *out, uint32 cols,
- uint32 rows, uint16 spp, uint16 bps,
- FILE *dumpfile, int format, int level)
- {
- int ready_bits = 0 /*, bytes_per_sample = 0, shift_width = 0 */;
- uint32 src_rowsize, dst_rowsize, bit_offset, src_offset;
- uint32 src_byte = 0, src_bit = 0;
- uint32 row, col;
- uint32 longbuff1 = 0, longbuff2 = 0;
- uint64 maskbits = 0, matchbits = 0;
- uint64 buff1 = 0, buff2 = 0, buff3 = 0;
- uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0;
- tsample_t s;
- unsigned char *src = in[0];
- unsigned char *dst = out;
- char action[8];
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("combineSeparateSamples32bits","Invalid input or output buffer");
- return (1);
- }
-
- /* bytes_per_sample = (bps + 7) / 8; */
- src_rowsize = ((bps * cols) + 7) / 8;
- dst_rowsize = ((bps * cols * spp) + 7) / 8;
- maskbits = (uint64)-1 >> ( 64 - bps);
- /* shift_width = ((bps + 7) / 8) + 1; */
-
- for (row = 0; row < rows; row++)
- {
- ready_bits = 0;
- buff1 = buff2 = 0;
- dst = out + (row * dst_rowsize);
- src_offset = row * src_rowsize;
- for (col = 0; col < cols; col++)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps;
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
-
- matchbits = maskbits << (64 - src_bit - bps);
- for (s = 0; s < spp; s++)
- {
- src = in[s] + src_offset + src_byte;
- if (little_endian)
- {
- longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
- longbuff2 = longbuff1;
- }
- else
- {
- longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0];
- longbuff2 = longbuff1;
- }
- buff3 = ((uint64)longbuff1 << 32) | longbuff2;
- buff1 = (buff3 & matchbits) << (src_bit);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 32)
- {
- bytebuff1 = (buff2 >> 56);
- *dst++ = bytebuff1;
- bytebuff2 = (buff2 >> 48);
- *dst++ = bytebuff2;
- bytebuff3 = (buff2 >> 40);
- *dst++ = bytebuff3;
- bytebuff4 = (buff2 >> 32);
- *dst++ = bytebuff4;
- ready_bits -= 32;
-
- /* shift in new bits */
- buff2 = ((buff2 << 32) | (buff1 >> ready_bits));
- strcpy (action, "Flush");
- }
- else
- { /* add another bps bits to the buffer */
- bytebuff1 = bytebuff2 = bytebuff3 = bytebuff4 = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- strcpy (action, "Update");
- }
- ready_bits += bps;
-
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Sample %d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, s, src_byte, src_bit, dst - out);
- dump_wide (dumpfile, format, "Match bits ", matchbits);
- dump_data (dumpfile, format, "Src bits ", src, 8);
- dump_wide (dumpfile, format, "Buff1 bits ", buff1);
- dump_wide (dumpfile, format, "Buff2 bits ", buff2);
- dump_info (dumpfile, format, "", "Ready bits: %d, %s", ready_bits, action);
- }
- }
- }
- while (ready_bits > 0)
- {
- bytebuff1 = (buff2 >> 56);
- *dst++ = bytebuff1;
- buff2 = (buff2 << 8);
- ready_bits -= 8;
- }
-
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, src_byte, src_bit, dst - out);
-
- dump_long (dumpfile, format, "Match bits ", matchbits);
- dump_data (dumpfile, format, "Src bits ", src, 4);
- dump_long (dumpfile, format, "Buff1 bits ", buff1);
- dump_long (dumpfile, format, "Buff2 bits ", buff2);
- dump_byte (dumpfile, format, "Write bits1", bytebuff1);
- dump_byte (dumpfile, format, "Write bits2", bytebuff2);
- dump_info (dumpfile, format, "", "Ready bits: %2d", ready_bits);
- }
-
- if ((dumpfile != NULL) && (level == 2))
- {
- dump_info (dumpfile, format, "combineSeparateSamples32bits","Output data");
- dump_buffer(dumpfile, format, 1, dst_rowsize, row, out);
- }
- }
-
- return (0);
- } /* end combineSeparateSamples32bits */
-
-static int
-combineSeparateTileSamplesBytes (unsigned char *srcbuffs[], unsigned char *out,
- uint32 cols, uint32 rows, uint32 imagewidth,
- uint32 tw, uint16 spp, uint16 bps,
- FILE *dumpfile, int format, int level)
- {
- int i, bytes_per_sample;
- uint32 row, col, col_offset, src_rowsize, dst_rowsize, src_offset;
- unsigned char *src;
- unsigned char *dst;
- tsample_t s;
-
- src = srcbuffs[0];
- dst = out;
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("combineSeparateTileSamplesBytes","Invalid buffer address");
- return (1);
- }
-
- bytes_per_sample = (bps + 7) / 8;
- src_rowsize = ((bps * tw) + 7) / 8;
- dst_rowsize = imagewidth * bytes_per_sample * spp;
- for (row = 0; row < rows; row++)
- {
- if ((dumpfile != NULL) && (level == 2))
- {
- for (s = 0; s < spp; s++)
- {
- dump_info (dumpfile, format, "combineSeparateTileSamplesBytes","Input data, Sample %d", s);
- dump_buffer(dumpfile, format, 1, cols, row, srcbuffs[s] + (row * src_rowsize));
- }
- }
- dst = out + (row * dst_rowsize);
- src_offset = row * src_rowsize;
-#ifdef DEVELMODE
- TIFFError("","Tile row %4d, Src offset %6d Dst offset %6d",
- row, src_offset, dst - out);
-#endif
- for (col = 0; col < cols; col++)
- {
- col_offset = src_offset + (col * (bps / 8));
- for (s = 0; (s < spp) && (s < MAX_SAMPLES); s++)
- {
- src = srcbuffs[s] + col_offset;
- for (i = 0; i < bytes_per_sample; i++)
- *(dst + i) = *(src + i);
- dst += bytes_per_sample;
- }
- }
-
- if ((dumpfile != NULL) && (level == 2))
- {
- dump_info (dumpfile, format, "combineSeparateTileSamplesBytes","Output data, combined samples");
- dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize));
- }
- }
-
- return (0);
- } /* end combineSeparateTileSamplesBytes */
-
-static int
-combineSeparateTileSamples8bits (uint8 *in[], uint8 *out, uint32 cols,
- uint32 rows, uint32 imagewidth,
- uint32 tw, uint16 spp, uint16 bps,
- FILE *dumpfile, int format, int level)
- {
- int ready_bits = 0;
- uint32 src_rowsize, dst_rowsize, src_offset;
- uint32 bit_offset;
- uint32 row, col, src_byte = 0, src_bit = 0;
- uint8 maskbits = 0, matchbits = 0;
- uint8 buff1 = 0, buff2 = 0;
- tsample_t s;
- unsigned char *src = in[0];
- unsigned char *dst = out;
- char action[32];
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("combineSeparateTileSamples8bits","Invalid input or output buffer");
- return (1);
- }
-
- src_rowsize = ((bps * tw) + 7) / 8;
- dst_rowsize = ((imagewidth * bps * spp) + 7) / 8;
- maskbits = (uint8)-1 >> ( 8 - bps);
-
- for (row = 0; row < rows; row++)
- {
- ready_bits = 0;
- buff1 = buff2 = 0;
- dst = out + (row * dst_rowsize);
- src_offset = row * src_rowsize;
- for (col = 0; col < cols; col++)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps;
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
-
- matchbits = maskbits << (8 - src_bit - bps);
- /* load up next sample from each plane */
- for (s = 0; s < spp; s++)
- {
- src = in[s] + src_offset + src_byte;
- buff1 = ((*src) & matchbits) << (src_bit);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 8)
- {
- *dst++ = buff2;
- buff2 = buff1;
- ready_bits -= 8;
- strcpy (action, "Flush");
- }
- else
- {
- buff2 = (buff2 | (buff1 >> ready_bits));
- strcpy (action, "Update");
- }
- ready_bits += bps;
-
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Samples %d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, s, src_byte, src_bit, dst - out);
- dump_byte (dumpfile, format, "Match bits", matchbits);
- dump_byte (dumpfile, format, "Src bits", *src);
- dump_byte (dumpfile, format, "Buff1 bits", buff1);
- dump_byte (dumpfile, format, "Buff2 bits", buff2);
- dump_info (dumpfile, format, "","%s", action);
- }
- }
- }
-
- if (ready_bits > 0)
- {
- buff1 = (buff2 & ((unsigned int)255 << (8 - ready_bits)));
- *dst++ = buff1;
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, src_byte, src_bit, dst - out);
- dump_byte (dumpfile, format, "Final bits", buff1);
- }
- }
-
- if ((dumpfile != NULL) && (level >= 2))
- {
- dump_info (dumpfile, format, "combineSeparateTileSamples8bits","Output data");
- dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize));
- }
- }
-
- return (0);
- } /* end combineSeparateTileSamples8bits */
-
-static int
-combineSeparateTileSamples16bits (uint8 *in[], uint8 *out, uint32 cols,
- uint32 rows, uint32 imagewidth,
- uint32 tw, uint16 spp, uint16 bps,
- FILE *dumpfile, int format, int level)
- {
- int ready_bits = 0;
- uint32 src_rowsize, dst_rowsize;
- uint32 bit_offset, src_offset;
- uint32 row, col, src_byte = 0, src_bit = 0;
- uint16 maskbits = 0, matchbits = 0;
- uint16 buff1 = 0, buff2 = 0;
- uint8 bytebuff = 0;
- tsample_t s;
- unsigned char *src = in[0];
- unsigned char *dst = out;
- char action[8];
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("combineSeparateTileSamples16bits","Invalid input or output buffer");
- return (1);
- }
-
- src_rowsize = ((bps * tw) + 7) / 8;
- dst_rowsize = ((imagewidth * bps * spp) + 7) / 8;
- maskbits = (uint16)-1 >> (16 - bps);
-
- for (row = 0; row < rows; row++)
- {
- ready_bits = 0;
- buff1 = buff2 = 0;
- dst = out + (row * dst_rowsize);
- src_offset = row * src_rowsize;
- for (col = 0; col < cols; col++)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps;
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
-
- matchbits = maskbits << (16 - src_bit - bps);
- for (s = 0; s < spp; s++)
- {
- src = in[s] + src_offset + src_byte;
- if (little_endian)
- buff1 = (src[0] << 8) | src[1];
- else
- buff1 = (src[1] << 8) | src[0];
- buff1 = (buff1 & matchbits) << (src_bit);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 8)
- {
- bytebuff = (buff2 >> 8);
- *dst++ = bytebuff;
- ready_bits -= 8;
- /* shift in new bits */
- buff2 = ((buff2 << 8) | (buff1 >> ready_bits));
- strcpy (action, "Flush");
- }
- else
- { /* add another bps bits to the buffer */
- bytebuff = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- strcpy (action, "Update");
- }
- ready_bits += bps;
-
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Samples %d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, s, src_byte, src_bit, dst - out);
-
- dump_short (dumpfile, format, "Match bits", matchbits);
- dump_data (dumpfile, format, "Src bits", src, 2);
- dump_short (dumpfile, format, "Buff1 bits", buff1);
- dump_short (dumpfile, format, "Buff2 bits", buff2);
- dump_byte (dumpfile, format, "Write byte", bytebuff);
- dump_info (dumpfile, format, "","Ready bits: %d, %s", ready_bits, action);
- }
- }
- }
-
- /* catch any trailing bits at the end of the line */
- if (ready_bits > 0)
- {
- bytebuff = (buff2 >> 8);
- *dst++ = bytebuff;
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, src_byte, src_bit, dst - out);
- dump_byte (dumpfile, format, "Final bits", bytebuff);
- }
- }
-
- if ((dumpfile != NULL) && (level == 2))
- {
- dump_info (dumpfile, format, "combineSeparateTileSamples16bits","Output data");
- dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize));
- }
- }
-
- return (0);
- } /* end combineSeparateTileSamples16bits */
-
-static int
-combineSeparateTileSamples24bits (uint8 *in[], uint8 *out, uint32 cols,
- uint32 rows, uint32 imagewidth,
- uint32 tw, uint16 spp, uint16 bps,
- FILE *dumpfile, int format, int level)
- {
- int ready_bits = 0;
- uint32 src_rowsize, dst_rowsize;
- uint32 bit_offset, src_offset;
- uint32 row, col, src_byte = 0, src_bit = 0;
- uint32 maskbits = 0, matchbits = 0;
- uint32 buff1 = 0, buff2 = 0;
- uint8 bytebuff1 = 0, bytebuff2 = 0;
- tsample_t s;
- unsigned char *src = in[0];
- unsigned char *dst = out;
- char action[8];
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("combineSeparateTileSamples24bits","Invalid input or output buffer");
- return (1);
- }
-
- src_rowsize = ((bps * tw) + 7) / 8;
- dst_rowsize = ((imagewidth * bps * spp) + 7) / 8;
- maskbits = (uint32)-1 >> ( 32 - bps);
-
- for (row = 0; row < rows; row++)
- {
- ready_bits = 0;
- buff1 = buff2 = 0;
- dst = out + (row * dst_rowsize);
- src_offset = row * src_rowsize;
- for (col = 0; col < cols; col++)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps;
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
-
- matchbits = maskbits << (32 - src_bit - bps);
- for (s = 0; s < spp; s++)
- {
- src = in[s] + src_offset + src_byte;
- if (little_endian)
- buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
- else
- buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0];
- buff1 = (buff1 & matchbits) << (src_bit);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 16)
- {
- bytebuff1 = (buff2 >> 24);
- *dst++ = bytebuff1;
- bytebuff2 = (buff2 >> 16);
- *dst++ = bytebuff2;
- ready_bits -= 16;
-
- /* shift in new bits */
- buff2 = ((buff2 << 16) | (buff1 >> ready_bits));
- strcpy (action, "Flush");
- }
- else
- { /* add another bps bits to the buffer */
- bytebuff1 = bytebuff2 = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- strcpy (action, "Update");
- }
- ready_bits += bps;
-
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Samples %d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, s, src_byte, src_bit, dst - out);
- dump_long (dumpfile, format, "Match bits ", matchbits);
- dump_data (dumpfile, format, "Src bits ", src, 4);
- dump_long (dumpfile, format, "Buff1 bits ", buff1);
- dump_long (dumpfile, format, "Buff2 bits ", buff2);
- dump_byte (dumpfile, format, "Write bits1", bytebuff1);
- dump_byte (dumpfile, format, "Write bits2", bytebuff2);
- dump_info (dumpfile, format, "","Ready bits: %d, %s", ready_bits, action);
- }
- }
- }
-
- /* catch any trailing bits at the end of the line */
- while (ready_bits > 0)
- {
- bytebuff1 = (buff2 >> 24);
- *dst++ = bytebuff1;
-
- buff2 = (buff2 << 8);
- bytebuff2 = bytebuff1;
- ready_bits -= 8;
- }
-
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, src_byte, src_bit, dst - out);
-
- dump_long (dumpfile, format, "Match bits ", matchbits);
- dump_data (dumpfile, format, "Src bits ", src, 4);
- dump_long (dumpfile, format, "Buff1 bits ", buff1);
- dump_long (dumpfile, format, "Buff2 bits ", buff2);
- dump_byte (dumpfile, format, "Write bits1", bytebuff1);
- dump_byte (dumpfile, format, "Write bits2", bytebuff2);
- dump_info (dumpfile, format, "", "Ready bits: %2d", ready_bits);
- }
-
- if ((dumpfile != NULL) && (level == 2))
- {
- dump_info (dumpfile, format, "combineSeparateTileSamples24bits","Output data");
- dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize));
- }
- }
-
- return (0);
- } /* end combineSeparateTileSamples24bits */
-
-static int
-combineSeparateTileSamples32bits (uint8 *in[], uint8 *out, uint32 cols,
- uint32 rows, uint32 imagewidth,
- uint32 tw, uint16 spp, uint16 bps,
- FILE *dumpfile, int format, int level)
- {
- int ready_bits = 0 /*, shift_width = 0 */;
- uint32 src_rowsize, dst_rowsize, bit_offset, src_offset;
- uint32 src_byte = 0, src_bit = 0;
- uint32 row, col;
- uint32 longbuff1 = 0, longbuff2 = 0;
- uint64 maskbits = 0, matchbits = 0;
- uint64 buff1 = 0, buff2 = 0, buff3 = 0;
- uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0;
- tsample_t s;
- unsigned char *src = in[0];
- unsigned char *dst = out;
- char action[8];
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("combineSeparateTileSamples32bits","Invalid input or output buffer");
- return (1);
- }
-
- src_rowsize = ((bps * tw) + 7) / 8;
- dst_rowsize = ((imagewidth * bps * spp) + 7) / 8;
- maskbits = (uint64)-1 >> ( 64 - bps);
- /* shift_width = ((bps + 7) / 8) + 1; */
-
- for (row = 0; row < rows; row++)
- {
- ready_bits = 0;
- buff1 = buff2 = 0;
- dst = out + (row * dst_rowsize);
- src_offset = row * src_rowsize;
- for (col = 0; col < cols; col++)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = col * bps;
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
-
- matchbits = maskbits << (64 - src_bit - bps);
- for (s = 0; s < spp; s++)
- {
- src = in[s] + src_offset + src_byte;
- if (little_endian)
- {
- longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
- longbuff2 = longbuff1;
- }
- else
- {
- longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0];
- longbuff2 = longbuff1;
- }
-
- buff3 = ((uint64)longbuff1 << 32) | longbuff2;
- buff1 = (buff3 & matchbits) << (src_bit);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 32)
- {
- bytebuff1 = (buff2 >> 56);
- *dst++ = bytebuff1;
- bytebuff2 = (buff2 >> 48);
- *dst++ = bytebuff2;
- bytebuff3 = (buff2 >> 40);
- *dst++ = bytebuff3;
- bytebuff4 = (buff2 >> 32);
- *dst++ = bytebuff4;
- ready_bits -= 32;
-
- /* shift in new bits */
- buff2 = ((buff2 << 32) | (buff1 >> ready_bits));
- strcpy (action, "Flush");
- }
- else
- { /* add another bps bits to the buffer */
- bytebuff1 = bytebuff2 = bytebuff3 = bytebuff4 = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- strcpy (action, "Update");
- }
- ready_bits += bps;
-
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Sample %d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, s, src_byte, src_bit, dst - out);
- dump_wide (dumpfile, format, "Match bits ", matchbits);
- dump_data (dumpfile, format, "Src bits ", src, 8);
- dump_wide (dumpfile, format, "Buff1 bits ", buff1);
- dump_wide (dumpfile, format, "Buff2 bits ", buff2);
- dump_info (dumpfile, format, "", "Ready bits: %d, %s", ready_bits, action);
- }
- }
- }
- while (ready_bits > 0)
- {
- bytebuff1 = (buff2 >> 56);
- *dst++ = bytebuff1;
- buff2 = (buff2 << 8);
- ready_bits -= 8;
- }
-
- if ((dumpfile != NULL) && (level == 3))
- {
- dump_info (dumpfile, format, "",
- "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d",
- row + 1, col + 1, src_byte, src_bit, dst - out);
-
- dump_long (dumpfile, format, "Match bits ", matchbits);
- dump_data (dumpfile, format, "Src bits ", src, 4);
- dump_long (dumpfile, format, "Buff1 bits ", buff1);
- dump_long (dumpfile, format, "Buff2 bits ", buff2);
- dump_byte (dumpfile, format, "Write bits1", bytebuff1);
- dump_byte (dumpfile, format, "Write bits2", bytebuff2);
- dump_info (dumpfile, format, "", "Ready bits: %2d", ready_bits);
- }
-
- if ((dumpfile != NULL) && (level == 2))
- {
- dump_info (dumpfile, format, "combineSeparateTileSamples32bits","Output data");
- dump_buffer(dumpfile, format, 1, dst_rowsize, row, out);
- }
- }
-
- return (0);
- } /* end combineSeparateTileSamples32bits */
-
-
-static int readSeparateStripsIntoBuffer (TIFF *in, uint8 *obuf, uint32 length,
- uint32 width, uint16 spp,
- struct dump_opts *dump)
- {
- int i, j, bytes_per_sample, bytes_per_pixel, shift_width, result = 1;
- int32 bytes_read = 0;
- uint16 bps, nstrips, planar, strips_per_sample;
- uint32 src_rowsize, dst_rowsize, rows_processed, rps;
- uint32 rows_this_strip = 0;
- tsample_t s;
- tstrip_t strip;
- tsize_t scanlinesize = TIFFScanlineSize(in);
- tsize_t stripsize = TIFFStripSize(in);
- unsigned char *srcbuffs[MAX_SAMPLES];
- unsigned char *buff = NULL;
- unsigned char *dst = NULL;
-
- if (obuf == NULL)
- {
- TIFFError("readSeparateStripsIntoBuffer","Invalid buffer argument");
- return (0);
- }
-
- memset (srcbuffs, '\0', sizeof(srcbuffs));
- TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bps);
- TIFFGetFieldDefaulted(in, TIFFTAG_PLANARCONFIG, &planar);
- TIFFGetFieldDefaulted(in, TIFFTAG_ROWSPERSTRIP, &rps);
- if (rps > length)
- rps = length;
-
- bytes_per_sample = (bps + 7) / 8;
- bytes_per_pixel = ((bps * spp) + 7) / 8;
- if (bytes_per_pixel < (bytes_per_sample + 1))
- shift_width = bytes_per_pixel;
- else
- shift_width = bytes_per_sample + 1;
-
- src_rowsize = ((bps * width) + 7) / 8;
- dst_rowsize = ((bps * width * spp) + 7) / 8;
- dst = obuf;
-
- if ((dump->infile != NULL) && (dump->level == 3))
- {
- dump_info (dump->infile, dump->format, "",
- "Image width %d, length %d, Scanline size, %4d bytes",
- width, length, scanlinesize);
- dump_info (dump->infile, dump->format, "",
- "Bits per sample %d, Samples per pixel %d, Shift width %d",
- bps, spp, shift_width);
- }
-
- /* Libtiff seems to assume/require that data for separate planes are
- * written one complete plane after another and not interleaved in any way.
- * Multiple scanlines and possibly strips of the same plane must be
- * written before data for any other plane.
- */
- nstrips = TIFFNumberOfStrips(in);
- strips_per_sample = nstrips /spp;
-
- for (s = 0; (s < spp) && (s < MAX_SAMPLES); s++)
- {
- srcbuffs[s] = NULL;
- buff = _TIFFmalloc(stripsize);
- if (!buff)
- {
- TIFFError ("readSeparateStripsIntoBuffer",
- "Unable to allocate strip read buffer for sample %d", s);
- for (i = 0; i < s; i++)
- _TIFFfree (srcbuffs[i]);
- return 0;
- }
- srcbuffs[s] = buff;
- }
-
- rows_processed = 0;
- for (j = 0; (j < strips_per_sample) && (result == 1); j++)
- {
- for (s = 0; (s < spp) && (s < MAX_SAMPLES); s++)
- {
- buff = srcbuffs[s];
- strip = (s * strips_per_sample) + j;
- bytes_read = TIFFReadEncodedStrip (in, strip, buff, stripsize);
- rows_this_strip = bytes_read / src_rowsize;
- if (bytes_read < 0 && !ignore)
- {
- TIFFError(TIFFFileName(in),
- "Error, can't read strip %lu for sample %d",
- (unsigned long) strip, s + 1);
- result = 0;
- break;
- }
-#ifdef DEVELMODE
- TIFFError("", "Strip %2d, read %5d bytes for %4d scanlines, shift width %d",
- strip, bytes_read, rows_this_strip, shift_width);
-#endif
- }
-
- if (rps > rows_this_strip)
- rps = rows_this_strip;
- dst = obuf + (dst_rowsize * rows_processed);
- if ((bps % 8) == 0)
- {
- if (combineSeparateSamplesBytes (srcbuffs, dst, width, rps,
- spp, bps, dump->infile,
- dump->format, dump->level))
- {
- result = 0;
- break;
- }
- }
- else
- {
- switch (shift_width)
- {
- case 1: if (combineSeparateSamples8bits (srcbuffs, dst, width, rps,
- spp, bps, dump->infile,
- dump->format, dump->level))
- {
- result = 0;
- break;
- }
- break;
- case 2: if (combineSeparateSamples16bits (srcbuffs, dst, width, rps,
- spp, bps, dump->infile,
- dump->format, dump->level))
- {
- result = 0;
- break;
- }
- break;
- case 3: if (combineSeparateSamples24bits (srcbuffs, dst, width, rps,
- spp, bps, dump->infile,
- dump->format, dump->level))
- {
- result = 0;
- break;
- }
- break;
- case 4:
- case 5:
- case 6:
- case 7:
- case 8: if (combineSeparateSamples32bits (srcbuffs, dst, width, rps,
- spp, bps, dump->infile,
- dump->format, dump->level))
- {
- result = 0;
- break;
- }
- break;
- default: TIFFError ("readSeparateStripsIntoBuffer", "Unsupported bit depth: %d", bps);
- result = 0;
- break;
- }
- }
-
- if ((rows_processed + rps) > length)
- {
- rows_processed = length;
- rps = length - rows_processed;
- }
- else
- rows_processed += rps;
- }
-
- /* free any buffers allocated for each plane or scanline and
- * any temporary buffers
- */
- for (s = 0; (s < spp) && (s < MAX_SAMPLES); s++)
- {
- buff = srcbuffs[s];
- if (buff != NULL)
- _TIFFfree(buff);
- }
-
- return (result);
- } /* end readSeparateStripsIntoBuffer */
-
-static int
-get_page_geometry (char *name, struct pagedef *page)
- {
- char *ptr;
- int n;
-
- for (ptr = name; *ptr; ptr++)
- *ptr = (char)tolower((int)*ptr);
-
- for (n = 0; n < MAX_PAPERNAMES; n++)
- {
- if (strcmp(name, PaperTable[n].name) == 0)
- {
- page->width = PaperTable[n].width;
- page->length = PaperTable[n].length;
- strncpy (page->name, PaperTable[n].name, 15);
- page->name[15] = '\0';
- return (0);
- }
- }
-
- return (1);
- }
-
-
-static void
-initPageSetup (struct pagedef *page, struct pageseg *pagelist,
- struct buffinfo seg_buffs[])
- {
- int i;
-
- strcpy (page->name, "");
- page->mode = PAGE_MODE_NONE;
- page->res_unit = RESUNIT_NONE;
- page->hres = 0.0;
- page->vres = 0.0;
- page->width = 0.0;
- page->length = 0.0;
- page->hmargin = 0.0;
- page->vmargin = 0.0;
- page->rows = 0;
- page->cols = 0;
- page->orient = ORIENTATION_NONE;
-
- for (i = 0; i < MAX_SECTIONS; i++)
- {
- pagelist[i].x1 = (uint32)0;
- pagelist[i].x2 = (uint32)0;
- pagelist[i].y1 = (uint32)0;
- pagelist[i].y2 = (uint32)0;
- pagelist[i].buffsize = (uint32)0;
- pagelist[i].position = 0;
- pagelist[i].total = 0;
- }
-
- for (i = 0; i < MAX_OUTBUFFS; i++)
- {
- seg_buffs[i].size = 0;
- seg_buffs[i].buffer = NULL;
- }
- }
-
-static void
-initImageData (struct image_data *image)
- {
- image->xres = 0.0;
- image->yres = 0.0;
- image->width = 0;
- image->length = 0;
- image->res_unit = RESUNIT_NONE;
- image->bps = 0;
- image->spp = 0;
- image->planar = 0;
- image->photometric = 0;
- image->orientation = 0;
- image->compression = COMPRESSION_NONE;
- image->adjustments = 0;
- }
-
-static void
-initCropMasks (struct crop_mask *cps)
- {
- int i;
-
- cps->crop_mode = CROP_NONE;
- cps->res_unit = RESUNIT_NONE;
- cps->edge_ref = EDGE_TOP;
- cps->width = 0;
- cps->length = 0;
- for (i = 0; i < 4; i++)
- cps->margins[i] = 0.0;
- cps->bufftotal = (uint32)0;
- cps->combined_width = (uint32)0;
- cps->combined_length = (uint32)0;
- cps->rotation = (uint16)0;
- cps->photometric = INVERT_DATA_AND_TAG;
- cps->mirror = (uint16)0;
- cps->invert = (uint16)0;
- cps->zones = (uint32)0;
- cps->regions = (uint32)0;
- for (i = 0; i < MAX_REGIONS; i++)
- {
- cps->corners[i].X1 = 0.0;
- cps->corners[i].X2 = 0.0;
- cps->corners[i].Y1 = 0.0;
- cps->corners[i].Y2 = 0.0;
- cps->regionlist[i].x1 = 0;
- cps->regionlist[i].x2 = 0;
- cps->regionlist[i].y1 = 0;
- cps->regionlist[i].y2 = 0;
- cps->regionlist[i].width = 0;
- cps->regionlist[i].length = 0;
- cps->regionlist[i].buffsize = 0;
- cps->regionlist[i].buffptr = NULL;
- cps->zonelist[i].position = 0;
- cps->zonelist[i].total = 0;
- }
- cps->exp_mode = ONE_FILE_COMPOSITE;
- cps->img_mode = COMPOSITE_IMAGES;
- }
-
-static void initDumpOptions(struct dump_opts *dump)
- {
- dump->debug = 0;
- dump->format = DUMP_NONE;
- dump->level = 1;
- sprintf (dump->mode, "w");
- memset (dump->infilename, '\0', PATH_MAX + 1);
- memset (dump->outfilename, '\0',PATH_MAX + 1);
- dump->infile = NULL;
- dump->outfile = NULL;
- }
-
-/* Compute pixel offsets into the image for margins and fixed regions */
-static int
-computeInputPixelOffsets(struct crop_mask *crop, struct image_data *image,
- struct offset *off)
- {
- double scale;
- float xres, yres;
- /* Values for these offsets are in pixels from start of image, not bytes,
- * and are indexed from zero to width - 1 or length - 1 */
- uint32 tmargin, bmargin, lmargin, rmargin;
- uint32 startx, endx; /* offsets of first and last columns to extract */
- uint32 starty, endy; /* offsets of first and last row to extract */
- uint32 width, length, crop_width, crop_length;
- uint32 i, max_width, max_length, zwidth, zlength, buffsize;
- uint32 x1, x2, y1, y2;
-
- if (image->res_unit != RESUNIT_INCH && image->res_unit != RESUNIT_CENTIMETER)
- {
- xres = 1.0;
- yres = 1.0;
- }
- else
- {
- if (((image->xres == 0) || (image->yres == 0)) &&
- (crop->res_unit != RESUNIT_NONE) &&
- ((crop->crop_mode & CROP_REGIONS) || (crop->crop_mode & CROP_MARGINS) ||
- (crop->crop_mode & CROP_LENGTH) || (crop->crop_mode & CROP_WIDTH)))
- {
- TIFFError("computeInputPixelOffsets", "Cannot compute margins or fixed size sections without image resolution");
- TIFFError("computeInputPixelOffsets", "Specify units in pixels and try again");
- return (-1);
- }
- xres = image->xres;
- yres = image->yres;
- }
-
- /* Translate user units to image units */
- scale = 1.0;
- switch (crop->res_unit) {
- case RESUNIT_CENTIMETER:
- if (image->res_unit == RESUNIT_INCH)
- scale = 1.0/2.54;
- break;
- case RESUNIT_INCH:
- if (image->res_unit == RESUNIT_CENTIMETER)
- scale = 2.54;
- break;
- case RESUNIT_NONE: /* Dimensions in pixels */
- default:
- break;
- }
-
- if (crop->crop_mode & CROP_REGIONS)
- {
- max_width = max_length = 0;
- for (i = 0; i < crop->regions; i++)
- {
- if ((crop->res_unit == RESUNIT_INCH) || (crop->res_unit == RESUNIT_CENTIMETER))
- {
- x1 = (uint32) (crop->corners[i].X1 * scale * xres);
- x2 = (uint32) (crop->corners[i].X2 * scale * xres);
- y1 = (uint32) (crop->corners[i].Y1 * scale * yres);
- y2 = (uint32) (crop->corners[i].Y2 * scale * yres);
- }
- else
- {
- x1 = (uint32) (crop->corners[i].X1);
- x2 = (uint32) (crop->corners[i].X2);
- y1 = (uint32) (crop->corners[i].Y1);
- y2 = (uint32) (crop->corners[i].Y2);
- }
- if (x1 < 1)
- crop->regionlist[i].x1 = 0;
- else
- crop->regionlist[i].x1 = (uint32) (x1 - 1);
-
- if (x2 > image->width - 1)
- crop->regionlist[i].x2 = image->width - 1;
- else
- crop->regionlist[i].x2 = (uint32) (x2 - 1);
- zwidth = crop->regionlist[i].x2 - crop->regionlist[i].x1 + 1;
-
- if (y1 < 1)
- crop->regionlist[i].y1 = 0;
- else
- crop->regionlist[i].y1 = (uint32) (y1 - 1);
-
- if (y2 > image->length - 1)
- crop->regionlist[i].y2 = image->length - 1;
- else
- crop->regionlist[i].y2 = (uint32) (y2 - 1);
-
- zlength = crop->regionlist[i].y2 - crop->regionlist[i].y1 + 1;
-
- if (zwidth > max_width)
- max_width = zwidth;
- if (zlength > max_length)
- max_length = zlength;
-
- buffsize = (uint32)
- (((zwidth * image->bps * image->spp + 7 ) / 8) * (zlength + 1));
-
- crop->regionlist[i].buffsize = buffsize;
- crop->bufftotal += buffsize;
- if (crop->img_mode == COMPOSITE_IMAGES)
- {
- switch (crop->edge_ref)
- {
- case EDGE_LEFT:
- case EDGE_RIGHT:
- crop->combined_length = zlength;
- crop->combined_width += zwidth;
- break;
- case EDGE_BOTTOM:
- case EDGE_TOP: /* width from left, length from top */
- default:
- crop->combined_width = zwidth;
- crop->combined_length += zlength;
- break;
- }
- }
- }
- return (0);
- }
-
- /* Convert crop margins into offsets into image
- * Margins are expressed as pixel rows and columns, not bytes
- */
- if (crop->crop_mode & CROP_MARGINS)
- {
- if (crop->res_unit != RESUNIT_INCH && crop->res_unit != RESUNIT_CENTIMETER)
- { /* User has specified pixels as reference unit */
- tmargin = (uint32)(crop->margins[0]);
- lmargin = (uint32)(crop->margins[1]);
- bmargin = (uint32)(crop->margins[2]);
- rmargin = (uint32)(crop->margins[3]);
- }
- else
- { /* inches or centimeters specified */
- tmargin = (uint32)(crop->margins[0] * scale * yres);
- lmargin = (uint32)(crop->margins[1] * scale * xres);
- bmargin = (uint32)(crop->margins[2] * scale * yres);
- rmargin = (uint32)(crop->margins[3] * scale * xres);
- }
-
- if ((lmargin + rmargin) > image->width)
- {
- TIFFError("computeInputPixelOffsets", "Combined left and right margins exceed image width");
- lmargin = (uint32) 0;
- rmargin = (uint32) 0;
- return (-1);
- }
- if ((tmargin + bmargin) > image->length)
- {
- TIFFError("computeInputPixelOffsets", "Combined top and bottom margins exceed image length");
- tmargin = (uint32) 0;
- bmargin = (uint32) 0;
- return (-1);
- }
- }
- else
- { /* no margins requested */
- tmargin = (uint32) 0;
- lmargin = (uint32) 0;
- bmargin = (uint32) 0;
- rmargin = (uint32) 0;
- }
-
- /* Width, height, and margins are expressed as pixel offsets into image */
- if (crop->res_unit != RESUNIT_INCH && crop->res_unit != RESUNIT_CENTIMETER)
- {
- if (crop->crop_mode & CROP_WIDTH)
- width = (uint32)crop->width;
- else
- width = image->width - lmargin - rmargin;
-
- if (crop->crop_mode & CROP_LENGTH)
- length = (uint32)crop->length;
- else
- length = image->length - tmargin - bmargin;
- }
- else
- {
- if (crop->crop_mode & CROP_WIDTH)
- width = (uint32)(crop->width * scale * image->xres);
- else
- width = image->width - lmargin - rmargin;
-
- if (crop->crop_mode & CROP_LENGTH)
- length = (uint32)(crop->length * scale * image->yres);
- else
- length = image->length - tmargin - bmargin;
- }
-
- off->tmargin = tmargin;
- off->bmargin = bmargin;
- off->lmargin = lmargin;
- off->rmargin = rmargin;
-
- /* Calculate regions defined by margins, width, and length.
- * Coordinates expressed as 0 to imagewidth - 1, imagelength - 1,
- * since they are used to compute offsets into buffers */
- switch (crop->edge_ref) {
- case EDGE_BOTTOM:
- startx = lmargin;
- if ((startx + width) >= (image->width - rmargin))
- endx = image->width - rmargin - 1;
- else
- endx = startx + width - 1;
-
- endy = image->length - bmargin - 1;
- if ((endy - length) <= tmargin)
- starty = tmargin;
- else
- starty = endy - length + 1;
- break;
- case EDGE_RIGHT:
- endx = image->width - rmargin - 1;
- if ((endx - width) <= lmargin)
- startx = lmargin;
- else
- startx = endx - width + 1;
-
- starty = tmargin;
- if ((starty + length) >= (image->length - bmargin))
- endy = image->length - bmargin - 1;
- else
- endy = starty + length - 1;
- break;
- case EDGE_TOP: /* width from left, length from top */
- case EDGE_LEFT:
- default:
- startx = lmargin;
- if ((startx + width) >= (image->width - rmargin))
- endx = image->width - rmargin - 1;
- else
- endx = startx + width - 1;
-
- starty = tmargin;
- if ((starty + length) >= (image->length - bmargin))
- endy = image->length - bmargin - 1;
- else
- endy = starty + length - 1;
- break;
- }
- off->startx = startx;
- off->starty = starty;
- off->endx = endx;
- off->endy = endy;
-
- crop_width = endx - startx + 1;
- crop_length = endy - starty + 1;
-
- if (crop_width <= 0)
- {
- TIFFError("computeInputPixelOffsets",
- "Invalid left/right margins and /or image crop width requested");
- return (-1);
- }
- if (crop_width > image->width)
- crop_width = image->width;
-
- if (crop_length <= 0)
- {
- TIFFError("computeInputPixelOffsets",
- "Invalid top/bottom margins and /or image crop length requested");
- return (-1);
- }
- if (crop_length > image->length)
- crop_length = image->length;
-
- off->crop_width = crop_width;
- off->crop_length = crop_length;
-
- return (0);
- } /* end computeInputPixelOffsets */
-
-/*
- * Translate crop options into pixel offsets for one or more regions of the image.
- * Options are applied in this order: margins, specific width and length, zones,
- * but all are optional. Margins are relative to each edge. Width, length and
- * zones are relative to the specified reference edge. Zones are expressed as
- * X:Y where X is the ordinal value in a set of Y equal sized portions. eg.
- * 2:3 would indicate the middle third of the region qualified by margins and
- * any explicit width and length specified. Regions are specified by coordinates
- * of the top left and lower right corners with range 1 to width or height.
- */
-
-static int
-getCropOffsets(struct image_data *image, struct crop_mask *crop, struct dump_opts *dump)
- {
- struct offset offsets;
- int i;
- int32 test;
- uint32 seg, total, need_buff = 0;
- uint32 buffsize;
- uint32 zwidth, zlength;
-
- memset(&offsets, '\0', sizeof(struct offset));
- crop->bufftotal = 0;
- crop->combined_width = (uint32)0;
- crop->combined_length = (uint32)0;
- crop->selections = 0;
-
- /* Compute pixel offsets if margins or fixed width or length specified */
- if ((crop->crop_mode & CROP_MARGINS) ||
- (crop->crop_mode & CROP_REGIONS) ||
- (crop->crop_mode & CROP_LENGTH) ||
- (crop->crop_mode & CROP_WIDTH))
- {
- if (computeInputPixelOffsets(crop, image, &offsets))
- {
- TIFFError ("getCropOffsets", "Unable to compute crop margins");
- return (-1);
- }
- need_buff = TRUE;
- crop->selections = crop->regions;
- /* Regions are only calculated from top and left edges with no margins */
- if (crop->crop_mode & CROP_REGIONS)
- return (0);
- }
- else
- { /* cropped area is the full image */
- offsets.tmargin = 0;
- offsets.lmargin = 0;
- offsets.bmargin = 0;
- offsets.rmargin = 0;
- offsets.crop_width = image->width;
- offsets.crop_length = image->length;
- offsets.startx = 0;
- offsets.endx = image->width - 1;
- offsets.starty = 0;
- offsets.endy = image->length - 1;
- need_buff = FALSE;
- }
-
- if (dump->outfile != NULL)
- {
- dump_info (dump->outfile, dump->format, "", "Margins: Top: %d Left: %d Bottom: %d Right: %d",
- offsets.tmargin, offsets.lmargin, offsets.bmargin, offsets.rmargin);
- dump_info (dump->outfile, dump->format, "", "Crop region within margins: Adjusted Width: %6d Length: %6d",
- offsets.crop_width, offsets.crop_length);
- }
-
- if (!(crop->crop_mode & CROP_ZONES)) /* no crop zones requested */
- {
- if (need_buff == FALSE) /* No margins or fixed width or length areas */
- {
- crop->selections = 0;
- crop->combined_width = image->width;
- crop->combined_length = image->length;
- return (0);
- }
- else
- {
- /* Use one region for margins and fixed width or length areas
- * even though it was not formally declared as a region.
- */
- crop->selections = 1;
- crop->zones = 1;
- crop->zonelist[0].total = 1;
- crop->zonelist[0].position = 1;
- }
- }
- else
- crop->selections = crop->zones;
-
- for (i = 0; i < crop->zones; i++)
- {
- seg = crop->zonelist[i].position;
- total = crop->zonelist[i].total;
-
- switch (crop->edge_ref)
- {
- case EDGE_LEFT: /* zones from left to right, length from top */
- zlength = offsets.crop_length;
- crop->regionlist[i].y1 = offsets.starty;
- crop->regionlist[i].y2 = offsets.endy;
-
- crop->regionlist[i].x1 = offsets.startx +
- (uint32)(offsets.crop_width * 1.0 * (seg - 1) / total);
- test = (int32)offsets.startx +
- (int32)(offsets.crop_width * 1.0 * seg / total);
- if (test < 1 )
- crop->regionlist[i].x2 = 0;
- else
- {
- if (test > (int32)(image->width - 1))
- crop->regionlist[i].x2 = image->width - 1;
- else
- crop->regionlist[i].x2 = test - 1;
- }
- zwidth = crop->regionlist[i].x2 - crop->regionlist[i].x1 + 1;
-
- /* This is passed to extractCropZone or extractCompositeZones */
- crop->combined_length = (uint32)zlength;
- if (crop->exp_mode == COMPOSITE_IMAGES)
- crop->combined_width += (uint32)zwidth;
- else
- crop->combined_width = (uint32)zwidth;
- break;
- case EDGE_BOTTOM: /* width from left, zones from bottom to top */
- zwidth = offsets.crop_width;
- crop->regionlist[i].x1 = offsets.startx;
- crop->regionlist[i].x2 = offsets.endx;
-
- test = offsets.endy - (uint32)(offsets.crop_length * 1.0 * seg / total);
- if (test < 1 )
- crop->regionlist[i].y1 = 0;
- else
- crop->regionlist[i].y1 = test + 1;
-
- test = offsets.endy - (offsets.crop_length * 1.0 * (seg - 1) / total);
- if (test < 1 )
- crop->regionlist[i].y2 = 0;
- else
- {
- if (test > (int32)(image->length - 1))
- crop->regionlist[i].y2 = image->length - 1;
- else
- crop->regionlist[i].y2 = test;
- }
- zlength = crop->regionlist[i].y2 - crop->regionlist[i].y1 + 1;
-
- /* This is passed to extractCropZone or extractCompositeZones */
- if (crop->exp_mode == COMPOSITE_IMAGES)
- crop->combined_length += (uint32)zlength;
- else
- crop->combined_length = (uint32)zlength;
- crop->combined_width = (uint32)zwidth;
- break;
- case EDGE_RIGHT: /* zones from right to left, length from top */
- zlength = offsets.crop_length;
- crop->regionlist[i].y1 = offsets.starty;
- crop->regionlist[i].y2 = offsets.endy;
-
- crop->regionlist[i].x1 = offsets.startx +
- (uint32)(offsets.crop_width * (total - seg) * 1.0 / total);
- test = offsets.startx +
- (offsets.crop_width * (total - seg + 1) * 1.0 / total);
- if (test < 1 )
- crop->regionlist[i].x2 = 0;
- else
- {
- if (test > (int32)(image->width - 1))
- crop->regionlist[i].x2 = image->width - 1;
- else
- crop->regionlist[i].x2 = test - 1;
- }
- zwidth = crop->regionlist[i].x2 - crop->regionlist[i].x1 + 1;
-
- /* This is passed to extractCropZone or extractCompositeZones */
- crop->combined_length = (uint32)zlength;
- if (crop->exp_mode == COMPOSITE_IMAGES)
- crop->combined_width += (uint32)zwidth;
- else
- crop->combined_width = (uint32)zwidth;
- break;
- case EDGE_TOP: /* width from left, zones from top to bottom */
- default:
- zwidth = offsets.crop_width;
- crop->regionlist[i].x1 = offsets.startx;
- crop->regionlist[i].x2 = offsets.endx;
-
- crop->regionlist[i].y1 = offsets.starty + (uint32)(offsets.crop_length * 1.0 * (seg - 1) / total);
- test = offsets.starty + (uint32)(offsets.crop_length * 1.0 * seg / total);
- if (test < 1 )
- crop->regionlist[i].y2 = 0;
- else
- {
- if (test > (int32)(image->length - 1))
- crop->regionlist[i].y2 = image->length - 1;
- else
- crop->regionlist[i].y2 = test - 1;
- }
- zlength = crop->regionlist[i].y2 - crop->regionlist[i].y1 + 1;
-
- /* This is passed to extractCropZone or extractCompositeZones */
- if (crop->exp_mode == COMPOSITE_IMAGES)
- crop->combined_length += (uint32)zlength;
- else
- crop->combined_length = (uint32)zlength;
- crop->combined_width = (uint32)zwidth;
- break;
- } /* end switch statement */
-
- buffsize = (uint32)
- ((((zwidth * image->bps * image->spp) + 7 ) / 8) * (zlength + 1));
- crop->regionlist[i].width = (uint32) zwidth;
- crop->regionlist[i].length = (uint32) zlength;
- crop->regionlist[i].buffsize = buffsize;
- crop->bufftotal += buffsize;
-
-
- if (dump->outfile != NULL)
- dump_info (dump->outfile, dump->format, "", "Zone %d, width: %4d, length: %4d, x1: %4d x2: %4d y1: %4d y2: %4d",
- i + 1, (uint32)zwidth, (uint32)zlength,
- crop->regionlist[i].x1, crop->regionlist[i].x2,
- crop->regionlist[i].y1, crop->regionlist[i].y2);
- }
-
- return (0);
- } /* end getCropOffsets */
-
-
-static int
-computeOutputPixelOffsets (struct crop_mask *crop, struct image_data *image,
- struct pagedef *page, struct pageseg *sections,
- struct dump_opts* dump)
- {
- double scale;
- double pwidth, plength; /* Output page width and length in user units*/
- uint32 iwidth, ilength; /* Input image width and length in pixels*/
- uint32 owidth, olength; /* Output image width and length in pixels*/
- uint32 orows, ocols; /* rows and cols for output */
- uint32 hmargin, vmargin; /* Horizontal and vertical margins */
- uint32 x1, x2, y1, y2, line_bytes;
- /* unsigned int orientation; */
- uint32 i, j, k;
-
- scale = 1.0;
- if (page->res_unit == RESUNIT_NONE)
- page->res_unit = image->res_unit;
-
- switch (image->res_unit) {
- case RESUNIT_CENTIMETER:
- if (page->res_unit == RESUNIT_INCH)
- scale = 1.0/2.54;
- break;
- case RESUNIT_INCH:
- if (page->res_unit == RESUNIT_CENTIMETER)
- scale = 2.54;
- break;
- case RESUNIT_NONE: /* Dimensions in pixels */
- default:
- break;
- }
-
- /* get width, height, resolutions of input image selection */
- if (crop->combined_width > 0)
- iwidth = crop->combined_width;
- else
- iwidth = image->width;
- if (crop->combined_length > 0)
- ilength = crop->combined_length;
- else
- ilength = image->length;
-
- if (page->hres <= 1.0)
- page->hres = image->xres;
- if (page->vres <= 1.0)
- page->vres = image->yres;
-
- if ((page->hres < 1.0) || (page->vres < 1.0))
- {
- TIFFError("computeOutputPixelOffsets",
- "Invalid horizontal or vertical resolution specified or read from input image");
- return (1);
- }
-
- /* If no page sizes are being specified, we just use the input image size to
- * calculate maximum margins that can be taken from image.
- */
- if (page->width <= 0)
- pwidth = iwidth;
- else
- pwidth = page->width;
-
- if (page->length <= 0)
- plength = ilength;
- else
- plength = page->length;
-
- if (dump->debug)
- {
- TIFFError("", "Page size: %s, Vres: %3.2f, Hres: %3.2f, "
- "Hmargin: %3.2f, Vmargin: %3.2f",
- page->name, page->vres, page->hres,
- page->hmargin, page->vmargin);
- TIFFError("", "Res_unit: %d, Scale: %3.2f, Page width: %3.2f, length: %3.2f",
- page->res_unit, scale, pwidth, plength);
- }
-
- /* compute margins at specified unit and resolution */
- if (page->mode & PAGE_MODE_MARGINS)
- {
- if (page->res_unit == RESUNIT_INCH || page->res_unit == RESUNIT_CENTIMETER)
- { /* inches or centimeters specified */
- hmargin = (uint32)(page->hmargin * scale * page->hres * ((image->bps + 7)/ 8));
- vmargin = (uint32)(page->vmargin * scale * page->vres * ((image->bps + 7)/ 8));
- }
- else
- { /* Otherwise user has specified pixels as reference unit */
- hmargin = (uint32)(page->hmargin * scale * ((image->bps + 7)/ 8));
- vmargin = (uint32)(page->vmargin * scale * ((image->bps + 7)/ 8));
- }
-
- if ((hmargin * 2.0) > (pwidth * page->hres))
- {
- TIFFError("computeOutputPixelOffsets",
- "Combined left and right margins exceed page width");
- hmargin = (uint32) 0;
- return (-1);
- }
- if ((vmargin * 2.0) > (plength * page->vres))
- {
- TIFFError("computeOutputPixelOffsets",
- "Combined top and bottom margins exceed page length");
- vmargin = (uint32) 0;
- return (-1);
- }
- }
- else
- {
- hmargin = 0;
- vmargin = 0;
- }
-
- if (page->mode & PAGE_MODE_ROWSCOLS )
- {
- /* Maybe someday but not for now */
- if (page->mode & PAGE_MODE_MARGINS)
- TIFFError("computeOutputPixelOffsets",
- "Output margins cannot be specified with rows and columns");
-
- owidth = TIFFhowmany(iwidth, page->cols);
- olength = TIFFhowmany(ilength, page->rows);
- }
- else
- {
- if (page->mode & PAGE_MODE_PAPERSIZE )
- {
- owidth = (uint32)((pwidth * page->hres) - (hmargin * 2));
- olength = (uint32)((plength * page->vres) - (vmargin * 2));
- }
- else
- {
- owidth = (uint32)(iwidth - (hmargin * 2 * page->hres));
- olength = (uint32)(ilength - (vmargin * 2 * page->vres));
- }
- }
-
- if (owidth > iwidth)
- owidth = iwidth;
- if (olength > ilength)
- olength = ilength;
-
- /* Compute the number of pages required for Portrait or Landscape */
- switch (page->orient)
- {
- case ORIENTATION_NONE:
- case ORIENTATION_PORTRAIT:
- ocols = TIFFhowmany(iwidth, owidth);
- orows = TIFFhowmany(ilength, olength);
- /* orientation = ORIENTATION_PORTRAIT; */
- break;
-
- case ORIENTATION_LANDSCAPE:
- ocols = TIFFhowmany(iwidth, olength);
- orows = TIFFhowmany(ilength, owidth);
- x1 = olength;
- olength = owidth;
- owidth = x1;
- /* orientation = ORIENTATION_LANDSCAPE; */
- break;
-
- case ORIENTATION_AUTO:
- default:
- x1 = TIFFhowmany(iwidth, owidth);
- x2 = TIFFhowmany(ilength, olength);
- y1 = TIFFhowmany(iwidth, olength);
- y2 = TIFFhowmany(ilength, owidth);
-
- if ( (x1 * x2) < (y1 * y2))
- { /* Portrait */
- ocols = x1;
- orows = x2;
- /* orientation = ORIENTATION_PORTRAIT; */
- }
- else
- { /* Landscape */
- ocols = y1;
- orows = y2;
- x1 = olength;
- olength = owidth;
- owidth = x1;
- /* orientation = ORIENTATION_LANDSCAPE; */
- }
- }
-
- if (ocols < 1)
- ocols = 1;
- if (orows < 1)
- orows = 1;
-
- /* If user did not specify rows and cols, set them from calcuation */
- if (page->rows < 1)
- page->rows = orows;
- if (page->cols < 1)
- page->cols = ocols;
-
- line_bytes = TIFFhowmany8(owidth * image->bps) * image->spp;
-
- if ((page->rows * page->cols) > MAX_SECTIONS)
- {
- TIFFError("computeOutputPixelOffsets",
- "Rows and Columns exceed maximum sections\nIncrease resolution or reduce sections");
- return (-1);
- }
-
- /* build the list of offsets for each output section */
- for (k = 0, i = 0 && k <= MAX_SECTIONS; i < orows; i++)
- {
- y1 = (uint32)(olength * i);
- y2 = (uint32)(olength * (i + 1) - 1);
- if (y2 >= ilength)
- y2 = ilength - 1;
- for (j = 0; j < ocols; j++, k++)
- {
- x1 = (uint32)(owidth * j);
- x2 = (uint32)(owidth * (j + 1) - 1);
- if (x2 >= iwidth)
- x2 = iwidth - 1;
- sections[k].x1 = x1;
- sections[k].x2 = x2;
- sections[k].y1 = y1;
- sections[k].y2 = y2;
- sections[k].buffsize = line_bytes * olength;
- sections[k].position = k + 1;
- sections[k].total = orows * ocols;
- }
- }
- return (0);
- } /* end computeOutputPixelOffsets */
-
-static int
-loadImage(TIFF* in, struct image_data *image, struct dump_opts *dump, unsigned char **read_ptr)
- {
- uint32 i;
- float xres = 0.0, yres = 0.0;
- uint16 nstrips = 0, ntiles = 0, planar = 0;
- uint16 bps = 0, spp = 0, res_unit = 0;
- uint16 orientation = 0;
- uint16 input_compression = 0, input_photometric = 0;
- uint16 subsampling_horiz, subsampling_vert;
- uint32 width = 0, length = 0;
- uint32 stsize = 0, tlsize = 0, buffsize = 0, scanlinesize = 0;
- uint32 tw = 0, tl = 0; /* Tile width and length */
- uint32 tile_rowsize = 0;
- unsigned char *read_buff = NULL;
- unsigned char *new_buff = NULL;
- int readunit = 0;
- static uint32 prev_readsize = 0;
-
- TIFFGetFieldDefaulted(in, TIFFTAG_BITSPERSAMPLE, &bps);
- TIFFGetFieldDefaulted(in, TIFFTAG_SAMPLESPERPIXEL, &spp);
- TIFFGetFieldDefaulted(in, TIFFTAG_PLANARCONFIG, &planar);
- TIFFGetFieldDefaulted(in, TIFFTAG_ORIENTATION, &orientation);
- if (! TIFFGetFieldDefaulted(in, TIFFTAG_PHOTOMETRIC, &input_photometric))
- TIFFError("loadImage","Image lacks Photometric interpreation tag");
- if (! TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width))
- TIFFError("loadimage","Image lacks image width tag");
- if(! TIFFGetField(in, TIFFTAG_IMAGELENGTH, &length))
- TIFFError("loadimage","Image lacks image length tag");
- TIFFGetFieldDefaulted(in, TIFFTAG_XRESOLUTION, &xres);
- TIFFGetFieldDefaulted(in, TIFFTAG_YRESOLUTION, &yres);
- if (!TIFFGetFieldDefaulted(in, TIFFTAG_RESOLUTIONUNIT, &res_unit))
- res_unit = RESUNIT_INCH;
- if (!TIFFGetField(in, TIFFTAG_COMPRESSION, &input_compression))
- input_compression = COMPRESSION_NONE;
-
-#ifdef DEBUG2
- char compressionid[16];
-
- switch (input_compression)
- {
- case COMPRESSION_NONE: /* 1 dump mode */
- strcpy (compressionid, "None/dump");
- break;
- case COMPRESSION_CCITTRLE: /* 2 CCITT modified Huffman RLE */
- strcpy (compressionid, "Huffman RLE");
- break;
- case COMPRESSION_CCITTFAX3: /* 3 CCITT Group 3 fax encoding */
- strcpy (compressionid, "Group3 Fax");
- break;
- case COMPRESSION_CCITTFAX4: /* 4 CCITT Group 4 fax encoding */
- strcpy (compressionid, "Group4 Fax");
- break;
- case COMPRESSION_LZW: /* 5 Lempel-Ziv & Welch */
- strcpy (compressionid, "LZW");
- break;
- case COMPRESSION_OJPEG: /* 6 !6.0 JPEG */
- strcpy (compressionid, "Old Jpeg");
- break;
- case COMPRESSION_JPEG: /* 7 %JPEG DCT compression */
- strcpy (compressionid, "New Jpeg");
- break;
- case COMPRESSION_NEXT: /* 32766 NeXT 2-bit RLE */
- strcpy (compressionid, "Next RLE");
- break;
- case COMPRESSION_CCITTRLEW: /* 32771 #1 w/ word alignment */
- strcpy (compressionid, "CITTRLEW");
- break;
- case COMPRESSION_PACKBITS: /* 32773 Macintosh RLE */
- strcpy (compressionid, "Mac Packbits");
- break;
- case COMPRESSION_THUNDERSCAN: /* 32809 ThunderScan RLE */
- strcpy (compressionid, "Thunderscan");
- break;
- case COMPRESSION_IT8CTPAD: /* 32895 IT8 CT w/padding */
- strcpy (compressionid, "IT8 padded");
- break;
- case COMPRESSION_IT8LW: /* 32896 IT8 Linework RLE */
- strcpy (compressionid, "IT8 RLE");
- break;
- case COMPRESSION_IT8MP: /* 32897 IT8 Monochrome picture */
- strcpy (compressionid, "IT8 mono");
- break;
- case COMPRESSION_IT8BL: /* 32898 IT8 Binary line art */
- strcpy (compressionid, "IT8 lineart");
- break;
- case COMPRESSION_PIXARFILM: /* 32908 Pixar companded 10bit LZW */
- strcpy (compressionid, "Pixar 10 bit");
- break;
- case COMPRESSION_PIXARLOG: /* 32909 Pixar companded 11bit ZIP */
- strcpy (compressionid, "Pixar 11bit");
- break;
- case COMPRESSION_DEFLATE: /* 32946 Deflate compression */
- strcpy (compressionid, "Deflate");
- break;
- case COMPRESSION_ADOBE_DEFLATE: /* 8 Deflate compression */
- strcpy (compressionid, "Adobe deflate");
- break;
- default:
- strcpy (compressionid, "None/unknown");
- break;
- }
- TIFFError("loadImage", "Input compression %s", compressionid);
-#endif
-
- scanlinesize = TIFFScanlineSize(in);
- image->bps = bps;
- image->spp = spp;
- image->planar = planar;
- image->width = width;
- image->length = length;
- image->xres = xres;
- image->yres = yres;
- image->res_unit = res_unit;
- image->compression = input_compression;
- image->photometric = input_photometric;
-#ifdef DEBUG2
- char photometricid[12];
-
- switch (input_photometric)
- {
- case PHOTOMETRIC_MINISWHITE:
- strcpy (photometricid, "MinIsWhite");
- break;
- case PHOTOMETRIC_MINISBLACK:
- strcpy (photometricid, "MinIsBlack");
- break;
- case PHOTOMETRIC_RGB:
- strcpy (photometricid, "RGB");
- break;
- case PHOTOMETRIC_PALETTE:
- strcpy (photometricid, "Palette");
- break;
- case PHOTOMETRIC_MASK:
- strcpy (photometricid, "Mask");
- break;
- case PHOTOMETRIC_SEPARATED:
- strcpy (photometricid, "Separated");
- break;
- case PHOTOMETRIC_YCBCR:
- strcpy (photometricid, "YCBCR");
- break;
- case PHOTOMETRIC_CIELAB:
- strcpy (photometricid, "CIELab");
- break;
- case PHOTOMETRIC_ICCLAB:
- strcpy (photometricid, "ICCLab");
- break;
- case PHOTOMETRIC_ITULAB:
- strcpy (photometricid, "ITULab");
- break;
- case PHOTOMETRIC_LOGL:
- strcpy (photometricid, "LogL");
- break;
- case PHOTOMETRIC_LOGLUV:
- strcpy (photometricid, "LOGLuv");
- break;
- default:
- strcpy (photometricid, "Unknown");
- break;
- }
- TIFFError("loadImage", "Input photometric interpretation %s", photometricid);
-
-#endif
- image->orientation = orientation;
- switch (orientation)
- {
- case 0:
- case ORIENTATION_TOPLEFT:
- image->adjustments = 0;
- break;
- case ORIENTATION_TOPRIGHT:
- image->adjustments = MIRROR_HORIZ;
- break;
- case ORIENTATION_BOTRIGHT:
- image->adjustments = ROTATECW_180;
- break;
- case ORIENTATION_BOTLEFT:
- image->adjustments = MIRROR_VERT;
- break;
- case ORIENTATION_LEFTTOP:
- image->adjustments = MIRROR_VERT | ROTATECW_90;
- break;
- case ORIENTATION_RIGHTTOP:
- image->adjustments = ROTATECW_90;
- break;
- case ORIENTATION_RIGHTBOT:
- image->adjustments = MIRROR_VERT | ROTATECW_270;
- break;
- case ORIENTATION_LEFTBOT:
- image->adjustments = ROTATECW_270;
- break;
- default:
- image->adjustments = 0;
- image->orientation = ORIENTATION_TOPLEFT;
- }
-
- if ((bps == 0) || (spp == 0))
- {
- TIFFError("loadImage", "Invalid samples per pixel (%d) or bits per sample (%d)",
- spp, bps);
- return (-1);
- }
-
- if (TIFFIsTiled(in))
- {
- readunit = TILE;
- tlsize = TIFFTileSize(in);
- ntiles = TIFFNumberOfTiles(in);
- TIFFGetField(in, TIFFTAG_TILEWIDTH, &tw);
- TIFFGetField(in, TIFFTAG_TILELENGTH, &tl);
-
- tile_rowsize = TIFFTileRowSize(in);
- buffsize = tlsize * ntiles;
-
-
- if (buffsize < (uint32)(ntiles * tl * tile_rowsize))
- {
- buffsize = ntiles * tl * tile_rowsize;
-#ifdef DEBUG2
- TIFFError("loadImage",
- "Tilesize %u is too small, using ntiles * tilelength * tilerowsize %lu",
- tlsize, (unsigned long)buffsize);
-#endif
- }
-
- if (dump->infile != NULL)
- dump_info (dump->infile, dump->format, "",
- "Tilesize: %u, Number of Tiles: %u, Tile row size: %u",
- tlsize, ntiles, tile_rowsize);
- }
- else
- {
- readunit = STRIP;
- TIFFGetFieldDefaulted(in, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
- stsize = TIFFStripSize(in);
- nstrips = TIFFNumberOfStrips(in);
- buffsize = stsize * nstrips;
-
- if (buffsize < (uint32) (((length * width * spp * bps) + 7) / 8))
- {
- buffsize = ((length * width * spp * bps) + 7) / 8;
-#ifdef DEBUG2
- TIFFError("loadImage",
- "Stripsize %u is too small, using imagelength * width * spp * bps / 8 = %lu",
- stsize, (unsigned long)buffsize);
-#endif
- }
-
- if (dump->infile != NULL)
- dump_info (dump->infile, dump->format, "",
- "Stripsize: %u, Number of Strips: %u, Rows per Strip: %u, Scanline size: %u",
- stsize, nstrips, rowsperstrip, scanlinesize);
- }
-
- if (input_compression == COMPRESSION_JPEG)
- { /* Force conversion to RGB */
- jpegcolormode = JPEGCOLORMODE_RGB;
- TIFFSetField(in, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
- }
- /* The clause up to the read statement is taken from Tom Lane's tiffcp patch */
- else
- { /* Otherwise, can't handle subsampled input */
- if (input_photometric == PHOTOMETRIC_YCBCR)
- {
- TIFFGetFieldDefaulted(in, TIFFTAG_YCBCRSUBSAMPLING,
- &subsampling_horiz, &subsampling_vert);
- if (subsampling_horiz != 1 || subsampling_vert != 1)
- {
- TIFFError("loadImage",
- "Can't copy/convert subsampled image with subsampling %d horiz %d vert",
- subsampling_horiz, subsampling_vert);
- return (-1);
- }
- }
- }
-
- read_buff = *read_ptr;
- /* +3 : add a few guard bytes since reverseSamples16bits() can read a bit */
- /* outside buffer */
- if (!read_buff)
- read_buff = (unsigned char *)_TIFFmalloc(buffsize+3);
- else
- {
- if (prev_readsize < buffsize)
- {
- new_buff = _TIFFrealloc(read_buff, buffsize);
- if (!new_buff)
- {
- free (read_buff);
- read_buff = (unsigned char *)_TIFFmalloc(buffsize+3);
- }
- else
- read_buff = new_buff;
- }
- }
- read_buff[buffsize] = 0;
- read_buff[buffsize+1] = 0;
- read_buff[buffsize+2] = 0;
-
- if (!read_buff)
- {
- TIFFError("loadImage", "Unable to allocate/reallocate read buffer");
- return (-1);
- }
-
- prev_readsize = buffsize;
- *read_ptr = read_buff;
-
- /* N.B. The read functions used copy separate plane data into a buffer as interleaved
- * samples rather than separate planes so the same logic works to extract regions
- * regardless of the way the data are organized in the input file.
- */
- switch (readunit) {
- case STRIP:
- if (planar == PLANARCONFIG_CONTIG)
- {
- if (!(readContigStripsIntoBuffer(in, read_buff)))
- {
- TIFFError("loadImage", "Unable to read contiguous strips into buffer");
- return (-1);
- }
- }
- else
- {
- if (!(readSeparateStripsIntoBuffer(in, read_buff, length, width, spp, dump)))
- {
- TIFFError("loadImage", "Unable to read separate strips into buffer");
- return (-1);
- }
- }
- break;
-
- case TILE:
- if (planar == PLANARCONFIG_CONTIG)
- {
- if (!(readContigTilesIntoBuffer(in, read_buff, length, width, tw, tl, spp, bps)))
- {
- TIFFError("loadImage", "Unable to read contiguous tiles into buffer");
- return (-1);
- }
- }
- else
- {
- if (!(readSeparateTilesIntoBuffer(in, read_buff, length, width, tw, tl, spp, bps)))
- {
- TIFFError("loadImage", "Unable to read separate tiles into buffer");
- return (-1);
- }
- }
- break;
- default: TIFFError("loadImage", "Unsupported image file format");
- return (-1);
- break;
- }
- if ((dump->infile != NULL) && (dump->level == 2))
- {
- dump_info (dump->infile, dump->format, "loadImage",
- "Image width %d, length %d, Raw image data, %4d bytes",
- width, length, buffsize);
- dump_info (dump->infile, dump->format, "",
- "Bits per sample %d, Samples per pixel %d", bps, spp);
-
- for (i = 0; i < length; i++)
- dump_buffer(dump->infile, dump->format, 1, scanlinesize,
- i, read_buff + (i * scanlinesize));
- }
- return (0);
- } /* end loadImage */
-
-static int correct_orientation(struct image_data *image, unsigned char **work_buff_ptr)
- {
- uint16 mirror, rotation;
- unsigned char *work_buff;
-
- work_buff = *work_buff_ptr;
- if ((image == NULL) || (work_buff == NULL))
- {
- TIFFError ("correct_orientatin", "Invalid image or buffer pointer");
- return (-1);
- }
-
- if ((image->adjustments & MIRROR_HORIZ) || (image->adjustments & MIRROR_VERT))
- {
- mirror = (uint16)(image->adjustments & MIRROR_BOTH);
- if (mirrorImage(image->spp, image->bps, mirror,
- image->width, image->length, work_buff))
- {
- TIFFError ("correct_orientation", "Unable to mirror image");
- return (-1);
- }
- }
-
- if (image->adjustments & ROTATE_ANY)
- {
- if (image->adjustments & ROTATECW_90)
- rotation = (uint16) 90;
- else
- if (image->adjustments & ROTATECW_180)
- rotation = (uint16) 180;
- else
- if (image->adjustments & ROTATECW_270)
- rotation = (uint16) 270;
- else
- {
- TIFFError ("correct_orientation", "Invalid rotation value: %d",
- image->adjustments & ROTATE_ANY);
- return (-1);
- }
-
- if (rotateImage(rotation, image, &image->width, &image->length, work_buff_ptr))
- {
- TIFFError ("correct_orientation", "Unable to rotate image");
- return (-1);
- }
- image->orientation = ORIENTATION_TOPLEFT;
- }
-
- return (0);
- } /* end correct_orientation */
-
-
-/* Extract multiple zones from an image and combine into a single composite image */
-static int
-extractCompositeRegions(struct image_data *image, struct crop_mask *crop,
- unsigned char *read_buff, unsigned char *crop_buff)
- {
- int shift_width, bytes_per_sample, bytes_per_pixel;
- uint32 i, trailing_bits, prev_trailing_bits;
- uint32 row, first_row, last_row, first_col, last_col;
- uint32 src_rowsize, dst_rowsize, src_offset, dst_offset;
- uint32 crop_width, crop_length, img_width /*, img_length */;
- uint32 prev_length, prev_width, composite_width;
- uint16 bps, spp;
- uint8 *src, *dst;
- tsample_t count, sample = 0; /* Update to extract one or more samples */
-
- img_width = image->width;
- /* img_length = image->length; */
- bps = image->bps;
- spp = image->spp;
- count = spp;
-
- bytes_per_sample = (bps + 7) / 8;
- bytes_per_pixel = ((bps * spp) + 7) / 8;
- if ((bps % 8) == 0)
- shift_width = 0;
- else
- {
- if (bytes_per_pixel < (bytes_per_sample + 1))
- shift_width = bytes_per_pixel;
- else
- shift_width = bytes_per_sample + 1;
- }
- src = read_buff;
- dst = crop_buff;
-
- /* These are setup for adding additional sections */
- prev_width = prev_length = 0;
- prev_trailing_bits = trailing_bits = 0;
- composite_width = crop->combined_width;
- crop->combined_width = 0;
- crop->combined_length = 0;
-
- for (i = 0; i < crop->selections; i++)
- {
- /* rows, columns, width, length are expressed in pixels */
- first_row = crop->regionlist[i].y1;
- last_row = crop->regionlist[i].y2;
- first_col = crop->regionlist[i].x1;
- last_col = crop->regionlist[i].x2;
-
- crop_width = last_col - first_col + 1;
- crop_length = last_row - first_row + 1;
-
- /* These should not be needed for composite images */
- crop->regionlist[i].width = crop_width;
- crop->regionlist[i].length = crop_length;
- crop->regionlist[i].buffptr = crop_buff;
-
- src_rowsize = ((img_width * bps * spp) + 7) / 8;
- dst_rowsize = (((crop_width * bps * count) + 7) / 8);
-
- switch (crop->edge_ref)
- {
- default:
- case EDGE_TOP:
- case EDGE_BOTTOM:
- if ((i > 0) && (crop_width != crop->regionlist[i - 1].width))
- {
- TIFFError ("extractCompositeRegions",
- "Only equal width regions can be combined for -E top or bottom");
- return (1);
- }
-
- crop->combined_width = crop_width;
- crop->combined_length += crop_length;
-
- for (row = first_row; row <= last_row; row++)
- {
- src_offset = row * src_rowsize;
- dst_offset = (row - first_row) * dst_rowsize;
- src = read_buff + src_offset;
- dst = crop_buff + dst_offset + (prev_length * dst_rowsize);
- switch (shift_width)
- {
- case 0: if (extractContigSamplesBytes (src, dst, img_width, sample,
- spp, bps, count, first_col,
- last_col + 1))
- {
- TIFFError("extractCompositeRegions",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- case 1: if (bps == 1)
- {
- if (extractContigSamplesShifted8bits (src, dst, img_width,
- sample, spp, bps, count,
- first_col, last_col + 1,
- prev_trailing_bits))
- {
- TIFFError("extractCompositeRegions",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- }
- else
- if (extractContigSamplesShifted16bits (src, dst, img_width,
- sample, spp, bps, count,
- first_col, last_col + 1,
- prev_trailing_bits))
- {
- TIFFError("extractCompositeRegions",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- case 2: if (extractContigSamplesShifted24bits (src, dst, img_width,
- sample, spp, bps, count,
- first_col, last_col + 1,
- prev_trailing_bits))
- {
- TIFFError("extractCompositeRegions",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- case 3:
- case 4:
- case 5: if (extractContigSamplesShifted32bits (src, dst, img_width,
- sample, spp, bps, count,
- first_col, last_col + 1,
- prev_trailing_bits))
- {
- TIFFError("extractCompositeRegions",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- default: TIFFError("extractCompositeRegions", "Unsupported bit depth %d", bps);
- return (1);
- }
- }
- prev_length += crop_length;
- break;
- case EDGE_LEFT: /* splice the pieces of each row together, side by side */
- case EDGE_RIGHT:
- if ((i > 0) && (crop_length != crop->regionlist[i - 1].length))
- {
- TIFFError ("extractCompositeRegions",
- "Only equal length regions can be combined for -E left or right");
- return (1);
- }
- crop->combined_width += crop_width;
- crop->combined_length = crop_length;
- dst_rowsize = (((composite_width * bps * count) + 7) / 8);
- trailing_bits = (crop_width * bps * count) % 8;
- for (row = first_row; row <= last_row; row++)
- {
- src_offset = row * src_rowsize;
- dst_offset = (row - first_row) * dst_rowsize;
- src = read_buff + src_offset;
- dst = crop_buff + dst_offset + prev_width;
-
- switch (shift_width)
- {
- case 0: if (extractContigSamplesBytes (src, dst, img_width,
- sample, spp, bps, count,
- first_col, last_col + 1))
- {
- TIFFError("extractCompositeRegions",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- case 1: if (bps == 1)
- {
- if (extractContigSamplesShifted8bits (src, dst, img_width,
- sample, spp, bps, count,
- first_col, last_col + 1,
- prev_trailing_bits))
- {
- TIFFError("extractCompositeRegions",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- }
- else
- if (extractContigSamplesShifted16bits (src, dst, img_width,
- sample, spp, bps, count,
- first_col, last_col + 1,
- prev_trailing_bits))
- {
- TIFFError("extractCompositeRegions",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- case 2: if (extractContigSamplesShifted24bits (src, dst, img_width,
- sample, spp, bps, count,
- first_col, last_col + 1,
- prev_trailing_bits))
- {
- TIFFError("extractCompositeRegions",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- case 3:
- case 4:
- case 5: if (extractContigSamplesShifted32bits (src, dst, img_width,
- sample, spp, bps, count,
- first_col, last_col + 1,
- prev_trailing_bits))
- {
- TIFFError("extractCompositeRegions",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- default: TIFFError("extractCompositeRegions", "Unsupported bit depth %d", bps);
- return (1);
- }
- }
- prev_width += (crop_width * bps * count) / 8;
- prev_trailing_bits += trailing_bits;
- if (prev_trailing_bits > 7)
- prev_trailing_bits-= 8;
- break;
- }
- }
- if (crop->combined_width != composite_width)
- TIFFError("combineSeparateRegions","Combined width does not match composite width");
-
- return (0);
- } /* end extractCompositeRegions */
-
-/* Copy a single region of input buffer to an output buffer.
- * The read functions used copy separate plane data into a buffer
- * as interleaved samples rather than separate planes so the same
- * logic works to extract regions regardless of the way the data
- * are organized in the input file. This function can be used to
- * extract one or more samples from the input image by updating the
- * parameters for starting sample and number of samples to copy in the
- * fifth and eighth arguments of the call to extractContigSamples.
- * They would be passed as new elements of the crop_mask struct.
- */
-
-static int
-extractSeparateRegion(struct image_data *image, struct crop_mask *crop,
- unsigned char *read_buff, unsigned char *crop_buff,
- int region)
- {
- int shift_width, prev_trailing_bits = 0;
- uint32 bytes_per_sample, bytes_per_pixel;
- uint32 src_rowsize, dst_rowsize;
- uint32 row, first_row, last_row, first_col, last_col;
- uint32 src_offset, dst_offset;
- uint32 crop_width, crop_length, img_width /*, img_length */;
- uint16 bps, spp;
- uint8 *src, *dst;
- tsample_t count, sample = 0; /* Update to extract more or more samples */
-
- img_width = image->width;
- /* img_length = image->length; */
- bps = image->bps;
- spp = image->spp;
- count = spp;
-
- bytes_per_sample = (bps + 7) / 8;
- bytes_per_pixel = ((bps * spp) + 7) / 8;
- if ((bps % 8) == 0)
- shift_width = 0; /* Byte aligned data only */
- else
- {
- if (bytes_per_pixel < (bytes_per_sample + 1))
- shift_width = bytes_per_pixel;
- else
- shift_width = bytes_per_sample + 1;
- }
-
- /* rows, columns, width, length are expressed in pixels */
- first_row = crop->regionlist[region].y1;
- last_row = crop->regionlist[region].y2;
- first_col = crop->regionlist[region].x1;
- last_col = crop->regionlist[region].x2;
-
- crop_width = last_col - first_col + 1;
- crop_length = last_row - first_row + 1;
-
- crop->regionlist[region].width = crop_width;
- crop->regionlist[region].length = crop_length;
- crop->regionlist[region].buffptr = crop_buff;
-
- src = read_buff;
- dst = crop_buff;
- src_rowsize = ((img_width * bps * spp) + 7) / 8;
- dst_rowsize = (((crop_width * bps * spp) + 7) / 8);
-
- for (row = first_row; row <= last_row; row++)
- {
- src_offset = row * src_rowsize;
- dst_offset = (row - first_row) * dst_rowsize;
- src = read_buff + src_offset;
- dst = crop_buff + dst_offset;
-
- switch (shift_width)
- {
- case 0: if (extractContigSamplesBytes (src, dst, img_width, sample,
- spp, bps, count, first_col,
- last_col + 1))
- {
- TIFFError("extractSeparateRegion",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- case 1: if (bps == 1)
- {
- if (extractContigSamplesShifted8bits (src, dst, img_width,
- sample, spp, bps, count,
- first_col, last_col + 1,
- prev_trailing_bits))
- {
- TIFFError("extractSeparateRegion",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- }
- else
- if (extractContigSamplesShifted16bits (src, dst, img_width,
- sample, spp, bps, count,
- first_col, last_col + 1,
- prev_trailing_bits))
- {
- TIFFError("extractSeparateRegion",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- case 2: if (extractContigSamplesShifted24bits (src, dst, img_width,
- sample, spp, bps, count,
- first_col, last_col + 1,
- prev_trailing_bits))
- {
- TIFFError("extractSeparateRegion",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- case 3:
- case 4:
- case 5: if (extractContigSamplesShifted32bits (src, dst, img_width,
- sample, spp, bps, count,
- first_col, last_col + 1,
- prev_trailing_bits))
- {
- TIFFError("extractSeparateRegion",
- "Unable to extract row %d", row);
- return (1);
- }
- break;
- default: TIFFError("extractSeparateRegion", "Unsupported bit depth %d", bps);
- return (1);
- }
- }
-
- return (0);
- } /* end extractSeparateRegion */
-
-static int
-extractImageSection(struct image_data *image, struct pageseg *section,
- unsigned char *src_buff, unsigned char *sect_buff)
- {
- unsigned char bytebuff1, bytebuff2;
-#ifdef DEVELMODE
- /* unsigned char *src, *dst; */
-#endif
-
- uint32 img_width, img_rowsize;
-#ifdef DEVELMODE
- uint32 img_length;
-#endif
- uint32 j, shift1, shift2, trailing_bits;
- uint32 row, first_row, last_row, first_col, last_col;
- uint32 src_offset, dst_offset, row_offset, col_offset;
- uint32 offset1, offset2, full_bytes;
- uint32 sect_width;
-#ifdef DEVELMODE
- uint32 sect_length;
-#endif
- uint16 bps, spp;
-
-#ifdef DEVELMODE
- int k;
- unsigned char bitset;
- static char *bitarray = NULL;
-#endif
-
- img_width = image->width;
-#ifdef DEVELMODE
- img_length = image->length;
-#endif
- bps = image->bps;
- spp = image->spp;
-
-#ifdef DEVELMODE
- /* src = src_buff; */
- /* dst = sect_buff; */
-#endif
- src_offset = 0;
- dst_offset = 0;
-
-#ifdef DEVELMODE
- if (bitarray == NULL)
- {
- if ((bitarray = (char *)malloc(img_width)) == NULL)
- {
- TIFFError ("", "DEBUG: Unable to allocate debugging bitarray");
- return (-1);
- }
- }
-#endif
-
- /* rows, columns, width, length are expressed in pixels */
- first_row = section->y1;
- last_row = section->y2;
- first_col = section->x1;
- last_col = section->x2;
-
- sect_width = last_col - first_col + 1;
-#ifdef DEVELMODE
- sect_length = last_row - first_row + 1;
-#endif
- img_rowsize = ((img_width * bps + 7) / 8) * spp;
- full_bytes = (sect_width * spp * bps) / 8; /* number of COMPLETE bytes per row in section */
- trailing_bits = (sect_width * bps) % 8;
-
-#ifdef DEVELMODE
- TIFFError ("", "First row: %d, last row: %d, First col: %d, last col: %d\n",
- first_row, last_row, first_col, last_col);
- TIFFError ("", "Image width: %d, Image length: %d, bps: %d, spp: %d\n",
- img_width, img_length, bps, spp);
- TIFFError ("", "Sect width: %d, Sect length: %d, full bytes: %d trailing bits %d\n",
- sect_width, sect_length, full_bytes, trailing_bits);
-#endif
-
- if ((bps % 8) == 0)
- {
- col_offset = first_col * spp * bps / 8;
- for (row = first_row; row <= last_row; row++)
- {
- /* row_offset = row * img_width * spp * bps / 8; */
- row_offset = row * img_rowsize;
- src_offset = row_offset + col_offset;
-
-#ifdef DEVELMODE
- TIFFError ("", "Src offset: %8d, Dst offset: %8d", src_offset, dst_offset);
-#endif
- _TIFFmemcpy (sect_buff + dst_offset, src_buff + src_offset, full_bytes);
- dst_offset += full_bytes;
- }
- }
- else
- { /* bps != 8 */
- shift1 = spp * ((first_col * bps) % 8);
- shift2 = spp * ((last_col * bps) % 8);
- for (row = first_row; row <= last_row; row++)
- {
- /* pull out the first byte */
- row_offset = row * img_rowsize;
- offset1 = row_offset + (first_col * bps / 8);
- offset2 = row_offset + (last_col * bps / 8);
-
-#ifdef DEVELMODE
- for (j = 0, k = 7; j < 8; j++, k--)
- {
- bitset = *(src_buff + offset1) & (((unsigned char)1 << k)) ? 1 : 0;
- sprintf(&bitarray[j], (bitset) ? "1" : "0");
- }
- sprintf(&bitarray[8], " ");
- sprintf(&bitarray[9], " ");
- for (j = 10, k = 7; j < 18; j++, k--)
- {
- bitset = *(src_buff + offset2) & (((unsigned char)1 << k)) ? 1 : 0;
- sprintf(&bitarray[j], (bitset) ? "1" : "0");
- }
- bitarray[18] = '\0';
- TIFFError ("", "Row: %3d Offset1: %d, Shift1: %d, Offset2: %d, Shift2: %d\n",
- row, offset1, shift1, offset2, shift2);
-#endif
-
- bytebuff1 = bytebuff2 = 0;
- if (shift1 == 0) /* the region is byte and sample alligned */
- {
- _TIFFmemcpy (sect_buff + dst_offset, src_buff + offset1, full_bytes);
-
-#ifdef DEVELMODE
- TIFFError ("", " Alligned data src offset1: %8d, Dst offset: %8d\n", offset1, dst_offset);
- sprintf(&bitarray[18], "\n");
- sprintf(&bitarray[19], "\t");
- for (j = 20, k = 7; j < 28; j++, k--)
- {
- bitset = *(sect_buff + dst_offset) & (((unsigned char)1 << k)) ? 1 : 0;
- sprintf(&bitarray[j], (bitset) ? "1" : "0");
- }
- bitarray[28] = ' ';
- bitarray[29] = ' ';
-#endif
- dst_offset += full_bytes;
-
- if (trailing_bits != 0)
- {
- bytebuff2 = src_buff[offset2] & ((unsigned char)255 << (7 - shift2));
- sect_buff[dst_offset] = bytebuff2;
-#ifdef DEVELMODE
- TIFFError ("", " Trailing bits src offset: %8d, Dst offset: %8d\n",
- offset2, dst_offset);
- for (j = 30, k = 7; j < 38; j++, k--)
- {
- bitset = *(sect_buff + dst_offset) & (((unsigned char)1 << k)) ? 1 : 0;
- sprintf(&bitarray[j], (bitset) ? "1" : "0");
- }
- bitarray[38] = '\0';
- TIFFError ("", "\tFirst and last bytes before and after masking:\n\t%s\n\n", bitarray);
-#endif
- dst_offset++;
- }
- }
- else /* each destination byte will have to be built from two source bytes*/
- {
-#ifdef DEVELMODE
- TIFFError ("", " Unalligned data src offset: %8d, Dst offset: %8d\n", offset1 , dst_offset);
-#endif
- for (j = 0; j <= full_bytes; j++)
- {
- bytebuff1 = src_buff[offset1 + j] & ((unsigned char)255 >> shift1);
- bytebuff2 = src_buff[offset1 + j + 1] & ((unsigned char)255 << (7 - shift1));
- sect_buff[dst_offset + j] = (bytebuff1 << shift1) | (bytebuff2 >> (8 - shift1));
- }
-#ifdef DEVELMODE
- sprintf(&bitarray[18], "\n");
- sprintf(&bitarray[19], "\t");
- for (j = 20, k = 7; j < 28; j++, k--)
- {
- bitset = *(sect_buff + dst_offset) & (((unsigned char)1 << k)) ? 1 : 0;
- sprintf(&bitarray[j], (bitset) ? "1" : "0");
- }
- bitarray[28] = ' ';
- bitarray[29] = ' ';
-#endif
- dst_offset += full_bytes;
-
- if (trailing_bits != 0)
- {
-#ifdef DEVELMODE
- TIFFError ("", " Trailing bits src offset: %8d, Dst offset: %8d\n", offset1 + full_bytes, dst_offset);
-#endif
- if (shift2 > shift1)
- {
- bytebuff1 = src_buff[offset1 + full_bytes] & ((unsigned char)255 << (7 - shift2));
- bytebuff2 = bytebuff1 & ((unsigned char)255 << shift1);
- sect_buff[dst_offset] = bytebuff2;
-#ifdef DEVELMODE
- TIFFError ("", " Shift2 > Shift1\n");
-#endif
- }
- else
- {
- if (shift2 < shift1)
- {
- bytebuff2 = ((unsigned char)255 << (shift1 - shift2 - 1));
- sect_buff[dst_offset] &= bytebuff2;
-#ifdef DEVELMODE
- TIFFError ("", " Shift2 < Shift1\n");
-#endif
- }
-#ifdef DEVELMODE
- else
- TIFFError ("", " Shift2 == Shift1\n");
-#endif
- }
- }
-#ifdef DEVELMODE
- sprintf(&bitarray[28], " ");
- sprintf(&bitarray[29], " ");
- for (j = 30, k = 7; j < 38; j++, k--)
- {
- bitset = *(sect_buff + dst_offset) & (((unsigned char)1 << k)) ? 1 : 0;
- sprintf(&bitarray[j], (bitset) ? "1" : "0");
- }
- bitarray[38] = '\0';
- TIFFError ("", "\tFirst and last bytes before and after masking:\n\t%s\n\n", bitarray);
-#endif
- dst_offset++;
- }
- }
- }
-
- return (0);
- } /* end extractImageSection */
-
-static int
-writeSelections(TIFF *in, TIFF **out, struct crop_mask *crop,
- struct image_data *image, struct dump_opts *dump,
- struct buffinfo seg_buffs[], char *mp, char *filename,
- unsigned int *page, unsigned int total_pages)
- {
- int i, page_count;
- int autoindex = 0;
- unsigned char *crop_buff = NULL;
-
- /* Where we open a new file depends on the export mode */
- switch (crop->exp_mode)
- {
- case ONE_FILE_COMPOSITE: /* Regions combined into single image */
- autoindex = 0;
- crop_buff = seg_buffs[0].buffer;
- if (update_output_file (out, mp, autoindex, filename, page))
- return (1);
- page_count = total_pages;
- if (writeCroppedImage(in, *out, image, dump,
- crop->combined_width,
- crop->combined_length,
- crop_buff, *page, total_pages))
- {
- TIFFError("writeRegions", "Unable to write new image");
- return (-1);
- }
- break;
- case ONE_FILE_SEPARATED: /* Regions as separated images */
- autoindex = 0;
- if (update_output_file (out, mp, autoindex, filename, page))
- return (1);
- page_count = crop->selections * total_pages;
- for (i = 0; i < crop->selections; i++)
- {
- crop_buff = seg_buffs[i].buffer;
- if (writeCroppedImage(in, *out, image, dump,
- crop->regionlist[i].width,
- crop->regionlist[i].length,
- crop_buff, *page, page_count))
- {
- TIFFError("writeRegions", "Unable to write new image");
- return (-1);
- }
- }
- break;
- case FILE_PER_IMAGE_COMPOSITE: /* Regions as composite image */
- autoindex = 1;
- if (update_output_file (out, mp, autoindex, filename, page))
- return (1);
-
- crop_buff = seg_buffs[0].buffer;
- if (writeCroppedImage(in, *out, image, dump,
- crop->combined_width,
- crop->combined_length,
- crop_buff, *page, total_pages))
- {
- TIFFError("writeRegions", "Unable to write new image");
- return (-1);
- }
- break;
- case FILE_PER_IMAGE_SEPARATED: /* Regions as separated images */
- autoindex = 1;
- page_count = crop->selections;
- if (update_output_file (out, mp, autoindex, filename, page))
- return (1);
-
- for (i = 0; i < crop->selections; i++)
- {
- crop_buff = seg_buffs[i].buffer;
- /* Write the current region to the current file */
- if (writeCroppedImage(in, *out, image, dump,
- crop->regionlist[i].width,
- crop->regionlist[i].length,
- crop_buff, *page, page_count))
- {
- TIFFError("writeRegions", "Unable to write new image");
- return (-1);
- }
- }
- break;
- case FILE_PER_SELECTION:
- autoindex = 1;
- page_count = 1;
- for (i = 0; i < crop->selections; i++)
- {
- if (update_output_file (out, mp, autoindex, filename, page))
- return (1);
-
- crop_buff = seg_buffs[i].buffer;
- /* Write the current region to the current file */
- if (writeCroppedImage(in, *out, image, dump,
- crop->regionlist[i].width,
- crop->regionlist[i].length,
- crop_buff, *page, page_count))
- {
- TIFFError("writeRegions", "Unable to write new image");
- return (-1);
- }
- }
- break;
- default: return (1);
- }
-
- return (0);
- } /* end writeRegions */
-
-static int
-writeImageSections(TIFF *in, TIFF *out, struct image_data *image,
- struct pagedef *page, struct pageseg *sections,
- struct dump_opts * dump, unsigned char *src_buff,
- unsigned char **sect_buff_ptr)
- {
- double hres, vres;
- uint32 i, k, width, length, sectsize;
- unsigned char *sect_buff = *sect_buff_ptr;
-
- hres = page->hres;
- vres = page->vres;
-
- k = page->cols * page->rows;
- if ((k < 1) || (k > MAX_SECTIONS))
- {
- TIFFError("writeImageSections",
- "%d Rows and Columns exceed maximum sections\nIncrease resolution or reduce sections", k);
- return (-1);
- }
-
- for (i = 0; i < k; i++)
- {
- width = sections[i].x2 - sections[i].x1 + 1;
- length = sections[i].y2 - sections[i].y1 + 1;
- sectsize = (uint32)
- ceil((width * image->bps + 7) / (double)8) * image->spp * length;
- /* allocate a buffer if we don't have one already */
- if (createImageSection(sectsize, sect_buff_ptr))
- {
- TIFFError("writeImageSections", "Unable to allocate section buffer");
- exit (-1);
- }
- sect_buff = *sect_buff_ptr;
-
- if (extractImageSection (image, &sections[i], src_buff, sect_buff))
- {
- TIFFError("writeImageSections", "Unable to extract image sections");
- exit (-1);
- }
-
- /* call the write routine here instead of outside the loop */
- if (writeSingleSection(in, out, image, dump, width, length, hres, vres, sect_buff))
- {
- TIFFError("writeImageSections", "Unable to write image section");
- exit (-1);
- }
- }
-
- return (0);
- } /* end writeImageSections */
-
-/* Code in this function is heavily indebted to code in tiffcp
- * with modifications by Richard Nolde to handle orientation correctly.
- * It will have to be updated significantly if support is added to
- * extract one or more samples from original image since the
- * original code assumes we are always copying all samples.
- */
-static int
-writeSingleSection(TIFF *in, TIFF *out, struct image_data *image,
- struct dump_opts *dump, uint32 width, uint32 length,
- double hres, double vres,
- unsigned char *sect_buff)
- {
- uint16 bps, spp;
- uint16 input_compression, input_photometric;
- uint16 input_planar;
- struct cpTag* p;
-
- /* Calling this seems to reset the compression mode on the TIFF *in file.
- TIFFGetField(in, TIFFTAG_JPEGCOLORMODE, &input_jpeg_colormode);
- */
- input_compression = image->compression;
- input_photometric = image->photometric;
-
- spp = image->spp;
- bps = image->bps;
- TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width);
- TIFFSetField(out, TIFFTAG_IMAGELENGTH, length);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, bps);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, spp);
-
-#ifdef DEBUG2
- TIFFError("writeSingleSection", "Input compression: %s",
- (input_compression == COMPRESSION_OJPEG) ? "Old Jpeg" :
- ((input_compression == COMPRESSION_JPEG) ? "New Jpeg" : "Non Jpeg"));
-#endif
- /* This is the global variable compression which is set
- * if the user has specified a command line option for
- * a compression option. Should be passed around in one
- * of the parameters instead of as a global. If no user
- * option specified it will still be (uint16) -1. */
- if (compression != (uint16)-1)
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- else
- { /* OJPEG is no longer supported for writing so upgrade to JPEG */
- if (input_compression == COMPRESSION_OJPEG)
- {
- compression = COMPRESSION_JPEG;
- jpegcolormode = JPEGCOLORMODE_RAW;
- TIFFSetField(out, TIFFTAG_COMPRESSION, COMPRESSION_JPEG);
- }
- else /* Use the compression from the input file */
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- }
-
- if (compression == COMPRESSION_JPEG)
- {
- if ((input_photometric == PHOTOMETRIC_PALETTE) || /* color map indexed */
- (input_photometric == PHOTOMETRIC_MASK)) /* holdout mask */
- {
- TIFFError ("writeSingleSection",
- "JPEG compression cannot be used with %s image data",
- (input_photometric == PHOTOMETRIC_PALETTE) ?
- "palette" : "mask");
- return (-1);
- }
- if ((input_photometric == PHOTOMETRIC_RGB) &&
- (jpegcolormode == JPEGCOLORMODE_RGB))
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR);
- else
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, input_photometric);
- }
- else
- {
- if (compression == COMPRESSION_SGILOG || compression == COMPRESSION_SGILOG24)
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, spp == 1 ?
- PHOTOMETRIC_LOGL : PHOTOMETRIC_LOGLUV);
- else
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, image->photometric);
- }
-
-#ifdef DEBUG2
- TIFFError("writeSingleSection", "Input photometric: %s",
- (input_photometric == PHOTOMETRIC_RGB) ? "RGB" :
- ((input_photometric == PHOTOMETRIC_YCBCR) ? "YCbCr" : "Not RGB or YCbCr"));
-#endif
-
- if (((input_photometric == PHOTOMETRIC_LOGL) ||
- (input_photometric == PHOTOMETRIC_LOGLUV)) &&
- ((compression != COMPRESSION_SGILOG) &&
- (compression != COMPRESSION_SGILOG24)))
- {
- TIFFError("writeSingleSection",
- "LogL and LogLuv source data require SGI_LOG or SGI_LOG24 compression");
- return (-1);
- }
-
- if (fillorder != 0)
- TIFFSetField(out, TIFFTAG_FILLORDER, fillorder);
- else
- CopyTag(TIFFTAG_FILLORDER, 1, TIFF_SHORT);
-
- /* The loadimage function reads input orientation and sets
- * image->orientation. The correct_image_orientation function
- * applies the required rotation and mirror operations to
- * present the data in TOPLEFT orientation and updates
- * image->orientation if any transforms are performed,
- * as per EXIF standard.
- */
- TIFFSetField(out, TIFFTAG_ORIENTATION, image->orientation);
-
- /*
- * Choose tiles/strip for the output image according to
- * the command line arguments (-tiles, -strips) and the
- * structure of the input image.
- */
- if (outtiled == -1)
- outtiled = TIFFIsTiled(in);
- if (outtiled) {
- /*
- * Setup output file's tile width&height. If either
- * is not specified, use either the value from the
- * input image or, if nothing is defined, use the
- * library default.
- */
- if (tilewidth == (uint32) 0)
- TIFFGetField(in, TIFFTAG_TILEWIDTH, &tilewidth);
- if (tilelength == (uint32) 0)
- TIFFGetField(in, TIFFTAG_TILELENGTH, &tilelength);
-
- if (tilewidth == 0 || tilelength == 0)
- TIFFDefaultTileSize(out, &tilewidth, &tilelength);
- TIFFDefaultTileSize(out, &tilewidth, &tilelength);
- TIFFSetField(out, TIFFTAG_TILEWIDTH, tilewidth);
- TIFFSetField(out, TIFFTAG_TILELENGTH, tilelength);
- } else {
- /*
- * RowsPerStrip is left unspecified: use either the
- * value from the input image or, if nothing is defined,
- * use the library default.
- */
- if (rowsperstrip == (uint32) 0)
- {
- if (!TIFFGetField(in, TIFFTAG_ROWSPERSTRIP, &rowsperstrip))
- rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip);
- if (compression != COMPRESSION_JPEG)
- {
- if (rowsperstrip > length)
- rowsperstrip = length;
- }
- }
- else
- if (rowsperstrip == (uint32) -1)
- rowsperstrip = length;
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
- }
-
- TIFFGetFieldDefaulted(in, TIFFTAG_PLANARCONFIG, &input_planar);
- if (config != (uint16) -1)
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, config);
- else
- CopyField(TIFFTAG_PLANARCONFIG, config);
- if (spp <= 4)
- CopyTag(TIFFTAG_TRANSFERFUNCTION, 4, TIFF_SHORT);
- CopyTag(TIFFTAG_COLORMAP, 4, TIFF_SHORT);
-
-/* SMinSampleValue & SMaxSampleValue */
- switch (compression) {
- /* These are references to GLOBAL variables set by defaults
- * and /or the compression flag
- */
- case COMPRESSION_JPEG:
- if (((bps % 8) == 0) || ((bps % 12) == 0))
- {
- TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality);
- TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
- }
- else
- {
- TIFFError("writeSingleSection",
- "JPEG compression requires 8 or 12 bits per sample");
- return (-1);
- }
- break;
- case COMPRESSION_LZW:
- case COMPRESSION_ADOBE_DEFLATE:
- case COMPRESSION_DEFLATE:
- if (predictor != (uint16)-1)
- TIFFSetField(out, TIFFTAG_PREDICTOR, predictor);
- else
- CopyField(TIFFTAG_PREDICTOR, predictor);
- break;
- case COMPRESSION_CCITTFAX3:
- case COMPRESSION_CCITTFAX4:
- if (compression == COMPRESSION_CCITTFAX3) {
- if (g3opts != (uint32) -1)
- TIFFSetField(out, TIFFTAG_GROUP3OPTIONS, g3opts);
- else
- CopyField(TIFFTAG_GROUP3OPTIONS, g3opts);
- } else
- CopyTag(TIFFTAG_GROUP4OPTIONS, 1, TIFF_LONG);
- CopyTag(TIFFTAG_BADFAXLINES, 1, TIFF_LONG);
- CopyTag(TIFFTAG_CLEANFAXDATA, 1, TIFF_LONG);
- CopyTag(TIFFTAG_CONSECUTIVEBADFAXLINES, 1, TIFF_LONG);
- CopyTag(TIFFTAG_FAXRECVPARAMS, 1, TIFF_LONG);
- CopyTag(TIFFTAG_FAXRECVTIME, 1, TIFF_LONG);
- CopyTag(TIFFTAG_FAXSUBADDRESS, 1, TIFF_ASCII);
- break;
- }
- { uint32 len32;
- void** data;
- if (TIFFGetField(in, TIFFTAG_ICCPROFILE, &len32, &data))
- TIFFSetField(out, TIFFTAG_ICCPROFILE, len32, data);
- }
- { uint16 ninks;
- const char* inknames;
- if (TIFFGetField(in, TIFFTAG_NUMBEROFINKS, &ninks)) {
- TIFFSetField(out, TIFFTAG_NUMBEROFINKS, ninks);
- if (TIFFGetField(in, TIFFTAG_INKNAMES, &inknames)) {
- int inknameslen = strlen(inknames) + 1;
- const char* cp = inknames;
- while (ninks > 1) {
- cp = strchr(cp, '\0');
- if (cp) {
- cp++;
- inknameslen += (strlen(cp) + 1);
- }
- ninks--;
- }
- TIFFSetField(out, TIFFTAG_INKNAMES, inknameslen, inknames);
- }
- }
- }
- {
- unsigned short pg0, pg1;
- if (TIFFGetField(in, TIFFTAG_PAGENUMBER, &pg0, &pg1)) {
- if (pageNum < 0) /* only one input file */
- TIFFSetField(out, TIFFTAG_PAGENUMBER, pg0, pg1);
- else
- TIFFSetField(out, TIFFTAG_PAGENUMBER, pageNum++, 0);
- }
- }
-
- for (p = tags; p < &tags[NTAGS]; p++)
- CopyTag(p->tag, p->count, p->type);
-
- /* Update these since they are overwritten from input res by loop above */
- TIFFSetField(out, TIFFTAG_XRESOLUTION, (float)hres);
- TIFFSetField(out, TIFFTAG_YRESOLUTION, (float)vres);
-
- /* Compute the tile or strip dimensions and write to disk */
- if (outtiled)
- {
- if (config == PLANARCONFIG_CONTIG)
- writeBufferToContigTiles (out, sect_buff, length, width, spp, dump);
- else
- writeBufferToSeparateTiles (out, sect_buff, length, width, spp, dump);
- }
- else
- {
- if (config == PLANARCONFIG_CONTIG)
- writeBufferToContigStrips (out, sect_buff, length);
- else
- writeBufferToSeparateStrips(out, sect_buff, length, width, spp, dump);
- }
-
- if (!TIFFWriteDirectory(out))
- {
- TIFFClose(out);
- return (-1);
- }
-
- return (0);
- } /* end writeSingleSection */
-
-
-/* Create a buffer to write one section at a time */
-static int
-createImageSection(uint32 sectsize, unsigned char **sect_buff_ptr)
- {
- unsigned char *sect_buff = NULL;
- unsigned char *new_buff = NULL;
- static uint32 prev_sectsize = 0;
-
- sect_buff = *sect_buff_ptr;
-
- if (!sect_buff)
- {
- sect_buff = (unsigned char *)_TIFFmalloc(sectsize);
- *sect_buff_ptr = sect_buff;
- _TIFFmemset(sect_buff, 0, sectsize);
- }
- else
- {
- if (prev_sectsize < sectsize)
- {
- new_buff = _TIFFrealloc(sect_buff, sectsize);
- if (!new_buff)
- {
- free (sect_buff);
- sect_buff = (unsigned char *)_TIFFmalloc(sectsize);
- }
- else
- sect_buff = new_buff;
-
- _TIFFmemset(sect_buff, 0, sectsize);
- }
- }
-
- if (!sect_buff)
- {
- TIFFError("createImageSection", "Unable to allocate/reallocate section buffer");
- return (-1);
- }
- prev_sectsize = sectsize;
- *sect_buff_ptr = sect_buff;
-
- return (0);
- } /* end createImageSection */
-
-
-/* Process selections defined by regions, zones, margins, or fixed sized areas */
-static int
-processCropSelections(struct image_data *image, struct crop_mask *crop,
- unsigned char **read_buff_ptr, struct buffinfo seg_buffs[])
- {
- int i;
- uint32 width, length, total_width, total_length;
- tsize_t cropsize;
- unsigned char *crop_buff = NULL;
- unsigned char *read_buff = NULL;
- unsigned char *next_buff = NULL;
- tsize_t prev_cropsize = 0;
-
- read_buff = *read_buff_ptr;
-
- if (crop->img_mode == COMPOSITE_IMAGES)
- {
- cropsize = crop->bufftotal;
- crop_buff = seg_buffs[0].buffer;
- if (!crop_buff)
- crop_buff = (unsigned char *)_TIFFmalloc(cropsize);
- else
- {
- prev_cropsize = seg_buffs[0].size;
- if (prev_cropsize < cropsize)
- {
- next_buff = _TIFFrealloc(crop_buff, cropsize);
- if (! next_buff)
- {
- _TIFFfree (crop_buff);
- crop_buff = (unsigned char *)_TIFFmalloc(cropsize);
- }
- else
- crop_buff = next_buff;
- }
- }
-
- if (!crop_buff)
- {
- TIFFError("processCropSelections", "Unable to allocate/reallocate crop buffer");
- return (-1);
- }
-
- _TIFFmemset(crop_buff, 0, cropsize);
- seg_buffs[0].buffer = crop_buff;
- seg_buffs[0].size = cropsize;
-
- /* Checks for matching width or length as required */
- if (extractCompositeRegions(image, crop, read_buff, crop_buff) != 0)
- return (1);
-
- if (crop->crop_mode & CROP_INVERT)
- {
- switch (crop->photometric)
- {
- /* Just change the interpretation */
- case PHOTOMETRIC_MINISWHITE:
- case PHOTOMETRIC_MINISBLACK:
- image->photometric = crop->photometric;
- break;
- case INVERT_DATA_ONLY:
- case INVERT_DATA_AND_TAG:
- if (invertImage(image->photometric, image->spp, image->bps,
- crop->combined_width, crop->combined_length, crop_buff))
- {
- TIFFError("processCropSelections",
- "Failed to invert colorspace for composite regions");
- return (-1);
- }
- if (crop->photometric == INVERT_DATA_AND_TAG)
- {
- switch (image->photometric)
- {
- case PHOTOMETRIC_MINISWHITE:
- image->photometric = PHOTOMETRIC_MINISBLACK;
- break;
- case PHOTOMETRIC_MINISBLACK:
- image->photometric = PHOTOMETRIC_MINISWHITE;
- break;
- default:
- break;
- }
- }
- break;
- default: break;
- }
- }
-
- /* Mirror and Rotate will not work with multiple regions unless they are the same width */
- if (crop->crop_mode & CROP_MIRROR)
- {
- if (mirrorImage(image->spp, image->bps, crop->mirror,
- crop->combined_width, crop->combined_length, crop_buff))
- {
- TIFFError("processCropSelections", "Failed to mirror composite regions %s",
- (crop->rotation == MIRROR_HORIZ) ? "horizontally" : "vertically");
- return (-1);
- }
- }
-
- if (crop->crop_mode & CROP_ROTATE) /* rotate should be last as it can reallocate the buffer */
- {
- if (rotateImage(crop->rotation, image, &crop->combined_width,
- &crop->combined_length, &crop_buff))
- {
- TIFFError("processCropSelections",
- "Failed to rotate composite regions by %d degrees", crop->rotation);
- return (-1);
- }
- seg_buffs[0].buffer = crop_buff;
- seg_buffs[0].size = (((crop->combined_width * image->bps + 7 ) / 8)
- * image->spp) * crop->combined_length;
- }
- }
- else /* Separated Images */
- {
- total_width = total_length = 0;
- for (i = 0; i < crop->selections; i++)
- {
- cropsize = crop->bufftotal;
- crop_buff = seg_buffs[i].buffer;
- if (!crop_buff)
- crop_buff = (unsigned char *)_TIFFmalloc(cropsize);
- else
- {
- prev_cropsize = seg_buffs[0].size;
- if (prev_cropsize < cropsize)
- {
- next_buff = _TIFFrealloc(crop_buff, cropsize);
- if (! next_buff)
- {
- _TIFFfree (crop_buff);
- crop_buff = (unsigned char *)_TIFFmalloc(cropsize);
- }
- else
- crop_buff = next_buff;
- }
- }
-
- if (!crop_buff)
- {
- TIFFError("processCropSelections", "Unable to allocate/reallocate crop buffer");
- return (-1);
- }
-
- _TIFFmemset(crop_buff, 0, cropsize);
- seg_buffs[i].buffer = crop_buff;
- seg_buffs[i].size = cropsize;
-
- if (extractSeparateRegion(image, crop, read_buff, crop_buff, i))
- {
- TIFFError("processCropSelections", "Unable to extract cropped region %d from image", i);
- return (-1);
- }
-
- width = crop->regionlist[i].width;
- length = crop->regionlist[i].length;
-
- if (crop->crop_mode & CROP_INVERT)
- {
- switch (crop->photometric)
- {
- /* Just change the interpretation */
- case PHOTOMETRIC_MINISWHITE:
- case PHOTOMETRIC_MINISBLACK:
- image->photometric = crop->photometric;
- break;
- case INVERT_DATA_ONLY:
- case INVERT_DATA_AND_TAG:
- if (invertImage(image->photometric, image->spp, image->bps,
- width, length, crop_buff))
- {
- TIFFError("processCropSelections",
- "Failed to invert colorspace for region");
- return (-1);
- }
- if (crop->photometric == INVERT_DATA_AND_TAG)
- {
- switch (image->photometric)
- {
- case PHOTOMETRIC_MINISWHITE:
- image->photometric = PHOTOMETRIC_MINISBLACK;
- break;
- case PHOTOMETRIC_MINISBLACK:
- image->photometric = PHOTOMETRIC_MINISWHITE;
- break;
- default:
- break;
- }
- }
- break;
- default: break;
- }
- }
-
- if (crop->crop_mode & CROP_MIRROR)
- {
- if (mirrorImage(image->spp, image->bps, crop->mirror,
- width, length, crop_buff))
- {
- TIFFError("processCropSelections", "Failed to mirror crop region %s",
- (crop->rotation == MIRROR_HORIZ) ? "horizontally" : "vertically");
- return (-1);
- }
- }
-
- if (crop->crop_mode & CROP_ROTATE) /* rotate should be last as it can reallocate the buffer */
- {
- if (rotateImage(crop->rotation, image, &crop->regionlist[i].width,
- &crop->regionlist[i].length, &crop_buff))
- {
- TIFFError("processCropSelections",
- "Failed to rotate crop region by %d degrees", crop->rotation);
- return (-1);
- }
- total_width += crop->regionlist[i].width;
- total_length += crop->regionlist[i].length;
- crop->combined_width = total_width;
- crop->combined_length = total_length;
- seg_buffs[i].buffer = crop_buff;
- seg_buffs[i].size = (((crop->regionlist[i].width * image->bps + 7 ) / 8)
- * image->spp) * crop->regionlist[i].length;
- }
- }
- }
- return (0);
- } /* end processCropSelections */
-
-/* Copy the crop section of the data from the current image into a buffer
- * and adjust the IFD values to reflect the new size. If no cropping is
- * required, use the origial read buffer as the crop buffer.
- *
- * There is quite a bit of redundancy between this routine and the more
- * specialized processCropSelections, but this provides
- * the most optimized path when no Zones or Regions are required.
- */
-static int
-createCroppedImage(struct image_data *image, struct crop_mask *crop,
- unsigned char **read_buff_ptr, unsigned char **crop_buff_ptr)
- {
- tsize_t cropsize;
- unsigned char *read_buff = NULL;
- unsigned char *crop_buff = NULL;
- unsigned char *new_buff = NULL;
- static tsize_t prev_cropsize = 0;
-
- read_buff = *read_buff_ptr;
-
- /* process full image, no crop buffer needed */
- crop_buff = read_buff;
- *crop_buff_ptr = read_buff;
- crop->combined_width = image->width;
- crop->combined_length = image->length;
-
- cropsize = crop->bufftotal;
- crop_buff = *crop_buff_ptr;
- if (!crop_buff)
- {
- crop_buff = (unsigned char *)_TIFFmalloc(cropsize);
- *crop_buff_ptr = crop_buff;
- _TIFFmemset(crop_buff, 0, cropsize);
- prev_cropsize = cropsize;
- }
- else
- {
- if (prev_cropsize < cropsize)
- {
- new_buff = _TIFFrealloc(crop_buff, cropsize);
- if (!new_buff)
- {
- free (crop_buff);
- crop_buff = (unsigned char *)_TIFFmalloc(cropsize);
- }
- else
- crop_buff = new_buff;
- _TIFFmemset(crop_buff, 0, cropsize);
- }
- }
-
- if (!crop_buff)
- {
- TIFFError("createCroppedImage", "Unable to allocate/reallocate crop buffer");
- return (-1);
- }
- *crop_buff_ptr = crop_buff;
-
- if (crop->crop_mode & CROP_INVERT)
- {
- switch (crop->photometric)
- {
- /* Just change the interpretation */
- case PHOTOMETRIC_MINISWHITE:
- case PHOTOMETRIC_MINISBLACK:
- image->photometric = crop->photometric;
- break;
- case INVERT_DATA_ONLY:
- case INVERT_DATA_AND_TAG:
- if (invertImage(image->photometric, image->spp, image->bps,
- crop->combined_width, crop->combined_length, crop_buff))
- {
- TIFFError("createCroppedImage",
- "Failed to invert colorspace for image or cropped selection");
- return (-1);
- }
- if (crop->photometric == INVERT_DATA_AND_TAG)
- {
- switch (image->photometric)
- {
- case PHOTOMETRIC_MINISWHITE:
- image->photometric = PHOTOMETRIC_MINISBLACK;
- break;
- case PHOTOMETRIC_MINISBLACK:
- image->photometric = PHOTOMETRIC_MINISWHITE;
- break;
- default:
- break;
- }
- }
- break;
- default: break;
- }
- }
-
- if (crop->crop_mode & CROP_MIRROR)
- {
- if (mirrorImage(image->spp, image->bps, crop->mirror,
- crop->combined_width, crop->combined_length, crop_buff))
- {
- TIFFError("createCroppedImage", "Failed to mirror image or cropped selection %s",
- (crop->rotation == MIRROR_HORIZ) ? "horizontally" : "vertically");
- return (-1);
- }
- }
-
- if (crop->crop_mode & CROP_ROTATE) /* rotate should be last as it can reallocate the buffer */
- {
- if (rotateImage(crop->rotation, image, &crop->combined_width,
- &crop->combined_length, crop_buff_ptr))
- {
- TIFFError("createCroppedImage",
- "Failed to rotate image or cropped selection by %d degrees", crop->rotation);
- return (-1);
- }
- }
-
- if (crop_buff == read_buff) /* we used the read buffer for the crop buffer */
- *read_buff_ptr = NULL; /* so we don't try to free it later */
-
- return (0);
- } /* end createCroppedImage */
-
-
-/* Code in this function is heavily indebted to code in tiffcp
- * with modifications by Richard Nolde to handle orientation correctly.
- * It will have to be updated significantly if support is added to
- * extract one or more samples from original image since the
- * original code assumes we are always copying all samples.
- * Use of global variables for config, compression and others
- * should be replaced by addition to the crop_mask struct (which
- * will be renamed to proc_opts indicating that is controlls
- * user supplied processing options, not just cropping) and
- * then passed in as an argument.
- */
-static int
-writeCroppedImage(TIFF *in, TIFF *out, struct image_data *image,
- struct dump_opts *dump, uint32 width, uint32 length,
- unsigned char *crop_buff, int pagenum, int total_pages)
- {
- uint16 bps, spp;
- uint16 input_compression, input_photometric;
- uint16 input_planar;
- struct cpTag* p;
-
- input_compression = image->compression;
- input_photometric = image->photometric;
- spp = image->spp;
- bps = image->bps;
-
- TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width);
- TIFFSetField(out, TIFFTAG_IMAGELENGTH, length);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, bps);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, spp);
-
-#ifdef DEBUG2
- TIFFError("writeCroppedImage", "Input compression: %s",
- (input_compression == COMPRESSION_OJPEG) ? "Old Jpeg" :
- ((input_compression == COMPRESSION_JPEG) ? "New Jpeg" : "Non Jpeg"));
-#endif
-
- if (compression != (uint16)-1)
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- else
- {
- if (input_compression == COMPRESSION_OJPEG)
- {
- compression = COMPRESSION_JPEG;
- jpegcolormode = JPEGCOLORMODE_RAW;
- TIFFSetField(out, TIFFTAG_COMPRESSION, COMPRESSION_JPEG);
- }
- else
- CopyField(TIFFTAG_COMPRESSION, compression);
- }
-
- if (compression == COMPRESSION_JPEG)
- {
- if ((input_photometric == PHOTOMETRIC_PALETTE) || /* color map indexed */
- (input_photometric == PHOTOMETRIC_MASK)) /* $holdout mask */
- {
- TIFFError ("writeCroppedImage",
- "JPEG compression cannot be used with %s image data",
- (input_photometric == PHOTOMETRIC_PALETTE) ?
- "palette" : "mask");
- return (-1);
- }
- if ((input_photometric == PHOTOMETRIC_RGB) &&
- (jpegcolormode == JPEGCOLORMODE_RGB))
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR);
- else
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, input_photometric);
- }
- else
- {
- if (compression == COMPRESSION_SGILOG || compression == COMPRESSION_SGILOG24)
- {
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, spp == 1 ?
- PHOTOMETRIC_LOGL : PHOTOMETRIC_LOGLUV);
- }
- else
- {
- if (input_compression == COMPRESSION_SGILOG ||
- input_compression == COMPRESSION_SGILOG24)
- {
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, spp == 1 ?
- PHOTOMETRIC_LOGL : PHOTOMETRIC_LOGLUV);
- }
- else
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, image->photometric);
- }
- }
-
- if (((input_photometric == PHOTOMETRIC_LOGL) ||
- (input_photometric == PHOTOMETRIC_LOGLUV)) &&
- ((compression != COMPRESSION_SGILOG) &&
- (compression != COMPRESSION_SGILOG24)))
- {
- TIFFError("writeCroppedImage",
- "LogL and LogLuv source data require SGI_LOG or SGI_LOG24 compression");
- return (-1);
- }
-
- if (fillorder != 0)
- TIFFSetField(out, TIFFTAG_FILLORDER, fillorder);
- else
- CopyTag(TIFFTAG_FILLORDER, 1, TIFF_SHORT);
-
- /* The loadimage function reads input orientation and sets
- * image->orientation. The correct_image_orientation function
- * applies the required rotation and mirror operations to
- * present the data in TOPLEFT orientation and updates
- * image->orientation if any transforms are performed,
- * as per EXIF standard.
- */
- TIFFSetField(out, TIFFTAG_ORIENTATION, image->orientation);
-
- /*
- * Choose tiles/strip for the output image according to
- * the command line arguments (-tiles, -strips) and the
- * structure of the input image.
- */
- if (outtiled == -1)
- outtiled = TIFFIsTiled(in);
- if (outtiled) {
- /*
- * Setup output file's tile width&height. If either
- * is not specified, use either the value from the
- * input image or, if nothing is defined, use the
- * library default.
- */
- if (tilewidth == (uint32) 0)
- TIFFGetField(in, TIFFTAG_TILEWIDTH, &tilewidth);
- if (tilelength == (uint32) 0)
- TIFFGetField(in, TIFFTAG_TILELENGTH, &tilelength);
-
- if (tilewidth == 0 || tilelength == 0)
- TIFFDefaultTileSize(out, &tilewidth, &tilelength);
- TIFFSetField(out, TIFFTAG_TILEWIDTH, tilewidth);
- TIFFSetField(out, TIFFTAG_TILELENGTH, tilelength);
- } else {
- /*
- * RowsPerStrip is left unspecified: use either the
- * value from the input image or, if nothing is defined,
- * use the library default.
- */
- if (rowsperstrip == (uint32) 0)
- {
- if (!TIFFGetField(in, TIFFTAG_ROWSPERSTRIP, &rowsperstrip))
- rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip);
- if (compression != COMPRESSION_JPEG)
- {
- if (rowsperstrip > length)
- rowsperstrip = length;
- }
- }
- else
- if (rowsperstrip == (uint32) -1)
- rowsperstrip = length;
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
- }
-
- TIFFGetFieldDefaulted(in, TIFFTAG_PLANARCONFIG, &input_planar);
- if (config != (uint16) -1)
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, config);
- else
- CopyField(TIFFTAG_PLANARCONFIG, config);
- if (spp <= 4)
- CopyTag(TIFFTAG_TRANSFERFUNCTION, 4, TIFF_SHORT);
- CopyTag(TIFFTAG_COLORMAP, 4, TIFF_SHORT);
-
-/* SMinSampleValue & SMaxSampleValue */
- switch (compression) {
- case COMPRESSION_JPEG:
- if (((bps % 8) == 0) || ((bps % 12) == 0))
- {
- TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality);
- TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
- }
- else
- {
- TIFFError("writeCroppedImage",
- "JPEG compression requires 8 or 12 bits per sample");
- return (-1);
- }
- break;
- case COMPRESSION_LZW:
- case COMPRESSION_ADOBE_DEFLATE:
- case COMPRESSION_DEFLATE:
- if (predictor != (uint16)-1)
- TIFFSetField(out, TIFFTAG_PREDICTOR, predictor);
- else
- CopyField(TIFFTAG_PREDICTOR, predictor);
- break;
- case COMPRESSION_CCITTFAX3:
- case COMPRESSION_CCITTFAX4:
- if (bps != 1)
- {
- TIFFError("writeCroppedImage",
- "Group 3/4 compression is not usable with bps > 1");
- return (-1);
- }
- if (compression == COMPRESSION_CCITTFAX3) {
- if (g3opts != (uint32) -1)
- TIFFSetField(out, TIFFTAG_GROUP3OPTIONS, g3opts);
- else
- CopyField(TIFFTAG_GROUP3OPTIONS, g3opts);
- } else
- CopyTag(TIFFTAG_GROUP4OPTIONS, 1, TIFF_LONG);
- CopyTag(TIFFTAG_BADFAXLINES, 1, TIFF_LONG);
- CopyTag(TIFFTAG_CLEANFAXDATA, 1, TIFF_LONG);
- CopyTag(TIFFTAG_CONSECUTIVEBADFAXLINES, 1, TIFF_LONG);
- CopyTag(TIFFTAG_FAXRECVPARAMS, 1, TIFF_LONG);
- CopyTag(TIFFTAG_FAXRECVTIME, 1, TIFF_LONG);
- CopyTag(TIFFTAG_FAXSUBADDRESS, 1, TIFF_ASCII);
- break;
- case COMPRESSION_NONE:
- break;
- default: break;
- }
- { uint32 len32;
- void** data;
- if (TIFFGetField(in, TIFFTAG_ICCPROFILE, &len32, &data))
- TIFFSetField(out, TIFFTAG_ICCPROFILE, len32, data);
- }
- { uint16 ninks;
- const char* inknames;
- if (TIFFGetField(in, TIFFTAG_NUMBEROFINKS, &ninks)) {
- TIFFSetField(out, TIFFTAG_NUMBEROFINKS, ninks);
- if (TIFFGetField(in, TIFFTAG_INKNAMES, &inknames)) {
- int inknameslen = strlen(inknames) + 1;
- const char* cp = inknames;
- while (ninks > 1) {
- cp = strchr(cp, '\0');
- if (cp) {
- cp++;
- inknameslen += (strlen(cp) + 1);
- }
- ninks--;
- }
- TIFFSetField(out, TIFFTAG_INKNAMES, inknameslen, inknames);
- }
- }
- }
- {
- unsigned short pg0, pg1;
- if (TIFFGetField(in, TIFFTAG_PAGENUMBER, &pg0, &pg1)) {
- TIFFSetField(out, TIFFTAG_PAGENUMBER, pagenum, total_pages);
- }
- }
-
- for (p = tags; p < &tags[NTAGS]; p++)
- CopyTag(p->tag, p->count, p->type);
-
- /* Compute the tile or strip dimensions and write to disk */
- if (outtiled)
- {
- if (config == PLANARCONFIG_CONTIG)
- {
- if (writeBufferToContigTiles (out, crop_buff, length, width, spp, dump))
- TIFFError("","Unable to write contiguous tile data for page %d", pagenum);
- }
- else
- {
- if (writeBufferToSeparateTiles (out, crop_buff, length, width, spp, dump))
- TIFFError("","Unable to write separate tile data for page %d", pagenum);
- }
- }
- else
- {
- if (config == PLANARCONFIG_CONTIG)
- {
- if (writeBufferToContigStrips (out, crop_buff, length))
- TIFFError("","Unable to write contiguous strip data for page %d", pagenum);
- }
- else
- {
- if (writeBufferToSeparateStrips(out, crop_buff, length, width, spp, dump))
- TIFFError("","Unable to write separate strip data for page %d", pagenum);
- }
- }
-
- if (!TIFFWriteDirectory(out))
- {
- TIFFError("","Failed to write IFD for page number %d", pagenum);
- TIFFClose(out);
- return (-1);
- }
-
- return (0);
- } /* end writeCroppedImage */
-
-static int
-rotateContigSamples8bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width,
- uint32 length, uint32 col, uint8 *src, uint8 *dst)
- {
- int ready_bits = 0;
- uint32 src_byte = 0, src_bit = 0;
- uint32 row, rowsize = 0, bit_offset = 0;
- uint8 matchbits = 0, maskbits = 0;
- uint8 buff1 = 0, buff2 = 0;
- uint8 *next;
- tsample_t sample;
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("rotateContigSamples8bits","Invalid src or destination buffer");
- return (1);
- }
-
- rowsize = ((bps * spp * width) + 7) / 8;
- ready_bits = 0;
- maskbits = (uint8)-1 >> ( 8 - bps);
- buff1 = buff2 = 0;
-
- for (row = 0; row < length ; row++)
- {
- bit_offset = col * bps * spp;
- for (sample = 0; sample < spp; sample++)
- {
- if (sample == 0)
- {
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sample * bps)) / 8;
- src_bit = (bit_offset + (sample * bps)) % 8;
- }
-
- switch (rotation)
- {
- case 90: next = src + src_byte - (row * rowsize);
- break;
- case 270: next = src + src_byte + (row * rowsize);
- break;
- default: TIFFError("rotateContigSamples8bits", "Invalid rotation %d", rotation);
- return (1);
- }
- matchbits = maskbits << (8 - src_bit - bps);
- buff1 = ((*next) & matchbits) << (src_bit);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 8)
- {
- *dst++ = buff2;
- buff2 = buff1;
- ready_bits -= 8;
- }
- else
- {
- buff2 = (buff2 | (buff1 >> ready_bits));
- }
- ready_bits += bps;
- }
- }
-
- if (ready_bits > 0)
- {
- buff1 = (buff2 & ((unsigned int)255 << (8 - ready_bits)));
- *dst++ = buff1;
- }
-
- return (0);
- } /* end rotateContigSamples8bits */
-
-
-static int
-rotateContigSamples16bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width,
- uint32 length, uint32 col, uint8 *src, uint8 *dst)
- {
- int ready_bits = 0;
- uint32 row, rowsize, bit_offset;
- uint32 src_byte = 0, src_bit = 0;
- uint16 matchbits = 0, maskbits = 0;
- uint16 buff1 = 0, buff2 = 0;
- uint8 bytebuff = 0;
- uint8 *next;
- tsample_t sample;
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("rotateContigSamples16bits","Invalid src or destination buffer");
- return (1);
- }
-
- rowsize = ((bps * spp * width) + 7) / 8;
- ready_bits = 0;
- maskbits = (uint16)-1 >> (16 - bps);
- buff1 = buff2 = 0;
- for (row = 0; row < length; row++)
- {
- bit_offset = col * bps * spp;
- for (sample = 0; sample < spp; sample++)
- {
- if (sample == 0)
- {
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sample * bps)) / 8;
- src_bit = (bit_offset + (sample * bps)) % 8;
- }
-
- switch (rotation)
- {
- case 90: next = src + src_byte - (row * rowsize);
- break;
- case 270: next = src + src_byte + (row * rowsize);
- break;
- default: TIFFError("rotateContigSamples8bits", "Invalid rotation %d", rotation);
- return (1);
- }
- matchbits = maskbits << (16 - src_bit - bps);
- if (little_endian)
- buff1 = (next[0] << 8) | next[1];
- else
- buff1 = (next[1] << 8) | next[0];
-
- buff1 = (buff1 & matchbits) << (src_bit);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 8)
- {
- bytebuff = (buff2 >> 8);
- *dst++ = bytebuff;
- ready_bits -= 8;
- /* shift in new bits */
- buff2 = ((buff2 << 8) | (buff1 >> ready_bits));
- }
- else
- { /* add another bps bits to the buffer */
- bytebuff = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- }
- ready_bits += bps;
- }
- }
-
- if (ready_bits > 0)
- {
- bytebuff = (buff2 >> 8);
- *dst++ = bytebuff;
- }
-
- return (0);
- } /* end rotateContigSamples16bits */
-
-static int
-rotateContigSamples24bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width,
- uint32 length, uint32 col, uint8 *src, uint8 *dst)
- {
- int ready_bits = 0;
- uint32 row, rowsize, bit_offset;
- uint32 src_byte = 0, src_bit = 0;
- uint32 matchbits = 0, maskbits = 0;
- uint32 buff1 = 0, buff2 = 0;
- uint8 bytebuff1 = 0, bytebuff2 = 0;
- uint8 *next;
- tsample_t sample;
-
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("rotateContigSamples24bits","Invalid src or destination buffer");
- return (1);
- }
-
- rowsize = ((bps * spp * width) + 7) / 8;
- ready_bits = 0;
- maskbits = (uint32)-1 >> (32 - bps);
- buff1 = buff2 = 0;
- for (row = 0; row < length; row++)
- {
- bit_offset = col * bps * spp;
- for (sample = 0; sample < spp; sample++)
- {
- if (sample == 0)
- {
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sample * bps)) / 8;
- src_bit = (bit_offset + (sample * bps)) % 8;
- }
-
- switch (rotation)
- {
- case 90: next = src + src_byte - (row * rowsize);
- break;
- case 270: next = src + src_byte + (row * rowsize);
- break;
- default: TIFFError("rotateContigSamples8bits", "Invalid rotation %d", rotation);
- return (1);
- }
- matchbits = maskbits << (32 - src_bit - bps);
- if (little_endian)
- buff1 = (next[0] << 24) | (next[1] << 16) | (next[2] << 8) | next[3];
- else
- buff1 = (next[3] << 24) | (next[2] << 16) | (next[1] << 8) | next[0];
- buff1 = (buff1 & matchbits) << (src_bit);
-
- /* If we have a full buffer's worth, write it out */
- if (ready_bits >= 16)
- {
- bytebuff1 = (buff2 >> 24);
- *dst++ = bytebuff1;
- bytebuff2 = (buff2 >> 16);
- *dst++ = bytebuff2;
- ready_bits -= 16;
-
- /* shift in new bits */
- buff2 = ((buff2 << 16) | (buff1 >> ready_bits));
- }
- else
- { /* add another bps bits to the buffer */
- bytebuff1 = bytebuff2 = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- }
- ready_bits += bps;
- }
- }
-
- /* catch any trailing bits at the end of the line */
- while (ready_bits > 0)
- {
- bytebuff1 = (buff2 >> 24);
- *dst++ = bytebuff1;
-
- buff2 = (buff2 << 8);
- bytebuff2 = bytebuff1;
- ready_bits -= 8;
- }
-
- return (0);
- } /* end rotateContigSamples24bits */
-
-static int
-rotateContigSamples32bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width,
- uint32 length, uint32 col, uint8 *src, uint8 *dst)
- {
- int ready_bits = 0 /*, shift_width = 0 */;
- /* int bytes_per_sample, bytes_per_pixel; */
- uint32 row, rowsize, bit_offset;
- uint32 src_byte, src_bit;
- uint32 longbuff1 = 0, longbuff2 = 0;
- uint64 maskbits = 0, matchbits = 0;
- uint64 buff1 = 0, buff2 = 0, buff3 = 0;
- uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0;
- uint8 *next;
- tsample_t sample;
-
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("rotateContigSamples24bits","Invalid src or destination buffer");
- return (1);
- }
-
- /* bytes_per_sample = (bps + 7) / 8; */
- /* bytes_per_pixel = ((bps * spp) + 7) / 8; */
- /* if (bytes_per_pixel < (bytes_per_sample + 1)) */
- /* shift_width = bytes_per_pixel; */
- /* else */
- /* shift_width = bytes_per_sample + 1; */
-
- rowsize = ((bps * spp * width) + 7) / 8;
- ready_bits = 0;
- maskbits = (uint64)-1 >> (64 - bps);
- buff1 = buff2 = 0;
- for (row = 0; row < length; row++)
- {
- bit_offset = col * bps * spp;
- for (sample = 0; sample < spp; sample++)
- {
- if (sample == 0)
- {
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sample * bps)) / 8;
- src_bit = (bit_offset + (sample * bps)) % 8;
- }
-
- switch (rotation)
- {
- case 90: next = src + src_byte - (row * rowsize);
- break;
- case 270: next = src + src_byte + (row * rowsize);
- break;
- default: TIFFError("rotateContigSamples8bits", "Invalid rotation %d", rotation);
- return (1);
- }
- matchbits = maskbits << (64 - src_bit - bps);
- if (little_endian)
- {
- longbuff1 = (next[0] << 24) | (next[1] << 16) | (next[2] << 8) | next[3];
- longbuff2 = longbuff1;
- }
- else
- {
- longbuff1 = (next[3] << 24) | (next[2] << 16) | (next[1] << 8) | next[0];
- longbuff2 = longbuff1;
- }
-
- buff3 = ((uint64)longbuff1 << 32) | longbuff2;
- buff1 = (buff3 & matchbits) << (src_bit);
-
- if (ready_bits < 32)
- { /* add another bps bits to the buffer */
- bytebuff1 = bytebuff2 = bytebuff3 = bytebuff4 = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- }
- else /* If we have a full buffer's worth, write it out */
- {
- bytebuff1 = (buff2 >> 56);
- *dst++ = bytebuff1;
- bytebuff2 = (buff2 >> 48);
- *dst++ = bytebuff2;
- bytebuff3 = (buff2 >> 40);
- *dst++ = bytebuff3;
- bytebuff4 = (buff2 >> 32);
- *dst++ = bytebuff4;
- ready_bits -= 32;
-
- /* shift in new bits */
- buff2 = ((buff2 << 32) | (buff1 >> ready_bits));
- }
- ready_bits += bps;
- }
- }
- while (ready_bits > 0)
- {
- bytebuff1 = (buff2 >> 56);
- *dst++ = bytebuff1;
- buff2 = (buff2 << 8);
- ready_bits -= 8;
- }
-
- return (0);
- } /* end rotateContigSamples32bits */
-
-
-/* Rotate an image by a multiple of 90 degrees clockwise */
-static int
-rotateImage(uint16 rotation, struct image_data *image, uint32 *img_width,
- uint32 *img_length, unsigned char **ibuff_ptr)
- {
- int shift_width;
- uint32 bytes_per_pixel, bytes_per_sample;
- uint32 row, rowsize, src_offset, dst_offset;
- uint32 i, col, width, length;
- uint32 colsize, buffsize, col_offset, pix_offset;
- unsigned char *ibuff;
- unsigned char *src;
- unsigned char *dst;
- uint16 spp, bps;
- float res_temp;
- unsigned char *rbuff = NULL;
-
- width = *img_width;
- length = *img_length;
- spp = image->spp;
- bps = image->bps;
-
- rowsize = ((bps * spp * width) + 7) / 8;
- colsize = ((bps * spp * length) + 7) / 8;
- if ((colsize * width) > (rowsize * length))
- buffsize = (colsize + 1) * width;
- else
- buffsize = (rowsize + 1) * length;
-
- bytes_per_sample = (bps + 7) / 8;
- bytes_per_pixel = ((bps * spp) + 7) / 8;
- if (bytes_per_pixel < (bytes_per_sample + 1))
- shift_width = bytes_per_pixel;
- else
- shift_width = bytes_per_sample + 1;
-
- switch (rotation)
- {
- case 0:
- case 360: return (0);
- case 90:
- case 180:
- case 270: break;
- default: TIFFError("rotateImage", "Invalid rotation angle %d", rotation);
- return (-1);
- }
-
- if (!(rbuff = (unsigned char *)_TIFFmalloc(buffsize)))
- {
- TIFFError("rotateImage", "Unable to allocate rotation buffer of %1u bytes", buffsize);
- return (-1);
- }
- _TIFFmemset(rbuff, '\0', buffsize);
-
- ibuff = *ibuff_ptr;
- switch (rotation)
- {
- case 180: if ((bps % 8) == 0) /* byte alligned data */
- {
- src = ibuff;
- pix_offset = (spp * bps) / 8;
- for (row = 0; row < length; row++)
- {
- dst_offset = (length - row - 1) * rowsize;
- for (col = 0; col < width; col++)
- {
- col_offset = (width - col - 1) * pix_offset;
- dst = rbuff + dst_offset + col_offset;
-
- for (i = 0; i < bytes_per_pixel; i++)
- *dst++ = *src++;
- }
- }
- }
- else
- { /* non 8 bit per sample data */
- for (row = 0; row < length; row++)
- {
- src_offset = row * rowsize;
- dst_offset = (length - row - 1) * rowsize;
- src = ibuff + src_offset;
- dst = rbuff + dst_offset;
- switch (shift_width)
- {
- case 1: if (bps == 1)
- {
- if (reverseSamples8bits(spp, bps, width, src, dst))
- {
- _TIFFfree(rbuff);
- return (-1);
- }
- break;
- }
- if (reverseSamples16bits(spp, bps, width, src, dst))
- {
- _TIFFfree(rbuff);
- return (-1);
- }
- break;
- case 2: if (reverseSamples24bits(spp, bps, width, src, dst))
- {
- _TIFFfree(rbuff);
- return (-1);
- }
- break;
- case 3:
- case 4:
- case 5: if (reverseSamples32bits(spp, bps, width, src, dst))
- {
- _TIFFfree(rbuff);
- return (-1);
- }
- break;
- default: TIFFError("rotateImage","Unsupported bit depth %d", bps);
- _TIFFfree(rbuff);
- return (-1);
- }
- }
- }
- _TIFFfree(ibuff);
- *(ibuff_ptr) = rbuff;
- break;
-
- case 90: if ((bps % 8) == 0) /* byte aligned data */
- {
- for (col = 0; col < width; col++)
- {
- src_offset = ((length - 1) * rowsize) + (col * bytes_per_pixel);
- dst_offset = col * colsize;
- src = ibuff + src_offset;
- dst = rbuff + dst_offset;
- for (row = length; row > 0; row--)
- {
- for (i = 0; i < bytes_per_pixel; i++)
- *dst++ = *(src + i);
- src -= rowsize;
- }
- }
- }
- else
- { /* non 8 bit per sample data */
- for (col = 0; col < width; col++)
- {
- src_offset = (length - 1) * rowsize;
- dst_offset = col * colsize;
- src = ibuff + src_offset;
- dst = rbuff + dst_offset;
- switch (shift_width)
- {
- case 1: if (bps == 1)
- {
- if (rotateContigSamples8bits(rotation, spp, bps, width,
- length, col, src, dst))
- {
- _TIFFfree(rbuff);
- return (-1);
- }
- break;
- }
- if (rotateContigSamples16bits(rotation, spp, bps, width,
- length, col, src, dst))
- {
- _TIFFfree(rbuff);
- return (-1);
- }
- break;
- case 2: if (rotateContigSamples24bits(rotation, spp, bps, width,
- length, col, src, dst))
- {
- _TIFFfree(rbuff);
- return (-1);
- }
- break;
- case 3:
- case 4:
- case 5: if (rotateContigSamples32bits(rotation, spp, bps, width,
- length, col, src, dst))
- {
- _TIFFfree(rbuff);
- return (-1);
- }
- break;
- default: TIFFError("rotateImage","Unsupported bit depth %d", bps);
- _TIFFfree(rbuff);
- return (-1);
- }
- }
- }
- _TIFFfree(ibuff);
- *(ibuff_ptr) = rbuff;
-
- *img_width = length;
- *img_length = width;
- image->width = length;
- image->length = width;
- res_temp = image->xres;
- image->xres = image->yres;
- image->yres = res_temp;
- break;
-
- case 270: if ((bps % 8) == 0) /* byte aligned data */
- {
- for (col = 0; col < width; col++)
- {
- src_offset = col * bytes_per_pixel;
- dst_offset = (width - col - 1) * colsize;
- src = ibuff + src_offset;
- dst = rbuff + dst_offset;
- for (row = length; row > 0; row--)
- {
- for (i = 0; i < bytes_per_pixel; i++)
- *dst++ = *(src + i);
- src += rowsize;
- }
- }
- }
- else
- { /* non 8 bit per sample data */
- for (col = 0; col < width; col++)
- {
- src_offset = 0;
- dst_offset = (width - col - 1) * colsize;
- src = ibuff + src_offset;
- dst = rbuff + dst_offset;
- switch (shift_width)
- {
- case 1: if (bps == 1)
- {
- if (rotateContigSamples8bits(rotation, spp, bps, width,
- length, col, src, dst))
- {
- _TIFFfree(rbuff);
- return (-1);
- }
- break;
- }
- if (rotateContigSamples16bits(rotation, spp, bps, width,
- length, col, src, dst))
- {
- _TIFFfree(rbuff);
- return (-1);
- }
- break;
- case 2: if (rotateContigSamples24bits(rotation, spp, bps, width,
- length, col, src, dst))
- {
- _TIFFfree(rbuff);
- return (-1);
- }
- break;
- case 3:
- case 4:
- case 5: if (rotateContigSamples32bits(rotation, spp, bps, width,
- length, col, src, dst))
- {
- _TIFFfree(rbuff);
- return (-1);
- }
- break;
- default: TIFFError("rotateImage","Unsupported bit depth %d", bps);
- _TIFFfree(rbuff);
- return (-1);
- }
- }
- }
- _TIFFfree(ibuff);
- *(ibuff_ptr) = rbuff;
-
- *img_width = length;
- *img_length = width;
- image->width = length;
- image->length = width;
- res_temp = image->xres;
- image->xres = image->yres;
- image->yres = res_temp;
- break;
- default:
- break;
- }
-
- return (0);
- } /* end rotateImage */
-
-static int
-reverseSamples8bits (uint16 spp, uint16 bps, uint32 width,
- uint8 *ibuff, uint8 *obuff)
- {
- int ready_bits = 0;
- uint32 col;
- uint32 src_byte, src_bit;
- uint32 bit_offset = 0;
- uint8 match_bits = 0, mask_bits = 0;
- uint8 buff1 = 0, buff2 = 0;
- unsigned char *src;
- unsigned char *dst;
- tsample_t sample;
-
- if ((ibuff == NULL) || (obuff == NULL))
- {
- TIFFError("reverseSamples8bits","Invalid image or work buffer");
- return (1);
- }
-
- ready_bits = 0;
- mask_bits = (uint8)-1 >> ( 8 - bps);
- dst = obuff;
- for (col = width; col > 0; col--)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = (col - 1) * bps * spp;
- for (sample = 0; sample < spp; sample++)
- {
- if (sample == 0)
- {
- src_byte = bit_offset / 8;
- src_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sample * bps)) / 8;
- src_bit = (bit_offset + (sample * bps)) % 8;
- }
-
- src = ibuff + src_byte;
- match_bits = mask_bits << (8 - src_bit - bps);
- buff1 = ((*src) & match_bits) << (src_bit);
-
- if (ready_bits < 8)
- buff2 = (buff2 | (buff1 >> ready_bits));
- else /* If we have a full buffer's worth, write it out */
- {
- *dst++ = buff2;
- buff2 = buff1;
- ready_bits -= 8;
- }
- ready_bits += bps;
- }
- }
- if (ready_bits > 0)
- {
- buff1 = (buff2 & ((unsigned int)255 << (8 - ready_bits)));
- *dst++ = buff1;
- }
-
- return (0);
- } /* end reverseSamples8bits */
-
-
-static int
-reverseSamples16bits (uint16 spp, uint16 bps, uint32 width,
- uint8 *ibuff, uint8 *obuff)
- {
- int ready_bits = 0;
- uint32 col;
- uint32 src_byte = 0, high_bit = 0;
- uint32 bit_offset = 0;
- uint16 match_bits = 0, mask_bits = 0;
- uint16 buff1 = 0, buff2 = 0;
- uint8 bytebuff = 0;
- unsigned char *src;
- unsigned char *dst;
- tsample_t sample;
-
- if ((ibuff == NULL) || (obuff == NULL))
- {
- TIFFError("reverseSample16bits","Invalid image or work buffer");
- return (1);
- }
-
- ready_bits = 0;
- mask_bits = (uint16)-1 >> (16 - bps);
- dst = obuff;
- for (col = width; col > 0; col--)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = (col - 1) * bps * spp;
- for (sample = 0; sample < spp; sample++)
- {
- if (sample == 0)
- {
- src_byte = bit_offset / 8;
- high_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sample * bps)) / 8;
- high_bit = (bit_offset + (sample * bps)) % 8;
- }
-
- src = ibuff + src_byte;
- match_bits = mask_bits << (16 - high_bit - bps);
- if (little_endian)
- buff1 = (src[0] << 8) | src[1];
- else
- buff1 = (src[1] << 8) | src[0];
- buff1 = (buff1 & match_bits) << (high_bit);
-
- if (ready_bits < 8)
- { /* add another bps bits to the buffer */
- bytebuff = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- }
- else /* If we have a full buffer's worth, write it out */
- {
- bytebuff = (buff2 >> 8);
- *dst++ = bytebuff;
- ready_bits -= 8;
- /* shift in new bits */
- buff2 = ((buff2 << 8) | (buff1 >> ready_bits));
- }
- ready_bits += bps;
- }
- }
-
- if (ready_bits > 0)
- {
- bytebuff = (buff2 >> 8);
- *dst++ = bytebuff;
- }
-
- return (0);
- } /* end reverseSamples16bits */
-
-static int
-reverseSamples24bits (uint16 spp, uint16 bps, uint32 width,
- uint8 *ibuff, uint8 *obuff)
- {
- int ready_bits = 0;
- uint32 col;
- uint32 src_byte = 0, high_bit = 0;
- uint32 bit_offset = 0;
- uint32 match_bits = 0, mask_bits = 0;
- uint32 buff1 = 0, buff2 = 0;
- uint8 bytebuff1 = 0, bytebuff2 = 0;
- unsigned char *src;
- unsigned char *dst;
- tsample_t sample;
-
- if ((ibuff == NULL) || (obuff == NULL))
- {
- TIFFError("reverseSamples24bits","Invalid image or work buffer");
- return (1);
- }
-
- ready_bits = 0;
- mask_bits = (uint32)-1 >> (32 - bps);
- dst = obuff;
- for (col = width; col > 0; col--)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = (col - 1) * bps * spp;
- for (sample = 0; sample < spp; sample++)
- {
- if (sample == 0)
- {
- src_byte = bit_offset / 8;
- high_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sample * bps)) / 8;
- high_bit = (bit_offset + (sample * bps)) % 8;
- }
-
- src = ibuff + src_byte;
- match_bits = mask_bits << (32 - high_bit - bps);
- if (little_endian)
- buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
- else
- buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0];
- buff1 = (buff1 & match_bits) << (high_bit);
-
- if (ready_bits < 16)
- { /* add another bps bits to the buffer */
- bytebuff1 = bytebuff2 = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- }
- else /* If we have a full buffer's worth, write it out */
- {
- bytebuff1 = (buff2 >> 24);
- *dst++ = bytebuff1;
- bytebuff2 = (buff2 >> 16);
- *dst++ = bytebuff2;
- ready_bits -= 16;
-
- /* shift in new bits */
- buff2 = ((buff2 << 16) | (buff1 >> ready_bits));
- }
- ready_bits += bps;
- }
- }
-
- /* catch any trailing bits at the end of the line */
- while (ready_bits > 0)
- {
- bytebuff1 = (buff2 >> 24);
- *dst++ = bytebuff1;
-
- buff2 = (buff2 << 8);
- bytebuff2 = bytebuff1;
- ready_bits -= 8;
- }
-
- return (0);
- } /* end reverseSamples24bits */
-
-
-static int
-reverseSamples32bits (uint16 spp, uint16 bps, uint32 width,
- uint8 *ibuff, uint8 *obuff)
- {
- int ready_bits = 0 /*, shift_width = 0 */;
- /* int bytes_per_sample, bytes_per_pixel; */
- uint32 bit_offset;
- uint32 src_byte = 0, high_bit = 0;
- uint32 col;
- uint32 longbuff1 = 0, longbuff2 = 0;
- uint64 mask_bits = 0, match_bits = 0;
- uint64 buff1 = 0, buff2 = 0, buff3 = 0;
- uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0;
- unsigned char *src;
- unsigned char *dst;
- tsample_t sample;
-
- if ((ibuff == NULL) || (obuff == NULL))
- {
- TIFFError("reverseSamples32bits","Invalid image or work buffer");
- return (1);
- }
-
- ready_bits = 0;
- mask_bits = (uint64)-1 >> (64 - bps);
- dst = obuff;
-
- /* bytes_per_sample = (bps + 7) / 8; */
- /* bytes_per_pixel = ((bps * spp) + 7) / 8; */
- /* if (bytes_per_pixel < (bytes_per_sample + 1)) */
- /* shift_width = bytes_per_pixel; */
- /* else */
- /* shift_width = bytes_per_sample + 1; */
-
- for (col = width; col > 0; col--)
- {
- /* Compute src byte(s) and bits within byte(s) */
- bit_offset = (col - 1) * bps * spp;
- for (sample = 0; sample < spp; sample++)
- {
- if (sample == 0)
- {
- src_byte = bit_offset / 8;
- high_bit = bit_offset % 8;
- }
- else
- {
- src_byte = (bit_offset + (sample * bps)) / 8;
- high_bit = (bit_offset + (sample * bps)) % 8;
- }
-
- src = ibuff + src_byte;
- match_bits = mask_bits << (64 - high_bit - bps);
- if (little_endian)
- {
- longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
- longbuff2 = longbuff1;
- }
- else
- {
- longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0];
- longbuff2 = longbuff1;
- }
- buff3 = ((uint64)longbuff1 << 32) | longbuff2;
- buff1 = (buff3 & match_bits) << (high_bit);
-
- if (ready_bits < 32)
- { /* add another bps bits to the buffer */
- bytebuff1 = bytebuff2 = bytebuff3 = bytebuff4 = 0;
- buff2 = (buff2 | (buff1 >> ready_bits));
- }
- else /* If we have a full buffer's worth, write it out */
- {
- bytebuff1 = (buff2 >> 56);
- *dst++ = bytebuff1;
- bytebuff2 = (buff2 >> 48);
- *dst++ = bytebuff2;
- bytebuff3 = (buff2 >> 40);
- *dst++ = bytebuff3;
- bytebuff4 = (buff2 >> 32);
- *dst++ = bytebuff4;
- ready_bits -= 32;
-
- /* shift in new bits */
- buff2 = ((buff2 << 32) | (buff1 >> ready_bits));
- }
- ready_bits += bps;
- }
- }
- while (ready_bits > 0)
- {
- bytebuff1 = (buff2 >> 56);
- *dst++ = bytebuff1;
- buff2 = (buff2 << 8);
- ready_bits -= 8;
- }
-
- return (0);
- } /* end reverseSamples32bits */
-
-static int
-reverseSamplesBytes (uint16 spp, uint16 bps, uint32 width,
- uint8 *src, uint8 *dst)
- {
- int i;
- uint32 col, bytes_per_pixel, col_offset;
- uint8 bytebuff1;
- unsigned char swapbuff[32];
-
- if ((src == NULL) || (dst == NULL))
- {
- TIFFError("reverseSamplesBytes","Invalid input or output buffer");
- return (1);
- }
-
- bytes_per_pixel = ((bps * spp) + 7) / 8;
- switch (bps / 8)
- {
- case 8: /* Use memcpy for multiple bytes per sample data */
- case 4:
- case 3:
- case 2: for (col = 0; col < (width / 2); col++)
- {
- col_offset = col * bytes_per_pixel;
- _TIFFmemcpy (swapbuff, src + col_offset, bytes_per_pixel);
- _TIFFmemcpy (src + col_offset, dst - col_offset - bytes_per_pixel, bytes_per_pixel);
- _TIFFmemcpy (dst - col_offset - bytes_per_pixel, swapbuff, bytes_per_pixel);
- }
- break;
- case 1: /* Use byte copy only for single byte per sample data */
- for (col = 0; col < (width / 2); col++)
- {
- for (i = 0; i < spp; i++)
- {
- bytebuff1 = *src;
- *src++ = *(dst - spp + i);
- *(dst - spp + i) = bytebuff1;
- }
- dst -= spp;
- }
- break;
- default: TIFFError("reverseSamplesBytes","Unsupported bit depth %d", bps);
- return (1);
- }
- return (0);
- } /* end reverseSamplesBytes */
-
-
-/* Mirror an image horizontally or vertically */
-static int
-mirrorImage(uint16 spp, uint16 bps, uint16 mirror, uint32 width, uint32 length, unsigned char *ibuff)
- {
- int shift_width;
- uint32 bytes_per_pixel, bytes_per_sample;
- uint32 row, rowsize, row_offset;
- unsigned char *line_buff = NULL;
- unsigned char *src;
- unsigned char *dst;
-
- src = ibuff;
- rowsize = ((width * bps * spp) + 7) / 8;
- switch (mirror)
- {
- case MIRROR_BOTH:
- case MIRROR_VERT:
- line_buff = (unsigned char *)_TIFFmalloc(rowsize);
- if (line_buff == NULL)
- {
- TIFFError ("mirrorImage", "Unable to allocate mirror line buffer of %1u bytes", rowsize);
- return (-1);
- }
-
- dst = ibuff + (rowsize * (length - 1));
- for (row = 0; row < length / 2; row++)
- {
- _TIFFmemcpy(line_buff, src, rowsize);
- _TIFFmemcpy(src, dst, rowsize);
- _TIFFmemcpy(dst, line_buff, rowsize);
- src += (rowsize);
- dst -= (rowsize);
- }
- if (line_buff)
- _TIFFfree(line_buff);
- if (mirror == MIRROR_VERT)
- break;
- case MIRROR_HORIZ :
- if ((bps % 8) == 0) /* byte alligned data */
- {
- for (row = 0; row < length; row++)
- {
- row_offset = row * rowsize;
- src = ibuff + row_offset;
- dst = ibuff + row_offset + rowsize;
- if (reverseSamplesBytes(spp, bps, width, src, dst))
- {
- return (-1);
- }
- }
- }
- else
- { /* non 8 bit per sample data */
- if (!(line_buff = (unsigned char *)_TIFFmalloc(rowsize + 1)))
- {
- TIFFError("mirrorImage", "Unable to allocate mirror line buffer");
- return (-1);
- }
- bytes_per_sample = (bps + 7) / 8;
- bytes_per_pixel = ((bps * spp) + 7) / 8;
- if (bytes_per_pixel < (bytes_per_sample + 1))
- shift_width = bytes_per_pixel;
- else
- shift_width = bytes_per_sample + 1;
-
- for (row = 0; row < length; row++)
- {
- row_offset = row * rowsize;
- src = ibuff + row_offset;
- _TIFFmemset (line_buff, '\0', rowsize);
- switch (shift_width)
- {
- case 1: if (reverseSamples16bits(spp, bps, width, src, line_buff))
- {
- _TIFFfree(line_buff);
- return (-1);
- }
- _TIFFmemcpy (src, line_buff, rowsize);
- break;
- case 2: if (reverseSamples24bits(spp, bps, width, src, line_buff))
- {
- _TIFFfree(line_buff);
- return (-1);
- }
- _TIFFmemcpy (src, line_buff, rowsize);
- break;
- case 3:
- case 4:
- case 5: if (reverseSamples32bits(spp, bps, width, src, line_buff))
- {
- _TIFFfree(line_buff);
- return (-1);
- }
- _TIFFmemcpy (src, line_buff, rowsize);
- break;
- default: TIFFError("mirrorImage","Unsupported bit depth %d", bps);
- _TIFFfree(line_buff);
- return (-1);
- }
- }
- if (line_buff)
- _TIFFfree(line_buff);
- }
- break;
-
- default: TIFFError ("mirrorImage", "Invalid mirror axis %d", mirror);
- return (-1);
- break;
- }
-
- return (0);
- }
-
-/* Invert the light and dark values for a bilevel or grayscale image */
-static int
-invertImage(uint16 photometric, uint16 spp, uint16 bps, uint32 width, uint32 length, unsigned char *work_buff)
- {
- uint32 row, col;
- unsigned char bytebuff1, bytebuff2, bytebuff3, bytebuff4;
- unsigned char *src;
- uint16 *src_uint16;
- uint32 *src_uint32;
-
- if (spp != 1)
- {
- TIFFError("invertImage", "Image inversion not supported for more than one sample per pixel");
- return (-1);
- }
-
- if (photometric != PHOTOMETRIC_MINISWHITE && photometric != PHOTOMETRIC_MINISBLACK)
- {
- TIFFError("invertImage", "Only black and white and grayscale images can be inverted");
- return (-1);
- }
-
- src = work_buff;
- if (src == NULL)
- {
- TIFFError ("invertImage", "Invalid crop buffer passed to invertImage");
- return (-1);
- }
-
- switch (bps)
- {
- case 32: src_uint32 = (uint32 *)src;
- for (row = 0; row < length; row++)
- for (col = 0; col < width; col++)
- {
- *src_uint32 = (uint32)0xFFFFFFFF - *src_uint32;
- src_uint32++;
- }
- break;
- case 16: src_uint16 = (uint16 *)src;
- for (row = 0; row < length; row++)
- for (col = 0; col < width; col++)
- {
- *src_uint16 = (uint16)0xFFFF - *src_uint16;
- src_uint16++;
- }
- break;
- case 8: for (row = 0; row < length; row++)
- for (col = 0; col < width; col++)
- {
- *src = (uint8)255 - *src;
- src++;
- }
- break;
- case 4: for (row = 0; row < length; row++)
- for (col = 0; col < width; col++)
- {
- bytebuff1 = 16 - (uint8)(*src & 240 >> 4);
- bytebuff2 = 16 - (*src & 15);
- *src = bytebuff1 << 4 & bytebuff2;
- src++;
- }
- break;
- case 2: for (row = 0; row < length; row++)
- for (col = 0; col < width; col++)
- {
- bytebuff1 = 4 - (uint8)(*src & 192 >> 6);
- bytebuff2 = 4 - (uint8)(*src & 48 >> 4);
- bytebuff3 = 4 - (uint8)(*src & 12 >> 2);
- bytebuff4 = 4 - (uint8)(*src & 3);
- *src = (bytebuff1 << 6) || (bytebuff2 << 4) || (bytebuff3 << 2) || bytebuff4;
- src++;
- }
- break;
- case 1: for (row = 0; row < length; row++)
- for (col = 0; col < width; col += 8 /(spp * bps))
- {
- *src = ~(*src);
- src++;
- }
- break;
- default: TIFFError("invertImage", "Unsupported bit depth %d", bps);
- return (-1);
- }
-
- return (0);
- }
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/tiffdither.c b/tiff/tools/tiffdither.c
deleted file mode 100755
index 4308946..0000000
--- a/tiff/tools/tiffdither.c
+++ /dev/null
@@ -1,334 +0,0 @@
-/* $Id: tiffdither.c,v 1.14 2013-05-02 14:44:29 tgl Exp $ */
-
-/*
- * Copyright (c) 1988-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffio.h"
-
-#define streq(a,b) (strcmp(a,b) == 0)
-#define strneq(a,b,n) (strncmp(a,b,n) == 0)
-
-#define CopyField(tag, v) \
- if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v)
-
-uint32 imagewidth;
-uint32 imagelength;
-int threshold = 128;
-
-static void usage(void);
-
-/*
- * Floyd-Steinberg error propragation with threshold.
- * This code is stolen from tiffmedian.
- */
-static void
-fsdither(TIFF* in, TIFF* out)
-{
- unsigned char *outline, *inputline, *inptr;
- short *thisline, *nextline, *tmpptr;
- register unsigned char *outptr;
- register short *thisptr, *nextptr;
- register uint32 i, j;
- uint32 imax, jmax;
- int lastline, lastpixel;
- int bit;
- tsize_t outlinesize;
-
- imax = imagelength - 1;
- jmax = imagewidth - 1;
- inputline = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(in));
- thisline = (short *)_TIFFmalloc(imagewidth * sizeof (short));
- nextline = (short *)_TIFFmalloc(imagewidth * sizeof (short));
- outlinesize = TIFFScanlineSize(out);
- outline = (unsigned char *) _TIFFmalloc(outlinesize);
-
- /*
- * Get first line
- */
- if (TIFFReadScanline(in, inputline, 0, 0) <= 0)
- goto skip_on_error;
-
- inptr = inputline;
- nextptr = nextline;
- for (j = 0; j < imagewidth; ++j)
- *nextptr++ = *inptr++;
- for (i = 1; i < imagelength; ++i) {
- tmpptr = thisline;
- thisline = nextline;
- nextline = tmpptr;
- lastline = (i == imax);
- if (TIFFReadScanline(in, inputline, i, 0) <= 0)
- break;
- inptr = inputline;
- nextptr = nextline;
- for (j = 0; j < imagewidth; ++j)
- *nextptr++ = *inptr++;
- thisptr = thisline;
- nextptr = nextline;
- _TIFFmemset(outptr = outline, 0, outlinesize);
- bit = 0x80;
- for (j = 0; j < imagewidth; ++j) {
- register int v;
-
- lastpixel = (j == jmax);
- v = *thisptr++;
- if (v < 0)
- v = 0;
- else if (v > 255)
- v = 255;
- if (v > threshold) {
- *outptr |= bit;
- v -= 255;
- }
- bit >>= 1;
- if (bit == 0) {
- outptr++;
- bit = 0x80;
- }
- if (!lastpixel)
- thisptr[0] += v * 7 / 16;
- if (!lastline) {
- if (j != 0)
- nextptr[-1] += v * 3 / 16;
- *nextptr++ += v * 5 / 16;
- if (!lastpixel)
- nextptr[0] += v / 16;
- }
- }
- if (TIFFWriteScanline(out, outline, i-1, 0) < 0)
- break;
- }
- skip_on_error:
- _TIFFfree(inputline);
- _TIFFfree(thisline);
- _TIFFfree(nextline);
- _TIFFfree(outline);
-}
-
-static uint16 compression = COMPRESSION_PACKBITS;
-static uint16 predictor = 0;
-static uint32 group3options = 0;
-
-static void
-processG3Options(char* cp)
-{
- if ((cp = strchr(cp, ':'))) {
- do {
- cp++;
- if (strneq(cp, "1d", 2))
- group3options &= ~GROUP3OPT_2DENCODING;
- else if (strneq(cp, "2d", 2))
- group3options |= GROUP3OPT_2DENCODING;
- else if (strneq(cp, "fill", 4))
- group3options |= GROUP3OPT_FILLBITS;
- else
- usage();
- } while ((cp = strchr(cp, ':')));
- }
-}
-
-static int
-processCompressOptions(char* opt)
-{
- if (streq(opt, "none"))
- compression = COMPRESSION_NONE;
- else if (streq(opt, "packbits"))
- compression = COMPRESSION_PACKBITS;
- else if (strneq(opt, "g3", 2)) {
- processG3Options(opt);
- compression = COMPRESSION_CCITTFAX3;
- } else if (streq(opt, "g4"))
- compression = COMPRESSION_CCITTFAX4;
- else if (strneq(opt, "lzw", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_LZW;
- } else if (strneq(opt, "zip", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_DEFLATE;
- } else
- return (0);
- return (1);
-}
-
-int
-main(int argc, char* argv[])
-{
- TIFF *in, *out;
- uint16 samplesperpixel, bitspersample = 1, shortv;
- float floatv;
- char thing[1024];
- uint32 rowsperstrip = (uint32) -1;
- uint16 fillorder = 0;
- int c;
- extern int optind;
- extern char *optarg;
-
- while ((c = getopt(argc, argv, "c:f:r:t:")) != -1)
- switch (c) {
- case 'c': /* compression scheme */
- if (!processCompressOptions(optarg))
- usage();
- break;
- case 'f': /* fill order */
- if (streq(optarg, "lsb2msb"))
- fillorder = FILLORDER_LSB2MSB;
- else if (streq(optarg, "msb2lsb"))
- fillorder = FILLORDER_MSB2LSB;
- else
- usage();
- break;
- case 'r': /* rows/strip */
- rowsperstrip = atoi(optarg);
- break;
- case 't':
- threshold = atoi(optarg);
- if (threshold < 0)
- threshold = 0;
- else if (threshold > 255)
- threshold = 255;
- break;
- case '?':
- usage();
- /*NOTREACHED*/
- }
- if (argc - optind < 2)
- usage();
- in = TIFFOpen(argv[optind], "r");
- if (in == NULL)
- return (-1);
- TIFFGetField(in, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel);
- if (samplesperpixel != 1) {
- fprintf(stderr, "%s: Not a b&w image.\n", argv[0]);
- return (-1);
- }
- TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bitspersample);
- if (bitspersample != 8) {
- fprintf(stderr,
- " %s: Sorry, only handle 8-bit samples.\n", argv[0]);
- return (-1);
- }
- out = TIFFOpen(argv[optind+1], "w");
- if (out == NULL)
- return (-1);
- CopyField(TIFFTAG_IMAGEWIDTH, imagewidth);
- TIFFGetField(in, TIFFTAG_IMAGELENGTH, &imagelength);
- TIFFSetField(out, TIFFTAG_IMAGELENGTH, imagelength-1);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 1);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 1);
- TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- if (fillorder)
- TIFFSetField(out, TIFFTAG_FILLORDER, fillorder);
- else
- CopyField(TIFFTAG_FILLORDER, shortv);
- snprintf(thing, sizeof(thing), "Dithered B&W version of %s", argv[optind]);
- TIFFSetField(out, TIFFTAG_IMAGEDESCRIPTION, thing);
- CopyField(TIFFTAG_PHOTOMETRIC, shortv);
- CopyField(TIFFTAG_ORIENTATION, shortv);
- CopyField(TIFFTAG_XRESOLUTION, floatv);
- CopyField(TIFFTAG_YRESOLUTION, floatv);
- CopyField(TIFFTAG_RESOLUTIONUNIT, shortv);
- rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip);
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
- switch (compression) {
- case COMPRESSION_CCITTFAX3:
- TIFFSetField(out, TIFFTAG_GROUP3OPTIONS, group3options);
- break;
- case COMPRESSION_LZW:
- case COMPRESSION_DEFLATE:
- if (predictor)
- TIFFSetField(out, TIFFTAG_PREDICTOR, predictor);
- break;
- }
- fsdither(in, out);
- TIFFClose(in);
- TIFFClose(out);
- return (0);
-}
-
-char* stuff[] = {
-"usage: tiffdither [options] input.tif output.tif",
-"where options are:",
-" -r # make each strip have no more than # rows",
-" -t # set the threshold value for dithering (default 128)",
-" -f lsb2msb force lsb-to-msb FillOrder for output",
-" -f msb2lsb force msb-to-lsb FillOrder for output",
-" -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding",
-" -c zip[:opts] compress output with deflate encoding",
-" -c packbits compress output with packbits encoding",
-" -c g3[:opts] compress output with CCITT Group 3 encoding",
-" -c g4 compress output with CCITT Group 4 encoding",
-" -c none use no compression algorithm on output",
-"",
-"Group 3 options:",
-" 1d use default CCITT Group 3 1D-encoding",
-" 2d use optional CCITT Group 3 2D-encoding",
-" fill byte-align EOL codes",
-"For example, -c g3:2d:fill to get G3-2D-encoded data with byte-aligned EOLs",
-"",
-"LZW and deflate options:",
-" # set predictor value",
-"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/tiffdump.c b/tiff/tools/tiffdump.c
deleted file mode 100755
index f490d85..0000000
--- a/tiff/tools/tiffdump.c
+++ /dev/null
@@ -1,895 +0,0 @@
-/* $Id: tiffdump.c,v 1.30 2014-12-22 02:52:38 bfriesen Exp $ */
-
-/*
- * Copyright (c) 1988-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#include "tiffiop.h"
-
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#ifdef HAVE_IO_H
-# include <io.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#ifndef HAVE_GETOPT
-extern int getopt(int, char**, char*);
-#endif
-
-#include "tiffio.h"
-
-#ifndef O_BINARY
-# define O_BINARY 0
-#endif
-
-static union
-{
- TIFFHeaderClassic classic;
- TIFFHeaderBig big;
- TIFFHeaderCommon common;
-} hdr;
-char* appname;
-char* curfile;
-int swabflag;
-int bigendian;
-int bigtiff;
-uint32 maxitems = 24; /* maximum indirect data items to print */
-
-const char* bytefmt = "%s%#02x"; /* BYTE */
-const char* sbytefmt = "%s%d"; /* SBYTE */
-const char* shortfmt = "%s%u"; /* SHORT */
-const char* sshortfmt = "%s%d"; /* SSHORT */
-const char* longfmt = "%s%lu"; /* LONG */
-const char* slongfmt = "%s%ld"; /* SLONG */
-const char* ifdfmt = "%s%#04lx"; /* IFD offset */
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
-const char* long8fmt = "%s%I64u"; /* LONG8 */
-const char* slong8fmt = "%s%I64d"; /* SLONG8 */
-const char* ifd8fmt = "%s%#08I64x"; /* IFD offset8*/
-#else
-const char* long8fmt = "%s%llu"; /* LONG8 */
-const char* slong8fmt = "%s%lld"; /* SLONG8 */
-const char* ifd8fmt = "%s%#08llx"; /* IFD offset8*/
-#endif
-const char* rationalfmt = "%s%g"; /* RATIONAL */
-const char* srationalfmt = "%s%g"; /* SRATIONAL */
-const char* floatfmt = "%s%g"; /* FLOAT */
-const char* doublefmt = "%s%g"; /* DOUBLE */
-
-static void dump(int, uint64);
-extern int optind;
-extern char* optarg;
-
-void
-usage()
-{
- fprintf(stderr, "usage: %s [-h] [-o offset] [-m maxitems] file.tif ...\n", appname);
- exit(-1);
-}
-
-int
-main(int argc, char* argv[])
-{
- int one = 1, fd;
- int multiplefiles = (argc > 1);
- int c;
- uint64 diroff = 0;
- bigendian = (*(char *)&one == 0);
-
- appname = argv[0];
- while ((c = getopt(argc, argv, "m:o:h")) != -1) {
- switch (c) {
- case 'h': /* print values in hex */
- shortfmt = "%s%#x";
- sshortfmt = "%s%#x";
- longfmt = "%s%#lx";
- slongfmt = "%s%#lx";
- break;
- case 'o':
- diroff = (uint64) strtoul(optarg, NULL, 0);
- break;
- case 'm':
- maxitems = strtoul(optarg, NULL, 0);
- break;
- default:
- usage();
- }
- }
- if (optind >= argc)
- usage();
- for (; optind < argc; optind++) {
- fd = open(argv[optind], O_RDONLY|O_BINARY, 0);
- if (fd < 0) {
- perror(argv[0]);
- return (-1);
- }
- if (multiplefiles)
- printf("%s:\n", argv[optind]);
- curfile = argv[optind];
- swabflag = 0;
- bigtiff = 0;
- dump(fd, diroff);
- close(fd);
- }
- return (0);
-}
-
-#define ord(e) ((int)e)
-
-static uint64 ReadDirectory(int, unsigned, uint64);
-static void ReadError(char*);
-static void Error(const char*, ...);
-static void Fatal(const char*, ...);
-
-static void
-dump(int fd, uint64 diroff)
-{
- unsigned i, j;
- uint64* visited_diroff = NULL;
- unsigned int count_visited_dir = 0;
-
- lseek(fd, (off_t) 0, 0);
- if (read(fd, (char*) &hdr, sizeof (TIFFHeaderCommon)) != sizeof (TIFFHeaderCommon))
- ReadError("TIFF header");
- if (hdr.common.tiff_magic != TIFF_BIGENDIAN
- && hdr.common.tiff_magic != TIFF_LITTLEENDIAN &&
-#if HOST_BIGENDIAN
- /* MDI is sensitive to the host byte order, unlike TIFF */
- MDI_BIGENDIAN != hdr.common.tiff_magic
-#else
- MDI_LITTLEENDIAN != hdr.common.tiff_magic
-#endif
- ) {
- Fatal("Not a TIFF or MDI file, bad magic number %u (%#x)",
- hdr.common.tiff_magic, hdr.common.tiff_magic);
- }
- if (hdr.common.tiff_magic == TIFF_BIGENDIAN
- || hdr.common.tiff_magic == MDI_BIGENDIAN)
- swabflag = !bigendian;
- else
- swabflag = bigendian;
- if (swabflag)
- TIFFSwabShort(&hdr.common.tiff_version);
- if (hdr.common.tiff_version==42)
- {
- if (read(fd, (char*) &hdr.classic.tiff_diroff, 4) != 4)
- ReadError("TIFF header");
- if (swabflag)
- TIFFSwabLong(&hdr.classic.tiff_diroff);
- printf("Magic: %#x <%s-endian> Version: %#x <%s>\n",
- hdr.classic.tiff_magic,
- hdr.classic.tiff_magic == TIFF_BIGENDIAN ? "big" : "little",
- 42,"ClassicTIFF");
- if (diroff == 0)
- diroff = hdr.classic.tiff_diroff;
- }
- else if (hdr.common.tiff_version==43)
- {
- if (read(fd, (char*) &hdr.big.tiff_offsetsize, 12) != 12)
- ReadError("TIFF header");
- if (swabflag)
- {
- TIFFSwabShort(&hdr.big.tiff_offsetsize);
- TIFFSwabShort(&hdr.big.tiff_unused);
- TIFFSwabLong8(&hdr.big.tiff_diroff);
- }
- printf("Magic: %#x <%s-endian> Version: %#x <%s>\n",
- hdr.big.tiff_magic,
- hdr.big.tiff_magic == TIFF_BIGENDIAN ? "big" : "little",
- 43,"BigTIFF");
- printf("OffsetSize: %#x Unused: %#x\n",
- hdr.big.tiff_offsetsize,hdr.big.tiff_unused);
- if (diroff == 0)
- diroff = hdr.big.tiff_diroff;
- bigtiff = 1;
- }
- else
- Fatal("Not a TIFF file, bad version number %u (%#x)",
- hdr.common.tiff_version, hdr.common.tiff_version);
- for (i = 0; diroff != 0; i++) {
- for(j=0; j<count_visited_dir; j++)
- {
- if( visited_diroff[j] == diroff )
- {
- free(visited_diroff);
- Fatal("Cycle detected in chaining of TIFF directories!");
- }
- }
- {
- size_t alloc_size;
- alloc_size=TIFFSafeMultiply(tmsize_t,(count_visited_dir + 1),
- sizeof(uint64));
- if (alloc_size == 0)
- {
- if (visited_diroff)
- free(visited_diroff);
- visited_diroff = 0;
- }
- else
- {
- visited_diroff = (uint64*) realloc(visited_diroff,alloc_size);
- }
- }
- if( !visited_diroff )
- Fatal("Out of memory");
- visited_diroff[count_visited_dir] = diroff;
- count_visited_dir ++;
-
- if (i > 0)
- putchar('\n');
- diroff = ReadDirectory(fd, i, diroff);
- }
- if( visited_diroff )
- free(visited_diroff);
-}
-
-static const int datawidth[] = {
- 0, /* 00 = undefined */
- 1, /* 01 = TIFF_BYTE */
- 1, /* 02 = TIFF_ASCII */
- 2, /* 03 = TIFF_SHORT */
- 4, /* 04 = TIFF_LONG */
- 8, /* 05 = TIFF_RATIONAL */
- 1, /* 06 = TIFF_SBYTE */
- 1, /* 07 = TIFF_UNDEFINED */
- 2, /* 08 = TIFF_SSHORT */
- 4, /* 09 = TIFF_SLONG */
- 8, /* 10 = TIFF_SRATIONAL */
- 4, /* 11 = TIFF_FLOAT */
- 8, /* 12 = TIFF_DOUBLE */
- 4, /* 13 = TIFF_IFD */
- 0, /* 14 = undefined */
- 0, /* 15 = undefined */
- 8, /* 16 = TIFF_LONG8 */
- 8, /* 17 = TIFF_SLONG8 */
- 8, /* 18 = TIFF_IFD8 */
-};
-#define NWIDTHS (sizeof (datawidth) / sizeof (datawidth[0]))
-static void PrintTag(FILE*, uint16);
-static void PrintType(FILE*, uint16);
-static void PrintData(FILE*, uint16, uint32, unsigned char*);
-
-/*
- * Read the next TIFF directory from a file
- * and convert it to the internal format.
- * We read directories sequentially.
- */
-static uint64
-ReadDirectory(int fd, unsigned int ix, uint64 off)
-{
- uint16 dircount;
- uint32 direntrysize;
- void* dirmem = NULL;
- uint64 nextdiroff = 0;
- uint32 n;
- uint8* dp;
-
- if (off == 0) /* no more directories */
- goto done;
-#if defined(__WIN32__) && defined(_MSC_VER)
- if (_lseeki64(fd, (__int64)off, SEEK_SET) != (__int64)off) {
-#else
- if (lseek(fd, (off_t)off, SEEK_SET) != (off_t)off) {
-#endif
- Fatal("Seek error accessing TIFF directory");
- goto done;
- }
- if (!bigtiff) {
- if (read(fd, (char*) &dircount, sizeof (uint16)) != sizeof (uint16)) {
- ReadError("directory count");
- goto done;
- }
- if (swabflag)
- TIFFSwabShort(&dircount);
- direntrysize = 12;
- } else {
- uint64 dircount64 = 0;
- if (read(fd, (char*) &dircount64, sizeof (uint64)) != sizeof (uint64)) {
- ReadError("directory count");
- goto done;
- }
- if (swabflag)
- TIFFSwabLong8(&dircount64);
- if (dircount64>0xFFFF) {
- Error("Sanity check on directory count failed");
- goto done;
- }
- dircount = (uint16)dircount64;
- direntrysize = 20;
- }
- dirmem = _TIFFmalloc(TIFFSafeMultiply(tmsize_t,dircount,direntrysize));
- if (dirmem == NULL) {
- Fatal("No space for TIFF directory");
- goto done;
- }
- n = read(fd, (char*) dirmem, dircount*direntrysize);
- if (n != dircount*direntrysize) {
- n /= direntrysize;
- Error(
-#if defined(__WIN32__) && defined(_MSC_VER)
- "Could only read %lu of %u entries in directory at offset %#I64x",
- (unsigned long)n, dircount, (unsigned __int64) off);
-#else
- "Could only read %lu of %u entries in directory at offset %#llx",
- (unsigned long)n, dircount, (unsigned long long) off);
-#endif
- dircount = n;
- nextdiroff = 0;
- } else {
- if (!bigtiff) {
- uint32 nextdiroff32;
- if (read(fd, (char*) &nextdiroff32, sizeof (uint32)) != sizeof (uint32))
- nextdiroff32 = 0;
- if (swabflag)
- TIFFSwabLong(&nextdiroff32);
- nextdiroff = nextdiroff32;
- } else {
- if (read(fd, (char*) &nextdiroff, sizeof (uint64)) != sizeof (uint64))
- nextdiroff = 0;
- if (swabflag)
- TIFFSwabLong8(&nextdiroff);
- }
- }
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- printf("Directory %u: offset %I64u (%#I64x) next %I64u (%#I64x)\n", ix,
- (unsigned __int64)off, (unsigned __int64)off,
- (unsigned __int64)nextdiroff, (unsigned __int64)nextdiroff);
-#else
- printf("Directory %u: offset %llu (%#llx) next %llu (%#llx)\n", ix,
- (unsigned long long)off, (unsigned long long)off,
- (unsigned long long)nextdiroff, (unsigned long long)nextdiroff);
-#endif
- for (dp = (uint8*)dirmem, n = dircount; n > 0; n--) {
- uint16 tag;
- uint16 type;
- uint16 typewidth;
- uint64 count;
- uint64 datasize;
- int datafits;
- void* datamem;
- uint64 dataoffset;
- int datatruncated;
- int datasizeoverflow;
-
- tag = *(uint16*)dp;
- if (swabflag)
- TIFFSwabShort(&tag);
- dp += sizeof(uint16);
- type = *(uint16*)dp;
- dp += sizeof(uint16);
- if (swabflag)
- TIFFSwabShort(&type);
- PrintTag(stdout, tag);
- putchar(' ');
- PrintType(stdout, type);
- putchar(' ');
- if (!bigtiff)
- {
- uint32 count32;
- count32 = *(uint32*)dp;
- if (swabflag)
- TIFFSwabLong(&count32);
- dp += sizeof(uint32);
- count = count32;
- }
- else
- {
- count = *(uint64*)dp;
- if (swabflag)
- TIFFSwabLong8(&count);
- dp += sizeof(uint64);
- }
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- printf("%I64u<", (unsigned __int64)count);
-#else
- printf("%llu<", (unsigned long long)count);
-#endif
- if (type >= NWIDTHS)
- typewidth = 0;
- else
- typewidth = datawidth[type];
- datasize = count*typewidth;
- datasizeoverflow = (typewidth > 0 && datasize / typewidth != count);
- datafits = 1;
- datamem = dp;
- dataoffset = 0;
- datatruncated = 0;
- if (!bigtiff)
- {
- if (datasizeoverflow || datasize>4)
- {
- uint32 dataoffset32;
- datafits = 0;
- datamem = NULL;
- dataoffset32 = *(uint32*)dp;
- if (swabflag)
- TIFFSwabLong(&dataoffset32);
- dataoffset = dataoffset32;
- }
- dp += sizeof(uint32);
- }
- else
- {
- if (datasizeoverflow || datasize>8)
- {
- datafits = 0;
- datamem = NULL;
- dataoffset = *(uint64*)dp;
- if (swabflag)
- TIFFSwabLong8(&dataoffset);
- }
- dp += sizeof(uint64);
- }
- if (datasizeoverflow || datasize>0x10000)
- {
- datatruncated = 1;
- count = 0x10000/typewidth;
- datasize = count*typewidth;
- }
- if (count>maxitems)
- {
- datatruncated = 1;
- count = maxitems;
- datasize = count*typewidth;
- }
- if (!datafits)
- {
- datamem = _TIFFmalloc((uint32)datasize);
- if (datamem) {
-#if defined(__WIN32__) && defined(_MSC_VER)
- if (_lseeki64(fd, (__int64)dataoffset, SEEK_SET)
- != (__int64)dataoffset)
-#else
- if (lseek(fd, (off_t)dataoffset, 0) !=
- (off_t)dataoffset)
-#endif
- {
- Error(
- "Seek error accessing tag %u value", tag);
- _TIFFfree(datamem);
- datamem = NULL;
- }
- else if (read(fd, datamem, (size_t)datasize) != (TIFF_SSIZE_T)datasize)
- {
- Error(
- "Read error accessing tag %u value", tag);
- _TIFFfree(datamem);
- datamem = NULL;
- }
- } else
- Error("No space for data for tag %u",tag);
- }
- if (datamem)
- {
- if (swabflag)
- {
- switch (type)
- {
- case TIFF_BYTE:
- case TIFF_ASCII:
- case TIFF_SBYTE:
- case TIFF_UNDEFINED:
- break;
- case TIFF_SHORT:
- case TIFF_SSHORT:
- TIFFSwabArrayOfShort((uint16*)datamem,(tmsize_t)count);
- break;
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_FLOAT:
- case TIFF_IFD:
- TIFFSwabArrayOfLong((uint32*)datamem,(tmsize_t)count);
- break;
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- TIFFSwabArrayOfLong((uint32*)datamem,(tmsize_t)count*2);
- break;
- case TIFF_DOUBLE:
- case TIFF_LONG8:
- case TIFF_SLONG8:
- case TIFF_IFD8:
- TIFFSwabArrayOfLong8((uint64*)datamem,(tmsize_t)count);
- break;
- }
- }
- PrintData(stdout,type,(uint32)count,datamem);
- if (datatruncated)
- printf(" ...");
- if (!datafits)
- {
- _TIFFfree(datamem);
- datamem = NULL;
- }
- }
- printf(">\n");
- }
-done:
- if (dirmem)
- _TIFFfree((char *)dirmem);
- return (nextdiroff);
-}
-
-static const struct tagname {
- uint16 tag;
- const char* name;
-} tagnames[] = {
- { TIFFTAG_SUBFILETYPE, "SubFileType" },
- { TIFFTAG_OSUBFILETYPE, "OldSubFileType" },
- { TIFFTAG_IMAGEWIDTH, "ImageWidth" },
- { TIFFTAG_IMAGELENGTH, "ImageLength" },
- { TIFFTAG_BITSPERSAMPLE, "BitsPerSample" },
- { TIFFTAG_COMPRESSION, "Compression" },
- { TIFFTAG_PHOTOMETRIC, "Photometric" },
- { TIFFTAG_THRESHHOLDING, "Threshholding" },
- { TIFFTAG_CELLWIDTH, "CellWidth" },
- { TIFFTAG_CELLLENGTH, "CellLength" },
- { TIFFTAG_FILLORDER, "FillOrder" },
- { TIFFTAG_DOCUMENTNAME, "DocumentName" },
- { TIFFTAG_IMAGEDESCRIPTION, "ImageDescription" },
- { TIFFTAG_MAKE, "Make" },
- { TIFFTAG_MODEL, "Model" },
- { TIFFTAG_STRIPOFFSETS, "StripOffsets" },
- { TIFFTAG_ORIENTATION, "Orientation" },
- { TIFFTAG_SAMPLESPERPIXEL, "SamplesPerPixel" },
- { TIFFTAG_ROWSPERSTRIP, "RowsPerStrip" },
- { TIFFTAG_STRIPBYTECOUNTS, "StripByteCounts" },
- { TIFFTAG_MINSAMPLEVALUE, "MinSampleValue" },
- { TIFFTAG_MAXSAMPLEVALUE, "MaxSampleValue" },
- { TIFFTAG_XRESOLUTION, "XResolution" },
- { TIFFTAG_YRESOLUTION, "YResolution" },
- { TIFFTAG_PLANARCONFIG, "PlanarConfig" },
- { TIFFTAG_PAGENAME, "PageName" },
- { TIFFTAG_XPOSITION, "XPosition" },
- { TIFFTAG_YPOSITION, "YPosition" },
- { TIFFTAG_FREEOFFSETS, "FreeOffsets" },
- { TIFFTAG_FREEBYTECOUNTS, "FreeByteCounts" },
- { TIFFTAG_GRAYRESPONSEUNIT, "GrayResponseUnit" },
- { TIFFTAG_GRAYRESPONSECURVE,"GrayResponseCurve" },
- { TIFFTAG_GROUP3OPTIONS, "Group3Options" },
- { TIFFTAG_GROUP4OPTIONS, "Group4Options" },
- { TIFFTAG_RESOLUTIONUNIT, "ResolutionUnit" },
- { TIFFTAG_PAGENUMBER, "PageNumber" },
- { TIFFTAG_COLORRESPONSEUNIT,"ColorResponseUnit" },
- { TIFFTAG_TRANSFERFUNCTION, "TransferFunction" },
- { TIFFTAG_SOFTWARE, "Software" },
- { TIFFTAG_DATETIME, "DateTime" },
- { TIFFTAG_ARTIST, "Artist" },
- { TIFFTAG_HOSTCOMPUTER, "HostComputer" },
- { TIFFTAG_PREDICTOR, "Predictor" },
- { TIFFTAG_WHITEPOINT, "Whitepoint" },
- { TIFFTAG_PRIMARYCHROMATICITIES,"PrimaryChromaticities" },
- { TIFFTAG_COLORMAP, "Colormap" },
- { TIFFTAG_HALFTONEHINTS, "HalftoneHints" },
- { TIFFTAG_TILEWIDTH, "TileWidth" },
- { TIFFTAG_TILELENGTH, "TileLength" },
- { TIFFTAG_TILEOFFSETS, "TileOffsets" },
- { TIFFTAG_TILEBYTECOUNTS, "TileByteCounts" },
- { TIFFTAG_BADFAXLINES, "BadFaxLines" },
- { TIFFTAG_CLEANFAXDATA, "CleanFaxData" },
- { TIFFTAG_CONSECUTIVEBADFAXLINES, "ConsecutiveBadFaxLines" },
- { TIFFTAG_SUBIFD, "SubIFD" },
- { TIFFTAG_INKSET, "InkSet" },
- { TIFFTAG_INKNAMES, "InkNames" },
- { TIFFTAG_NUMBEROFINKS, "NumberOfInks" },
- { TIFFTAG_DOTRANGE, "DotRange" },
- { TIFFTAG_TARGETPRINTER, "TargetPrinter" },
- { TIFFTAG_EXTRASAMPLES, "ExtraSamples" },
- { TIFFTAG_SAMPLEFORMAT, "SampleFormat" },
- { TIFFTAG_SMINSAMPLEVALUE, "SMinSampleValue" },
- { TIFFTAG_SMAXSAMPLEVALUE, "SMaxSampleValue" },
- { TIFFTAG_JPEGPROC, "JPEGProcessingMode" },
- { TIFFTAG_JPEGIFOFFSET, "JPEGInterchangeFormat" },
- { TIFFTAG_JPEGIFBYTECOUNT, "JPEGInterchangeFormatLength" },
- { TIFFTAG_JPEGRESTARTINTERVAL,"JPEGRestartInterval" },
- { TIFFTAG_JPEGLOSSLESSPREDICTORS,"JPEGLosslessPredictors" },
- { TIFFTAG_JPEGPOINTTRANSFORM,"JPEGPointTransform" },
- { TIFFTAG_JPEGTABLES, "JPEGTables" },
- { TIFFTAG_JPEGQTABLES, "JPEGQTables" },
- { TIFFTAG_JPEGDCTABLES, "JPEGDCTables" },
- { TIFFTAG_JPEGACTABLES, "JPEGACTables" },
- { TIFFTAG_YCBCRCOEFFICIENTS,"YCbCrCoefficients" },
- { TIFFTAG_YCBCRSUBSAMPLING, "YCbCrSubsampling" },
- { TIFFTAG_YCBCRPOSITIONING, "YCbCrPositioning" },
- { TIFFTAG_REFERENCEBLACKWHITE, "ReferenceBlackWhite" },
- { TIFFTAG_REFPTS, "IgReferencePoints (Island Graphics)" },
- { TIFFTAG_REGIONTACKPOINT, "IgRegionTackPoint (Island Graphics)" },
- { TIFFTAG_REGIONWARPCORNERS,"IgRegionWarpCorners (Island Graphics)" },
- { TIFFTAG_REGIONAFFINE, "IgRegionAffine (Island Graphics)" },
- { TIFFTAG_MATTEING, "OBSOLETE Matteing (Silicon Graphics)" },
- { TIFFTAG_DATATYPE, "OBSOLETE DataType (Silicon Graphics)" },
- { TIFFTAG_IMAGEDEPTH, "ImageDepth (Silicon Graphics)" },
- { TIFFTAG_TILEDEPTH, "TileDepth (Silicon Graphics)" },
- { 32768, "OLD BOGUS Matteing tag" },
- { TIFFTAG_COPYRIGHT, "Copyright" },
- { TIFFTAG_ICCPROFILE, "ICC Profile" },
- { TIFFTAG_JBIGOPTIONS, "JBIG Options" },
- { TIFFTAG_STONITS, "StoNits" },
-};
-#define NTAGS (sizeof (tagnames) / sizeof (tagnames[0]))
-
-static void
-PrintTag(FILE* fd, uint16 tag)
-{
- const struct tagname *tp;
-
- for (tp = tagnames; tp < &tagnames[NTAGS]; tp++)
- if (tp->tag == tag) {
- fprintf(fd, "%s (%u)", tp->name, tag);
- return;
- }
- fprintf(fd, "%u (%#x)", tag, tag);
-}
-
-static void
-PrintType(FILE* fd, uint16 type)
-{
- static const char *typenames[] = {
- "0",
- "BYTE",
- "ASCII",
- "SHORT",
- "LONG",
- "RATIONAL",
- "SBYTE",
- "UNDEFINED",
- "SSHORT",
- "SLONG",
- "SRATIONAL",
- "FLOAT",
- "DOUBLE",
- "IFD",
- "14",
- "15",
- "LONG8",
- "SLONG8",
- "IFD8"
- };
-#define NTYPES (sizeof (typenames) / sizeof (typenames[0]))
-
- if (type < NTYPES)
- fprintf(fd, "%s (%u)", typenames[type], type);
- else
- fprintf(fd, "%u (%#x)", type, type);
-}
-#undef NTYPES
-
-#include <ctype.h>
-
-static void
-PrintASCII(FILE* fd, uint32 cc, const unsigned char* cp)
-{
- for (; cc > 0; cc--, cp++) {
- const char* tp;
-
- if (isprint(*cp)) {
- fputc(*cp, fd);
- continue;
- }
- for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++)
- if (*tp++ == *cp)
- break;
- if (*tp)
- fprintf(fd, "\\%c", *tp);
- else if (*cp)
- fprintf(fd, "\\%03o", *cp);
- else
- fprintf(fd, "\\0");
- }
-}
-
-static void
-PrintData(FILE* fd, uint16 type, uint32 count, unsigned char* data)
-{
- char* sep = "";
-
- switch (type) {
- case TIFF_BYTE:
- while (count-- > 0)
- fprintf(fd, bytefmt, sep, *data++), sep = " ";
- break;
- case TIFF_SBYTE:
- while (count-- > 0)
- fprintf(fd, sbytefmt, sep, *(char *)data++), sep = " ";
- break;
- case TIFF_UNDEFINED:
- while (count-- > 0)
- fprintf(fd, bytefmt, sep, *data++), sep = " ";
- break;
- case TIFF_ASCII:
- PrintASCII(fd, count, data);
- break;
- case TIFF_SHORT: {
- uint16 *wp = (uint16*)data;
- while (count-- > 0)
- fprintf(fd, shortfmt, sep, *wp++), sep = " ";
- break;
- }
- case TIFF_SSHORT: {
- int16 *wp = (int16*)data;
- while (count-- > 0)
- fprintf(fd, sshortfmt, sep, *wp++), sep = " ";
- break;
- }
- case TIFF_LONG: {
- uint32 *lp = (uint32*)data;
- while (count-- > 0) {
- fprintf(fd, longfmt, sep, (unsigned long) *lp++);
- sep = " ";
- }
- break;
- }
- case TIFF_SLONG: {
- int32 *lp = (int32*)data;
- while (count-- > 0)
- fprintf(fd, slongfmt, sep, (long) *lp++), sep = " ";
- break;
- }
- case TIFF_LONG8: {
- uint64 *llp = (uint64*)data;
- while (count-- > 0) {
-#if defined(__WIN32__) && defined(_MSC_VER)
- fprintf(fd, long8fmt, sep, (unsigned __int64) *llp++);
-#else
- fprintf(fd, long8fmt, sep, (unsigned long long) *llp++);
-#endif
- sep = " ";
- }
- break;
- }
- case TIFF_SLONG8: {
- int64 *llp = (int64*)data;
- while (count-- > 0)
-#if defined(__WIN32__) && defined(_MSC_VER)
- fprintf(fd, slong8fmt, sep, (__int64) *llp++), sep = " ";
-#else
- fprintf(fd, slong8fmt, sep, (long long) *llp++), sep = " ";
-#endif
- break;
- }
- case TIFF_RATIONAL: {
- uint32 *lp = (uint32*)data;
- while (count-- > 0) {
- if (lp[1] == 0)
- fprintf(fd, "%sNan (%lu/%lu)", sep,
- (unsigned long) lp[0],
- (unsigned long) lp[1]);
- else
- fprintf(fd, rationalfmt, sep,
- (double)lp[0] / (double)lp[1]);
- sep = " ";
- lp += 2;
- }
- break;
- }
- case TIFF_SRATIONAL: {
- int32 *lp = (int32*)data;
- while (count-- > 0) {
- if (lp[1] == 0)
- fprintf(fd, "%sNan (%ld/%ld)", sep,
- (long) lp[0], (long) lp[1]);
- else
- fprintf(fd, srationalfmt, sep,
- (double)lp[0] / (double)lp[1]);
- sep = " ";
- lp += 2;
- }
- break;
- }
- case TIFF_FLOAT: {
- float *fp = (float *)data;
- while (count-- > 0)
- fprintf(fd, floatfmt, sep, *fp++), sep = " ";
- break;
- }
- case TIFF_DOUBLE: {
- double *dp = (double *)data;
- while (count-- > 0)
- fprintf(fd, doublefmt, sep, *dp++), sep = " ";
- break;
- }
- case TIFF_IFD: {
- uint32 *lp = (uint32*)data;
- while (count-- > 0) {
- fprintf(fd, ifdfmt, sep, (unsigned long) *lp++);
- sep = " ";
- }
- break;
- }
- case TIFF_IFD8: {
- uint64 *llp = (uint64*)data;
- while (count-- > 0) {
-#if defined(__WIN32__) && defined(_MSC_VER)
- fprintf(fd, ifd8fmt, sep, (unsigned __int64) *llp++);
-#else
- fprintf(fd, ifd8fmt, sep, (unsigned long long) *llp++);
-#endif
- sep = " ";
- }
- break;
- }
- }
-}
-
-static void
-ReadError(char* what)
-{
- Fatal("Error while reading %s", what);
-}
-
-#include <stdarg.h>
-
-static void
-vError(FILE* fd, const char* fmt, va_list ap)
-{
- fprintf(fd, "%s: ", curfile);
- vfprintf(fd, fmt, ap);
- fprintf(fd, ".\n");
-}
-
-static void
-Error(const char* fmt, ...)
-{
- va_list ap;
- va_start(ap, fmt);
- vError(stderr, fmt, ap);
- va_end(ap);
-}
-
-static void
-Fatal(const char* fmt, ...)
-{
- va_list ap;
- va_start(ap, fmt);
- vError(stderr, fmt, ap);
- va_end(ap);
- exit(-1);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/tiffgt.c b/tiff/tools/tiffgt.c
deleted file mode 100755
index 3907d30..0000000
--- a/tiff/tools/tiffgt.c
+++ /dev/null
@@ -1,470 +0,0 @@
-/* $Id: tiffgt.c,v 1.11 2014-12-26 16:06:41 bfriesen Exp $ */
-
-/*
- * Copyright (c) 1988-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- * Copyright (c) 2003, Andrey Kiselev <dron@ak4719.spb.edu>
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#if HAVE_APPLE_OPENGL_FRAMEWORK
-# include <OpenGL/gl.h>
-# include <GLUT/glut.h>
-#else
-# include <GL/gl.h>
-# include <GL/glut.h>
-#endif
-
-#include "tiffio.h"
-#include "tiffiop.h"
-
-#ifndef HAVE_GETOPT
-extern int getopt(int, char**, char*);
-#endif
-
-static uint32 width = 0, height = 0; /* window width & height */
-static uint32* raster = NULL; /* displayable image */
-static TIFFRGBAImage img;
-static int order0 = 0, order;
-static uint16 photo0 = (uint16) -1, photo;
-static int stoponerr = 0; /* stop on read error */
-static int verbose = 0;
-#define TITLE_LENGTH 1024
-static char title[TITLE_LENGTH]; /* window title line */
-static uint32 xmax, ymax;
-static char** filelist = NULL;
-static int fileindex;
-static int filenum;
-static TIFFErrorHandler oerror;
-static TIFFErrorHandler owarning;
-
-static void cleanup_and_exit(void);
-static int initImage(void);
-static int prevImage(void);
-static int nextImage(void);
-static void setWindowSize(void);
-static void usage(void);
-static uint16 photoArg(const char*);
-static void raster_draw(void);
-static void raster_reshape(int, int);
-static void raster_keys(unsigned char, int, int);
-static void raster_special(int, int, int);
-
-extern char* optarg;
-extern int optind;
-static TIFF* tif = NULL;
-
-int
-main(int argc, char* argv[])
-{
- int c;
- int dirnum = -1;
- uint32 diroff = 0;
-
- oerror = TIFFSetErrorHandler(NULL);
- owarning = TIFFSetWarningHandler(NULL);
- while ((c = getopt(argc, argv, "d:o:p:eflmsvw?")) != -1)
- switch (c) {
- case 'd':
- dirnum = atoi(optarg);
- break;
- case 'e':
- oerror = TIFFSetErrorHandler(oerror);
- break;
- case 'l':
- order0 = FILLORDER_LSB2MSB;
- break;
- case 'm':
- order0 = FILLORDER_MSB2LSB;
- break;
- case 'o':
- diroff = strtoul(optarg, NULL, 0);
- break;
- case 'p':
- photo0 = photoArg(optarg);
- break;
- case 's':
- stoponerr = 1;
- break;
- case 'w':
- owarning = TIFFSetWarningHandler(owarning);
- break;
- case 'v':
- verbose = 1;
- break;
- case '?':
- usage();
- /*NOTREACHED*/
- }
- filenum = argc - optind;
- if ( filenum < 1)
- usage();
-
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
-
- /*
- * Get the screen size
- */
- xmax = glutGet(GLUT_SCREEN_WIDTH);
- ymax = glutGet(GLUT_SCREEN_HEIGHT);
-
- /*
- * Use 90% of the screen size
- */
- xmax = xmax - xmax / 10.0;
- ymax = ymax - ymax / 10.0;
-
- filelist = (char **) _TIFFmalloc(filenum * sizeof(char*));
- if (!filelist) {
- TIFFError(argv[0], "Can not allocate space for the file list.");
- return 1;
- }
- _TIFFmemcpy(filelist, argv + optind, filenum * sizeof(char*));
- fileindex = -1;
- if (nextImage() < 0) {
- _TIFFfree(filelist);
- return 2;
- }
- /*
- * Set initial directory if user-specified
- * file was opened successfully.
- */
- if (dirnum != -1 && !TIFFSetDirectory(tif, dirnum))
- TIFFError(argv[0], "Error, seeking to directory %d", dirnum);
- if (diroff != 0 && !TIFFSetSubDirectory(tif, diroff))
- TIFFError(argv[0], "Error, setting subdirectory at %#x", diroff);
- order = order0;
- photo = photo0;
- if (initImage() < 0){
- _TIFFfree(filelist);
- return 3;
- }
- /*
- * Create a new window or reconfigure an existing
- * one to suit the image to be displayed.
- */
- glutInitWindowSize(width, height);
- snprintf(title, TITLE_LENGTH - 1, "%s [%u]", filelist[fileindex],
- (unsigned int) TIFFCurrentDirectory(tif));
- glutCreateWindow(title);
- glutDisplayFunc(raster_draw);
- glutReshapeFunc(raster_reshape);
- glutKeyboardFunc(raster_keys);
- glutSpecialFunc(raster_special);
- glutMainLoop();
-
- cleanup_and_exit();
- return 0;
-}
-
-static void
-cleanup_and_exit(void)
-{
- TIFFRGBAImageEnd(&img);
- if (filelist != NULL)
- _TIFFfree(filelist);
- if (raster != NULL)
- _TIFFfree(raster);
- if (tif != NULL)
- TIFFClose(tif);
- exit(0);
-}
-
-static int
-initImage(void)
-{
- uint32 w, h;
-
- if (order)
- TIFFSetField(tif, TIFFTAG_FILLORDER, order);
- if (photo != (uint16) -1)
- TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, photo);
- if (!TIFFRGBAImageBegin(&img, tif, stoponerr, title)) {
- TIFFError(filelist[fileindex], "%s", title);
- TIFFClose(tif);
- tif = NULL;
- return -1;
- }
-
- /*
- * Setup the image raster as required.
- */
- h = img.height;
- w = img.width;
- if (h > ymax) {
- w = (int)(w * ((float)ymax / h));
- h = ymax;
- }
- if (w > xmax) {
- h = (int)(h * ((float)xmax / w));
- w = xmax;
- }
-
- if (w != width || h != height) {
- uint32 rastersize =
- _TIFFMultiply32(tif, img.width, img.height, "allocating raster buffer");
- if (raster != NULL)
- _TIFFfree(raster), raster = NULL;
- raster = (uint32*) _TIFFCheckMalloc(tif, rastersize, sizeof (uint32),
- "allocating raster buffer");
- if (raster == NULL) {
- width = height = 0;
- TIFFError(filelist[fileindex], "No space for raster buffer");
- cleanup_and_exit();
- }
- width = w;
- height = h;
- }
- TIFFRGBAImageGet(&img, raster, img.width, img.height);
-#if HOST_BIGENDIAN
- TIFFSwabArrayOfLong(raster,img.width*img.height);
-#endif
- return 0;
-}
-
-static int
-prevImage(void)
-{
- if (fileindex > 0)
- fileindex--;
- else if (tif)
- return fileindex;
- if (tif)
- TIFFClose(tif);
- tif = TIFFOpen(filelist[fileindex], "r");
- if (tif == NULL)
- return -1;
- return fileindex;
-}
-
-static int
-nextImage(void)
-{
- if (fileindex < filenum - 1)
- fileindex++;
- else if (tif)
- return fileindex;
- if (tif)
- TIFFClose(tif);
- tif = TIFFOpen(filelist[fileindex], "r");
- if (tif == NULL)
- return -1;
- return fileindex;
-}
-
-static void
-setWindowSize(void)
-{
- glutReshapeWindow(width, height);
-}
-
-static void
-raster_draw(void)
-{
- glDrawPixels(img.width, img.height, GL_RGBA, GL_UNSIGNED_BYTE, (const GLvoid *) raster);
-}
-
-static void
-raster_reshape(int win_w, int win_h)
-{
- GLfloat xratio = (GLfloat)win_w/img.width;
- GLfloat yratio = (GLfloat)win_h/img.height;
- int ratio = (int)(((xratio > yratio)?xratio:yratio) * 100);
-
- glPixelZoom(xratio, yratio);
- glViewport(0, 0, win_w, win_h);
- snprintf(title, 1024, "%s [%u] %d%%", filelist[fileindex],
- (unsigned int) TIFFCurrentDirectory(tif), ratio);
- glutSetWindowTitle(title);
-}
-
-static void
-raster_keys(unsigned char key, int x, int y)
-{
- (void) x;
- (void) y;
- switch (key) {
- case 'b': /* photometric MinIsBlack */
- photo = PHOTOMETRIC_MINISBLACK;
- initImage();
- break;
- case 'l': /* lsb-to-msb FillOrder */
- order = FILLORDER_LSB2MSB;
- initImage();
- break;
- case 'm': /* msb-to-lsb FillOrder */
- order = FILLORDER_MSB2LSB;
- initImage();
- break;
- case 'w': /* photometric MinIsWhite */
- photo = PHOTOMETRIC_MINISWHITE;
- initImage();
- break;
- case 'W': /* toggle warnings */
- owarning = TIFFSetWarningHandler(owarning);
- initImage();
- break;
- case 'E': /* toggle errors */
- oerror = TIFFSetErrorHandler(oerror);
- initImage();
- break;
- case 'z': /* reset to defaults */
- case 'Z':
- order = order0;
- photo = photo0;
- if (owarning == NULL)
- owarning = TIFFSetWarningHandler(NULL);
- if (oerror == NULL)
- oerror = TIFFSetErrorHandler(NULL);
- initImage();
- break;
- case 'q': /* exit */
- case '\033':
- cleanup_and_exit();
- }
- glutPostRedisplay();
-}
-
-static void
-raster_special(int key, int x, int y)
-{
- (void) x;
- (void) y;
- switch (key) {
- case GLUT_KEY_PAGE_UP: /* previous logical image */
- if (TIFFCurrentDirectory(tif) > 0) {
- if (TIFFSetDirectory(tif,
- TIFFCurrentDirectory(tif)-1)) {
- initImage();
- setWindowSize();
- }
- } else {
- TIFFRGBAImageEnd(&img);
- prevImage();
- initImage();
- setWindowSize();
- }
- break;
- case GLUT_KEY_PAGE_DOWN: /* next logical image */
- if (!TIFFLastDirectory(tif)) {
- if (TIFFReadDirectory(tif)) {
- initImage();
- setWindowSize();
- }
- } else {
- TIFFRGBAImageEnd(&img);
- nextImage();
- initImage();
- setWindowSize();
- }
- break;
- case GLUT_KEY_HOME: /* 1st image in current file */
- if (TIFFSetDirectory(tif, 0)) {
- TIFFRGBAImageEnd(&img);
- initImage();
- setWindowSize();
- }
- break;
- case GLUT_KEY_END: /* last image in current file */
- TIFFRGBAImageEnd(&img);
- while (!TIFFLastDirectory(tif))
- TIFFReadDirectory(tif);
- initImage();
- setWindowSize();
- break;
- }
- glutPostRedisplay();
-}
-
-
-
-char* stuff[] = {
-"usage: tiffgt [options] file.tif",
-"where options are:",
-" -c use colormap visual",
-" -d dirnum set initial directory (default is 0)",
-" -e enable display of TIFF error messages",
-" -l force lsb-to-msb FillOrder",
-" -m force msb-to-lsb FillOrder",
-" -o offset set initial directory offset",
-" -p photo override photometric interpretation",
-" -r use fullcolor visual",
-" -s stop decoding on first error (default is ignore errors)",
-" -v enable verbose mode",
-" -w enable display of TIFF warning messages",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-static uint16
-photoArg(const char* arg)
-{
- if (strcmp(arg, "miniswhite") == 0)
- return (PHOTOMETRIC_MINISWHITE);
- else if (strcmp(arg, "minisblack") == 0)
- return (PHOTOMETRIC_MINISBLACK);
- else if (strcmp(arg, "rgb") == 0)
- return (PHOTOMETRIC_RGB);
- else if (strcmp(arg, "palette") == 0)
- return (PHOTOMETRIC_PALETTE);
- else if (strcmp(arg, "mask") == 0)
- return (PHOTOMETRIC_MASK);
- else if (strcmp(arg, "separated") == 0)
- return (PHOTOMETRIC_SEPARATED);
- else if (strcmp(arg, "ycbcr") == 0)
- return (PHOTOMETRIC_YCBCR);
- else if (strcmp(arg, "cielab") == 0)
- return (PHOTOMETRIC_CIELAB);
- else if (strcmp(arg, "logl") == 0)
- return (PHOTOMETRIC_LOGL);
- else if (strcmp(arg, "logluv") == 0)
- return (PHOTOMETRIC_LOGLUV);
- else
- return ((uint16) -1);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/tiffinfo.c b/tiff/tools/tiffinfo.c
deleted file mode 100755
index 8493439..0000000
--- a/tiff/tools/tiffinfo.c
+++ /dev/null
@@ -1,472 +0,0 @@
-/* $Id: tiffinfo.c,v 1.22 2013-07-10 00:44:22 fwarmerdam Exp $ */
-
-/*
- * Copyright (c) 1988-1997 Sam Leffler
- * Copyright (c) 1991-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffiop.h"
-
-static TIFFErrorHandler old_error_handler = 0;
-static int status = 0; /* exit status */
-static int showdata = 0; /* show data */
-static int rawdata = 0; /* show raw/decoded data */
-static int showwords = 0; /* show data as bytes/words */
-static int readdata = 0; /* read data in file */
-static int stoponerr = 1; /* stop on first read error */
-
-static void usage(void);
-static void tiffinfo(TIFF*, uint16, long, int);
-
-static void
-PrivateErrorHandler(const char* module, const char* fmt, va_list ap)
-{
- if (old_error_handler)
- (*old_error_handler)(module,fmt,ap);
- status = 1;
-}
-
-int
-main(int argc, char* argv[])
-{
- int dirnum = -1, multiplefiles, c;
- uint16 order = 0;
- TIFF* tif;
- extern int optind;
- extern char* optarg;
- long flags = 0;
- uint64 diroff = 0;
- int chopstrips = 0; /* disable strip chopping */
-
- while ((c = getopt(argc, argv, "f:o:cdDSjilmrsvwz0123456789")) != -1)
- switch (c) {
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- case '8': case '9':
- dirnum = atoi(&argv[optind-1][1]);
- break;
- case 'd':
- showdata++;
- /* fall thru... */
- case 'D':
- readdata++;
- break;
- case 'c':
- flags |= TIFFPRINT_COLORMAP | TIFFPRINT_CURVES;
- break;
- case 'f': /* fill order */
- if (streq(optarg, "lsb2msb"))
- order = FILLORDER_LSB2MSB;
- else if (streq(optarg, "msb2lsb"))
- order = FILLORDER_MSB2LSB;
- else
- usage();
- break;
- case 'i':
- stoponerr = 0;
- break;
- case 'o':
- diroff = strtoul(optarg, NULL, 0);
- break;
- case 'j':
- flags |= TIFFPRINT_JPEGQTABLES |
- TIFFPRINT_JPEGACTABLES |
- TIFFPRINT_JPEGDCTABLES;
- break;
- case 'r':
- rawdata = 1;
- break;
- case 's':
- flags |= TIFFPRINT_STRIPS;
- break;
- case 'w':
- showwords = 1;
- break;
- case 'z':
- chopstrips = 1;
- break;
- case '?':
- usage();
- /*NOTREACHED*/
- }
- if (optind >= argc)
- usage();
-
- old_error_handler = TIFFSetErrorHandler(PrivateErrorHandler);
-
- multiplefiles = (argc - optind > 1);
- for (; optind < argc; optind++) {
- if (multiplefiles)
- printf("%s:\n", argv[optind]);
- tif = TIFFOpen(argv[optind], chopstrips ? "rC" : "rc");
- if (tif != NULL) {
- if (dirnum != -1) {
- if (TIFFSetDirectory(tif, (tdir_t) dirnum))
- tiffinfo(tif, order, flags, 1);
- } else if (diroff != 0) {
- if (TIFFSetSubDirectory(tif, diroff))
- tiffinfo(tif, order, flags, 1);
- } else {
- do {
- toff_t offset=0;
-
- tiffinfo(tif, order, flags, 1);
- if (TIFFGetField(tif, TIFFTAG_EXIFIFD,
- &offset)) {
- if (TIFFReadEXIFDirectory(tif, offset)) {
- tiffinfo(tif, order, flags, 0);
- }
- }
- } while (TIFFReadDirectory(tif));
- }
- TIFFClose(tif);
- }
- }
- return (status);
-}
-
-char* stuff[] = {
-"usage: tiffinfo [options] input...",
-"where options are:",
-" -D read data",
-" -i ignore read errors",
-" -c display data for grey/color response curve or colormap",
-" -d display raw/decoded image data",
-" -f lsb2msb force lsb-to-msb FillOrder for input",
-" -f msb2lsb force msb-to-lsb FillOrder for input",
-" -j show JPEG tables",
-" -o offset set initial directory offset",
-" -r read/display raw image data instead of decoded data",
-" -s display strip offsets and byte counts",
-" -w display raw data in words rather than bytes",
-" -z enable strip chopping",
-" -# set initial directory (first directory is # 0)",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-static void
-ShowStrip(tstrip_t strip, unsigned char* pp, uint32 nrow, tsize_t scanline)
-{
- register tsize_t cc;
-
- printf("Strip %lu:\n", (unsigned long) strip);
- while (nrow-- > 0) {
- for (cc = 0; cc < scanline; cc++) {
- printf(" %02x", *pp++);
- if (((cc+1) % 24) == 0)
- putchar('\n');
- }
- putchar('\n');
- }
-}
-
-void
-TIFFReadContigStripData(TIFF* tif)
-{
- unsigned char *buf;
- tsize_t scanline = TIFFScanlineSize(tif);
-
- buf = (unsigned char *)_TIFFmalloc(TIFFStripSize(tif));
- if (buf) {
- uint32 row, h=0;
- uint32 rowsperstrip = (uint32)-1;
-
- TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
- TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
- for (row = 0; row < h; row += rowsperstrip) {
- uint32 nrow = (row+rowsperstrip > h ?
- h-row : rowsperstrip);
- tstrip_t strip = TIFFComputeStrip(tif, row, 0);
- if (TIFFReadEncodedStrip(tif, strip, buf, nrow*scanline) < 0) {
- if (stoponerr)
- break;
- } else if (showdata)
- ShowStrip(strip, buf, nrow, scanline);
- }
- _TIFFfree(buf);
- }
-}
-
-void
-TIFFReadSeparateStripData(TIFF* tif)
-{
- unsigned char *buf;
- tsize_t scanline = TIFFScanlineSize(tif);
-
- buf = (unsigned char *)_TIFFmalloc(TIFFStripSize(tif));
- if (buf) {
- uint32 row, h=0;
- uint32 rowsperstrip = (uint32)-1;
- tsample_t s, samplesperpixel=0;
-
- TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
- TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
- TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel);
- for (row = 0; row < h; row += rowsperstrip) {
- for (s = 0; s < samplesperpixel; s++) {
- uint32 nrow = (row+rowsperstrip > h ?
- h-row : rowsperstrip);
- tstrip_t strip = TIFFComputeStrip(tif, row, s);
- if (TIFFReadEncodedStrip(tif, strip, buf, nrow*scanline) < 0) {
- if (stoponerr)
- break;
- } else if (showdata)
- ShowStrip(strip, buf, nrow, scanline);
- }
- }
- _TIFFfree(buf);
- }
-}
-
-static void
-ShowTile(uint32 row, uint32 col, tsample_t sample,
- unsigned char* pp, uint32 nrow, tsize_t rowsize)
-{
- uint32 cc;
-
- printf("Tile (%lu,%lu", (unsigned long) row, (unsigned long) col);
- if (sample != (tsample_t) -1)
- printf(",%u", sample);
- printf("):\n");
- while (nrow-- > 0) {
- for (cc = 0; cc < (uint32) rowsize; cc++) {
- printf(" %02x", *pp++);
- if (((cc+1) % 24) == 0)
- putchar('\n');
- }
- putchar('\n');
- }
-}
-
-void
-TIFFReadContigTileData(TIFF* tif)
-{
- unsigned char *buf;
- tsize_t rowsize = TIFFTileRowSize(tif);
-
- buf = (unsigned char *)_TIFFmalloc(TIFFTileSize(tif));
- if (buf) {
- uint32 tw=0, th=0, w=0, h=0;
- uint32 row, col;
-
- TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);
- TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
- TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);
- TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);
- for (row = 0; row < h; row += th) {
- for (col = 0; col < w; col += tw) {
- if (TIFFReadTile(tif, buf, col, row, 0, 0) < 0) {
- if (stoponerr)
- break;
- } else if (showdata)
- ShowTile(row, col, (tsample_t) -1, buf, th, rowsize);
- }
- }
- _TIFFfree(buf);
- }
-}
-
-void
-TIFFReadSeparateTileData(TIFF* tif)
-{
- unsigned char *buf;
- tsize_t rowsize = TIFFTileRowSize(tif);
-
- buf = (unsigned char *)_TIFFmalloc(TIFFTileSize(tif));
- if (buf) {
- uint32 tw=0, th=0, w=0, h=0;
- uint32 row, col;
- tsample_t s, samplesperpixel=0;
-
- TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);
- TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
- TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);
- TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);
- TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel);
- for (row = 0; row < h; row += th) {
- for (col = 0; col < w; col += tw) {
- for (s = 0; s < samplesperpixel; s++) {
- if (TIFFReadTile(tif, buf, col, row, 0, s) < 0) {
- if (stoponerr)
- break;
- } else if (showdata)
- ShowTile(row, col, s, buf, th, rowsize);
- }
- }
- }
- _TIFFfree(buf);
- }
-}
-
-void
-TIFFReadData(TIFF* tif)
-{
- uint16 config = PLANARCONFIG_CONTIG;
-
- TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &config);
- if (TIFFIsTiled(tif)) {
- if (config == PLANARCONFIG_CONTIG)
- TIFFReadContigTileData(tif);
- else
- TIFFReadSeparateTileData(tif);
- } else {
- if (config == PLANARCONFIG_CONTIG)
- TIFFReadContigStripData(tif);
- else
- TIFFReadSeparateStripData(tif);
- }
-}
-
-static void
-ShowRawBytes(unsigned char* pp, uint32 n)
-{
- uint32 i;
-
- for (i = 0; i < n; i++) {
- printf(" %02x", *pp++);
- if (((i+1) % 24) == 0)
- printf("\n ");
- }
- putchar('\n');
-}
-
-static void
-ShowRawWords(uint16* pp, uint32 n)
-{
- uint32 i;
-
- for (i = 0; i < n; i++) {
- printf(" %04x", *pp++);
- if (((i+1) % 15) == 0)
- printf("\n ");
- }
- putchar('\n');
-}
-
-void
-TIFFReadRawData(TIFF* tif, int bitrev)
-{
- tstrip_t nstrips = TIFFNumberOfStrips(tif);
- const char* what = TIFFIsTiled(tif) ? "Tile" : "Strip";
- uint64* stripbc=NULL;
-
- TIFFGetField(tif, TIFFTAG_STRIPBYTECOUNTS, &stripbc);
- if (nstrips > 0) {
- uint32 bufsize = (uint32) stripbc[0];
- tdata_t buf = _TIFFmalloc(bufsize);
- tstrip_t s;
-
- for (s = 0; s < nstrips; s++) {
- if (stripbc[s] > bufsize) {
- buf = _TIFFrealloc(buf, (tmsize_t)stripbc[s]);
- bufsize = (uint32) stripbc[s];
- }
- if (buf == NULL) {
- fprintf(stderr,
- "Cannot allocate buffer to read strip %lu\n",
- (unsigned long) s);
- break;
- }
- if (TIFFReadRawStrip(tif, s, buf, (tmsize_t) stripbc[s]) < 0) {
- fprintf(stderr, "Error reading strip %lu\n",
- (unsigned long) s);
- if (stoponerr)
- break;
- } else if (showdata) {
- if (bitrev) {
- TIFFReverseBits(buf, (tmsize_t)stripbc[s]);
- printf("%s %lu: (bit reversed)\n ",
- what, (unsigned long) s);
- } else
- printf("%s %lu:\n ", what,
- (unsigned long) s);
- if (showwords)
- ShowRawWords((uint16*) buf, (uint32) stripbc[s]>>1);
- else
- ShowRawBytes((unsigned char*) buf, (uint32) stripbc[s]);
- }
- }
- if (buf != NULL)
- _TIFFfree(buf);
- }
-}
-
-static void
-tiffinfo(TIFF* tif, uint16 order, long flags, int is_image)
-{
- TIFFPrintDirectory(tif, stdout, flags);
- if (!readdata || !is_image)
- return;
- if (rawdata) {
- if (order) {
- uint16 o;
- TIFFGetFieldDefaulted(tif,
- TIFFTAG_FILLORDER, &o);
- TIFFReadRawData(tif, o != order);
- } else
- TIFFReadRawData(tif, 0);
- } else {
- if (order)
- TIFFSetField(tif, TIFFTAG_FILLORDER, order);
- TIFFReadData(tif);
- }
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/tiffmedian.c b/tiff/tools/tiffmedian.c
deleted file mode 100755
index 6501494..0000000
--- a/tiff/tools/tiffmedian.c
+++ /dev/null
@@ -1,906 +0,0 @@
-/* $Id: tiffmedian.c,v 1.10 2010-03-10 18:56:50 bfriesen Exp $ */
-
-/*
- * Apply median cut on an image.
- *
- * tiffmedian [-c n] [-f] input output
- * -C n - set colortable size. Default is 256.
- * -f - use Floyd-Steinberg dithering.
- * -c lzw - compress output with LZW
- * -c none - use no compression on output
- * -c packbits - use packbits compression on output
- * -r n - create output with n rows/strip of data
- * (by default the compression scheme and rows/strip are taken
- * from the input file)
- *
- * Notes:
- *
- * [1] Floyd-Steinberg dither:
- * I should point out that the actual fractions we used were, assuming
- * you are at X, moving left to right:
- *
- * X 7/16
- * 3/16 5/16 1/16
- *
- * Note that the error goes to four neighbors, not three. I think this
- * will probably do better (at least for black and white) than the
- * 3/8-3/8-1/4 distribution, at the cost of greater processing. I have
- * seen the 3/8-3/8-1/4 distribution described as "our" algorithm before,
- * but I have no idea who the credit really belongs to.
-
- * Also, I should add that if you do zig-zag scanning (see my immediately
- * previous message), it is sufficient (but not quite as good) to send
- * half the error one pixel ahead (e.g. to the right on lines you scan
- * left to right), and half one pixel straight down. Again, this is for
- * black and white; I've not tried it with color.
- * --
- * Lou Steinberg
- *
- * [2] Color Image Quantization for Frame Buffer Display, Paul Heckbert,
- * Siggraph '82 proceedings, pp. 297-307
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef NEED_LIBPORT
-# include "libport.h"
-#endif
-
-#include "tiffio.h"
-
-#define MAX_CMAP_SIZE 256
-
-#define streq(a,b) (strcmp(a,b) == 0)
-#define strneq(a,b,n) (strncmp(a,b,n) == 0)
-
-#define COLOR_DEPTH 8
-#define MAX_COLOR 256
-
-#define B_DEPTH 5 /* # bits/pixel to use */
-#define B_LEN (1L<<B_DEPTH)
-
-#define C_DEPTH 2
-#define C_LEN (1L<<C_DEPTH) /* # cells/color to use */
-
-#define COLOR_SHIFT (COLOR_DEPTH-B_DEPTH)
-
-typedef struct colorbox {
- struct colorbox *next, *prev;
- int rmin, rmax;
- int gmin, gmax;
- int bmin, bmax;
- uint32 total;
-} Colorbox;
-
-typedef struct {
- int num_ents;
- int entries[MAX_CMAP_SIZE][2];
-} C_cell;
-
-uint16 rm[MAX_CMAP_SIZE], gm[MAX_CMAP_SIZE], bm[MAX_CMAP_SIZE];
-int num_colors;
-uint32 histogram[B_LEN][B_LEN][B_LEN];
-Colorbox *freeboxes;
-Colorbox *usedboxes;
-C_cell **ColorCells;
-TIFF *in, *out;
-uint32 rowsperstrip = (uint32) -1;
-uint16 compression = (uint16) -1;
-uint16 bitspersample = 1;
-uint16 samplesperpixel;
-uint32 imagewidth;
-uint32 imagelength;
-uint16 predictor = 0;
-
-static void get_histogram(TIFF*, Colorbox*);
-static void splitbox(Colorbox*);
-static void shrinkbox(Colorbox*);
-static void map_colortable(void);
-static void quant(TIFF*, TIFF*);
-static void quant_fsdither(TIFF*, TIFF*);
-static Colorbox* largest_box(void);
-
-static void usage(void);
-static int processCompressOptions(char*);
-
-#define CopyField(tag, v) \
- if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v)
-
-int
-main(int argc, char* argv[])
-{
- int i, dither = 0;
- uint16 shortv, config, photometric;
- Colorbox *box_list, *ptr;
- float floatv;
- uint32 longv;
- int c;
- extern int optind;
- extern char* optarg;
-
- num_colors = MAX_CMAP_SIZE;
- while ((c = getopt(argc, argv, "c:C:r:f")) != -1)
- switch (c) {
- case 'c': /* compression scheme */
- if (!processCompressOptions(optarg))
- usage();
- break;
- case 'C': /* set colormap size */
- num_colors = atoi(optarg);
- if (num_colors > MAX_CMAP_SIZE) {
- fprintf(stderr,
- "-c: colormap too big, max %d\n",
- MAX_CMAP_SIZE);
- usage();
- }
- break;
- case 'f': /* dither */
- dither = 1;
- break;
- case 'r': /* rows/strip */
- rowsperstrip = atoi(optarg);
- break;
- case '?':
- usage();
- /*NOTREACHED*/
- }
- if (argc - optind != 2)
- usage();
- in = TIFFOpen(argv[optind], "r");
- if (in == NULL)
- return (-1);
- TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &imagewidth);
- TIFFGetField(in, TIFFTAG_IMAGELENGTH, &imagelength);
- TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bitspersample);
- TIFFGetField(in, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel);
- if (bitspersample != 8 && bitspersample != 16) {
- fprintf(stderr, "%s: Image must have at least 8-bits/sample\n",
- argv[optind]);
- return (-3);
- }
- if (!TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &photometric) ||
- photometric != PHOTOMETRIC_RGB || samplesperpixel < 3) {
- fprintf(stderr, "%s: Image must have RGB data\n", argv[optind]);
- return (-4);
- }
- TIFFGetField(in, TIFFTAG_PLANARCONFIG, &config);
- if (config != PLANARCONFIG_CONTIG) {
- fprintf(stderr, "%s: Can only handle contiguous data packing\n",
- argv[optind]);
- return (-5);
- }
-
- /*
- * STEP 1: create empty boxes
- */
- usedboxes = NULL;
- box_list = freeboxes = (Colorbox *)_TIFFmalloc(num_colors*sizeof (Colorbox));
- freeboxes[0].next = &freeboxes[1];
- freeboxes[0].prev = NULL;
- for (i = 1; i < num_colors-1; ++i) {
- freeboxes[i].next = &freeboxes[i+1];
- freeboxes[i].prev = &freeboxes[i-1];
- }
- freeboxes[num_colors-1].next = NULL;
- freeboxes[num_colors-1].prev = &freeboxes[num_colors-2];
-
- /*
- * STEP 2: get histogram, initialize first box
- */
- ptr = freeboxes;
- freeboxes = ptr->next;
- if (freeboxes)
- freeboxes->prev = NULL;
- ptr->next = usedboxes;
- usedboxes = ptr;
- if (ptr->next)
- ptr->next->prev = ptr;
- get_histogram(in, ptr);
-
- /*
- * STEP 3: continually subdivide boxes until no more free
- * boxes remain or until all colors assigned.
- */
- while (freeboxes != NULL) {
- ptr = largest_box();
- if (ptr != NULL)
- splitbox(ptr);
- else
- freeboxes = NULL;
- }
-
- /*
- * STEP 4: assign colors to all boxes
- */
- for (i = 0, ptr = usedboxes; ptr != NULL; ++i, ptr = ptr->next) {
- rm[i] = ((ptr->rmin + ptr->rmax) << COLOR_SHIFT) / 2;
- gm[i] = ((ptr->gmin + ptr->gmax) << COLOR_SHIFT) / 2;
- bm[i] = ((ptr->bmin + ptr->bmax) << COLOR_SHIFT) / 2;
- }
-
- /* We're done with the boxes now */
- _TIFFfree(box_list);
- freeboxes = usedboxes = NULL;
-
- /*
- * STEP 5: scan histogram and map all values to closest color
- */
- /* 5a: create cell list as described in Heckbert[2] */
- ColorCells = (C_cell **)_TIFFmalloc(C_LEN*C_LEN*C_LEN*sizeof (C_cell*));
- _TIFFmemset(ColorCells, 0, C_LEN*C_LEN*C_LEN*sizeof (C_cell*));
- /* 5b: create mapping from truncated pixel space to color
- table entries */
- map_colortable();
-
- /*
- * STEP 6: scan image, match input values to table entries
- */
- out = TIFFOpen(argv[optind+1], "w");
- if (out == NULL)
- return (-2);
-
- CopyField(TIFFTAG_SUBFILETYPE, longv);
- CopyField(TIFFTAG_IMAGEWIDTH, longv);
- TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, (short)COLOR_DEPTH);
- if (compression != (uint16)-1) {
- TIFFSetField(out, TIFFTAG_COMPRESSION, compression);
- switch (compression) {
- case COMPRESSION_LZW:
- case COMPRESSION_DEFLATE:
- if (predictor != 0)
- TIFFSetField(out, TIFFTAG_PREDICTOR, predictor);
- break;
- }
- } else
- CopyField(TIFFTAG_COMPRESSION, compression);
- TIFFSetField(out, TIFFTAG_PHOTOMETRIC, (short)PHOTOMETRIC_PALETTE);
- CopyField(TIFFTAG_ORIENTATION, shortv);
- TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, (short)1);
- CopyField(TIFFTAG_PLANARCONFIG, shortv);
- TIFFSetField(out, TIFFTAG_ROWSPERSTRIP,
- TIFFDefaultStripSize(out, rowsperstrip));
- CopyField(TIFFTAG_MINSAMPLEVALUE, shortv);
- CopyField(TIFFTAG_MAXSAMPLEVALUE, shortv);
- CopyField(TIFFTAG_RESOLUTIONUNIT, shortv);
- CopyField(TIFFTAG_XRESOLUTION, floatv);
- CopyField(TIFFTAG_YRESOLUTION, floatv);
- CopyField(TIFFTAG_XPOSITION, floatv);
- CopyField(TIFFTAG_YPOSITION, floatv);
-
- if (dither)
- quant_fsdither(in, out);
- else
- quant(in, out);
- /*
- * Scale colormap to TIFF-required 16-bit values.
- */
-#define SCALE(x) (((x)*((1L<<16)-1))/255)
- for (i = 0; i < MAX_CMAP_SIZE; ++i) {
- rm[i] = SCALE(rm[i]);
- gm[i] = SCALE(gm[i]);
- bm[i] = SCALE(bm[i]);
- }
- TIFFSetField(out, TIFFTAG_COLORMAP, rm, gm, bm);
- (void) TIFFClose(out);
- return (0);
-}
-
-static int
-processCompressOptions(char* opt)
-{
- if (streq(opt, "none"))
- compression = COMPRESSION_NONE;
- else if (streq(opt, "packbits"))
- compression = COMPRESSION_PACKBITS;
- else if (strneq(opt, "lzw", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_LZW;
- } else if (strneq(opt, "zip", 3)) {
- char* cp = strchr(opt, ':');
- if (cp)
- predictor = atoi(cp+1);
- compression = COMPRESSION_DEFLATE;
- } else
- return (0);
- return (1);
-}
-
-char* stuff[] = {
-"usage: tiffmedian [options] input.tif output.tif",
-"where options are:",
-" -r # make each strip have no more than # rows",
-" -C # create a colormap with # entries",
-" -f use Floyd-Steinberg dithering",
-" -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding",
-" -c zip[:opts] compress output with deflate encoding",
-" -c packbits compress output with packbits encoding",
-" -c none use no compression algorithm on output",
-"",
-"LZW and deflate options:",
-" # set predictor value",
-"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing",
-NULL
-};
-
-static void
-usage(void)
-{
- char buf[BUFSIZ];
- int i;
-
- setbuf(stderr, buf);
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- for (i = 0; stuff[i] != NULL; i++)
- fprintf(stderr, "%s\n", stuff[i]);
- exit(-1);
-}
-
-static void
-get_histogram(TIFF* in, Colorbox* box)
-{
- register unsigned char *inptr;
- register int red, green, blue;
- register uint32 j, i;
- unsigned char *inputline;
-
- inputline = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(in));
- if (inputline == NULL) {
- fprintf(stderr, "No space for scanline buffer\n");
- exit(-1);
- }
- box->rmin = box->gmin = box->bmin = 999;
- box->rmax = box->gmax = box->bmax = -1;
- box->total = imagewidth * imagelength;
-
- { register uint32 *ptr = &histogram[0][0][0];
- for (i = B_LEN*B_LEN*B_LEN; i-- > 0;)
- *ptr++ = 0;
- }
- for (i = 0; i < imagelength; i++) {
- if (TIFFReadScanline(in, inputline, i, 0) <= 0)
- break;
- inptr = inputline;
- for (j = imagewidth; j-- > 0;) {
- red = *inptr++ >> COLOR_SHIFT;
- green = *inptr++ >> COLOR_SHIFT;
- blue = *inptr++ >> COLOR_SHIFT;
- if (red < box->rmin)
- box->rmin = red;
- if (red > box->rmax)
- box->rmax = red;
- if (green < box->gmin)
- box->gmin = green;
- if (green > box->gmax)
- box->gmax = green;
- if (blue < box->bmin)
- box->bmin = blue;
- if (blue > box->bmax)
- box->bmax = blue;
- histogram[red][green][blue]++;
- }
- }
- _TIFFfree(inputline);
-}
-
-static Colorbox *
-largest_box(void)
-{
- register Colorbox *p, *b;
- register uint32 size;
-
- b = NULL;
- size = 0;
- for (p = usedboxes; p != NULL; p = p->next)
- if ((p->rmax > p->rmin || p->gmax > p->gmin ||
- p->bmax > p->bmin) && p->total > size)
- size = (b = p)->total;
- return (b);
-}
-
-static void
-splitbox(Colorbox* ptr)
-{
- uint32 hist2[B_LEN];
- int first=0, last=0;
- register Colorbox *new;
- register uint32 *iptr, *histp;
- register int i, j;
- register int ir,ig,ib;
- register uint32 sum, sum1, sum2;
- enum { RED, GREEN, BLUE } axis;
-
- /*
- * See which axis is the largest, do a histogram along that
- * axis. Split at median point. Contract both new boxes to
- * fit points and return
- */
- i = ptr->rmax - ptr->rmin;
- if (i >= ptr->gmax - ptr->gmin && i >= ptr->bmax - ptr->bmin)
- axis = RED;
- else if (ptr->gmax - ptr->gmin >= ptr->bmax - ptr->bmin)
- axis = GREEN;
- else
- axis = BLUE;
- /* get histogram along longest axis */
- switch (axis) {
- case RED:
- histp = &hist2[ptr->rmin];
- for (ir = ptr->rmin; ir <= ptr->rmax; ++ir) {
- *histp = 0;
- for (ig = ptr->gmin; ig <= ptr->gmax; ++ig) {
- iptr = &histogram[ir][ig][ptr->bmin];
- for (ib = ptr->bmin; ib <= ptr->bmax; ++ib)
- *histp += *iptr++;
- }
- histp++;
- }
- first = ptr->rmin;
- last = ptr->rmax;
- break;
- case GREEN:
- histp = &hist2[ptr->gmin];
- for (ig = ptr->gmin; ig <= ptr->gmax; ++ig) {
- *histp = 0;
- for (ir = ptr->rmin; ir <= ptr->rmax; ++ir) {
- iptr = &histogram[ir][ig][ptr->bmin];
- for (ib = ptr->bmin; ib <= ptr->bmax; ++ib)
- *histp += *iptr++;
- }
- histp++;
- }
- first = ptr->gmin;
- last = ptr->gmax;
- break;
- case BLUE:
- histp = &hist2[ptr->bmin];
- for (ib = ptr->bmin; ib <= ptr->bmax; ++ib) {
- *histp = 0;
- for (ir = ptr->rmin; ir <= ptr->rmax; ++ir) {
- iptr = &histogram[ir][ptr->gmin][ib];
- for (ig = ptr->gmin; ig <= ptr->gmax; ++ig) {
- *histp += *iptr;
- iptr += B_LEN;
- }
- }
- histp++;
- }
- first = ptr->bmin;
- last = ptr->bmax;
- break;
- }
- /* find median point */
- sum2 = ptr->total / 2;
- histp = &hist2[first];
- sum = 0;
- for (i = first; i <= last && (sum += *histp++) < sum2; ++i)
- ;
- if (i == first)
- i++;
-
- /* Create new box, re-allocate points */
- new = freeboxes;
- freeboxes = new->next;
- if (freeboxes)
- freeboxes->prev = NULL;
- if (usedboxes)
- usedboxes->prev = new;
- new->next = usedboxes;
- usedboxes = new;
-
- histp = &hist2[first];
- for (sum1 = 0, j = first; j < i; j++)
- sum1 += *histp++;
- for (sum2 = 0, j = i; j <= last; j++)
- sum2 += *histp++;
- new->total = sum1;
- ptr->total = sum2;
-
- new->rmin = ptr->rmin;
- new->rmax = ptr->rmax;
- new->gmin = ptr->gmin;
- new->gmax = ptr->gmax;
- new->bmin = ptr->bmin;
- new->bmax = ptr->bmax;
- switch (axis) {
- case RED:
- new->rmax = i-1;
- ptr->rmin = i;
- break;
- case GREEN:
- new->gmax = i-1;
- ptr->gmin = i;
- break;
- case BLUE:
- new->bmax = i-1;
- ptr->bmin = i;
- break;
- }
- shrinkbox(new);
- shrinkbox(ptr);
-}
-
-static void
-shrinkbox(Colorbox* box)
-{
- register uint32 *histp;
- register int ir, ig, ib;
-
- if (box->rmax > box->rmin) {
- for (ir = box->rmin; ir <= box->rmax; ++ir)
- for (ig = box->gmin; ig <= box->gmax; ++ig) {
- histp = &histogram[ir][ig][box->bmin];
- for (ib = box->bmin; ib <= box->bmax; ++ib)
- if (*histp++ != 0) {
- box->rmin = ir;
- goto have_rmin;
- }
- }
- have_rmin:
- if (box->rmax > box->rmin)
- for (ir = box->rmax; ir >= box->rmin; --ir)
- for (ig = box->gmin; ig <= box->gmax; ++ig) {
- histp = &histogram[ir][ig][box->bmin];
- ib = box->bmin;
- for (; ib <= box->bmax; ++ib)
- if (*histp++ != 0) {
- box->rmax = ir;
- goto have_rmax;
- }
- }
- }
-have_rmax:
- if (box->gmax > box->gmin) {
- for (ig = box->gmin; ig <= box->gmax; ++ig)
- for (ir = box->rmin; ir <= box->rmax; ++ir) {
- histp = &histogram[ir][ig][box->bmin];
- for (ib = box->bmin; ib <= box->bmax; ++ib)
- if (*histp++ != 0) {
- box->gmin = ig;
- goto have_gmin;
- }
- }
- have_gmin:
- if (box->gmax > box->gmin)
- for (ig = box->gmax; ig >= box->gmin; --ig)
- for (ir = box->rmin; ir <= box->rmax; ++ir) {
- histp = &histogram[ir][ig][box->bmin];
- ib = box->bmin;
- for (; ib <= box->bmax; ++ib)
- if (*histp++ != 0) {
- box->gmax = ig;
- goto have_gmax;
- }
- }
- }
-have_gmax:
- if (box->bmax > box->bmin) {
- for (ib = box->bmin; ib <= box->bmax; ++ib)
- for (ir = box->rmin; ir <= box->rmax; ++ir) {
- histp = &histogram[ir][box->gmin][ib];
- for (ig = box->gmin; ig <= box->gmax; ++ig) {
- if (*histp != 0) {
- box->bmin = ib;
- goto have_bmin;
- }
- histp += B_LEN;
- }
- }
- have_bmin:
- if (box->bmax > box->bmin)
- for (ib = box->bmax; ib >= box->bmin; --ib)
- for (ir = box->rmin; ir <= box->rmax; ++ir) {
- histp = &histogram[ir][box->gmin][ib];
- ig = box->gmin;
- for (; ig <= box->gmax; ++ig) {
- if (*histp != 0) {
- box->bmax = ib;
- goto have_bmax;
- }
- histp += B_LEN;
- }
- }
- }
-have_bmax:
- ;
-}
-
-static C_cell *
-create_colorcell(int red, int green, int blue)
-{
- register int ir, ig, ib, i;
- register C_cell *ptr;
- int mindist, next_n;
- register int tmp, dist, n;
-
- ir = red >> (COLOR_DEPTH-C_DEPTH);
- ig = green >> (COLOR_DEPTH-C_DEPTH);
- ib = blue >> (COLOR_DEPTH-C_DEPTH);
- ptr = (C_cell *)_TIFFmalloc(sizeof (C_cell));
- *(ColorCells + ir*C_LEN*C_LEN + ig*C_LEN + ib) = ptr;
- ptr->num_ents = 0;
-
- /*
- * Step 1: find all colors inside this cell, while we're at
- * it, find distance of centermost point to furthest corner
- */
- mindist = 99999999;
- for (i = 0; i < num_colors; ++i) {
- if (rm[i]>>(COLOR_DEPTH-C_DEPTH) != ir ||
- gm[i]>>(COLOR_DEPTH-C_DEPTH) != ig ||
- bm[i]>>(COLOR_DEPTH-C_DEPTH) != ib)
- continue;
- ptr->entries[ptr->num_ents][0] = i;
- ptr->entries[ptr->num_ents][1] = 0;
- ++ptr->num_ents;
- tmp = rm[i] - red;
- if (tmp < (MAX_COLOR/C_LEN/2))
- tmp = MAX_COLOR/C_LEN-1 - tmp;
- dist = tmp*tmp;
- tmp = gm[i] - green;
- if (tmp < (MAX_COLOR/C_LEN/2))
- tmp = MAX_COLOR/C_LEN-1 - tmp;
- dist += tmp*tmp;
- tmp = bm[i] - blue;
- if (tmp < (MAX_COLOR/C_LEN/2))
- tmp = MAX_COLOR/C_LEN-1 - tmp;
- dist += tmp*tmp;
- if (dist < mindist)
- mindist = dist;
- }
-
- /*
- * Step 3: find all points within that distance to cell.
- */
- for (i = 0; i < num_colors; ++i) {
- if (rm[i] >> (COLOR_DEPTH-C_DEPTH) == ir &&
- gm[i] >> (COLOR_DEPTH-C_DEPTH) == ig &&
- bm[i] >> (COLOR_DEPTH-C_DEPTH) == ib)
- continue;
- dist = 0;
- if ((tmp = red - rm[i]) > 0 ||
- (tmp = rm[i] - (red + MAX_COLOR/C_LEN-1)) > 0 )
- dist += tmp*tmp;
- if ((tmp = green - gm[i]) > 0 ||
- (tmp = gm[i] - (green + MAX_COLOR/C_LEN-1)) > 0 )
- dist += tmp*tmp;
- if ((tmp = blue - bm[i]) > 0 ||
- (tmp = bm[i] - (blue + MAX_COLOR/C_LEN-1)) > 0 )
- dist += tmp*tmp;
- if (dist < mindist) {
- ptr->entries[ptr->num_ents][0] = i;
- ptr->entries[ptr->num_ents][1] = dist;
- ++ptr->num_ents;
- }
- }
-
- /*
- * Sort color cells by distance, use cheap exchange sort
- */
- for (n = ptr->num_ents - 1; n > 0; n = next_n) {
- next_n = 0;
- for (i = 0; i < n; ++i)
- if (ptr->entries[i][1] > ptr->entries[i+1][1]) {
- tmp = ptr->entries[i][0];
- ptr->entries[i][0] = ptr->entries[i+1][0];
- ptr->entries[i+1][0] = tmp;
- tmp = ptr->entries[i][1];
- ptr->entries[i][1] = ptr->entries[i+1][1];
- ptr->entries[i+1][1] = tmp;
- next_n = i;
- }
- }
- return (ptr);
-}
-
-static void
-map_colortable(void)
-{
- register uint32 *histp = &histogram[0][0][0];
- register C_cell *cell;
- register int j, tmp, d2, dist;
- int ir, ig, ib, i;
-
- for (ir = 0; ir < B_LEN; ++ir)
- for (ig = 0; ig < B_LEN; ++ig)
- for (ib = 0; ib < B_LEN; ++ib, histp++) {
- if (*histp == 0) {
- *histp = -1;
- continue;
- }
- cell = *(ColorCells +
- (((ir>>(B_DEPTH-C_DEPTH)) << C_DEPTH*2) +
- ((ig>>(B_DEPTH-C_DEPTH)) << C_DEPTH) +
- (ib>>(B_DEPTH-C_DEPTH))));
- if (cell == NULL )
- cell = create_colorcell(
- ir << COLOR_SHIFT,
- ig << COLOR_SHIFT,
- ib << COLOR_SHIFT);
- dist = 9999999;
- for (i = 0; i < cell->num_ents &&
- dist > cell->entries[i][1]; ++i) {
- j = cell->entries[i][0];
- d2 = rm[j] - (ir << COLOR_SHIFT);
- d2 *= d2;
- tmp = gm[j] - (ig << COLOR_SHIFT);
- d2 += tmp*tmp;
- tmp = bm[j] - (ib << COLOR_SHIFT);
- d2 += tmp*tmp;
- if (d2 < dist) {
- dist = d2;
- *histp = j;
- }
- }
- }
-}
-
-/*
- * straight quantization. Each pixel is mapped to the colors
- * closest to it. Color values are rounded to the nearest color
- * table entry.
- */
-static void
-quant(TIFF* in, TIFF* out)
-{
- unsigned char *outline, *inputline;
- register unsigned char *outptr, *inptr;
- register uint32 i, j;
- register int red, green, blue;
-
- inputline = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(in));
- outline = (unsigned char *)_TIFFmalloc(imagewidth);
- for (i = 0; i < imagelength; i++) {
- if (TIFFReadScanline(in, inputline, i, 0) <= 0)
- break;
- inptr = inputline;
- outptr = outline;
- for (j = 0; j < imagewidth; j++) {
- red = *inptr++ >> COLOR_SHIFT;
- green = *inptr++ >> COLOR_SHIFT;
- blue = *inptr++ >> COLOR_SHIFT;
- *outptr++ = (unsigned char)histogram[red][green][blue];
- }
- if (TIFFWriteScanline(out, outline, i, 0) < 0)
- break;
- }
- _TIFFfree(inputline);
- _TIFFfree(outline);
-}
-
-#define SWAP(type,a,b) { type p; p = a; a = b; b = p; }
-
-#define GetInputLine(tif, row, bad) \
- if (TIFFReadScanline(tif, inputline, row, 0) <= 0) \
- bad; \
- inptr = inputline; \
- nextptr = nextline; \
- for (j = 0; j < imagewidth; ++j) { \
- *nextptr++ = *inptr++; \
- *nextptr++ = *inptr++; \
- *nextptr++ = *inptr++; \
- }
-#define GetComponent(raw, cshift, c) \
- cshift = raw; \
- if (cshift < 0) \
- cshift = 0; \
- else if (cshift >= MAX_COLOR) \
- cshift = MAX_COLOR-1; \
- c = cshift; \
- cshift >>= COLOR_SHIFT;
-
-static void
-quant_fsdither(TIFF* in, TIFF* out)
-{
- unsigned char *outline, *inputline, *inptr;
- short *thisline, *nextline;
- register unsigned char *outptr;
- register short *thisptr, *nextptr;
- register uint32 i, j;
- uint32 imax, jmax;
- int lastline, lastpixel;
-
- imax = imagelength - 1;
- jmax = imagewidth - 1;
- inputline = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(in));
- thisline = (short *)_TIFFmalloc(imagewidth * 3 * sizeof (short));
- nextline = (short *)_TIFFmalloc(imagewidth * 3 * sizeof (short));
- outline = (unsigned char *) _TIFFmalloc(TIFFScanlineSize(out));
-
- GetInputLine(in, 0, goto bad); /* get first line */
- for (i = 1; i <= imagelength; ++i) {
- SWAP(short *, thisline, nextline);
- lastline = (i >= imax);
- if (i <= imax)
- GetInputLine(in, i, break);
- thisptr = thisline;
- nextptr = nextline;
- outptr = outline;
- for (j = 0; j < imagewidth; ++j) {
- int red, green, blue;
- register int oval, r2, g2, b2;
-
- lastpixel = (j == jmax);
- GetComponent(*thisptr++, r2, red);
- GetComponent(*thisptr++, g2, green);
- GetComponent(*thisptr++, b2, blue);
- oval = histogram[r2][g2][b2];
- if (oval == -1) {
- int ci;
- register int cj, tmp, d2, dist;
- register C_cell *cell;
-
- cell = *(ColorCells +
- (((r2>>(B_DEPTH-C_DEPTH)) << C_DEPTH*2) +
- ((g2>>(B_DEPTH-C_DEPTH)) << C_DEPTH ) +
- (b2>>(B_DEPTH-C_DEPTH))));
- if (cell == NULL)
- cell = create_colorcell(red,
- green, blue);
- dist = 9999999;
- for (ci = 0; ci < cell->num_ents && dist > cell->entries[ci][1]; ++ci) {
- cj = cell->entries[ci][0];
- d2 = (rm[cj] >> COLOR_SHIFT) - r2;
- d2 *= d2;
- tmp = (gm[cj] >> COLOR_SHIFT) - g2;
- d2 += tmp*tmp;
- tmp = (bm[cj] >> COLOR_SHIFT) - b2;
- d2 += tmp*tmp;
- if (d2 < dist) {
- dist = d2;
- oval = cj;
- }
- }
- histogram[r2][g2][b2] = oval;
- }
- *outptr++ = oval;
- red -= rm[oval];
- green -= gm[oval];
- blue -= bm[oval];
- if (!lastpixel) {
- thisptr[0] += blue * 7 / 16;
- thisptr[1] += green * 7 / 16;
- thisptr[2] += red * 7 / 16;
- }
- if (!lastline) {
- if (j != 0) {
- nextptr[-3] += blue * 3 / 16;
- nextptr[-2] += green * 3 / 16;
- nextptr[-1] += red * 3 / 16;
- }
- nextptr[0] += blue * 5 / 16;
- nextptr[1] += green * 5 / 16;
- nextptr[2] += red * 5 / 16;
- if (!lastpixel) {
- nextptr[3] += blue / 16;
- nextptr[4] += green / 16;
- nextptr[5] += red / 16;
- }
- nextptr += 3;
- }
- }
- if (TIFFWriteScanline(out, outline, i-1, 0) < 0)
- break;
- }
-bad:
- _TIFFfree(inputline);
- _TIFFfree(thisline);
- _TIFFfree(nextline);
- _TIFFfree(outline);
-}
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/tiffset.c b/tiff/tools/tiffset.c
deleted file mode 100755
index 7044d2b..0000000
--- a/tiff/tools/tiffset.c
+++ /dev/null
@@ -1,356 +0,0 @@
-/******************************************************************************
- * $Id: tiffset.c,v 1.18 2012-12-04 03:02:37 bfriesen Exp $
- *
- * Project: libtiff tools
- * Purpose: Mainline for setting metadata in existing TIFF files.
- * Author: Frank Warmerdam, warmerdam@pobox.com
- *
- ******************************************************************************
- * Copyright (c) 2000, Frank Warmerdam
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- ******************************************************************************
- */
-
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "tiffio.h"
-
-static char* usageMsg[] = {
-"usage: tiffset [options] filename",
-"where options are:",
-" -s <tagname> [count] <value>... set the tag value",
-" -u <tagname> to unset the tag",
-" -d <dirno> set the directory",
-" -sd <diroff> set the subdirectory",
-" -sf <tagname> <filename> read the tag value from file (for ASCII tags only)",
-NULL
-};
-
-static void
-usage(void)
-{
- int i;
- for (i = 0; usageMsg[i]; i++)
- fprintf(stderr, "%s\n", usageMsg[i]);
- exit(-1);
-}
-
-static const TIFFField *
-GetField(TIFF *tiff, const char *tagname)
-{
- const TIFFField *fip;
-
- if( atoi(tagname) > 0 )
- fip = TIFFFieldWithTag(tiff, (ttag_t)atoi(tagname));
- else
- fip = TIFFFieldWithName(tiff, tagname);
-
- if (!fip) {
- fprintf( stderr, "Field name \"%s\" is not recognised.\n", tagname );
- return (TIFFField *)NULL;
- }
-
- return fip;
-}
-
-int
-main(int argc, char* argv[])
-{
- TIFF *tiff;
- int arg_index;
-
- if (argc < 2)
- usage();
-
- tiff = TIFFOpen(argv[argc-1], "r+");
- if (tiff == NULL)
- return 2;
-
- for( arg_index = 1; arg_index < argc-1; arg_index++ ) {
- if (strcmp(argv[arg_index],"-d") == 0 && arg_index < argc-2) {
- arg_index++;
- if( TIFFSetDirectory(tiff, atoi(argv[arg_index]) ) != 1 )
- {
- fprintf( stderr, "Failed to set directory=%s\n", argv[arg_index] );
- return 6;
- }
- arg_index++;
- }
- if (strcmp(argv[arg_index],"-sd") == 0 && arg_index < argc-2) {
- arg_index++;
- if( TIFFSetSubDirectory(tiff, atoi(argv[arg_index]) ) != 1 )
- {
- fprintf( stderr, "Failed to set sub directory=%s\n", argv[arg_index] );
- return 7;
- }
- arg_index++;
- }
- /* Add unset option to tiffset -- Zach Baker (niquil@niquil.net) 11/14/2012 */
- if (strcmp(argv[arg_index],"-u") == 0 && arg_index < argc-2) {
- const TIFFField *fip;
- const char *tagname;
- arg_index++;
- tagname = argv[arg_index];
- fip = GetField(tiff, tagname);
- if (!fip)
- return 3;
-
- if (TIFFUnsetField(tiff, TIFFFieldTag(fip)) != 1)
- {
- fprintf(stderr, "Failed to unset %s\n", TIFFFieldName(fip));
- }
- arg_index++;
- } else if (strcmp(argv[arg_index],"-s") == 0 && arg_index < argc-3) {
- const TIFFField *fip;
- const char *tagname;
-
- arg_index++;
- tagname = argv[arg_index];
- fip = GetField(tiff, tagname);
-
- if (!fip)
- return 3;
-
- arg_index++;
- if (TIFFFieldDataType(fip) == TIFF_ASCII) {
- if (TIFFSetField(tiff, TIFFFieldTag(fip), argv[arg_index]) != 1)
- fprintf( stderr, "Failed to set %s=%s\n",
- TIFFFieldName(fip), argv[arg_index] );
- } else if (TIFFFieldWriteCount(fip) > 0
- || TIFFFieldWriteCount(fip) == TIFF_VARIABLE) {
- int ret = 1;
- short wc;
-
- if (TIFFFieldWriteCount(fip) == TIFF_VARIABLE)
- wc = atoi(argv[arg_index++]);
- else
- wc = TIFFFieldWriteCount(fip);
-
- if (argc - arg_index < wc) {
- fprintf( stderr,
- "Number of tag values is not enough. "
- "Expected %d values for %s tag, got %d\n",
- wc, TIFFFieldName(fip), argc - arg_index);
- return 4;
- }
-
- if (wc > 1) {
- int i, size;
- void *array;
-
- switch (TIFFFieldDataType(fip)) {
- /*
- * XXX: We can't use TIFFDataWidth()
- * to determine the space needed to store
- * the value. For TIFF_RATIONAL values
- * TIFFDataWidth() returns 8, but we use 4-byte
- * float to represent rationals.
- */
- case TIFF_BYTE:
- case TIFF_ASCII:
- case TIFF_SBYTE:
- case TIFF_UNDEFINED:
- default:
- size = 1;
- break;
-
- case TIFF_SHORT:
- case TIFF_SSHORT:
- size = 2;
- break;
-
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_FLOAT:
- case TIFF_IFD:
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- size = 4;
- break;
-
- case TIFF_DOUBLE:
- size = 8;
- break;
- }
-
- array = _TIFFmalloc(wc * size);
- if (!array) {
- fprintf(stderr, "No space for %s tag\n",
- tagname);
- return 4;
- }
-
- switch (TIFFFieldDataType(fip)) {
- case TIFF_BYTE:
- for (i = 0; i < wc; i++)
- ((uint8 *)array)[i] = atoi(argv[arg_index+i]);
- break;
- case TIFF_SHORT:
- for (i = 0; i < wc; i++)
- ((uint16 *)array)[i] = atoi(argv[arg_index+i]);
- break;
- case TIFF_SBYTE:
- for (i = 0; i < wc; i++)
- ((int8 *)array)[i] = atoi(argv[arg_index+i]);
- break;
- case TIFF_SSHORT:
- for (i = 0; i < wc; i++)
- ((int16 *)array)[i] = atoi(argv[arg_index+i]);
- break;
- case TIFF_LONG:
- for (i = 0; i < wc; i++)
- ((uint32 *)array)[i] = atol(argv[arg_index+i]);
- break;
- case TIFF_SLONG:
- case TIFF_IFD:
- for (i = 0; i < wc; i++)
- ((uint32 *)array)[i] = atol(argv[arg_index+i]);
- break;
- case TIFF_DOUBLE:
- for (i = 0; i < wc; i++)
- ((double *)array)[i] = atof(argv[arg_index+i]);
- break;
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- case TIFF_FLOAT:
- for (i = 0; i < wc; i++)
- ((float *)array)[i] = (float)atof(argv[arg_index+i]);
- break;
- default:
- break;
- }
-
- if (TIFFFieldPassCount(fip)) {
- ret = TIFFSetField(tiff, TIFFFieldTag(fip),
- wc, array);
- } else if (TIFFFieldTag(fip) == TIFFTAG_PAGENUMBER
- || TIFFFieldTag(fip) == TIFFTAG_HALFTONEHINTS
- || TIFFFieldTag(fip) == TIFFTAG_YCBCRSUBSAMPLING
- || TIFFFieldTag(fip) == TIFFTAG_DOTRANGE) {
- if (TIFFFieldDataType(fip) == TIFF_BYTE) {
- ret = TIFFSetField(tiff, TIFFFieldTag(fip),
- ((uint8 *)array)[0], ((uint8 *)array)[1]);
- } else if (TIFFFieldDataType(fip) == TIFF_SHORT) {
- ret = TIFFSetField(tiff, TIFFFieldTag(fip),
- ((uint16 *)array)[0], ((uint16 *)array)[1]);
- }
- } else {
- ret = TIFFSetField(tiff, TIFFFieldTag(fip),
- array);
- }
-
- _TIFFfree(array);
- } else {
- switch (TIFFFieldDataType(fip)) {
- case TIFF_BYTE:
- case TIFF_SHORT:
- case TIFF_SBYTE:
- case TIFF_SSHORT:
- ret = TIFFSetField(tiff, TIFFFieldTag(fip),
- atoi(argv[arg_index++]));
- break;
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_IFD:
- ret = TIFFSetField(tiff, TIFFFieldTag(fip),
- atol(argv[arg_index++]));
- break;
- case TIFF_DOUBLE:
- ret = TIFFSetField(tiff, TIFFFieldTag(fip),
- atof(argv[arg_index++]));
- break;
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- case TIFF_FLOAT:
- ret = TIFFSetField(tiff, TIFFFieldTag(fip),
- (float)atof(argv[arg_index++]));
- break;
- default:
- break;
- }
- }
-
- if (ret != 1)
- fprintf(stderr, "Failed to set %s\n", TIFFFieldName(fip));
- arg_index += wc;
- }
- } else if (strcmp(argv[arg_index],"-sf") == 0 && arg_index < argc-3) {
- FILE *fp;
- const TIFFField *fip;
- char *text;
- size_t len;
-
- arg_index++;
- fip = GetField(tiff, argv[arg_index]);
-
- if (!fip)
- return 3;
-
- if (TIFFFieldDataType(fip) != TIFF_ASCII) {
- fprintf( stderr,
- "Only ASCII tags can be set from file. "
- "%s is not ASCII tag.\n", TIFFFieldName(fip) );
- return 5;
- }
-
- arg_index++;
- fp = fopen( argv[arg_index], "rt" );
- if(fp == NULL) {
- perror( argv[arg_index] );
- continue;
- }
-
- text = (char *) malloc(1000000);
- len = fread( text, 1, 999999, fp );
- text[len] = '\0';
-
- fclose( fp );
-
- if(TIFFSetField( tiff, TIFFFieldTag(fip), text ) != 1) {
- fprintf(stderr, "Failed to set %s from file %s\n",
- TIFFFieldName(fip), argv[arg_index]);
- }
-
- _TIFFfree( text );
- arg_index++;
- } else {
- fprintf(stderr, "Unrecognised option: %s\n",
- argv[arg_index]);
- usage();
- }
- }
-
- TIFFRewriteDirectory(tiff);
- TIFFClose(tiff);
- return 0;
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/tiffsplit.c b/tiff/tools/tiffsplit.c
deleted file mode 100755
index fa43d63..0000000
--- a/tiff/tools/tiffsplit.c
+++ /dev/null
@@ -1,303 +0,0 @@
-/* $Id: tiffsplit.c,v 1.22 2011-10-22 17:03:01 bfriesen Exp $ */
-
-/*
- * Copyright (c) 1992-1997 Sam Leffler
- * Copyright (c) 1992-1997 Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#include "tif_config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "tiffio.h"
-
-#ifndef HAVE_GETOPT
-extern int getopt(int, char**, char*);
-#endif
-
-#define CopyField(tag, v) \
- if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v)
-#define CopyField2(tag, v1, v2) \
- if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2)
-#define CopyField3(tag, v1, v2, v3) \
- if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3)
-
-#define PATH_LENGTH 8192
-
-static const char TIFF_SUFFIX[] = ".tif";
-
-static char fname[PATH_LENGTH];
-
-static int tiffcp(TIFF*, TIFF*);
-static void newfilename(void);
-static int cpStrips(TIFF*, TIFF*);
-static int cpTiles(TIFF*, TIFF*);
-
-int
-main(int argc, char* argv[])
-{
- TIFF *in, *out;
-
- if (argc < 2) {
- fprintf(stderr, "%s\n\n", TIFFGetVersion());
- fprintf(stderr, "usage: tiffsplit input.tif [prefix]\n");
- return (-3);
- }
- if (argc > 2) {
- strncpy(fname, argv[2], sizeof(fname));
- fname[sizeof(fname) - 1] = '\0';
- }
- in = TIFFOpen(argv[1], "r");
- if (in != NULL) {
- do {
- size_t path_len;
- char *path;
-
- newfilename();
-
- path_len = strlen(fname) + sizeof(TIFF_SUFFIX);
- path = (char *) _TIFFmalloc(path_len);
- strncpy(path, fname, path_len);
- path[path_len - 1] = '\0';
- strncat(path, TIFF_SUFFIX, path_len - strlen(path) - 1);
- out = TIFFOpen(path, TIFFIsBigEndian(in)?"wb":"wl");
- _TIFFfree(path);
-
- if (out == NULL)
- return (-2);
- if (!tiffcp(in, out))
- return (-1);
- TIFFClose(out);
- } while (TIFFReadDirectory(in));
- (void) TIFFClose(in);
- }
- return (0);
-}
-
-static void
-newfilename(void)
-{
- static int first = 1;
- static long lastTurn;
- static long fnum;
- static short defname;
- static char *fpnt;
-
- if (first) {
- if (fname[0]) {
- fpnt = fname + strlen(fname);
- defname = 0;
- } else {
- fname[0] = 'x';
- fpnt = fname + 1;
- defname = 1;
- }
- first = 0;
- }
-#define MAXFILES 17576
- if (fnum == MAXFILES) {
- if (!defname || fname[0] == 'z') {
- fprintf(stderr, "tiffsplit: too many files.\n");
- exit(1);
- }
- fname[0]++;
- fnum = 0;
- }
- if (fnum % 676 == 0) {
- if (fnum != 0) {
- /*
- * advance to next letter every 676 pages
- * condition for 'z'++ will be covered above
- */
- fpnt[0]++;
- } else {
- /*
- * set to 'a' if we are on the very first file
- */
- fpnt[0] = 'a';
- }
- /*
- * set the value of the last turning point
- */
- lastTurn = fnum;
- }
- /*
- * start from 0 every 676 times (provided by lastTurn)
- * this keeps us within a-z boundaries
- */
- fpnt[1] = (char)((fnum - lastTurn) / 26) + 'a';
- /*
- * cycle last letter every file, from a-z, then repeat
- */
- fpnt[2] = (char)(fnum % 26) + 'a';
- fnum++;
-}
-
-static int
-tiffcp(TIFF* in, TIFF* out)
-{
- uint16 bitspersample, samplesperpixel, compression, shortv, *shortav;
- uint32 w, l;
- float floatv;
- char *stringv;
- uint32 longv;
-
- CopyField(TIFFTAG_SUBFILETYPE, longv);
- CopyField(TIFFTAG_TILEWIDTH, w);
- CopyField(TIFFTAG_TILELENGTH, l);
- CopyField(TIFFTAG_IMAGEWIDTH, w);
- CopyField(TIFFTAG_IMAGELENGTH, l);
- CopyField(TIFFTAG_BITSPERSAMPLE, bitspersample);
- CopyField(TIFFTAG_SAMPLESPERPIXEL, samplesperpixel);
- CopyField(TIFFTAG_COMPRESSION, compression);
- if (compression == COMPRESSION_JPEG) {
- uint32 count = 0;
- void *table = NULL;
- if (TIFFGetField(in, TIFFTAG_JPEGTABLES, &count, &table)
- && count > 0 && table) {
- TIFFSetField(out, TIFFTAG_JPEGTABLES, count, table);
- }
- }
- CopyField(TIFFTAG_PHOTOMETRIC, shortv);
- CopyField(TIFFTAG_PREDICTOR, shortv);
- CopyField(TIFFTAG_THRESHHOLDING, shortv);
- CopyField(TIFFTAG_FILLORDER, shortv);
- CopyField(TIFFTAG_ORIENTATION, shortv);
- CopyField(TIFFTAG_MINSAMPLEVALUE, shortv);
- CopyField(TIFFTAG_MAXSAMPLEVALUE, shortv);
- CopyField(TIFFTAG_XRESOLUTION, floatv);
- CopyField(TIFFTAG_YRESOLUTION, floatv);
- CopyField(TIFFTAG_GROUP3OPTIONS, longv);
- CopyField(TIFFTAG_GROUP4OPTIONS, longv);
- CopyField(TIFFTAG_RESOLUTIONUNIT, shortv);
- CopyField(TIFFTAG_PLANARCONFIG, shortv);
- CopyField(TIFFTAG_ROWSPERSTRIP, longv);
- CopyField(TIFFTAG_XPOSITION, floatv);
- CopyField(TIFFTAG_YPOSITION, floatv);
- CopyField(TIFFTAG_IMAGEDEPTH, longv);
- CopyField(TIFFTAG_TILEDEPTH, longv);
- CopyField(TIFFTAG_SAMPLEFORMAT, shortv);
- CopyField2(TIFFTAG_EXTRASAMPLES, shortv, shortav);
- { uint16 *red, *green, *blue;
- CopyField3(TIFFTAG_COLORMAP, red, green, blue);
- }
- { uint16 shortv2;
- CopyField2(TIFFTAG_PAGENUMBER, shortv, shortv2);
- }
- CopyField(TIFFTAG_ARTIST, stringv);
- CopyField(TIFFTAG_IMAGEDESCRIPTION, stringv);
- CopyField(TIFFTAG_MAKE, stringv);
- CopyField(TIFFTAG_MODEL, stringv);
- CopyField(TIFFTAG_SOFTWARE, stringv);
- CopyField(TIFFTAG_DATETIME, stringv);
- CopyField(TIFFTAG_HOSTCOMPUTER, stringv);
- CopyField(TIFFTAG_PAGENAME, stringv);
- CopyField(TIFFTAG_DOCUMENTNAME, stringv);
- CopyField(TIFFTAG_BADFAXLINES, longv);
- CopyField(TIFFTAG_CLEANFAXDATA, longv);
- CopyField(TIFFTAG_CONSECUTIVEBADFAXLINES, longv);
- CopyField(TIFFTAG_FAXRECVPARAMS, longv);
- CopyField(TIFFTAG_FAXRECVTIME, longv);
- CopyField(TIFFTAG_FAXSUBADDRESS, stringv);
- CopyField(TIFFTAG_FAXDCS, stringv);
- if (TIFFIsTiled(in))
- return (cpTiles(in, out));
- else
- return (cpStrips(in, out));
-}
-
-static int
-cpStrips(TIFF* in, TIFF* out)
-{
- tmsize_t bufsize = TIFFStripSize(in);
- unsigned char *buf = (unsigned char *)_TIFFmalloc(bufsize);
-
- if (buf) {
- tstrip_t s, ns = TIFFNumberOfStrips(in);
- uint64 *bytecounts;
-
- if (!TIFFGetField(in, TIFFTAG_STRIPBYTECOUNTS, &bytecounts)) {
- fprintf(stderr, "tiffsplit: strip byte counts are missing\n");
- return (0);
- }
- for (s = 0; s < ns; s++) {
- if (bytecounts[s] > (uint64)bufsize) {
- buf = (unsigned char *)_TIFFrealloc(buf, (tmsize_t)bytecounts[s]);
- if (!buf)
- return (0);
- bufsize = (tmsize_t)bytecounts[s];
- }
- if (TIFFReadRawStrip(in, s, buf, (tmsize_t)bytecounts[s]) < 0 ||
- TIFFWriteRawStrip(out, s, buf, (tmsize_t)bytecounts[s]) < 0) {
- _TIFFfree(buf);
- return (0);
- }
- }
- _TIFFfree(buf);
- return (1);
- }
- return (0);
-}
-
-static int
-cpTiles(TIFF* in, TIFF* out)
-{
- tmsize_t bufsize = TIFFTileSize(in);
- unsigned char *buf = (unsigned char *)_TIFFmalloc(bufsize);
-
- if (buf) {
- ttile_t t, nt = TIFFNumberOfTiles(in);
- uint64 *bytecounts;
-
- if (!TIFFGetField(in, TIFFTAG_TILEBYTECOUNTS, &bytecounts)) {
- fprintf(stderr, "tiffsplit: tile byte counts are missing\n");
- return (0);
- }
- for (t = 0; t < nt; t++) {
- if (bytecounts[t] > (uint64) bufsize) {
- buf = (unsigned char *)_TIFFrealloc(buf, (tmsize_t)bytecounts[t]);
- if (!buf)
- return (0);
- bufsize = (tmsize_t)bytecounts[t];
- }
- if (TIFFReadRawTile(in, t, buf, (tmsize_t)bytecounts[t]) < 0 ||
- TIFFWriteRawTile(out, t, buf, (tmsize_t)bytecounts[t]) < 0) {
- _TIFFfree(buf);
- return (0);
- }
- }
- _TIFFfree(buf);
- return (1);
- }
- return (0);
-}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/tiff/tools/ycbcr.c b/tiff/tools/ycbcr.c
deleted file mode 100755
index 8f72447..0000000
--- a/tiff/tools/ycbcr.c
+++ /dev/null
@@ -1,168 +0,0 @@
-float ycbcrCoeffs[3] = { .299, .587, .114 };
-/* default coding range is CCIR Rec 601-1 with no headroom/footroom */
-unsigned long refBlackWhite[6] = { 0, 255, 128, 255, 128, 255 };
-
-#define LumaRed ycbcrCoeffs[0]
-#define LumaGreen ycbcrCoeffs[1]
-#define LumaBlue ycbcrCoeffs[2]
-
-long eRtotal = 0;
-long eGtotal = 0;
-long eBtotal = 0;
-long preveRtotal = 0;
-long preveGtotal = 0;
-long preveBtotal = 0;
-unsigned long AbseRtotal = 0;
-unsigned long AbseGtotal = 0;
-unsigned long AbseBtotal = 0;
-unsigned long eCodes = 0;
-unsigned long preveCodes = 0;
-unsigned long eBits = 0;
-unsigned long preveBits = 0;
-
-static void setupLumaTables();
-static int abs(int v) { return (v < 0 ? -v : v); }
-static double pct(int v,double range) { return (v*100. / range); }
-static void check(int R, int G, int B);
-
-float D1, D2;
-float D3, D4;
-float D5, D6;
-
-int
-main(int argc, char** argv)
-{
- int R, G, B;
-
- if (argc > 1) {
- refBlackWhite[0] = 16;
- refBlackWhite[1] = 235;
- refBlackWhite[2] = 128;
- refBlackWhite[3] = 240;
- refBlackWhite[4] = 128;
- refBlackWhite[5] = 240;
- }
- D3 = 2 - 2*LumaRed;
- D4 = 2 - 2*LumaBlue;
- D1 = 1. / D3;
- D2 = 1. / D4;
- D5 = D3*LumaRed / LumaGreen;
- D6 = D4*LumaBlue / LumaGreen;
- setupLumaTables();
- for (R = 0; R < 256; R++) {
- for (G = 0; G < 256; G++)
- for (B = 0; B < 256; B++)
- check(R, G, B);
- printf("[%3u] c %u/%u b %u/%u (R %u/%d/%u G %u/%d/%u B %u/%d/%u)\n"
- , R
- , eCodes - preveCodes, eCodes
- , eBits - preveBits, eBits
- , abs(AbseRtotal - preveRtotal), eRtotal , AbseRtotal
- , abs(AbseGtotal - preveGtotal), eGtotal , AbseGtotal
- , abs(AbseBtotal - preveBtotal), eBtotal , AbseBtotal
- );
- preveRtotal = AbseRtotal;
- preveGtotal = AbseGtotal;
- preveBtotal = AbseBtotal;
- preveCodes = eCodes;
- preveBits = eBits;
- }
- printf("%u total codes\n", 256*256*256);
- printf("total error: %u codes %u bits (R %d/%u G %d/%u B %d/%u)\n"
- , eCodes
- , eBits
- , eRtotal , AbseRtotal
- , eGtotal , AbseGtotal
- , eBtotal , AbseBtotal
- );
- return (0);
-}
-
-float *lumaRed;
-float *lumaGreen;
-float *lumaBlue;
-
-static float*
-setupLuma(float c)
-{
- float *v = (float *)_TIFFmalloc(256 * sizeof (float));
- int i;
- for (i = 0; i < 256; i++)
- v[i] = c * i;
- return (v);
-}
-
-static void
-setupLumaTables(void)
-{
- lumaRed = setupLuma(LumaRed);
- lumaGreen = setupLuma(LumaGreen);
- lumaBlue = setupLuma(LumaBlue);
-}
-
-static unsigned
-V2Code(float f, unsigned long RB, unsigned long RW, int CR)
-{
- unsigned int c = (unsigned int)((((f)*(RW-RB)/CR)+RB)+.5);
- return (c > 255 ? 255 : c);
-}
-
-#define Code2V(c, RB, RW, CR) ((((c)-(int)RB)*(float)CR)/(float)(RW-RB))
-
-#define CLAMP(f,min,max) \
- (int)((f)+.5 < (min) ? (min) : (f)+.5 > (max) ? (max) : (f)+.5)
-
-static
-void
-check(int R, int G, int B)
-{
- float Y, Cb, Cr;
- int iY, iCb, iCr;
- float rY, rCb, rCr;
- float rR, rG, rB;
- int eR, eG, eB;
-
- Y = lumaRed[R] + lumaGreen[G] + lumaBlue[B];
- Cb = (B - Y)*D2;
- Cr = (R - Y)*D1;
- iY = V2Code(Y, refBlackWhite[0], refBlackWhite[1], 255);
- iCb = V2Code(Cb, refBlackWhite[2], refBlackWhite[3], 127);
- iCr = V2Code(Cr, refBlackWhite[4], refBlackWhite[5], 127);
- rCb = Code2V(iCb, refBlackWhite[2], refBlackWhite[3], 127);
- rCr = Code2V(iCr, refBlackWhite[4], refBlackWhite[5], 127);
- rY = Code2V(iY, refBlackWhite[0], refBlackWhite[1], 255);
- rR = rY + rCr*D3;
- rB = rY + rCb*D4;
- rG = rY - rCb*D6 - rCr*D5;
- eR = R - CLAMP(rR,0,255);
- eG = G - CLAMP(rG,0,255);
- eB = B - CLAMP(rB,0,255);
- if (abs(eR) > 1 || abs(eG) > 1 || abs(eB) > 1) {
- printf("R %u G %u B %u", R, G, B);
- printf(" Y %g Cb %g Cr %g", Y, Cb, Cr);
- printf(" iY %u iCb %u iCr %u", iY, iCb, iCr);
- printf("\n -> Y %g Cb %g Cr %g", rY, rCb, rCr);
- printf(" R %g (%u) G %g (%u) B %g (%u) E=[%d %d %d])\n"
- , rR, CLAMP(rR,0,255)
- , rG, CLAMP(rG,0,255)
- , rB, CLAMP(rB,0,255)
- , eR, eG, eB
- );
- }
- eRtotal += eR;
- eGtotal += eG;
- eBtotal += eB;
- AbseRtotal += abs(eR);
- AbseGtotal += abs(eG);
- AbseBtotal += abs(eB);
- if (eR | eG | eB)
- eCodes++;
- eBits += abs(eR) + abs(eG) + abs(eB);
-}
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */