remove sRGB2XYZ and back

now go via scRGB
This commit is contained in:
John Cupitt 2012-12-12 12:43:26 +00:00
parent c341f0d134
commit 89ff89ebf8
10 changed files with 101 additions and 502 deletions

7
TODO
View File

@ -1,10 +1,3 @@
- get rid of RGB, RGB16, just have sRGB and scRGB? maybe get rid of GREY16
too?
- get rid of sRGB2XYZ? is using two ops much slower?
- add colourconvert paths for scRGB
- now we've removed round-to-nearest from NN, we need something extra in the
affine transform to displace the input cods

View File

@ -25,8 +25,6 @@ libcolour_la_SOURCES = \
LabS2LabQ.c \
LabQ2LabS.c \
LabQ2sRGB.c \
XYZ2sRGB.c \
sRGB2XYZ.c \
sRGB2scRGB.c \
scRGB2XYZ.c \
XYZ2scRGB.c \

View File

@ -1,245 +0,0 @@
/* Turn XYZ files into displayable rgb.
*
* Author: J-P. Laurent
* Modified:
* 15/11/94 JC
* - error message added
* - out->Type set to IM_TYPE_RGB
* - memory leak fixed
* 16/11/94 JC
* - uses im_wrapone()
* 15/2/95 JC
* - oops! now uses PEL, not float for output pointer
* 2/1/96 JC
* - sometimes produced incorrect result at extrema
* - reformatted
* - now uses IM_RINT() and clip()
* 18/9/96 JC
* - some speed-ups ... 3x faster
* - slightly less accurate, but who cares
* - added out-of-mem check for table build
* 21/9/12
* - redone as a class
* - sRGB only, support for other RGBs is now via lcms
* 6/11/12
* - added 16-bit option
*/
/*
This file is part of VIPS.
VIPS is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /*HAVE_CONFIG_H*/
#include <vips/intl.h>
#include <stdio.h>
#include <math.h>
#include <vips/vips.h>
#include "colour.h"
typedef struct _VipsXYZ2sRGB {
VipsColourCode parent_instance;
int depth;
} VipsXYZ2sRGB;
typedef VipsColourCodeClass VipsXYZ2sRGBClass;
G_DEFINE_TYPE( VipsXYZ2sRGB, vips_XYZ2sRGB, VIPS_TYPE_COLOUR_CODE );
/* Process a buffer of data.
*/
static void
vips_XYZ2sRGB_line_8( VipsPel *q, float *p, int width )
{
int i;
for( i = 0; i < width; i++ ) {
float X = p[0];
float Y = p[1];
float Z = p[2];
float R, G, B;
int r, g, b;
int or;
vips_col_XYZ2scRGB( X, Y, Z, &R, &G, &B );
vips_col_scRGB2sRGB_8( R, G, B, &r, &g, &b, &or );
p += 3;
q[0] = r;
q[1] = g;
q[2] = b;
q += 3;
}
}
static void
vips_XYZ2sRGB_line_16( unsigned short *q, float *p, int width )
{
int i;
for( i = 0; i < width; i++ ) {
float X = p[0];
float Y = p[1];
float Z = p[2];
float R, G, B;
int r, g, b;
int or;
vips_col_XYZ2scRGB( X, Y, Z, &R, &G, &B );
vips_col_scRGB2sRGB_16( R, G, B, &r, &g, &b, &or );
p += 3;
q[0] = r;
q[1] = g;
q[2] = b;
q += 3;
}
}
static void
vips_XYZ2sRGB_line( VipsColour *colour, VipsPel *out, VipsPel **in, int width )
{
VipsXYZ2sRGB *XYZ2sRGB = (VipsXYZ2sRGB *) colour;
if( XYZ2sRGB->depth == 16 )
vips_XYZ2sRGB_line_16( (unsigned short *) out, (float *) in[0],
width );
else
vips_XYZ2sRGB_line_8( (VipsPel *) out, (float *) in[0], width );
}
static int
vips_XYZ2sRGB_build( VipsObject *object )
{
VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( object );
VipsXYZ2sRGB *XYZ2sRGB = (VipsXYZ2sRGB *) object;
VipsColour *colour = VIPS_COLOUR( XYZ2sRGB );
switch( XYZ2sRGB->depth ) {
case 16:
colour->interpretation = VIPS_INTERPRETATION_RGB16;
colour->format = VIPS_FORMAT_USHORT;
break;
case 8:
colour->interpretation = VIPS_INTERPRETATION_sRGB;
colour->format = VIPS_FORMAT_UCHAR;
break;
default:
vips_error( class->nickname,
"%s", _( "depth must be 8 or 16" ) );
return( -1 );
}
if( VIPS_OBJECT_CLASS( vips_XYZ2sRGB_parent_class )->build( object ) )
return( -1 );
return( 0 );
}
static void
vips_XYZ2sRGB_class_init( VipsXYZ2sRGBClass *class )
{
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsColourClass *colour_class = VIPS_COLOUR_CLASS( class );
gobject_class->set_property = vips_object_set_property;
gobject_class->get_property = vips_object_get_property;
object_class->nickname = "XYZ2sRGB";
object_class->description = _( "convert an XYZ image to sRGB" );
object_class->build = vips_XYZ2sRGB_build;
colour_class->process_line = vips_XYZ2sRGB_line;
VIPS_ARG_INT( class, "depth", 130,
_( "Depth" ),
_( "Output device space depth in bits" ),
VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsXYZ2sRGB, depth ),
8, 16, 8 );
}
static void
vips_XYZ2sRGB_init( VipsXYZ2sRGB *XYZ2sRGB )
{
VipsColour *colour = VIPS_COLOUR( XYZ2sRGB );
VipsColourCode *code = VIPS_COLOUR_CODE( XYZ2sRGB );
/* Just the default, can be overridden, see above.
*/
colour->coding = VIPS_CODING_NONE;
colour->interpretation = VIPS_INTERPRETATION_sRGB;
colour->format = VIPS_FORMAT_UCHAR;
colour->bands = 3;
code->input_coding = VIPS_CODING_NONE;
code->input_bands = 3;
code->input_format = VIPS_FORMAT_FLOAT;
XYZ2sRGB->depth = 8;
}
/**
* vips_XYZ2sRGB:
* @in: input image
* @out: output image
*
* Optional arguments:
*
* @depth: depth of output image in bits
*
* Convert an XYZ image to sRGB. Set @depth to 16 to get 16-bit output.
*
* See also: im_LabS2LabQ(), im_XYZ2sRGB(), im_rad2float().
*
* Returns: 0 on success, -1 on error.
*/
int
vips_XYZ2sRGB( VipsImage *in, VipsImage **out, ... )
{
va_list ap;
int result;
va_start( ap, out );
result = vips_call_split( "XYZ2sRGB", ap, in, out );
va_end( ap );
return( result );
}

