revise BGRA->RGBA
This commit is contained in:
parent
93f67a2bdf
commit
a1ae0d1d68
@ -35,17 +35,17 @@
|
|||||||
#include <vips/vips.h>
|
#include <vips/vips.h>
|
||||||
#include <vips/internal.h>
|
#include <vips/internal.h>
|
||||||
|
|
||||||
/* Convert from Cairo's BGRA to RGBA and undo premultiplication.
|
/* Convert from Cairo-style premultiplied BGRA to RGBA.
|
||||||
*
|
*
|
||||||
* See also openslide's argb2rgba().
|
* See also openslide's argb2rgba().
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
vips__cairo2rgba( guint32 * restrict buf, int n )
|
vips__premultiplied_bgra2rgba( guint32 * restrict p, int n )
|
||||||
{
|
{
|
||||||
int i;
|
int x;
|
||||||
|
|
||||||
for( i = 0; i < n; i++ ) {
|
for( x = 0; x < n; x++ ) {
|
||||||
guint32 bgra = GUINT32_FROM_BE( buf[i] );
|
guint32 bgra = GUINT32_FROM_BE( p[x] );
|
||||||
guint8 a = bgra & 0xff;
|
guint8 a = bgra & 0xff;
|
||||||
|
|
||||||
guint32 rgba;
|
guint32 rgba;
|
||||||
@ -65,6 +65,29 @@ vips__cairo2rgba( guint32 * restrict buf, int n )
|
|||||||
((255 * ((bgra >> 24) & 0xff) / a) << 8) |
|
((255 * ((bgra >> 24) & 0xff) / a) << 8) |
|
||||||
a;
|
a;
|
||||||
|
|
||||||
buf[i] = GUINT32_TO_BE( rgba );
|
p[x] = GUINT32_TO_BE( rgba );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Convert from PDFium-style BGRA to RGBA.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
vips__bgra2rgba( guint32 * restrict p, int n )
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
|
||||||
|
for( x = 0; x < n; x++ ) {
|
||||||
|
guint32 bgra = GUINT32_FROM_BE( p[x] );
|
||||||
|
|
||||||
|
guint rgba;
|
||||||
|
|
||||||
|
/* Leave G and A, swap R and B.
|
||||||
|
*/
|
||||||
|
rgba =
|
||||||
|
(bgra & 0x00ff00ff) |
|
||||||
|
(bgra & 0x0000ff00) << 16 |
|
||||||
|
(bgra & 0xff000000) >> 16;
|
||||||
|
|
||||||
|
p[x] = GUINT32_TO_BE( rgba );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -570,25 +570,10 @@ vips_foreign_load_pdf_generate( VipsRegion *or,
|
|||||||
|
|
||||||
/* PDFium writes BGRA, we must swap.
|
/* PDFium writes BGRA, we must swap.
|
||||||
*/
|
*/
|
||||||
for( y = 0; y < r->height; y++ ) {
|
for( y = 0; y < r->height; y++ )
|
||||||
guint32 * restrict p =
|
vips__bgra2rgba(
|
||||||
(guint32 *) VIPS_REGION_ADDR( or, r->left, r->top + y );
|
(guint32 *) VIPS_REGION_ADDR( or, r->left, r->top + y ),
|
||||||
|
r->width );
|
||||||
int x;
|
|
||||||
|
|
||||||
for( x = 0; x < r->width; x++ ) {
|
|
||||||
guint32 bgra = GUINT32_FROM_BE( p[x] );
|
|
||||||
|
|
||||||
guint rgba;
|
|
||||||
|
|
||||||
rgba =
|
|
||||||
(bgra & 0x00ff00ff) |
|
|
||||||
(bgra & 0x0000ff00) << 16 |
|
|
||||||
(bgra & 0xff000000) >> 16;
|
|
||||||
|
|
||||||
p[x] = GUINT32_TO_BE( rgba );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
@ -367,7 +367,7 @@ vips_foreign_load_pdf_header( VipsForeignLoad *load )
|
|||||||
/* Convert the background to the image format.
|
/* Convert the background to the image format.
|
||||||
*
|
*
|
||||||
* FIXME ... we probably should convert this to pre-multiplied BGRA
|
* FIXME ... we probably should convert this to pre-multiplied BGRA
|
||||||
* to match the Cairo convention. See vips__cairo2rgba().
|
* to match the Cairo convention. See vips__premultiplied_bgra2rgba().
|
||||||
*/
|
*/
|
||||||
if( !(pdf->ink = vips__vector_to_ink( class->nickname,
|
if( !(pdf->ink = vips__vector_to_ink( class->nickname,
|
||||||
load->out,
|
load->out,
|
||||||
@ -452,7 +452,7 @@ vips_foreign_load_pdf_generate( VipsRegion *or,
|
|||||||
/* Cairo makes pre-multipled BRGA, we must byteswap and unpremultiply.
|
/* Cairo makes pre-multipled BRGA, we must byteswap and unpremultiply.
|
||||||
*/
|
*/
|
||||||
for( y = 0; y < r->height; y++ )
|
for( y = 0; y < r->height; y++ )
|
||||||
vips__cairo2rgba(
|
vips__premultiplied_bgra2rgba(
|
||||||
(guint32 *) VIPS_REGION_ADDR( or, r->left, r->top + y ),
|
(guint32 *) VIPS_REGION_ADDR( or, r->left, r->top + y ),
|
||||||
r->width );
|
r->width );
|
||||||
|
|
||||||
|
@ -368,7 +368,7 @@ vips_foreign_load_svg_generate( VipsRegion *or,
|
|||||||
/* Cairo makes pre-multipled BRGA -- we must byteswap and unpremultiply.
|
/* Cairo makes pre-multipled BRGA -- we must byteswap and unpremultiply.
|
||||||
*/
|
*/
|
||||||
for( y = 0; y < r->height; y++ )
|
for( y = 0; y < r->height; y++ )
|
||||||
vips__cairo2rgba(
|
vips__premultiplied_bgra2rgba(
|
||||||
(guint32 *) VIPS_REGION_ADDR( or, r->left, r->top + y ),
|
(guint32 *) VIPS_REGION_ADDR( or, r->left, r->top + y ),
|
||||||
r->width );
|
r->width );
|
||||||
|
|
||||||
|
@ -236,7 +236,8 @@ int vips__byteswap_bool( VipsImage *in, VipsImage **out, gboolean swap );
|
|||||||
|
|
||||||
char *vips__xml_properties( VipsImage *image );
|
char *vips__xml_properties( VipsImage *image );
|
||||||
|
|
||||||
void vips__cairo2rgba( guint32 *buf, int n );
|
void vips__premultiplied_bgra2rgba( guint32 * restrict p, int n );
|
||||||
|
void vips__bgra2rgba( guint32 * restrict p, int n );
|
||||||
void vips__Lab2LabQ_vec( VipsPel *out, float *in, int width );
|
void vips__Lab2LabQ_vec( VipsPel *out, float *in, int width );
|
||||||
void vips__LabQ2Lab_vec( float *out, VipsPel *in, int width );
|
void vips__LabQ2Lab_vec( float *out, VipsPel *in, int width );
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user