redo im_Yxy2XYZ() and im_XYZ2Yxy() as classes

This commit is contained in:
John Cupitt 2012-09-20 09:49:05 +01:00
parent e688bf29b6
commit 7b665c24df
8 changed files with 134 additions and 31 deletions

View File

@ -1,6 +1,6 @@
31/8/12 started 7.31.0 31/8/12 started 7.31.0
- redone im_Lab2XYZ(), im_XYZ2Lab(), im_Lab2LCh(), im_LCh2Lab(), im_UCS2LCh, - redone im_Lab2XYZ(), im_XYZ2Lab(), im_Lab2LCh(), im_LCh2Lab(), im_UCS2LCh,
im_LCh2UCS() as classes im_LCh2UCS(), im_XYZ2Yxy(), im_Yxy2XYZ() as classes
13/9/12 started 7.30.3 13/9/12 started 7.30.3
- linecache sized itself too large - linecache sized itself too large

View File

@ -12,6 +12,8 @@ libcolour_la_SOURCES = \
LCh2UCS.c \ LCh2UCS.c \
UCS2LCh.c \ UCS2LCh.c \
XYZ2Lab.c \ XYZ2Lab.c \
XYZ2Yxy.c \
Yxy2XYZ.c \
im_icc_transform.c \ im_icc_transform.c \
im_Lab2LabQ.c \ im_Lab2LabQ.c \
im_Lab2LabS.c \ im_Lab2LabS.c \
@ -21,9 +23,7 @@ libcolour_la_SOURCES = \
im_LabS2LabQ.c \ im_LabS2LabQ.c \
im_LabS2Lab.c \ im_LabS2Lab.c \
im_lab_morph.c \ im_lab_morph.c \
im_XYZ2Yxy.c \
im_float2rad.c \ im_float2rad.c \
im_Yxy2XYZ.c \
im_XYZ2disp.c \ im_XYZ2disp.c \
im_dE00_fromLab.c \ im_dE00_fromLab.c \
im_dECMC_fromLab.c \ im_dECMC_fromLab.c \

View File

@ -43,16 +43,23 @@
#include <math.h> #include <math.h>
#include <vips/vips.h> #include <vips/vips.h>
#include <vips/internal.h>
/* Process a buffer of data. #include "colour.h"
*/
void typedef VipsColorimetric VipsXYZ2Yxy;
imb_XYZ2Yxy( float *p, float *q, int n ) typedef VipsColorimetricClass VipsXYZ2YxyClass;
G_DEFINE_TYPE( VipsXYZ2Yxy, vips_XYZ2Yxy, VIPS_TYPE_COLORIMETRIC );
static void
vips_XYZ2Yxy_line( VipsColour *colour, VipsPel *out, VipsPel **in, int width )
{ {
float *p = (float *) in[0];
float *q = (float *) out;
int i; int i;
for( i = 0; i < n; i++ ) { for( i = 0; i < width; i++ ) {
float X = p[0]; float X = p[0];
float Y = p[1]; float Y = p[1];
float Z = p[2]; float Z = p[2];
@ -72,19 +79,42 @@ imb_XYZ2Yxy( float *p, float *q, int n )
} }
} }
static void
vips_XYZ2Yxy_class_init( VipsXYZ2YxyClass *class )
{
VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsColourClass *colour_class = VIPS_COLOUR_CLASS( class );
object_class->nickname = "XYZ2Yxy";
object_class->description = _( "transform XYZ to Yxy" );
colour_class->process_line = vips_XYZ2Yxy_line;
colour_class->interpretation = VIPS_INTERPRETATION_YXY;
}
static void
vips_XYZ2Yxy_init( VipsXYZ2Yxy *XYZ2Yxy )
{
}
/** /**
* im_XYZ2Yxy: * vips_XYZ2Yxy:
* @in: input image * @in: input image
* @out: output image * @out: output image
* *
* Turn XYZ to Yxy. * Turn XYZ to Yxy.
* *
* Returns: 0 on success, -1 on error. * Returns: 0 on success, -1 on error
*/ */
int int
im_XYZ2Yxy( IMAGE *in, IMAGE *out ) vips_XYZ2Yxy( VipsImage *in, VipsImage **out, ... )
{ {
return( im__colour_unary( "im_XYZ2Yxy", in, out, IM_TYPE_YXY, va_list ap;
(im_wrapone_fn) imb_XYZ2Yxy, NULL, NULL ) ); int result;
}
va_start( ap, out );
result = vips_call_split( "XYZ2Yxy", ap, in, out );
va_end( ap );
return( result );
}

View File

