Merge branch 'master' into add-giflib
This commit is contained in:
commit
1e6af6656f
@ -281,7 +281,7 @@ vips_premultiply_init( VipsPremultiply *premultiply )
|
|||||||
* alpha = clip( 0, in[in.bands - 1], @max_alpha );
|
* alpha = clip( 0, in[in.bands - 1], @max_alpha );
|
||||||
* norm = alpha / @max_alpha;
|
* norm = alpha / @max_alpha;
|
||||||
* out = [in[0] * norm, ..., in[in.bands - 1] * norm, alpha];
|
* out = [in[0] * norm, ..., in[in.bands - 1] * norm, alpha];
|
||||||
* |]
|
* ]|
|
||||||
*
|
*
|
||||||
* So for an N-band image, the first N - 1 bands are multiplied by the clipped
|
* So for an N-band image, the first N - 1 bands are multiplied by the clipped
|
||||||
* and normalised final band, the final band is clipped.
|
* and normalised final band, the final band is clipped.
|
||||||
|
@ -296,7 +296,7 @@ vips_unpremultiply_init( VipsUnpremultiply *unpremultiply )
|
|||||||
* out = [0, ..., 0, alpha];
|
* out = [0, ..., 0, alpha];
|
||||||
* else
|
* else
|
||||||
* out = [in[0] / norm, ..., in[in.bands - 1] / norm, alpha];
|
* out = [in[0] / norm, ..., in[in.bands - 1] / norm, alpha];
|
||||||
* |]
|
* ]|
|
||||||
*
|
*
|
||||||
* So for an N-band image, the first N - 1 bands are divided by the clipped
|
* So for an N-band image, the first N - 1 bands are divided by the clipped
|
||||||
* and normalised final band, the final band is clipped.
|
* and normalised final band, the final band is clipped.
|
||||||
|
@ -409,15 +409,15 @@ vips__openslide_read_header( const char *filename, VipsImage *out,
|
|||||||
* compatibility with older vipses.
|
* compatibility with older vipses.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
argb2rgba( uint32_t *buf, int n, uint32_t bg )
|
argb2rgba( uint32_t * restrict buf, int n, uint32_t bg )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for( i = 0; i < n; i++ ) {
|
for( i = 0; i < n; i++ ) {
|
||||||
uint32_t *p = buf + i;
|
uint32_t * restrict p = buf + i;
|
||||||
uint32_t x = *p;
|
uint32_t x = *p;
|
||||||
uint8_t a = x >> 24;
|
uint8_t a = x >> 24;
|
||||||
VipsPel *out = (VipsPel *) p;
|
VipsPel * restrict out = (VipsPel *) p;
|
||||||
|
|
||||||
if( a == 255 )
|
if( a == 255 )
|
||||||
*p = GUINT32_TO_BE( (x << 8) | 255 );
|
*p = GUINT32_TO_BE( (x << 8) | 255 );
|
||||||
|
@ -234,7 +234,7 @@ vips_foreign_load_pdf_generate( VipsRegion *or,
|
|||||||
|
|
||||||
cairo_surface_t *surface;
|
cairo_surface_t *surface;
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
int x, y;
|
int y;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
printf( "vips_foreign_load_pdf_generate: "
|
printf( "vips_foreign_load_pdf_generate: "
|
||||||
@ -266,19 +266,12 @@ vips_foreign_load_pdf_generate( VipsRegion *or,
|
|||||||
|
|
||||||
cairo_destroy( cr );
|
cairo_destroy( cr );
|
||||||
|
|
||||||
/* Cairo makes BRGA, we must byteswap. We might not need to on SPARC,
|
/* Cairo makes pre-multipled BRGA, we must byteswap and unpremultiply.
|
||||||
* but I have no way of testing this :(
|
|
||||||
*/
|
*/
|
||||||
for( y = 0; y < r->height; y++ ) {
|
for( y = 0; y < r->height; y++ )
|
||||||
VipsPel * restrict q;
|
vips__cairo2rgba(
|
||||||
|
(guint32 *) VIPS_REGION_ADDR( or, r->left, r->top + y ),
|
||||||
q = VIPS_REGION_ADDR( or, r->left, r->top + y );
|
r->width );
|
||||||
for( x = 0; x < r->width; x++ ) {
|
|
||||||
VIPS_SWAP( VipsPel, q[0], q[2] );
|
|
||||||
|
|
||||||
q += 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
@ -149,6 +149,34 @@ vips_foreign_load_svg_header( VipsForeignLoad *load )
|
|||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Convert from ARGB to RGBA and undo premultiplication.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
vips__cairo2rgba( guint32 * restrict buf, int n )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for( i = 0; i < n; i++ ) {
|
||||||
|
guint32 * restrict p = buf + i;
|
||||||
|
guint32 x = *p;
|
||||||
|
guint8 a = x >> 24;
|
||||||
|
VipsPel * restrict out = (VipsPel *) p;
|
||||||
|
|
||||||
|
if( a == 255 )
|
||||||
|
*p = GUINT32_TO_BE( (x << 8) | 255 );
|
||||||
|
else if( a == 0 )
|
||||||
|
*p = GUINT32_TO_BE( x << 8 );
|
||||||
|
else {
|
||||||
|
/* Undo premultiplication.
|
||||||
|
*/
|
||||||
|
out[0] = 255 * ((x >> 16) & 255) / a;
|
||||||
|
out[1] = 255 * ((x >> 8) & 255) / a;
|
||||||
|
out[2] = 255 * (x & 255) / a;
|
||||||
|
out[3] = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
vips_foreign_load_svg_generate( VipsRegion *or,
|
vips_foreign_load_svg_generate( VipsRegion *or,
|
||||||
void *seq, void *a, void *b, gboolean *stop )
|
void *seq, void *a, void *b, gboolean *stop )
|
||||||
@ -159,7 +187,7 @@ vips_foreign_load_svg_generate( VipsRegion *or,
|
|||||||
|
|
||||||
cairo_surface_t *surface;
|
cairo_surface_t *surface;
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
int x, y;
|
int y;
|
||||||
|
|
||||||
/* rsvg won't always paint the background.
|
/* rsvg won't always paint the background.
|
||||||
*/
|
*/
|
||||||
@ -188,19 +216,12 @@ vips_foreign_load_svg_generate( VipsRegion *or,
|
|||||||
|
|
||||||
cairo_destroy( cr );
|
cairo_destroy( cr );
|
||||||
|
|
||||||
/* Cairo makes BRGA, we must byteswap. We might not need to on SPARC,
|
/* Cairo makes pre-multipled BRGA, we must byteswap and unpremultiply.
|
||||||
* but I have no way of testing this :(
|
|
||||||
*/
|
*/
|
||||||
for( y = 0; y < r->height; y++ ) {
|
for( y = 0; y < r->height; y++ )
|
||||||
VipsPel * restrict q;
|
vips__cairo2rgba(
|
||||||
|
(guint32 *) VIPS_REGION_ADDR( or, r->left, r->top + y ),
|
||||||
q = VIPS_REGION_ADDR( or, r->left, r->top + y );
|
r->width );
|
||||||
for( x = 0; x < r->width; x++ ) {
|
|
||||||
VIPS_SWAP( VipsPel, q[0], q[2] );
|
|
||||||
|
|
||||||
q += 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
@ -231,6 +231,8 @@ int vips__byteswap_bool( VipsImage *in, VipsImage **out, gboolean swap );
|
|||||||
|
|
||||||
char *vips__make_xml_metadata( const char *domain, VipsImage *image );
|
char *vips__make_xml_metadata( const char *domain, VipsImage *image );
|
||||||
|
|
||||||
|
void vips__cairo2rgba( guint32 *buf, int n );
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /*__cplusplus*/
|
#endif /*__cplusplus*/
|
||||||
|
Loading…
Reference in New Issue
Block a user