fix test suite

- CMYK2XYZ and back now support extra alpha bands
- test suite tests CMYK conversions
- a small bug fixed too
This commit is contained in:
John Cupitt 2018-12-28 20:53:25 +00:00
parent b0c66df72c
commit 074906f670
6 changed files with 63 additions and 23 deletions

View File

@ -92,8 +92,6 @@ vips__CMYK2XYZ_get_fallback_profile( size_t *length )
}
/* Shared with XYZ2CMYK.c.
*
* FIXME ... should this remove and replace a non-CMYK profile?
*/
int
vips_CMYK2XYZ_set_fallback_profile( VipsImage *image )
@ -101,8 +99,11 @@ vips_CMYK2XYZ_set_fallback_profile( VipsImage *image )
size_t data_length;
unsigned char *data;
/* Already a profile? Do nothing. We could remove and replace non-CMYK
* profiles I guess.
*/
if( vips_image_get_typeof( image, VIPS_META_ICC_NAME ) )
return( -1 );
return( 0 );
if( !(data = vips__CMYK2XYZ_get_fallback_profile( &data_length )) )
return( -1 );
@ -113,11 +114,22 @@ vips_CMYK2XYZ_set_fallback_profile( VipsImage *image )
return( 0 );
}
/* Our actual processing, as a VipsColourTransformFn.
*/
static int
vips_CMYK2XYZ_process( VipsImage *in, VipsImage **out, ... )
{
return( vips_icc_import( in, out,
"embedded", TRUE,
"pcs", VIPS_PCS_XYZ,
NULL ) );
}
static int
vips_CMYK2XYZ_build( VipsObject *object )
{
VipsCMYK2XYZ *CMYK2XYZ = (VipsCMYK2XYZ *) object;
VipsImage **t = (VipsImage **) vips_object_local_array( object, 7 );
VipsImage **t = (VipsImage **) vips_object_local_array( object, 2 );
VipsImage *out;
@ -129,10 +141,8 @@ vips_CMYK2XYZ_build( VipsObject *object )
if( vips_copy( CMYK2XYZ->in, &t[0], NULL ) ||
vips_CMYK2XYZ_set_fallback_profile( t[0] ) ||
vips_icc_import( t[0], &t[1],
"embedded", TRUE,
"pcs", VIPS_PCS_XYZ,
NULL ) ||
vips__colourspace_process_n( "CMYK2XYZ",
t[0], &t[1], 4, vips_CMYK2XYZ_process ) ||
vips_image_write( t[1], out ) )
return( -1 );

View File

@ -59,11 +59,21 @@ typedef VipsColourCodeClass VipsXYZ2CMYKClass;
G_DEFINE_TYPE( VipsXYZ2CMYK, vips_XYZ2CMYK, VIPS_TYPE_OPERATION );
/* Our actual processing, as a VipsColourTransformFn.
*/
static int
vips_XYZ2CMYK_process( VipsImage *in, VipsImage **out, ... )
{
return( vips_icc_export( in, out,
"pcs", VIPS_PCS_XYZ,
NULL ) );
}
static int
vips_XYZ2CMYK_build( VipsObject *object )
{
VipsXYZ2CMYK *XYZ2CMYK = (VipsXYZ2CMYK *) object;
VipsImage **t = (VipsImage **) vips_object_local_array( object, 7 );
VipsImage **t = (VipsImage **) vips_object_local_array( object, 2 );
VipsImage *out;
@ -75,9 +85,8 @@ vips_XYZ2CMYK_build( VipsObject *object )
if( vips_copy( XYZ2CMYK->in, &t[0], NULL ) ||
vips_CMYK2XYZ_set_fallback_profile( t[0] ) ||
vips_icc_export( t[0], &t[1],
"pcs", VIPS_PCS_XYZ,
NULL ) ||
vips__colourspace_process_n( "XYZ2CMYK",
t[0], &t[1], 3, vips_XYZ2CMYK_process ) ||
vips_image_write( t[1], out ) )
return( -1 );

View File

@ -68,10 +68,6 @@
#include "pcolour.h"
/* A colour-transforming function.
*/
typedef int (*VipsColourTransformFn)( VipsImage *in, VipsImage **out, ... );
static int
vips_scRGB2RGB16( VipsImage *in, VipsImage **out, ... )
{
@ -113,10 +109,12 @@ vips_sRGB2RGB16( VipsImage *in, VipsImage **out, ... )
}
/* Process the first @n bands with @fn, detach and reattach remaining bands.
*
* Also used by CMYK2XYZ and XYZ2CMYK.
*/
static int
vips_process_n( const char *domain, VipsImage *in, VipsImage **out,
int n, VipsColourTransformFn fn )
int
vips__colourspace_process_n( const char *domain,
VipsImage *in, VipsImage **out, int n, VipsColourTransformFn fn )
{
if( in->Bands > n ) {
VipsImage *scope = vips_image_new();
@ -168,7 +166,8 @@ vips_BW2sRGB_op( VipsImage *in, VipsImage **out, ... )
static int
vips_BW2sRGB( VipsImage *in, VipsImage **out, ... )
{
if( vips_process_n( "BW2sRGB", in, out, 1, vips_BW2sRGB_op ) )
if( vips__colourspace_process_n( "BW2sRGB",
in, out, 1, vips_BW2sRGB_op ) )
return( -1 );
(*out)->Type = VIPS_INTERPRETATION_sRGB;
@ -178,7 +177,8 @@ vips_BW2sRGB( VipsImage *in, VipsImage **out, ... )
static int
vips_GREY162RGB16( VipsImage *in, VipsImage **out, ... )
{
if( vips_process_n( "GREY162RGB16", in, out, 1, vips_BW2sRGB_op ) )
if( vips__colourspace_process_n( "GREY162RGB16",
in, out, 1, vips_BW2sRGB_op ) )
return( -1 );
(*out)->Type = VIPS_INTERPRETATION_RGB16;

View File

@ -218,6 +218,13 @@ void vips_col_make_tables_RGB_16( void );
int vips_CMYK2XYZ_set_fallback_profile( VipsImage *image );
/* A colour-transforming function.
*/
typedef int (*VipsColourTransformFn)( VipsImage *in, VipsImage **out, ... );
int vips__colourspace_process_n( const char *domain,
VipsImage *in, VipsImage **out, int n, VipsColourTransformFn fn );
#ifdef __cplusplus
}
#endif /*__cplusplus*/

View File

@ -49,17 +49,18 @@ colour_colourspaces = [pyvips.Interpretation.XYZ,
pyvips.Interpretation.LCH,
pyvips.Interpretation.CMC,
pyvips.Interpretation.LABS,
pyvips.Interpretation.CMYK,
pyvips.Interpretation.SCRGB,
pyvips.Interpretation.HSV,
pyvips.Interpretation.SRGB,
pyvips.Interpretation.YXY]
cmyk_colourspaces = [pyvips.Interpretation.CMYK]
coded_colourspaces = [pyvips.Interpretation.LABQ]
mono_colourspaces = [pyvips.Interpretation.B_W]
sixteenbit_colourspaces = [pyvips.Interpretation.GREY16,
pyvips.Interpretation.RGB16]
all_colourspaces = colour_colourspaces + mono_colourspaces + \
coded_colourspaces + sixteenbit_colourspaces
coded_colourspaces + sixteenbit_colourspaces + \
cmyk_colourspaces
max_value = {pyvips.BandFormat.UCHAR: 0xff,
pyvips.BandFormat.USHORT: 0xffff,

View File

@ -71,6 +71,19 @@ class TestColour:
# but 8-bit we should hit exactly
assert abs(after - before) < 1
# we should be able to go from cmyk to any 3-band space and back again,
# approximately
cmyk = test.colourspace(pyvips.Interpretation.CMYK)
for end in colour_colourspaces:
im = cmyk.colourspace(end)
im2 = im.colourspace(pyvips.Interpretation.CMYK)
before = cmyk(10, 10)
after = im2(10, 10)
assert_almost_equal_objects(before, after, threshold=10)
# test results from Bruce Lindbloom's calculator:
# http://www.brucelindbloom.com
def test_dE00(self):