View File

@ -829,8 +829,6 @@ vips_colour_operation_init( void )
vips_rad2float_get_type();
vips_float2rad_get_type();
vips_LabQ2sRGB_get_type();
vips_XYZ2sRGB_get_type();
vips_sRGB2XYZ_get_type();
vips_sRGB2scRGB_get_type();
vips_scRGB2XYZ_get_type();
vips_XYZ2scRGB_get_type();

View File

@ -49,9 +49,9 @@
#include "colour.h"
static int
vips_XYZ2RGB16( VipsImage *in, VipsImage **out, ... )
vips_scRGB2RGB16( VipsImage *in, VipsImage **out, ... )
{
return( vips_XYZ2sRGB( in, out, "depth", 16, NULL ) );
return( vips_scRGB2sRGB( in, out, "depth", 16, NULL ) );
}
/* A colour-transforming function.
@ -82,6 +82,7 @@ typedef struct _VipsColourRoute {
#define LCH VIPS_INTERPRETATION_LCH
#define CMC VIPS_INTERPRETATION_CMC
#define LABS VIPS_INTERPRETATION_LABS
#define scRGB VIPS_INTERPRETATION_scRGB
#define sRGB VIPS_INTERPRETATION_sRGB
#define RGB16 VIPS_INTERPRETATION_RGB16
#define YXY VIPS_INTERPRETATION_YXY
@ -94,8 +95,9 @@ static VipsColourRoute vips_colour_routes[] = {
{ XYZ, LCH, { vips_XYZ2Lab, vips_Lab2LCh, NULL } },
{ XYZ, CMC, { vips_XYZ2Lab, vips_Lab2LCh, vips_LCh2CMC, NULL } },
{ XYZ, LABS, { vips_XYZ2Lab, vips_Lab2LabS, NULL } },
{ XYZ, sRGB, { vips_XYZ2sRGB, NULL } },
{ XYZ, RGB16, { vips_XYZ2RGB16, NULL } },
{ XYZ, scRGB, { vips_XYZ2scRGB, NULL } },
{ XYZ, sRGB, { vips_XYZ2scRGB, vips_scRGB2sRGB, NULL } },
{ XYZ, RGB16, { vips_XYZ2scRGB, vips_scRGB2RGB16, NULL } },
{ XYZ, YXY, { vips_XYZ2Yxy, NULL } },
{ LAB, XYZ, { vips_Lab2XYZ, NULL } },
@ -103,8 +105,10 @@ static VipsColourRoute vips_colour_routes[] = {
{ LAB, LCH, { vips_Lab2LCh, NULL } },
{ LAB, CMC, { vips_Lab2LCh, vips_LCh2CMC, NULL } },
{ LAB, LABS, { vips_Lab2LabS, NULL } },
{ LAB, sRGB, { vips_Lab2XYZ, vips_XYZ2sRGB, NULL } },
{ LAB, RGB16, { vips_Lab2XYZ, vips_XYZ2RGB16, NULL } },
{ LAB, scRGB, { vips_Lab2XYZ, vips_XYZ2scRGB, NULL } },
{ LAB, sRGB, { vips_Lab2XYZ, vips_XYZ2scRGB, vips_scRGB2sRGB, NULL } },
{ LAB, RGB16, { vips_Lab2XYZ, vips_XYZ2scRGB,
vips_scRGB2RGB16, NULL } },
{ LAB, YXY, { vips_Lab2XYZ, vips_XYZ2Yxy, NULL } },
{ LABQ, XYZ, { vips_LabQ2Lab, vips_Lab2XYZ, NULL } },
@ -112,8 +116,10 @@ static VipsColourRoute vips_colour_routes[] = {
{ LABQ, LCH, { vips_LabQ2Lab, vips_Lab2LCh, NULL } },
{ LABQ, CMC, { vips_LabQ2Lab, vips_Lab2LCh, vips_LCh2CMC, NULL } },
{ LABQ, LABS, { vips_LabQ2LabS, NULL } },
{ LABQ, scRGB, { vips_LabQ2Lab, vips_Lab2XYZ, vips_XYZ2scRGB } },
{ LABQ, sRGB, { vips_LabQ2sRGB, NULL } },
{ LABQ, RGB16, { vips_LabQ2Lab, vips_Lab2XYZ, vips_XYZ2RGB16, NULL } },
{ LABQ, RGB16, { vips_LabQ2Lab, vips_Lab2XYZ, vips_XYZ2scRGB,
vips_scRGB2RGB16, NULL } },
{ LABQ, YXY, { vips_LabQ2Lab, vips_Lab2XYZ, vips_XYZ2Yxy, NULL } },
{ LCH, XYZ, { vips_LCh2Lab, vips_Lab2XYZ, NULL } },
@ -121,8 +127,11 @@ static VipsColourRoute vips_colour_routes[] = {
{ LCH, LABQ, { vips_LCh2Lab, vips_Lab2LabQ, NULL } },
{ LCH, CMC, { vips_LCh2CMC, NULL } },
{ LCH, LABS, { vips_LCh2Lab, vips_Lab2LabS, NULL } },
{ LCH, sRGB, { vips_LCh2Lab, vips_Lab2XYZ, vips_XYZ2sRGB, NULL } },
{ LCH, RGB16, { vips_LCh2Lab, vips_Lab2XYZ, vips_XYZ2RGB16, NULL } },
{ LCH, scRGB, { vips_LCh2Lab, vips_Lab2XYZ, vips_XYZ2scRGB, NULL } },
{ LCH, sRGB, { vips_LCh2Lab, vips_Lab2XYZ, vips_XYZ2scRGB,
vips_scRGB2sRGB, NULL } },
{ LCH, RGB16, { vips_LCh2Lab, vips_Lab2XYZ, vips_XYZ2scRGB,
vips_scRGB2RGB16, NULL } },
{ LCH, YXY, { vips_LCh2Lab, vips_Lab2XYZ, vips_XYZ2Yxy, NULL } },
{ CMC, XYZ, { vips_CMC2LCh, vips_LCh2Lab, vips_Lab2XYZ, NULL } },
@ -130,10 +139,12 @@ static VipsColourRoute vips_colour_routes[] = {
{ CMC, LABQ, { vips_CMC2LCh, vips_LCh2Lab, vips_Lab2LabQ, NULL } },
{ CMC, LCH, { vips_CMC2LCh, NULL } },
{ CMC, LABS, { vips_CMC2LCh, vips_LCh2Lab, vips_Lab2LabS, NULL } },
{ CMC, scRGB, { vips_CMC2LCh, vips_LCh2Lab, vips_Lab2XYZ,
vips_XYZ2scRGB, NULL } },
{ CMC, sRGB, { vips_CMC2LCh, vips_LCh2Lab, vips_Lab2XYZ,
vips_XYZ2sRGB, NULL } },
vips_XYZ2scRGB, vips_scRGB2sRGB, NULL } },
{ CMC, RGB16, { vips_CMC2LCh, vips_LCh2Lab, vips_Lab2XYZ,
vips_XYZ2RGB16, NULL } },
vips_XYZ2scRGB, vips_scRGB2RGB16, NULL } },
{ CMC, YXY, { vips_CMC2LCh, vips_LCh2Lab, vips_Lab2XYZ,
vips_XYZ2Yxy, NULL } },
@ -142,19 +153,37 @@ static VipsColourRoute vips_colour_routes[] = {
{ LABS, LABQ, { vips_LabS2LabQ, NULL } },
{ LABS, LCH, { vips_LabS2Lab, vips_Lab2LCh, NULL } },
{ LABS, CMC, { vips_LabS2Lab, vips_Lab2LCh, vips_LCh2CMC, NULL } },
{ LABS, sRGB, { vips_LabS2Lab, vips_Lab2XYZ, vips_XYZ2sRGB, NULL } },
{ LABS, RGB16, { vips_LabS2Lab, vips_Lab2XYZ, vips_XYZ2RGB16, NULL } },
{ LABS, scRGB, { vips_LabS2Lab, vips_Lab2XYZ, vips_XYZ2scRGB, NULL } },
{ LABS, sRGB, { vips_LabS2Lab, vips_Lab2XYZ, vips_XYZ2scRGB,
vips_scRGB2sRGB, NULL } },
{ LABS, RGB16, { vips_LabS2Lab, vips_Lab2XYZ, vips_XYZ2scRGB,
vips_scRGB2RGB16, NULL } },
{ LABS, YXY, { vips_LabS2Lab, vips_Lab2XYZ, vips_XYZ2Yxy, NULL } },
{ sRGB, XYZ, { vips_sRGB2XYZ, NULL } },
{ sRGB, LAB, { vips_sRGB2XYZ, vips_XYZ2Lab, NULL } },
{ sRGB, LABQ, { vips_sRGB2XYZ, vips_XYZ2Lab, vips_Lab2LabQ, NULL } },
{ sRGB, LCH, { vips_sRGB2XYZ, vips_XYZ2Lab, vips_Lab2LCh, NULL } },
{ sRGB, CMC, { vips_sRGB2XYZ, vips_XYZ2Lab, vips_Lab2LCh,
vips_LCh2CMC, NULL } },
{ sRGB, LABS, { vips_sRGB2XYZ, vips_XYZ2Lab, vips_Lab2LabS, NULL } },
{ sRGB, RGB16, { vips_sRGB2XYZ, vips_XYZ2RGB16, NULL } },
{ sRGB, YXY, { vips_sRGB2XYZ, vips_XYZ2Yxy, NULL } },
{ scRGB, XYZ, { vips_scRGB2XYZ, NULL } },
{ scRGB, LAB, { vips_scRGB2XYZ, vips_XYZ2Lab, NULL } },
{ scRGB, LABQ, { vips_scRGB2XYZ, vips_XYZ2Lab, vips_Lab2LabQ, NULL } },
{ scRGB, LCH, { vips_scRGB2XYZ, vips_XYZ2Lab, vips_Lab2LCh, NULL } },
{ scRGB, CMC, { vips_scRGB2XYZ, vips_XYZ2Lab,
vips_Lab2LCh, vips_LCh2CMC, NULL } },
{ scRGB, sRGB, { vips_scRGB2sRGB, NULL } },
{ scRGB, LABS, { vips_scRGB2XYZ, vips_XYZ2Lab, vips_Lab2LabS, NULL } },
{ scRGB, RGB16, { vips_scRGB2RGB16, NULL } },
{ scRGB, YXY, { vips_scRGB2XYZ, vips_XYZ2Yxy, NULL } },
{ sRGB, XYZ, { vips_sRGB2scRGB, vips_scRGB2XYZ, NULL } },
{ sRGB, LAB, { vips_sRGB2scRGB, vips_scRGB2XYZ, vips_XYZ2Lab, NULL } },
{ sRGB, LABQ, { vips_sRGB2scRGB, vips_scRGB2XYZ, vips_XYZ2Lab,
vips_Lab2LabQ, NULL } },
{ sRGB, LCH, { vips_sRGB2scRGB, vips_scRGB2XYZ, vips_XYZ2Lab,
vips_Lab2LCh, NULL } },
{ sRGB, CMC, { vips_sRGB2scRGB, vips_scRGB2XYZ, vips_XYZ2Lab,
vips_Lab2LCh, vips_LCh2CMC, NULL } },
{ sRGB, scRGB, { vips_sRGB2scRGB, NULL } },
{ sRGB, LABS, { vips_sRGB2scRGB, vips_scRGB2XYZ, vips_XYZ2Lab,
vips_Lab2LabS, NULL } },
{ sRGB, RGB16, { vips_sRGB2scRGB, vips_scRGB2RGB16, NULL } },
{ sRGB, YXY, { vips_sRGB2scRGB, vips_scRGB2XYZ, vips_XYZ2Yxy, NULL } },
{ YXY, XYZ, { vips_Yxy2XYZ, NULL } },
{ YXY, LAB, { vips_Yxy2XYZ, vips_XYZ2Lab, NULL } },
@ -163,8 +192,9 @@ static VipsColourRoute vips_colour_routes[] = {
{ YXY, CMC, { vips_Yxy2XYZ, vips_XYZ2Lab, vips_Lab2LCh,
vips_LCh2CMC, NULL } },
{ YXY, LABS, { vips_Yxy2XYZ, vips_XYZ2Lab, vips_Lab2LabS, NULL } },
{ YXY, sRGB, { vips_Yxy2XYZ, vips_XYZ2sRGB, NULL } },
{ YXY, RGB16, { vips_Yxy2XYZ, vips_XYZ2RGB16, NULL } },
{ YXY, scRGB, { vips_Yxy2XYZ, vips_XYZ2scRGB, NULL } },
{ YXY, sRGB, { vips_Yxy2XYZ, vips_XYZ2scRGB, vips_scRGB2sRGB, NULL } },
{ YXY, RGB16, { vips_Yxy2XYZ, vips_XYZ2scRGB, vips_scRGB2RGB16, NULL } },
};
/* Is an image in a supported colourspace.

View File

@ -1,200 +0,0 @@
/* Turn displayable rgb files to XYZ.
*
* Modified:
* 15/11/94 JC
* - memory leak fixed
* - error message added
* 16/11/94 JC
* - partialed
* 21/9/12
* - redone as a class
* - sRGB only, support for other RGBs is now via lcms
* 6/11/12
* - add 16-bit sRGB import
*/
/*
This file is part of VIPS.
VIPS is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /*HAVE_CONFIG_H*/
#include <vips/intl.h>
#include <stdio.h>
#include <math.h>
#include <vips/vips.h>
#include "colour.h"
typedef VipsColourCode VipssRGB2XYZ;
typedef VipsColourCodeClass VipssRGB2XYZClass;
G_DEFINE_TYPE( VipssRGB2XYZ, vips_sRGB2XYZ, VIPS_TYPE_COLOUR_CODE );
/* Convert a buffer of 8-bit pixels.
*/
static void
vips_sRGB2XYZ_line_8( float *q, VipsPel *p, int width )
{
int i;
for( i = 0; i < width; i++ ) {
int r = p[0];
int g = p[1];
int b = p[2];
float R, G, B;
float X, Y, Z;
p += 3;
vips_col_sRGB2scRGB_8( r, g, b, &R, &G, &B );
vips_col_scRGB2XYZ( R, G, B, &X, &Y, &Z );
q[0] = X;
q[1] = Y;
q[2] = Z;
q += 3;
}
}
/* Convert a buffer of 16-bit pixels.
*/
static void
vips_sRGB2XYZ_line_16( float *q, unsigned short *p, int width )
{
int i;
for( i = 0; i < width; i++ ) {
int r = p[0];
int g = p[1];
int b = p[2];
float R, G, B;
float X, Y, Z;
p += 3;
vips_col_sRGB2scRGB_16( r, g, b, &R, &G, &B );
vips_col_scRGB2XYZ( R, G, B, &X, &Y, &Z );
q[0] = X;
q[1] = Y;
q[2] = Z;
q += 3;
}
}
static void
vips_sRGB2XYZ_line( VipsColour *colour,
VipsPel *out, VipsPel **in, int width )
{
if( colour->in[0]->BandFmt == VIPS_FORMAT_UCHAR )
vips_sRGB2XYZ_line_8( (float *) out,
(VipsPel *) in[0], width );
else
vips_sRGB2XYZ_line_16( (float *) out,
(unsigned short *) in[0], width );
}
static int
vips_sRGB2XYZ_build( VipsObject *object )
{
VipsColourCode *code = (VipsColourCode *) object;
if( code->in )
code->input_format =
code->in->BandFmt == VIPS_FORMAT_USHORT ?
VIPS_FORMAT_USHORT : VIPS_FORMAT_UCHAR;
if( VIPS_OBJECT_CLASS( vips_sRGB2XYZ_parent_class )->
build( object ) )
return( -1 );
return( 0 );
}
static void
vips_sRGB2XYZ_class_init( VipssRGB2XYZClass *class )
{
VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsColourClass *colour_class = VIPS_COLOUR_CLASS( class );
object_class->nickname = "sRGB2XYZ";
object_class->description = _( "convert an sRGB image to XYZ" );
object_class->build = vips_sRGB2XYZ_build;
colour_class->process_line = vips_sRGB2XYZ_line;
}
static void
vips_sRGB2XYZ_init( VipssRGB2XYZ *sRGB2XYZ )
{
VipsColour *colour = VIPS_COLOUR( sRGB2XYZ );
VipsColourCode *code = VIPS_COLOUR_CODE( sRGB2XYZ );
colour->coding = VIPS_CODING_NONE;
colour->interpretation = VIPS_INTERPRETATION_XYZ;
colour->format = VIPS_FORMAT_FLOAT;
colour->bands = 3;
code->input_coding = VIPS_CODING_NONE;
code->input_bands = 3;
/* The default. This can get changed above ^^ if we see a
* 16-bit input.
*/
code->input_format = VIPS_FORMAT_UCHAR;
}
/**
* vips_sRGB2XYZ:
* @in: input image
* @out: output image
*
* Convert an sRGB image to XYZ.
*
* See also: im_LabS2LabQ(), im_sRGB2XYZ(), im_rad2float().
*
* Returns: 0 on success, -1 on error.
*/
int
vips_sRGB2XYZ( VipsImage *in, VipsImage **out, ... )
{
va_list ap;
int result;
va_start( ap, out );
result = vips_call_split( "sRGB2XYZ", ap, in, out );
va_end( ap );
return( result );
}

