Added support for blitting SDL_PIXELFORMAT_INDEX1LSB

Fixes https://github.com/libsdl-org/SDL/issues/7844

(cherry picked from commit a3d4fd71c3)
This commit is contained in:
Sam Lantinga
2023-06-19 08:36:30 -07:00
parent c6ee9780df
commit 70e43c150e

View File

@@ -44,6 +44,24 @@ static void BlitBto1(SDL_BlitInfo *info)
srcskip += width - (width + 7) / 8; srcskip += width - (width + 7) / 8;
if (map) { if (map) {
if (info->src_fmt->format == SDL_PIXELFORMAT_INDEX1LSB) {
while (height--) {
Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) {
if (!(c & 7)) {
byte = *src++;
}
bit = (byte & 0x01);
if (1) {
*dst = map[bit];
}
dst++;
byte >>= 1;
}
src += srcskip;
dst += dstskip;
}
} else {
while (height--) { while (height--) {
Uint8 byte = 0, bit; Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) { for (c = 0; c < width; ++c) {
@@ -60,6 +78,25 @@ static void BlitBto1(SDL_BlitInfo *info)
src += srcskip; src += srcskip;
dst += dstskip; dst += dstskip;
} }
}
} else {
if (info->src_fmt->format == SDL_PIXELFORMAT_INDEX1LSB) {
while (height--) {
Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) {
if (!(c & 7)) {
byte = *src++;
}
bit = (byte & 0x01);
if (1) {
*dst = bit;
}
dst++;
byte >>= 1;
}
src += srcskip;
dst += dstskip;
}
} else { } else {
while (height--) { while (height--) {
Uint8 byte = 0, bit; Uint8 byte = 0, bit;
@@ -78,6 +115,7 @@ static void BlitBto1(SDL_BlitInfo *info)
dst += dstskip; dst += dstskip;
} }
} }
}
} }
static void BlitBto2(SDL_BlitInfo *info) static void BlitBto2(SDL_BlitInfo *info)
@@ -98,6 +136,24 @@ static void BlitBto2(SDL_BlitInfo *info)
map = (Uint16 *)info->table; map = (Uint16 *)info->table;
srcskip += width - (width + 7) / 8; srcskip += width - (width + 7) / 8;
if (info->src_fmt->format == SDL_PIXELFORMAT_INDEX1LSB) {
while (height--) {
Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) {
if (!(c & 7)) {
byte = *src++;
}
bit = (byte & 0x01);
if (1) {
*dst = map[bit];
}
byte >>= 1;
dst++;
}
src += srcskip;
dst += dstskip;
}
} else {
while (height--) { while (height--) {
Uint8 byte = 0, bit; Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) { for (c = 0; c < width; ++c) {
@@ -114,6 +170,7 @@ static void BlitBto2(SDL_BlitInfo *info)
src += srcskip; src += srcskip;
dst += dstskip; dst += dstskip;
} }
}
} }
static void BlitBto3(SDL_BlitInfo *info) static void BlitBto3(SDL_BlitInfo *info)
@@ -133,6 +190,27 @@ static void BlitBto3(SDL_BlitInfo *info)
map = info->table; map = info->table;
srcskip += width - (width + 7) / 8; srcskip += width - (width + 7) / 8;
if (info->src_fmt->format == SDL_PIXELFORMAT_INDEX1LSB) {
while (height--) {
Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) {
if (!(c & 7)) {
byte = *src++;
}
bit = (byte & 0x01);
if (1) {
o = bit * 4;
dst[0] = map[o++];
dst[1] = map[o++];
dst[2] = map[o++];
}
byte >>= 1;
dst += 3;
}
src += srcskip;
dst += dstskip;
}
} else {
while (height--) { while (height--) {
Uint8 byte = 0, bit; Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) { for (c = 0; c < width; ++c) {
@@ -152,6 +230,7 @@ static void BlitBto3(SDL_BlitInfo *info)
src += srcskip; src += srcskip;
dst += dstskip; dst += dstskip;
} }
}
} }
static void BlitBto4(SDL_BlitInfo *info) static void BlitBto4(SDL_BlitInfo *info)
@@ -172,6 +251,24 @@ static void BlitBto4(SDL_BlitInfo *info)
map = (Uint32 *)info->table; map = (Uint32 *)info->table;
srcskip += width - (width + 7) / 8; srcskip += width - (width + 7) / 8;
if (info->src_fmt->format == SDL_PIXELFORMAT_INDEX1LSB) {
while (height--) {
Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) {
if (!(c & 7)) {
byte = *src++;
}
bit = (byte & 0x01);
if (1) {
*dst = map[bit];
}
byte >>= 1;
dst++;
}
src += srcskip;
dst += dstskip;
}
} else {
while (height--) { while (height--) {
Uint8 byte = 0, bit; Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) { for (c = 0; c < width; ++c) {
@@ -188,6 +285,7 @@ static void BlitBto4(SDL_BlitInfo *info)
src += srcskip; src += srcskip;
dst += dstskip; dst += dstskip;
} }
}
} }
static void BlitBto1Key(SDL_BlitInfo *info) static void BlitBto1Key(SDL_BlitInfo *info)
@@ -206,6 +304,24 @@ static void BlitBto1Key(SDL_BlitInfo *info)
srcskip += width - (width + 7) / 8; srcskip += width - (width + 7) / 8;
if (palmap) { if (palmap) {
if (info->src_fmt->format == SDL_PIXELFORMAT_INDEX1LSB) {
while (height--) {
Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) {
if (!(c & 7)) {
byte = *src++;
}
bit = (byte & 0x01);
if (bit != ckey) {
*dst = palmap[bit];
}
dst++;
byte >>= 1;
}
src += srcskip;
dst += dstskip;
}
} else {
while (height--) { while (height--) {
Uint8 byte = 0, bit; Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) { for (c = 0; c < width; ++c) {
@@ -222,6 +338,25 @@ static void BlitBto1Key(SDL_BlitInfo *info)
src += srcskip; src += srcskip;
dst += dstskip; dst += dstskip;
} }
}
} else {
if (info->src_fmt->format == SDL_PIXELFORMAT_INDEX1LSB) {
while (height--) {
Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) {
if (!(c & 7)) {
byte = *src++;
}
bit = (byte & 0x01);
if (bit != ckey) {
*dst = bit;
}
dst++;
byte >>= 1;
}
src += srcskip;
dst += dstskip;
}
} else { } else {
while (height--) { while (height--) {
Uint8 byte = 0, bit; Uint8 byte = 0, bit;
@@ -240,6 +375,7 @@ static void BlitBto1Key(SDL_BlitInfo *info)
dst += dstskip; dst += dstskip;
} }
} }
}
} }
static void BlitBto2Key(SDL_BlitInfo *info) static void BlitBto2Key(SDL_BlitInfo *info)
@@ -258,6 +394,24 @@ static void BlitBto2Key(SDL_BlitInfo *info)
srcskip += width - (width + 7) / 8; srcskip += width - (width + 7) / 8;
dstskip /= 2; dstskip /= 2;
if (info->src_fmt->format == SDL_PIXELFORMAT_INDEX1LSB) {
while (height--) {
Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) {
if (!(c & 7)) {
byte = *src++;
}
bit = (byte & 0x01);
if (bit != ckey) {
*dstp = ((Uint16 *)palmap)[bit];
}
byte >>= 1;
dstp++;
}
src += srcskip;
dstp += dstskip;
}
} else {
while (height--) { while (height--) {
Uint8 byte = 0, bit; Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) { for (c = 0; c < width; ++c) {
@@ -274,6 +428,7 @@ static void BlitBto2Key(SDL_BlitInfo *info)
src += srcskip; src += srcskip;
dstp += dstskip; dstp += dstskip;
} }
}
} }
static void BlitBto3Key(SDL_BlitInfo *info) static void BlitBto3Key(SDL_BlitInfo *info)
@@ -291,6 +446,24 @@ static void BlitBto3Key(SDL_BlitInfo *info)
/* Set up some basic variables */ /* Set up some basic variables */
srcskip += width - (width + 7) / 8; srcskip += width - (width + 7) / 8;
if (info->src_fmt->format == SDL_PIXELFORMAT_INDEX1LSB) {
while (height--) {
Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) {
if (!(c & 7)) {
byte = *src++;
}
bit = (byte & 0x01);
if (bit != ckey) {
SDL_memcpy(dst, &palmap[bit * 4], 3);
}
byte >>= 1;
dst += 3;
}
src += srcskip;
dst += dstskip;
}
} else {
while (height--) { while (height--) {
Uint8 byte = 0, bit; Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) { for (c = 0; c < width; ++c) {
@@ -307,6 +480,7 @@ static void BlitBto3Key(SDL_BlitInfo *info)
src += srcskip; src += srcskip;
dst += dstskip; dst += dstskip;
} }
}
} }
static void BlitBto4Key(SDL_BlitInfo *info) static void BlitBto4Key(SDL_BlitInfo *info)
@@ -325,6 +499,24 @@ static void BlitBto4Key(SDL_BlitInfo *info)
srcskip += width - (width + 7) / 8; srcskip += width - (width + 7) / 8;
dstskip /= 4; dstskip /= 4;
if (info->src_fmt->format == SDL_PIXELFORMAT_INDEX1LSB) {
while (height--) {
Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) {
if (!(c & 7)) {
byte = *src++;
}
bit = (byte & 0x01);
if (bit != ckey) {
*dstp = ((Uint32 *)palmap)[bit];
}
byte >>= 1;
dstp++;
}
src += srcskip;
dstp += dstskip;
}
} else {
while (height--) { while (height--) {
Uint8 byte = 0, bit; Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) { for (c = 0; c < width; ++c) {
@@ -341,6 +533,7 @@ static void BlitBto4Key(SDL_BlitInfo *info)
src += srcskip; src += srcskip;
dstp += dstskip; dstp += dstskip;
} }
}
} }
static void BlitBtoNAlpha(SDL_BlitInfo *info) static void BlitBtoNAlpha(SDL_BlitInfo *info)
@@ -364,6 +557,29 @@ static void BlitBtoNAlpha(SDL_BlitInfo *info)
dstbpp = dstfmt->BytesPerPixel; dstbpp = dstfmt->BytesPerPixel;
srcskip += width - (width + 7) / 8; srcskip += width - (width + 7) / 8;
if (info->src_fmt->format == SDL_PIXELFORMAT_INDEX1LSB) {
while (height--) {
Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) {
if (!(c & 7)) {
byte = *src++;
}
bit = (byte & 0x01);
if (1) {
sR = srcpal[bit].r;
sG = srcpal[bit].g;
sB = srcpal[bit].b;
DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);
ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);
}
byte >>= 1;
dst += dstbpp;
}
src += srcskip;
dst += dstskip;
}
} else {
while (height--) { while (height--) {
Uint8 byte = 0, bit; Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) { for (c = 0; c < width; ++c) {
@@ -385,6 +601,7 @@ static void BlitBtoNAlpha(SDL_BlitInfo *info)
src += srcskip; src += srcskip;
dst += dstskip; dst += dstskip;
} }
}
} }
static void BlitBtoNAlphaKey(SDL_BlitInfo *info) static void BlitBtoNAlphaKey(SDL_BlitInfo *info)
@@ -410,6 +627,29 @@ static void BlitBtoNAlphaKey(SDL_BlitInfo *info)
dstbpp = dstfmt->BytesPerPixel; dstbpp = dstfmt->BytesPerPixel;
srcskip += width - (width + 7) / 8; srcskip += width - (width + 7) / 8;
if (info->src_fmt->format == SDL_PIXELFORMAT_INDEX1LSB) {
while (height--) {
Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) {
if (!(c & 7)) {
byte = *src++;
}
bit = (byte & 0x01);
if (bit != ckey) {
sR = srcpal[bit].r;
sG = srcpal[bit].g;
sB = srcpal[bit].b;
DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);
ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);
}
byte >>= 1;
dst += dstbpp;
}
src += srcskip;
dst += dstskip;
}
} else {
while (height--) { while (height--) {
Uint8 byte = 0, bit; Uint8 byte = 0, bit;
for (c = 0; c < width; ++c) { for (c = 0; c < width; ++c) {
@@ -431,6 +671,7 @@ static void BlitBtoNAlphaKey(SDL_BlitInfo *info)
src += srcskip; src += srcskip;
dst += dstskip; dst += dstskip;
} }
}
} }
static const SDL_BlitFunc bitmap_blit[] = { static const SDL_BlitFunc bitmap_blit[] = {