[OK, this time with the patch!] On Sat, Jul 26, 2003 at 03:42:59PM -0700, Ross Boylan wrote: > I have attached a patch so that iscan, scanning software for Epson > scanners from Epson Kowa, will record the scanning resolution when > saving .png files. Without this, some programs (e.g., hylafax) have > to assume a resolution, and can be terribly wrong. (I was inspired to > do this because only the lower left corner of my 400 dpi scans was > going out, since they were assumed to be postscript standard 72dpi). > > I'm not sure if all versions of libpng support pHYS; if not, it might > be good to protect the code with some appropriate ifdef's. I had > libpng10-dev (aka libpng2) as my development library when I compiled > with gcc 3.3. > > Despite the name, I have used and applied the patch to iscan 1.5.2, > gcc 3.2 version. I originally developed it against 1.5.1. > > I (c) in my name and release it under GNU Public License v2 or later; > I believe this is the same license as the software it is patching, > which is available at > http://www.epkowa.co.jp/english/linux_e/lsd_e.html. > > Ross Boylan > > > P.S. There are some other changes I'd like to make, like having iscan > remember whether you selected png or pnm, and having it remember what > directory you are in. I think that requires learning about gtk > preferences, though. >
diff -ru iscan-1.5.1/frontend/pisa_change_unit.cc iscan-1.5.1-old/frontend/pisa_change_unit.cc --- iscan-1.5.1/frontend/pisa_change_unit.cc 2003-02-05 01:58:04.000000000 -0800 +++ iscan-1.5.1-old/frontend/pisa_change_unit.cc 2003-06-19 22:10:37.000000000 -0700 @@ -54,7 +54,6 @@ return ret; } - /*------------------------------------------------------------*/ double inch2centi ( double inch, long zoom ) { @@ -66,3 +65,13 @@ } +/*------------------------------------------------------------*/ +unsigned long centi2pixel ( double centi, long resolution, long zoom ) +{ + unsigned long ret; + + ret = ( long ) ( ( centi * resolution * zoom + 50 ) / (100* INCH2PIXEL)); + + return ret; +} + diff -ru iscan-1.5.1/frontend/pisa_change_unit.h iscan-1.5.1-old/frontend/pisa_change_unit.h --- iscan-1.5.1/frontend/pisa_change_unit.h 2003-02-05 01:58:04.000000000 -0800 +++ iscan-1.5.1-old/frontend/pisa_change_unit.h 2003-06-19 22:11:06.000000000 -0700 @@ -34,5 +34,6 @@ double inches_reflect_zoom ( double inch, long zoom ); long inch2pixel ( double inch, long resolution, long zoom = 100 ); double inch2centi ( double inch, long zoom = 100 ); +unsigned long centi2pixel ( double centi, long resolution, long zoom = 100); #endif // ___PISA_CHANGE_UNIT_H diff -ru iscan-1.5.1/frontend/pisa_save_file.cc iscan-1.5.1-old/frontend/pisa_save_file.cc --- iscan-1.5.1/frontend/pisa_save_file.cc 2003-03-15 01:11:15.000000000 -0800 +++ iscan-1.5.1-old/frontend/pisa_save_file.cc 2003-06-20 21:12:27.000000000 -0700 @@ -31,6 +31,7 @@ #include "pisa_save_file.h" +#include "pisa_change_unit.h" #include "pisa_error.h" #include <dlfcn.h> @@ -58,11 +59,12 @@ } void -base_save_file::set_img_info( char pixel, int width, int height ) +base_save_file::set_img_info( char pixel, int width, int height, long resolution ) { m_pixel = static_cast< pisa_pixel_type >( pixel ); m_width = width; m_height = height; + m_resolution = resolution; } @@ -150,6 +152,7 @@ plib_png_destroy_write_struct = ( lib_png_destroy_write_struct * ) dlsym ( m_handle_libpng, "png_destroy_write_struct" ); plib_png_init_io = ( lib_png_init_io * ) dlsym ( m_handle_libpng, "png_init_io" ); plib_png_set_IHDR = ( lib_png_set_IHDR * ) dlsym ( m_handle_libpng, "png_set_IHDR" ); + plib_png_set_pHYs = ( lib_png_set_pHYs * ) dlsym ( m_handle_libpng, "png_set_pHYs" ); plib_png_write_info = ( lib_png_write_info * ) dlsym ( m_handle_libpng, "png_write_info" ); plib_png_write_row = ( lib_png_write_row * ) dlsym ( m_handle_libpng, "png_write_row" ); plib_png_write_end = ( lib_png_write_end * ) dlsym ( m_handle_libpng, "png_write_end" ); @@ -160,6 +163,7 @@ ! plib_png_destroy_write_struct || ! plib_png_init_io || ! plib_png_set_IHDR || + ! plib_png_set_pHYs || ! plib_png_write_info || ! plib_png_write_row || ! plib_png_write_end ) @@ -287,7 +291,16 @@ PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE ); - + + // should I care about Zoom? + png_uint_32 resolution = centi2pixel( 100.0, m_resolution); + + plib_png_set_pHYs( m_png_ptr, + m_info_ptr, + resolution, + resolution, + PNG_RESOLUTION_METER); + /*write the info*/ plib_png_write_info(m_png_ptr, m_info_ptr); } diff -ru iscan-1.5.1/frontend/pisa_save_file.h iscan-1.5.1-old/frontend/pisa_save_file.h --- iscan-1.5.1/frontend/pisa_save_file.h 2003-03-15 01:11:15.000000000 -0800 +++ iscan-1.5.1-old/frontend/pisa_save_file.h 2003-06-19 22:41:02.000000000 -0700 @@ -42,7 +42,7 @@ virtual ~base_save_file(); base_save_file( const char *const filename ); - void set_img_info( char pixel, int width, int height ); + void set_img_info( char pixel, int width, int height, long resolution ); virtual void write_header() = 0; virtual void write_row( unsigned char *img, int size ) = 0; @@ -56,6 +56,7 @@ int m_width; int m_height; + long m_resolution; }; class save_file_pnm : public base_save_file @@ -114,6 +115,11 @@ int interlace_type, int compression_type, int filter_type ); + typedef void ( lib_png_set_pHYs ) ( png_structp png_ptr, + png_infop info_ptr, + png_uint_32 x, + png_uint_32 y, + int unit_type ); typedef void ( lib_png_write_info ) ( png_structp png_ptr, png_infop info_ptr ); typedef void ( lib_png_write_row ) ( png_structp png_ptr, @@ -127,6 +133,7 @@ lib_png_destroy_write_struct * plib_png_destroy_write_struct; lib_png_init_io * plib_png_init_io; lib_png_set_IHDR * plib_png_set_IHDR; + lib_png_set_pHYs * plib_png_set_pHYs; lib_png_write_info * plib_png_write_info; lib_png_write_row * plib_png_write_row; lib_png_write_end * plib_png_write_end; diff -ru iscan-1.5.1/frontend/pisa_view_manager.cc iscan-1.5.1-old/frontend/pisa_view_manager.cc --- iscan-1.5.1/frontend/pisa_view_manager.cc 2003-04-15 18:25:30.000000000 -0700 +++ iscan-1.5.1-old/frontend/pisa_view_manager.cc 2003-06-19 22:32:02.000000000 -0700 @@ -1152,7 +1152,9 @@ throw pisa_error( PISA_ERR_FILEOPEN ); } - save_cls->set_img_info( m_set.imgtype.pixeltype, width, height ); + // Perhaps get resolution from param? But it has two! Ross Boylan + save_cls->set_img_info( m_set.imgtype.pixeltype, width, height, + ::g_view_manager->m_set.resolution); try { save_cls->write_header();