Added 8-bit RGB source surface support to NtoN blitters
This commit is contained in:
parent
185f93a7a9
commit
c9acdd87a7
2 changed files with 326 additions and 296 deletions
|
@ -118,289 +118,319 @@ extern SDL_BlitFunc SDL_CalculateBlitA(SDL_Surface * surface);
|
|||
#endif
|
||||
|
||||
/* Load pixel of the specified format from a buffer and get its R-G-B values */
|
||||
#define RGB_FROM_PIXEL(Pixel, fmt, r, g, b) \
|
||||
{ \
|
||||
#define RGB_FROM_PIXEL(Pixel, fmt, r, g, b) \
|
||||
{ \
|
||||
r = SDL_expand_byte[fmt->Rloss][((Pixel&fmt->Rmask)>>fmt->Rshift)]; \
|
||||
g = SDL_expand_byte[fmt->Gloss][((Pixel&fmt->Gmask)>>fmt->Gshift)]; \
|
||||
b = SDL_expand_byte[fmt->Bloss][((Pixel&fmt->Bmask)>>fmt->Bshift)]; \
|
||||
}
|
||||
#define RGB_FROM_RGB565(Pixel, r, g, b) \
|
||||
{ \
|
||||
r = SDL_expand_byte[3][((Pixel&0xF800)>>11)]; \
|
||||
g = SDL_expand_byte[2][((Pixel&0x07E0)>>5)]; \
|
||||
b = SDL_expand_byte[3][(Pixel&0x001F)]; \
|
||||
#define RGB_FROM_RGB565(Pixel, r, g, b) \
|
||||
{ \
|
||||
r = SDL_expand_byte[3][((Pixel&0xF800)>>11)]; \
|
||||
g = SDL_expand_byte[2][((Pixel&0x07E0)>>5)]; \
|
||||
b = SDL_expand_byte[3][(Pixel&0x001F)]; \
|
||||
}
|
||||
#define RGB_FROM_RGB555(Pixel, r, g, b) \
|
||||
{ \
|
||||
r = SDL_expand_byte[3][((Pixel&0x7C00)>>10)]; \
|
||||
g = SDL_expand_byte[3][((Pixel&0x03E0)>>5)]; \
|
||||
b = SDL_expand_byte[3][(Pixel&0x001F)]; \
|
||||
#define RGB_FROM_RGB555(Pixel, r, g, b) \
|
||||
{ \
|
||||
r = SDL_expand_byte[3][((Pixel&0x7C00)>>10)]; \
|
||||
g = SDL_expand_byte[3][((Pixel&0x03E0)>>5)]; \
|
||||
b = SDL_expand_byte[3][(Pixel&0x001F)]; \
|
||||
}
|
||||
#define RGB_FROM_RGB888(Pixel, r, g, b) \
|
||||
{ \
|
||||
r = ((Pixel&0xFF0000)>>16); \
|
||||
g = ((Pixel&0xFF00)>>8); \
|
||||
b = (Pixel&0xFF); \
|
||||
#define RGB_FROM_RGB888(Pixel, r, g, b) \
|
||||
{ \
|
||||
r = ((Pixel&0xFF0000)>>16); \
|
||||
g = ((Pixel&0xFF00)>>8); \
|
||||
b = (Pixel&0xFF); \
|
||||
}
|
||||
#define RETRIEVE_RGB_PIXEL(buf, bpp, Pixel) \
|
||||
do { \
|
||||
switch (bpp) { \
|
||||
case 2: \
|
||||
Pixel = *((Uint16 *)(buf)); \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
Uint8 *B = (Uint8 *)(buf); \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
Pixel = B[0] + (B[1] << 8) + (B[2] << 16); \
|
||||
} else { \
|
||||
Pixel = (B[0] << 16) + (B[1] << 8) + B[2]; \
|
||||
} \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: \
|
||||
Pixel = *((Uint32 *)(buf)); \
|
||||
break; \
|
||||
\
|
||||
default: \
|
||||
Pixel = 0; /* stop gcc complaints */ \
|
||||
break; \
|
||||
} \
|
||||
#define RETRIEVE_RGB_PIXEL(buf, bpp, Pixel) \
|
||||
do { \
|
||||
switch (bpp) { \
|
||||
case 1: \
|
||||
Pixel = *((Uint8 *)(buf)); \
|
||||
break; \
|
||||
\
|
||||
case 2: \
|
||||
Pixel = *((Uint16 *)(buf)); \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
Uint8 *B = (Uint8 *)(buf); \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
Pixel = B[0] + (B[1] << 8) + (B[2] << 16); \
|
||||
} else { \
|
||||
Pixel = (B[0] << 16) + (B[1] << 8) + B[2]; \
|
||||
} \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: \
|
||||
Pixel = *((Uint32 *)(buf)); \
|
||||
break; \
|
||||
\
|
||||
default: \
|
||||
Pixel = 0; /* stop gcc complaints */ \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define DISEMBLE_RGB(buf, bpp, fmt, Pixel, r, g, b) \
|
||||
do { \
|
||||
switch (bpp) { \
|
||||
case 2: \
|
||||
Pixel = *((Uint16 *)(buf)); \
|
||||
RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
Pixel = 0; \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
r = *((buf)+fmt->Rshift/8); \
|
||||
g = *((buf)+fmt->Gshift/8); \
|
||||
b = *((buf)+fmt->Bshift/8); \
|
||||
} else { \
|
||||
r = *((buf)+2-fmt->Rshift/8); \
|
||||
g = *((buf)+2-fmt->Gshift/8); \
|
||||
b = *((buf)+2-fmt->Bshift/8); \
|
||||
} \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: \
|
||||
Pixel = *((Uint32 *)(buf)); \
|
||||
RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \
|
||||
break; \
|
||||
\
|
||||
default: \
|
||||
/* stop gcc complaints */ \
|
||||
Pixel = 0; \
|
||||
r = g = b = 0; \
|
||||
break; \
|
||||
} \
|
||||
#define DISEMBLE_RGB(buf, bpp, fmt, Pixel, r, g, b) \
|
||||
do { \
|
||||
switch (bpp) { \
|
||||
case 1: \
|
||||
Pixel = *((Uint8 *)(buf)); \
|
||||
RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \
|
||||
break; \
|
||||
\
|
||||
case 2: \
|
||||
Pixel = *((Uint16 *)(buf)); \
|
||||
RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
Pixel = 0; \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
r = *((buf)+fmt->Rshift/8); \
|
||||
g = *((buf)+fmt->Gshift/8); \
|
||||
b = *((buf)+fmt->Bshift/8); \
|
||||
} else { \
|
||||
r = *((buf)+2-fmt->Rshift/8); \
|
||||
g = *((buf)+2-fmt->Gshift/8); \
|
||||
b = *((buf)+2-fmt->Bshift/8); \
|
||||
} \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: \
|
||||
Pixel = *((Uint32 *)(buf)); \
|
||||
RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \
|
||||
break; \
|
||||
\
|
||||
default: \
|
||||
/* stop gcc complaints */ \
|
||||
Pixel = 0; \
|
||||
r = g = b = 0; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* Assemble R-G-B values into a specified pixel format and store them */
|
||||
#define PIXEL_FROM_RGB(Pixel, fmt, r, g, b) \
|
||||
{ \
|
||||
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
|
||||
((g>>fmt->Gloss)<<fmt->Gshift)| \
|
||||
((b>>fmt->Bloss)<<fmt->Bshift)| \
|
||||
fmt->Amask; \
|
||||
#define PIXEL_FROM_RGB(Pixel, fmt, r, g, b) \
|
||||
{ \
|
||||
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
|
||||
((g>>fmt->Gloss)<<fmt->Gshift)| \
|
||||
((b>>fmt->Bloss)<<fmt->Bshift)| \
|
||||
fmt->Amask; \
|
||||
}
|
||||
#define RGB565_FROM_RGB(Pixel, r, g, b) \
|
||||
{ \
|
||||
Pixel = ((r>>3)<<11)|((g>>2)<<5)|(b>>3); \
|
||||
#define RGB565_FROM_RGB(Pixel, r, g, b) \
|
||||
{ \
|
||||
Pixel = ((r>>3)<<11)|((g>>2)<<5)|(b>>3); \
|
||||
}
|
||||
#define RGB555_FROM_RGB(Pixel, r, g, b) \
|
||||
{ \
|
||||
Pixel = ((r>>3)<<10)|((g>>3)<<5)|(b>>3); \
|
||||
#define RGB555_FROM_RGB(Pixel, r, g, b) \
|
||||
{ \
|
||||
Pixel = ((r>>3)<<10)|((g>>3)<<5)|(b>>3); \
|
||||
}
|
||||
#define RGB888_FROM_RGB(Pixel, r, g, b) \
|
||||
{ \
|
||||
Pixel = (r<<16)|(g<<8)|b; \
|
||||
#define RGB888_FROM_RGB(Pixel, r, g, b) \
|
||||
{ \
|
||||
Pixel = (r<<16)|(g<<8)|b; \
|
||||
}
|
||||
#define ARGB8888_FROM_RGBA(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = (a<<24)|(r<<16)|(g<<8)|b; \
|
||||
#define ARGB8888_FROM_RGBA(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = (a<<24)|(r<<16)|(g<<8)|b; \
|
||||
}
|
||||
#define RGBA8888_FROM_RGBA(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = (r<<24)|(g<<16)|(b<<8)|a; \
|
||||
#define RGBA8888_FROM_RGBA(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = (r<<24)|(g<<16)|(b<<8)|a; \
|
||||
}
|
||||
#define ABGR8888_FROM_RGBA(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = (a<<24)|(b<<16)|(g<<8)|r; \
|
||||
#define ABGR8888_FROM_RGBA(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = (a<<24)|(b<<16)|(g<<8)|r; \
|
||||
}
|
||||
#define BGRA8888_FROM_RGBA(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = (b<<24)|(g<<16)|(r<<8)|a; \
|
||||
#define BGRA8888_FROM_RGBA(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = (b<<24)|(g<<16)|(r<<8)|a; \
|
||||
}
|
||||
#define ASSEMBLE_RGB(buf, bpp, fmt, r, g, b) \
|
||||
{ \
|
||||
switch (bpp) { \
|
||||
case 2: { \
|
||||
Uint16 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \
|
||||
*((Uint16 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
*((buf)+fmt->Rshift/8) = r; \
|
||||
*((buf)+fmt->Gshift/8) = g; \
|
||||
*((buf)+fmt->Bshift/8) = b; \
|
||||
} else { \
|
||||
*((buf)+2-fmt->Rshift/8) = r; \
|
||||
*((buf)+2-fmt->Gshift/8) = g; \
|
||||
*((buf)+2-fmt->Bshift/8) = b; \
|
||||
} \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: { \
|
||||
Uint32 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \
|
||||
*((Uint32 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
} \
|
||||
#define ASSEMBLE_RGB(buf, bpp, fmt, r, g, b) \
|
||||
{ \
|
||||
switch (bpp) { \
|
||||
case 1: { \
|
||||
Uint8 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \
|
||||
*((Uint8 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 2: { \
|
||||
Uint16 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \
|
||||
*((Uint16 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
*((buf)+fmt->Rshift/8) = r; \
|
||||
*((buf)+fmt->Gshift/8) = g; \
|
||||
*((buf)+fmt->Bshift/8) = b; \
|
||||
} else { \
|
||||
*((buf)+2-fmt->Rshift/8) = r; \
|
||||
*((buf)+2-fmt->Gshift/8) = g; \
|
||||
*((buf)+2-fmt->Bshift/8) = b; \
|
||||
} \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: { \
|
||||
Uint32 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \
|
||||
*((Uint32 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
} \
|
||||
}
|
||||
|
||||
/* FIXME: Should we rescale alpha into 0..255 here? */
|
||||
#define RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a) \
|
||||
{ \
|
||||
#define RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a) \
|
||||
{ \
|
||||
r = SDL_expand_byte[fmt->Rloss][((Pixel&fmt->Rmask)>>fmt->Rshift)]; \
|
||||
g = SDL_expand_byte[fmt->Gloss][((Pixel&fmt->Gmask)>>fmt->Gshift)]; \
|
||||
b = SDL_expand_byte[fmt->Bloss][((Pixel&fmt->Bmask)>>fmt->Bshift)]; \
|
||||
a = SDL_expand_byte[fmt->Aloss][((Pixel&fmt->Amask)>>fmt->Ashift)]; \
|
||||
}
|
||||
#define RGBA_FROM_8888(Pixel, fmt, r, g, b, a) \
|
||||
{ \
|
||||
r = (Pixel&fmt->Rmask)>>fmt->Rshift; \
|
||||
g = (Pixel&fmt->Gmask)>>fmt->Gshift; \
|
||||
b = (Pixel&fmt->Bmask)>>fmt->Bshift; \
|
||||
a = (Pixel&fmt->Amask)>>fmt->Ashift; \
|
||||
#define RGBA_FROM_8888(Pixel, fmt, r, g, b, a) \
|
||||
{ \
|
||||
r = (Pixel&fmt->Rmask)>>fmt->Rshift; \
|
||||
g = (Pixel&fmt->Gmask)>>fmt->Gshift; \
|
||||
b = (Pixel&fmt->Bmask)>>fmt->Bshift; \
|
||||
a = (Pixel&fmt->Amask)>>fmt->Ashift; \
|
||||
}
|
||||
#define RGBA_FROM_RGBA8888(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = (Pixel>>24); \
|
||||
g = ((Pixel>>16)&0xFF); \
|
||||
b = ((Pixel>>8)&0xFF); \
|
||||
a = (Pixel&0xFF); \
|
||||
#define RGBA_FROM_RGBA8888(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = (Pixel>>24); \
|
||||
g = ((Pixel>>16)&0xFF); \
|
||||
b = ((Pixel>>8)&0xFF); \
|
||||
a = (Pixel&0xFF); \
|
||||
}
|
||||
#define RGBA_FROM_ARGB8888(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = ((Pixel>>16)&0xFF); \
|
||||
g = ((Pixel>>8)&0xFF); \
|
||||
b = (Pixel&0xFF); \
|
||||
a = (Pixel>>24); \
|
||||
#define RGBA_FROM_ARGB8888(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = ((Pixel>>16)&0xFF); \
|
||||
g = ((Pixel>>8)&0xFF); \
|
||||
b = (Pixel&0xFF); \
|
||||
a = (Pixel>>24); \
|
||||
}
|
||||
#define RGBA_FROM_ABGR8888(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = (Pixel&0xFF); \
|
||||
g = ((Pixel>>8)&0xFF); \
|
||||
b = ((Pixel>>16)&0xFF); \
|
||||
a = (Pixel>>24); \
|
||||
#define RGBA_FROM_ABGR8888(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = (Pixel&0xFF); \
|
||||
g = ((Pixel>>8)&0xFF); \
|
||||
b = ((Pixel>>16)&0xFF); \
|
||||
a = (Pixel>>24); \
|
||||
}
|
||||
#define RGBA_FROM_BGRA8888(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = ((Pixel>>8)&0xFF); \
|
||||
g = ((Pixel>>16)&0xFF); \
|
||||
b = (Pixel>>24); \
|
||||
a = (Pixel&0xFF); \
|
||||
#define RGBA_FROM_BGRA8888(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = ((Pixel>>8)&0xFF); \
|
||||
g = ((Pixel>>16)&0xFF); \
|
||||
b = (Pixel>>24); \
|
||||
a = (Pixel&0xFF); \
|
||||
}
|
||||
#define DISEMBLE_RGBA(buf, bpp, fmt, Pixel, r, g, b, a) \
|
||||
do { \
|
||||
switch (bpp) { \
|
||||
case 2: \
|
||||
Pixel = *((Uint16 *)(buf)); \
|
||||
RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
Pixel = 0; \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
r = *((buf)+fmt->Rshift/8); \
|
||||
g = *((buf)+fmt->Gshift/8); \
|
||||
b = *((buf)+fmt->Bshift/8); \
|
||||
} else { \
|
||||
r = *((buf)+2-fmt->Rshift/8); \
|
||||
g = *((buf)+2-fmt->Gshift/8); \
|
||||
b = *((buf)+2-fmt->Bshift/8); \
|
||||
} \
|
||||
a = 0xFF; \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: \
|
||||
Pixel = *((Uint32 *)(buf)); \
|
||||
RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \
|
||||
break; \
|
||||
\
|
||||
default: \
|
||||
/* stop gcc complaints */ \
|
||||
Pixel = 0; \
|
||||
r = g = b = a = 0; \
|
||||
break; \
|
||||
} \
|
||||
#define DISEMBLE_RGBA(buf, bpp, fmt, Pixel, r, g, b, a) \
|
||||
do { \
|
||||
switch (bpp) { \
|
||||
case 1: \
|
||||
Pixel = *((Uint8 *)(buf)); \
|
||||
RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \
|
||||
break; \
|
||||
\
|
||||
case 2: \
|
||||
Pixel = *((Uint16 *)(buf)); \
|
||||
RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
Pixel = 0; \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
r = *((buf)+fmt->Rshift/8); \
|
||||
g = *((buf)+fmt->Gshift/8); \
|
||||
b = *((buf)+fmt->Bshift/8); \
|
||||
} else { \
|
||||
r = *((buf)+2-fmt->Rshift/8); \
|
||||
g = *((buf)+2-fmt->Gshift/8); \
|
||||
b = *((buf)+2-fmt->Bshift/8); \
|
||||
} \
|
||||
a = 0xFF; \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: \
|
||||
Pixel = *((Uint32 *)(buf)); \
|
||||
RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \
|
||||
break; \
|
||||
\
|
||||
default: \
|
||||
/* stop gcc complaints */ \
|
||||
Pixel = 0; \
|
||||
r = g = b = a = 0; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* FIXME: this isn't correct, especially for Alpha (maximum != 255) */
|
||||
#define PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
|
||||
((g>>fmt->Gloss)<<fmt->Gshift)| \
|
||||
((b>>fmt->Bloss)<<fmt->Bshift)| \
|
||||
((a>>fmt->Aloss)<<fmt->Ashift); \
|
||||
#define PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
|
||||
((g>>fmt->Gloss)<<fmt->Gshift)| \
|
||||
((b>>fmt->Bloss)<<fmt->Bshift)| \
|
||||
((a>>fmt->Aloss)<<fmt->Ashift); \
|
||||
}
|
||||
#define ASSEMBLE_RGBA(buf, bpp, fmt, r, g, b, a) \
|
||||
{ \
|
||||
switch (bpp) { \
|
||||
case 2: { \
|
||||
Uint16 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a); \
|
||||
*((Uint16 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
*((buf)+fmt->Rshift/8) = r; \
|
||||
*((buf)+fmt->Gshift/8) = g; \
|
||||
*((buf)+fmt->Bshift/8) = b; \
|
||||
} else { \
|
||||
*((buf)+2-fmt->Rshift/8) = r; \
|
||||
*((buf)+2-fmt->Gshift/8) = g; \
|
||||
*((buf)+2-fmt->Bshift/8) = b; \
|
||||
} \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: { \
|
||||
Uint32 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a); \
|
||||
*((Uint32 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
} \
|
||||
#define ASSEMBLE_RGBA(buf, bpp, fmt, r, g, b, a) \
|
||||
{ \
|
||||
switch (bpp) { \
|
||||
case 1: { \
|
||||
Uint8 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a); \
|
||||
*((Uint8 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 2: { \
|
||||
Uint16 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a); \
|
||||
*((Uint16 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
*((buf)+fmt->Rshift/8) = r; \
|
||||
*((buf)+fmt->Gshift/8) = g; \
|
||||
*((buf)+fmt->Bshift/8) = b; \
|
||||
} else { \
|
||||
*((buf)+2-fmt->Rshift/8) = r; \
|
||||
*((buf)+2-fmt->Gshift/8) = g; \
|
||||
*((buf)+2-fmt->Bshift/8) = b; \
|
||||
} \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: { \
|
||||
Uint32 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a); \
|
||||
*((Uint32 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
} \
|
||||
}
|
||||
|
||||
/* Blend the RGB values of two Pixels based on a source alpha value */
|
||||
#define ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB) \
|
||||
do { \
|
||||
dR = ((((int)(sR-dR)*(int)A)/255)+dR); \
|
||||
dG = ((((int)(sG-dG)*(int)A)/255)+dG); \
|
||||
dB = ((((int)(sB-dB)*(int)A)/255)+dB); \
|
||||
#define ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB) \
|
||||
do { \
|
||||
dR = ((((int)(sR-dR)*(int)A)/255)+dR); \
|
||||
dG = ((((int)(sG-dG)*(int)A)/255)+dG); \
|
||||
dB = ((((int)(sB-dB)*(int)A)/255)+dB); \
|
||||
} while(0)
|
||||
|
||||
|
||||
|
@ -413,74 +443,74 @@ do { \
|
|||
#ifdef USE_DUFFS_LOOP
|
||||
|
||||
/* 8-times unrolled loop */
|
||||
#define DUFFS_LOOP8(pixel_copy_increment, width) \
|
||||
{ int n = (width+7)/8; \
|
||||
switch (width & 7) { \
|
||||
case 0: do { pixel_copy_increment; \
|
||||
case 7: pixel_copy_increment; \
|
||||
case 6: pixel_copy_increment; \
|
||||
case 5: pixel_copy_increment; \
|
||||
case 4: pixel_copy_increment; \
|
||||
case 3: pixel_copy_increment; \
|
||||
case 2: pixel_copy_increment; \
|
||||
case 1: pixel_copy_increment; \
|
||||
} while ( --n > 0 ); \
|
||||
} \
|
||||
#define DUFFS_LOOP8(pixel_copy_increment, width) \
|
||||
{ int n = (width+7)/8; \
|
||||
switch (width & 7) { \
|
||||
case 0: do { pixel_copy_increment; \
|
||||
case 7: pixel_copy_increment; \
|
||||
case 6: pixel_copy_increment; \
|
||||
case 5: pixel_copy_increment; \
|
||||
case 4: pixel_copy_increment; \
|
||||
case 3: pixel_copy_increment; \
|
||||
case 2: pixel_copy_increment; \
|
||||
case 1: pixel_copy_increment; \
|
||||
} while ( --n > 0 ); \
|
||||
} \
|
||||
}
|
||||
|
||||
/* 4-times unrolled loop */
|
||||
#define DUFFS_LOOP4(pixel_copy_increment, width) \
|
||||
{ int n = (width+3)/4; \
|
||||
switch (width & 3) { \
|
||||
case 0: do { pixel_copy_increment; \
|
||||
case 3: pixel_copy_increment; \
|
||||
case 2: pixel_copy_increment; \
|
||||
case 1: pixel_copy_increment; \
|
||||
} while (--n > 0); \
|
||||
} \
|
||||
#define DUFFS_LOOP4(pixel_copy_increment, width) \
|
||||
{ int n = (width+3)/4; \
|
||||
switch (width & 3) { \
|
||||
case 0: do { pixel_copy_increment; \
|
||||
case 3: pixel_copy_increment; \
|
||||
case 2: pixel_copy_increment; \
|
||||
case 1: pixel_copy_increment; \
|
||||
} while (--n > 0); \
|
||||
} \
|
||||
}
|
||||
|
||||
/* Use the 8-times version of the loop by default */
|
||||
#define DUFFS_LOOP(pixel_copy_increment, width) \
|
||||
#define DUFFS_LOOP(pixel_copy_increment, width) \
|
||||
DUFFS_LOOP8(pixel_copy_increment, width)
|
||||
|
||||
/* Special version of Duff's device for even more optimization */
|
||||
#define DUFFS_LOOP_124(pixel_copy_increment1, \
|
||||
pixel_copy_increment2, \
|
||||
pixel_copy_increment4, width) \
|
||||
{ int n = width; \
|
||||
if (n & 1) { \
|
||||
pixel_copy_increment1; n -= 1; \
|
||||
} \
|
||||
if (n & 2) { \
|
||||
pixel_copy_increment2; n -= 2; \
|
||||
} \
|
||||
if (n) { \
|
||||
n = (n+7)/ 8; \
|
||||
switch (n & 4) { \
|
||||
case 0: do { pixel_copy_increment4; \
|
||||
case 4: pixel_copy_increment4; \
|
||||
} while (--n > 0); \
|
||||
} \
|
||||
} \
|
||||
#define DUFFS_LOOP_124(pixel_copy_increment1, \
|
||||
pixel_copy_increment2, \
|
||||
pixel_copy_increment4, width) \
|
||||
{ int n = width; \
|
||||
if (n & 1) { \
|
||||
pixel_copy_increment1; n -= 1; \
|
||||
} \
|
||||
if (n & 2) { \
|
||||
pixel_copy_increment2; n -= 2; \
|
||||
} \
|
||||
if (n) { \
|
||||
n = (n+7)/ 8; \
|
||||
switch (n & 4) { \
|
||||
case 0: do { pixel_copy_increment4; \
|
||||
case 4: pixel_copy_increment4; \
|
||||
} while (--n > 0); \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* Don't use Duff's device to unroll loops */
|
||||
#define DUFFS_LOOP(pixel_copy_increment, width) \
|
||||
{ int n; \
|
||||
for ( n=width; n > 0; --n ) { \
|
||||
pixel_copy_increment; \
|
||||
} \
|
||||
#define DUFFS_LOOP(pixel_copy_increment, width) \
|
||||
{ int n; \
|
||||
for ( n=width; n > 0; --n ) { \
|
||||
pixel_copy_increment; \
|
||||
} \
|
||||
}
|
||||
#define DUFFS_LOOP8(pixel_copy_increment, width) \
|
||||
#define DUFFS_LOOP8(pixel_copy_increment, width) \
|
||||
DUFFS_LOOP(pixel_copy_increment, width)
|
||||
#define DUFFS_LOOP4(pixel_copy_increment, width) \
|
||||
#define DUFFS_LOOP4(pixel_copy_increment, width) \
|
||||
DUFFS_LOOP(pixel_copy_increment, width)
|
||||
#define DUFFS_LOOP_124(pixel_copy_increment1, \
|
||||
pixel_copy_increment2, \
|
||||
pixel_copy_increment4, width) \
|
||||
#define DUFFS_LOOP_124(pixel_copy_increment1, \
|
||||
pixel_copy_increment2, \
|
||||
pixel_copy_increment4, width) \
|
||||
DUFFS_LOOP(pixel_copy_increment1, width)
|
||||
|
||||
#endif /* USE_DUFFS_LOOP */
|
||||
|
|
|
@ -2344,8 +2344,8 @@ struct blit_table
|
|||
{ NO_ALPHA = 1, SET_ALPHA = 2, COPY_ALPHA = 4 } alpha;
|
||||
};
|
||||
static const struct blit_table normal_blit_1[] = {
|
||||
/* Default for 8-bit RGB source, an invalid combination */
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, NULL},
|
||||
/* Default for 8-bit RGB source, never optimized */
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, BlitNtoN, 0}
|
||||
};
|
||||
|
||||
static const struct blit_table normal_blit_2[] = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue