#include #include #include "pnginput.h" #include "pngoutput.h" #include "colourspace.h" #include "filter.h" #define USE_LUV void read_image( double *pixeldata, pnginput_t *pnginput, int width, int height ) { int i, j; for( i = 0; i < height; i++ ) { unsigned char *curscanline = pnginput_get_scanline( pnginput, i ); for( j = 0; j < width; j++ ) { double bp = ( (double) curscanline[ 0 ] ) / 255.0; double gp = ( (double) curscanline[ 1 ] ) / 255.0; double rp = ( (double) curscanline[ 2 ] ) / 255.0; double r, g, b, x, y, z, lstar, ustar, vstar; nonlinear_to_linear_srgb( rp, gp, bp, &r, &g, &b ); srgb_to_xyz( r, g, b, &x, &y, &z ); xyz_to_lupvp( x, y, z, &lstar, &ustar, &vstar ); #ifdef USE_LUV *pixeldata++ = lstar; *pixeldata++ = ustar; *pixeldata++ = vstar; #else *pixeldata++ = x; *pixeldata++ = y; *pixeldata++ = z; #endif curscanline += 3; } } } void output_image_rgb( pngoutput_t *pngoutput, double *idata, int width, int height ) { unsigned char *scanline = (unsigned char *) malloc( width * 3 ); int i, j; for( i = 0; i < height; i++ ) { unsigned char *pixeldata = scanline; fprintf( stderr, "\rscale: Output scanline: %4d", i ); for( j = 0; j < width; j++ ) { double lstar, ustar, vstar, x, y, z, r, g, b, rp, gp, bp; #ifdef USE_LUV lstar = *idata++; ustar = *idata++; vstar = *idata++; lupvp_to_xyz( lstar, ustar, vstar, &x, &y, &z ); #else /* !USE_LUV */ x = *idata++; y = *idata++; z = *idata++; #endif /* USE_LUV */ xyz_to_srgb( x, y, z, &r, &g, &b ); linear_to_nonlinear_srgb( r, g, b, &rp, &gp, &bp ); *pixeldata++ = (unsigned char) ( ( bp * 255.0 ) + 0.5 ); *pixeldata++ = (unsigned char) ( ( gp * 255.0 ) + 0.5 ); *pixeldata++ = (unsigned char) ( ( rp * 255.0 ) + 0.5 ); } pngoutput_scanline( pngoutput, scanline ); } fprintf( stderr, "\n" ); free( scanline ); } int main( int argc, char **argv ) { pngoutput_t *pngoutput; pnginput_t *pnginput; int width, height; double *pixeldata; double *outdata; pnginput = pnginput_new( argv[ 1 ] ); if( !pnginput ) { fprintf( stderr, "scale: can't open input %s\n", argv[ 1 ] ); return 1; } width = pnginput_get_width( pnginput ); height = pnginput_get_height( pnginput ); pixeldata = (double *) malloc( 3 * width * height * sizeof( double ) ); if( !pixeldata ) { fprintf( stderr, "scale: can't allocate pixel data\n" ); return 1; } read_image( pixeldata, pnginput, width, height ); pnginput_delete( pnginput ); outdata = (double *) malloc( 3 * width * height * sizeof( double ) ); if( !outdata ) { fprintf( stderr, "scale: can't allocate pixel data\n" ); return 1; } pngoutput = pngoutput_new( argv[ 2 ], width, height, 0.45 ); if( !pngoutput ) { fprintf( stderr, "scale: can't open output %s\n", argv[ 2 ] ); return 1; } image3_highpass( outdata, pixeldata, width, height ); output_image_rgb( pngoutput, outdata, width, height ); pngoutput_delete( pngoutput ); return 0; }