@ -43,16 +43,23 @@
#include <math.h> #include <math.h>
#include <vips/vips.h> #include <vips/vips.h>
#include <vips/internal.h>
/* Process a buffer of data. #include "colour.h"
*/
typedef VipsColorimetric VipsYxy2XYZ;
typedef VipsColorimetricClass VipsYxy2XYZClass;
G_DEFINE_TYPE( VipsYxy2XYZ, vips_Yxy2XYZ, VIPS_TYPE_COLORIMETRIC );
void void
imb_Yxy2XYZ( float *p, float *q, int n ) vips_Yxy2XYZ_line( VipsColour *colour, VipsPel *out, VipsPel **in, int width )
{ {
float *p = (float *) in[0];
float *q = (float *) out;
int i; int i;
for( i = 0; i < n; i++ ) { for( i = 0; i < width; i++ ) {
float Y = p[0]; float Y = p[0];
float x = p[1]; float x = p[1];
float y = p[2]; float y = p[2];
@ -73,19 +80,43 @@ imb_Yxy2XYZ( float *p, float *q, int n )
} }
} }
static void
vips_Yxy2XYZ_class_init( VipsYxy2XYZClass *class )
{
VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsColourClass *colour_class = VIPS_COLOUR_CLASS( class );
object_class->nickname = "Yxy2XYZ";
object_class->description = _( "transform Yxy to XYZ" );
colour_class->process_line = vips_Yxy2XYZ_line;
colour_class->interpretation = VIPS_INTERPRETATION_XYZ;
}
static void
vips_Yxy2XYZ_init( VipsYxy2XYZ *Yxy2XYZ )
{
}
/** /**
* im_Yxy2XYZ: * vips_Yxy2XYZ:
* @in: input image * @in: input image
* @out: output image * @out: output image
* *
* Turn Yxy to XYZ. * Turn XYZ to Yxy.
* *
* Returns: 0 on success, -1 on error. * Returns: 0 on success, -1 on error
*/ */
int int
im_Yxy2XYZ( IMAGE *in, IMAGE *out ) vips_Yxy2XYZ( VipsImage *in, VipsImage **out, ... )
{ {
return( im__colour_unary( "im_Yxy2XYZ", in, out, IM_TYPE_XYZ, va_list ap;
(im_wrapone_fn) imb_Yxy2XYZ, NULL, NULL ) ); int result;
va_start( ap, out );
result = vips_call_split( "Yxy2XYZ", ap, in, out );
va_end( ap );
return( result );
} }

View File

@ -244,14 +244,20 @@ void
vips_colour_operation_init( void ) vips_colour_operation_init( void )
{ {
extern GType vips_Lab2XYZ_get_type( void ); extern GType vips_Lab2XYZ_get_type( void );
extern GType vips_XYZ2Lab_get_type( void );
extern GType vips_Lab2LCh_get_type( void ); extern GType vips_Lab2LCh_get_type( void );
extern GType vips_LCh2Lab_get_type( void ); extern GType vips_LCh2Lab_get_type( void );
extern GType vips_LCh2UCS_get_type( void ); extern GType vips_LCh2UCS_get_type( void );
extern GType vips_UCS2LCh_get_type( void ); extern GType vips_UCS2LCh_get_type( void );
extern GType vips_Yxy2XYZ_get_type( void );
extern GType vips_XYZ2Yxy_get_type( void );
vips_Lab2XYZ_get_type(); vips_Lab2XYZ_get_type();
vips_XYZ2Lab_get_type();
vips_Lab2LCh_get_type(); vips_Lab2LCh_get_type();
vips_LCh2Lab_get_type(); vips_LCh2Lab_get_type();
vips_LCh2UCS_get_type(); vips_LCh2UCS_get_type();
vips_UCS2LCh_get_type(); vips_UCS2LCh_get_type();
vips_XYZ2Yxy_get_type();
vips_Yxy2XYZ_get_type();
} }

View File

@ -2291,3 +2291,35 @@ im_UCS2LCh( IMAGE *in, IMAGE *out )
return( 0 ); return( 0 );
} }
int
im_XYZ2Yxy( IMAGE *in, IMAGE *out )
{
VipsImage *x;
if( vips_XYZ2Yxy( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
g_object_unref( x );
return( -1 );
}
g_object_unref( x );
return( 0 );
}
int
im_Yxy2XYZ( IMAGE *in, IMAGE *out )
{
VipsImage *x;
if( vips_Yxy2XYZ( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
g_object_unref( x );
return( -1 );
}
g_object_unref( x );
return( 0 );
}

View File

@ -126,6 +126,10 @@ int vips_LCh2UCS( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_UCS2LCh( VipsImage *in, VipsImage **out, ... ) int vips_UCS2LCh( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_XYZ2Yxy( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel));
int vips_Yxy2XYZ( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel));
void vips_col_Lab2XYZ( float L, float a, float b, void vips_col_Lab2XYZ( float L, float a, float b,
float *X, float *Y, float *Z ); float *X, float *Y, float *Z );
@ -174,8 +178,6 @@ int im_Lab2UCS( VipsImage *in, VipsImage *out );
int im_XYZ2UCS( VipsImage *in, VipsImage *out ); int im_XYZ2UCS( VipsImage *in, VipsImage *out );
int im_sRGB2XYZ( VipsImage *in, VipsImage *out ); int im_sRGB2XYZ( VipsImage *in, VipsImage *out );
int im_XYZ2sRGB( VipsImage *in, VipsImage *out ); int im_XYZ2sRGB( VipsImage *in, VipsImage *out );
int im_Yxy2XYZ( VipsImage *in, VipsImage *out );
int im_XYZ2Yxy( VipsImage *in, VipsImage *out );
int im_dECMC_fromLab( VipsImage *in1, VipsImage *in2, VipsImage *out ); int im_dECMC_fromLab( VipsImage *in1, VipsImage *in2, VipsImage *out );
int im_dE00_fromLab( VipsImage *in1, VipsImage *in2, VipsImage *out ); int im_dE00_fromLab( VipsImage *in1, VipsImage *in2, VipsImage *out );

View File

@ -716,6 +716,8 @@ int im_Lab2LCh( VipsImage *in, VipsImage *out );
int im_LCh2Lab( VipsImage *in, VipsImage *out ); int im_LCh2Lab( VipsImage *in, VipsImage *out );
int im_LCh2UCS( VipsImage *in, VipsImage *out ); int im_LCh2UCS( VipsImage *in, VipsImage *out );
int im_UCS2LCh( VipsImage *in, VipsImage *out ); int im_UCS2LCh( VipsImage *in, VipsImage *out );
int im_XYZ2Yxy( VipsImage *in, VipsImage *out );
int im_Yxy2XYZ( VipsImage *in, VipsImage *out );
/* ruby-vips uses this /* ruby-vips uses this
*/ */