View File

@ -1,7 +1,18 @@
/* Turn displayable rgb files to scRGB.
*
* Modified:
* 15/11/94 JC
* - memory leak fixed
* - error message added
* 16/11/94 JC
* - partialed
* 21/9/12
* - redone as a class
* - sRGB only, support for other RGBs is now via lcms
* 6/11/12
* - add 16-bit sRGB import
* 11/12/12
* - from sRGB2XYZ.c
* - cut about to make sRGB2scRGB.c
*/
/*

View File

@ -1,7 +1,30 @@
/* Turn scRGB files into displayable rgb.
*
* Author: J-P. Laurent
* Modified:
* 15/11/94 JC
* - error message added
* - out->Type set to IM_TYPE_RGB
* - memory leak fixed
* 16/11/94 JC
* - uses im_wrapone()
* 15/2/95 JC
* - oops! now uses PEL, not float for output pointer
* 2/1/96 JC
* - sometimes produced incorrect result at extrema
* - reformatted
* - now uses IM_RINT() and clip()
* 18/9/96 JC
* - some speed-ups ... 3x faster
* - slightly less accurate, but who cares
* - added out-of-mem check for table build
* 21/9/12
* - redone as a class
* - sRGB only, support for other RGBs is now via lcms
* 6/11/12
* - added 16-bit option
* 11/12/12
* - from XYZ2sRGB.c
* - cut about to make scRGB2sRGB.c
*/
/*

View File

@ -2495,7 +2495,7 @@ im_dE_fromdisp( IMAGE *im1, IMAGE *im2, IMAGE *out, struct im_col_display *d )
int
im_disp2Lab( IMAGE *in, IMAGE *out, struct im_col_display *d )
{
IMAGE *t[1];
VipsImage *t[1];
if( im_open_local_array( out, t, 1, "im_disp2Lab:1", "p" ) ||
im_disp2XYZ( in, t[0], d ) ||
@ -2508,15 +2508,13 @@ im_disp2Lab( IMAGE *in, IMAGE *out, struct im_col_display *d )
int
im_sRGB2XYZ( IMAGE *in, IMAGE *out )
{
VipsImage *x;
VipsImage **t = (VipsImage **)
vips_object_local_array( (VipsObject *) out, 2 );
if( vips_sRGB2XYZ( in, &x, NULL ) )
if( vips_sRGB2scRGB( in, &t[0], NULL ) ||
vips_scRGB2XYZ( t[0], &t[1], NULL ) ||
im_copy( t[1], out ) )
return( -1 );
if( im_copy( x, out ) ) {
g_object_unref( x );
return( -1 );
}
g_object_unref( x );
return( 0 );
}
@ -2524,15 +2522,13 @@ im_sRGB2XYZ( IMAGE *in, IMAGE *out )
int
im_XYZ2sRGB( IMAGE *in, IMAGE *out )
{
VipsImage *x;
VipsImage **t = (VipsImage **)
vips_object_local_array( (VipsObject *) out, 2 );
if( vips_XYZ2sRGB( in, &x, NULL ) )
if( vips_XYZ2scRGB( in, &t[0], NULL ) ||
vips_scRGB2sRGB( t[0], &t[1], NULL ) ||
im_copy( t[1], out ) )
return( -1 );
if( im_copy( x, out ) ) {
g_object_unref( x );
return( -1 );
}
g_object_unref( x );
return( 0 );
}

View File

@ -146,11 +146,6 @@ int vips_XYZ2scRGB( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel));
int vips_scRGB2sRGB( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel));
int vips_XYZ2sRGB( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel));
int vips_sRGB2XYZ( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel));
int vips_sRGB2scRGB( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel));
int vips_scRGB2XYZ( VipsImage *in, VipsImage **out, ... )