Add 32bpp blitter support for adjusting brightness of drawn sprites

This commit is contained in:
Jonathan G Rennison
2021-02-26 18:02:13 +00:00
parent 42e57995dd
commit 4ef363422a
10 changed files with 260 additions and 21 deletions

View File

@@ -345,6 +345,75 @@ bmcr_alpha_blend_single:
anim++;
}
break;
case BM_NORMAL_WITH_BRIGHTNESS:
for (uint x = (uint) bp->width; x > 0; x--) {
if (src->a == 0) {
} else if (src->a == 255) {
MapValue mv = *src_mv;
if (src_mv->m >= PALETTE_ANIM_START) {
mv.v = Clamp(mv.v + bp->brightness_adjust, 0, 255);
*dst = AdjustBrightneSSE(LookupColourInPalette(mv.m), mv.v);
} else {
*dst = AdjustBrightneSSE(src->data, DEFAULT_BRIGHTNESS + bp->brightness_adjust);
}
*anim = *(const uint16*) &mv;
} else {
*anim = 0;
__m128i srcABCD;
__m128i dstABCD = _mm_cvtsi32_si128(dst->data);
if (src_mv->m >= PALETTE_ANIM_START) {
Colour colour = AdjustBrightneSSE(LookupColourInPalette(src_mv->m), Clamp(src_mv->v + bp->brightness_adjust, 0, 255));
colour.a = src->a;
srcABCD = _mm_cvtsi32_si128(colour.data);
} else {
srcABCD = _mm_cvtsi32_si128(AdjustBrightneSSE(src->data, DEFAULT_BRIGHTNESS + bp->brightness_adjust).data);
}
dst->data = _mm_cvtsi128_si32(AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm));
}
src_mv++;
dst++;
src++;
anim++;
}
break;
case BM_COLOUR_REMAP_WITH_BRIGHTNESS:
for (uint x = (uint) bp->width; x > 0; x--) {
/* In case the m-channel is zero, do not remap this pixel in any way. */
__m128i srcABCD;
if (src->a == 0) {
} else if (src_mv->m) {
MapValue mv = *src_mv;
mv.v = Clamp(mv.v + bp->brightness_adjust, 0, 255);
const uint r = remap[mv.m];
*anim = (animated && src->a == 255) ? r | ((uint16) mv.v << 8) : 0;
if (r != 0) {
Colour remapped_colour = AdjustBrightneSSE(this->LookupColourInPalette(r), mv.v);
if (src->a == 255) {
*dst = remapped_colour;
} else {
remapped_colour.a = src->a;
srcABCD = _mm_cvtsi32_si128(remapped_colour.data);
goto bmcr_alpha_blend_single_brightness;
}
}
} else {
*anim = 0;
srcABCD = _mm_cvtsi32_si128(AdjustBrightneSSE(src->data, DEFAULT_BRIGHTNESS + bp->brightness_adjust).data);
if (src->a < 255) {
bmcr_alpha_blend_single_brightness:
__m128i dstABCD = _mm_cvtsi32_si128(dst->data);
srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm);
}
dst->data = _mm_cvtsi128_si32(srcABCD);
}
src_mv++;
dst++;
src++;
anim++;
}
break;
}
next_line:
@@ -407,6 +476,17 @@ bm_normal:
case BM_TRANSPARENT: Draw<BM_TRANSPARENT, RM_NONE, BT_NONE, true, true>(bp, zoom); return;
case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP, RM_NONE, BT_NONE, true, true>(bp, zoom); return;
case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP, RM_NONE, BT_NONE, true, true>(bp, zoom); return;
case BM_COLOUR_REMAP_WITH_BRIGHTNESS:
if (!(sprite_flags & SF_NO_REMAP)) {
Draw<BM_COLOUR_REMAP_WITH_BRIGHTNESS, RM_NONE, BT_NONE, true, true>(bp, zoom);
return;
}
/* FALL THROUGH */
case BM_NORMAL_WITH_BRIGHTNESS:
Draw<BM_NORMAL_WITH_BRIGHTNESS, RM_NONE, BT_NONE, true, true>(bp, zoom);
return;
}
}