Extend decal support to all VESA modes
This commit is contained in:
+75
-15
@@ -120,7 +120,7 @@ static struct map_struct {
|
|||||||
enum { delimdecal, petdecal, piledecal, NUMDECALS };
|
enum { delimdecal, petdecal, piledecal, NUMDECALS };
|
||||||
static unsigned char *vesa_decals[NUMDECALS] = { 0 };
|
static unsigned char *vesa_decals[NUMDECALS] = { 0 };
|
||||||
static unsigned char *tmptilebuf;
|
static unsigned char *tmptilebuf;
|
||||||
static unsigned short tilebackground;
|
static uint32_t tilebackground;
|
||||||
|
|
||||||
#define vesa_clearmap() \
|
#define vesa_clearmap() \
|
||||||
{ \
|
{ \
|
||||||
@@ -726,7 +726,20 @@ vesa_xputg(const glyph_info *glyphinfo, const glyph_info *bkglyphinfo UNUSED)
|
|||||||
if (!vesa_decals[delimdecal]) {
|
if (!vesa_decals[delimdecal]) {
|
||||||
vesa_decals[delimdecal] = vesa_tile(Tile_delimiter);
|
vesa_decals[delimdecal] = vesa_tile(Tile_delimiter);
|
||||||
/* The first pixel in Tile_delimiter is the background color */
|
/* The first pixel in Tile_delimiter is the background color */
|
||||||
tilebackground = *((unsigned short *)vesa_decals[delimdecal]);
|
switch(vesa_pixel_bytes) {
|
||||||
|
case 1:
|
||||||
|
tilebackground = *((uint8_t *)vesa_decals[delimdecal]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
tilebackground = *((uint16_t *)vesa_decals[delimdecal]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
tilebackground = *((uint32_t *)vesa_decals[delimdecal]) & 0x00FFFFFF;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (!vesa_decals[petdecal])
|
if (!vesa_decals[petdecal])
|
||||||
vesa_decals[petdecal] = vesa_tile(Tile_petmark);
|
vesa_decals[petdecal] = vesa_tile(Tile_petmark);
|
||||||
|
|
||||||
@@ -2028,21 +2041,68 @@ tile_with_decal(unsigned char const *tile, unsigned char const *decal)
|
|||||||
dst = tmptilebuf;
|
dst = tmptilebuf;
|
||||||
for (tr = 0; tr < iflags.wc_tile_height; ++tr) {
|
for (tr = 0; tr < iflags.wc_tile_height; ++tr) {
|
||||||
for (tc = 0; tc < iflags.wc_tile_width; ++tc) {
|
for (tc = 0; tc < iflags.wc_tile_width; ++tc) {
|
||||||
|
/*
|
||||||
|
* ignore the "background" pixels in decal,
|
||||||
|
* which is identified by the delim tile in the stock
|
||||||
|
* tile set which is 100% background.
|
||||||
|
*/
|
||||||
switch(vesa_pixel_bytes) {
|
switch(vesa_pixel_bytes) {
|
||||||
/*
|
case 1: {
|
||||||
* FIXME: add the other switch cases
|
uint8_t *t1 = (uint8_t *) tptr,
|
||||||
*/
|
*t2 = (uint8_t *) declptr,
|
||||||
case 2: {
|
*t3 = (uint8_t *) dst;
|
||||||
unsigned short *t1 = (unsigned short *) tptr,
|
|
||||||
*t2 = (unsigned short *) declptr,
|
|
||||||
*t3 = (unsigned short *) dst;
|
|
||||||
|
|
||||||
/*
|
*t3 = (*t2 != tilebackground) ? *t2 : *t1;
|
||||||
* ignore the "background" pixesl in decal,
|
}
|
||||||
* which is identified by the delim tile in the stock
|
break;
|
||||||
* tile set which is 100% background.
|
case 2: {
|
||||||
*/
|
uint16_t *t1 = (uint16_t *) tptr,
|
||||||
*t3 = (!(*t2 == tilebackground)) ? *t2 : *t1;
|
*t2 = (uint16_t *) declptr,
|
||||||
|
*t3 = (uint16_t *) dst;
|
||||||
|
|
||||||
|
*t3 = (*t2 != tilebackground) ? *t2 : *t1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3: {
|
||||||
|
uint16_t *t1a, *t2a, *t3a;
|
||||||
|
uint8_t *t1b, *t2b, *t3b;
|
||||||
|
uint32_t pix;
|
||||||
|
|
||||||
|
if ((tc & 1) == 0) {
|
||||||
|
/* pixel column is even */
|
||||||
|
t1a = (uint16_t *) (tptr + 0);
|
||||||
|
t2a = (uint16_t *) (declptr + 0);
|
||||||
|
t3a = (uint16_t *) (dst + 0);
|
||||||
|
t1b = (uint8_t *) (tptr + 2);
|
||||||
|
t2b = (uint8_t *) (declptr + 2);
|
||||||
|
t3b = (uint8_t *) (dst + 2);
|
||||||
|
pix = ((uint32_t) *t2b << 16) | *t2a;
|
||||||
|
} else {
|
||||||
|
/* pixel column is odd */
|
||||||
|
t1b = (uint8_t *) (tptr + 0);
|
||||||
|
t2b = (uint8_t *) (declptr + 0);
|
||||||
|
t3b = (uint8_t *) (dst + 0);
|
||||||
|
t1a = (uint16_t *) (tptr + 1);
|
||||||
|
t2a = (uint16_t *) (declptr + 1);
|
||||||
|
t3a = (uint16_t *) (dst + 1);
|
||||||
|
pix = ((uint32_t) *t2a << 8) | *t2b;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pix != tilebackground) {
|
||||||
|
*t3a = *t2a;
|
||||||
|
*t3b = *t2b;
|
||||||
|
} else {
|
||||||
|
*t3a = *t1a;
|
||||||
|
*t3b = *t1b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 4: {
|
||||||
|
uint32_t *t1 = (uint32_t *) tptr,
|
||||||
|
*t2 = (uint32_t *) declptr,
|
||||||
|
*t3 = (uint32_t *) dst;
|
||||||
|
|
||||||
|
*t3 = ((*t2 & 0x00FFFFFF) != tilebackground) ? *t2 : *t1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default: {
|
default: {
|
||||||
|
|||||||
Reference in New Issue
Block a user