Merge pull request #816 from lovell/srgb2scrgb-optimise-3-4-band
Colour: ~20% sRGB to scRGB speedup for 3/4 channel images
This commit is contained in:
commit
bbc2f4e1f8
@ -73,6 +73,24 @@ typedef VipsOperationClass VipssRGB2scRGBClass;
|
|||||||
|
|
||||||
G_DEFINE_TYPE( VipssRGB2scRGB, vips_sRGB2scRGB, VIPS_TYPE_OPERATION );
|
G_DEFINE_TYPE( VipssRGB2scRGB, vips_sRGB2scRGB, VIPS_TYPE_OPERATION );
|
||||||
|
|
||||||
|
/* Convert an 8-bit pixel.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
vips_sRGB2scRGB_pel_rgb_8( float * restrict q,
|
||||||
|
VipsPel * restrict p )
|
||||||
|
{
|
||||||
|
const int r = p[0];
|
||||||
|
const int g = p[1];
|
||||||
|
const int b = p[2];
|
||||||
|
|
||||||
|
float R, G, B;
|
||||||
|
vips_col_sRGB2scRGB_8( r, g, b, &R, &G, &B );
|
||||||
|
|
||||||
|
q[0] = R;
|
||||||
|
q[1] = G;
|
||||||
|
q[2] = B;
|
||||||
|
}
|
||||||
|
|
||||||
/* Convert a buffer of 8-bit pixels.
|
/* Convert a buffer of 8-bit pixels.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
@ -81,28 +99,51 @@ vips_sRGB2scRGB_line_8( float * restrict q, VipsPel * restrict p,
|
|||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
for( i = 0; i < width; i++ ) {
|
if( extra_bands == 0 ) {
|
||||||
int r = p[0];
|
for( i = 0; i < width; i++ ) {
|
||||||
int g = p[1];
|
vips_sRGB2scRGB_pel_rgb_8(q, p);
|
||||||
int b = p[2];
|
p += 3;
|
||||||
|
q += 3;
|
||||||
float R, G, B;
|
}
|
||||||
|
|
||||||
p += 3;
|
|
||||||
|
|
||||||
vips_col_sRGB2scRGB_8( r, g, b, &R, &G, &B );
|
|
||||||
|
|
||||||
q[0] = R;
|
|
||||||
q[1] = G;
|
|
||||||
q[2] = B;
|
|
||||||
|
|
||||||
q += 3;
|
|
||||||
|
|
||||||
for( j = 0; j < extra_bands; j++ )
|
|
||||||
q[j] = p[j];
|
|
||||||
p += extra_bands;
|
|
||||||
q += extra_bands;
|
|
||||||
}
|
}
|
||||||
|
else if( extra_bands == 1 ) {
|
||||||
|
for( i = 0; i < width; i++ ) {
|
||||||
|
vips_sRGB2scRGB_pel_rgb_8(q, p);
|
||||||
|
q[3] = p[3];
|
||||||
|
p += 4;
|
||||||
|
q += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for( i = 0; i < width; i++ ) {
|
||||||
|
vips_sRGB2scRGB_pel_rgb_8(q, p);
|
||||||
|
p += 3;
|
||||||
|
q += 3;
|
||||||
|
|
||||||
|
for( j = 0; j < extra_bands; j++ )
|
||||||
|
q[j] = p[j];
|
||||||
|
p += extra_bands;
|
||||||
|
q += extra_bands;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert a 16-bit pixel.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
vips_sRGB2scRGB_pel_rgb_16( float * restrict q,
|
||||||
|
unsigned short * restrict p )
|
||||||
|
{
|
||||||
|
const int r = p[0];
|
||||||
|
const int g = p[1];
|
||||||
|
const int b = p[2];
|
||||||
|
|
||||||
|
float R, G, B;
|
||||||
|
vips_col_sRGB2scRGB_16( r, g, b, &R, &G, &B );
|
||||||
|
|
||||||
|
q[0] = R;
|
||||||
|
q[1] = G;
|
||||||
|
q[2] = B;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert a buffer of 16-bit pixels.
|
/* Convert a buffer of 16-bit pixels.
|
||||||
@ -113,27 +154,32 @@ vips_sRGB2scRGB_line_16( float * restrict q, unsigned short * restrict p,
|
|||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
for( i = 0; i < width; i++ ) {
|
if( extra_bands == 0 ) {
|
||||||
int r = p[0];
|
for( i = 0; i < width; i++ ) {
|
||||||
int g = p[1];
|
vips_sRGB2scRGB_pel_rgb_16(q, p);
|
||||||
int b = p[2];
|
p += 3;
|
||||||
|
q += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( extra_bands == 1 ) {
|
||||||
|
for( i = 0; i < width; i++ ) {
|
||||||
|
vips_sRGB2scRGB_pel_rgb_16(q, p);
|
||||||
|
q[3] = p[3] / 256.0;
|
||||||
|
p += 4;
|
||||||
|
q += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for( i = 0; i < width; i++ ) {
|
||||||
|
vips_sRGB2scRGB_pel_rgb_16(q, p);
|
||||||
|
p += 3;
|
||||||
|
q += 3;
|
||||||
|
|
||||||
float R, G, B;
|
for( j = 0; j < extra_bands; j++ )
|
||||||
|
q[j] = p[j] / 256.0;
|
||||||
p += 3;
|
p += extra_bands;
|
||||||
|
q += extra_bands;
|
||||||
vips_col_sRGB2scRGB_16( r, g, b, &R, &G, &B );
|
}
|
||||||
|
|
||||||
q[0] = R;
|
|
||||||
q[1] = G;
|
|
||||||
q[2] = B;
|
|
||||||
|
|
||||||
q += 3;
|
|
||||||
|
|
||||||
for( j = 0; j < extra_bands; j++ )
|
|
||||||
q[j] = p[j] / 256.0;
|
|
||||||
p += extra_bands;
|
|
||||||
q += extra_bands;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,17 +198,25 @@ vips_sRGB2scRGB_gen( VipsRegion *or,
|
|||||||
|
|
||||||
VIPS_GATE_START( "vips_sRGB2scRGB_gen: work" );
|
VIPS_GATE_START( "vips_sRGB2scRGB_gen: work" );
|
||||||
|
|
||||||
for( y = 0; y < r->height; y++ ) {
|
if( in->BandFmt == VIPS_FORMAT_UCHAR ) {
|
||||||
VipsPel *p = VIPS_REGION_ADDR( ir, r->left, r->top + y );
|
for( y = 0; y < r->height; y++ ) {
|
||||||
float *q = (float *)
|
VipsPel *p = VIPS_REGION_ADDR( ir, r->left, r->top + y );
|
||||||
VIPS_REGION_ADDR( or, r->left, r->top + y );
|
float *q = (float *)
|
||||||
|
VIPS_REGION_ADDR( or, r->left, r->top + y );
|
||||||
|
|
||||||
if( in->BandFmt == VIPS_FORMAT_UCHAR )
|
|
||||||
vips_sRGB2scRGB_line_8( q, p,
|
vips_sRGB2scRGB_line_8( q, p,
|
||||||
in->Bands - 3, r->width );
|
in->Bands - 3, r->width );
|
||||||
else
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for( y = 0; y < r->height; y++ ) {
|
||||||
|
VipsPel *p = VIPS_REGION_ADDR( ir, r->left, r->top + y );
|
||||||
|
float *q = (float *)
|
||||||
|
VIPS_REGION_ADDR( or, r->left, r->top + y );
|
||||||
|
|
||||||
vips_sRGB2scRGB_line_16( q, (unsigned short *) p,
|
vips_sRGB2scRGB_line_16( q, (unsigned short *) p,
|
||||||
in->Bands - 3, r->width );
|
in->Bands - 3, r->width );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VIPS_GATE_STOP( "vips_sRGB2scRGB_gen: work" );
|
VIPS_GATE_STOP( "vips_sRGB2scRGB_gen: work" );
|
||||||
|
Loading…
Reference in New Issue
Block a user