1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-08-06 17:41:04 +00:00

Deleted unused parts of blitter

This commit is contained in:
sfan5 2025-07-07 18:18:03 +02:00
parent 158bfa6442
commit e8e5ef0369
6 changed files with 0 additions and 541 deletions

View file

@ -52,43 +52,6 @@ struct SBlitJob
f32 y_stretch;
};
// Bitfields Cohen Sutherland
enum eClipCode
{
CLIPCODE_EMPTY = 0,
CLIPCODE_BOTTOM = 1,
CLIPCODE_TOP = 2,
CLIPCODE_LEFT = 4,
CLIPCODE_RIGHT = 8
};
inline u32 GetClipCode(const AbsRectangle &r, const core::position2d<s32> &p)
{
u32 code = CLIPCODE_EMPTY;
if (p.X < r.x0)
code = CLIPCODE_LEFT;
else if (p.X > r.x1)
code = CLIPCODE_RIGHT;
if (p.Y < r.y0)
code |= CLIPCODE_TOP;
else if (p.Y > r.y1)
code |= CLIPCODE_BOTTOM;
return code;
}
/*
*/
inline void GetClip(AbsRectangle &clipping, video::IImage *t)
{
clipping.x0 = 0;
clipping.y0 = 0;
clipping.x1 = t->getDimension().Width - 1;
clipping.y1 = t->getDimension().Height - 1;
}
/*
return alpha in [0;256] Granularity from 32-Bit ARGB
add highbit alpha ( alpha > 127 ? + 1 )
@ -98,15 +61,6 @@ static inline u32 extractAlpha(const u32 c)
return (c >> 24) + (c >> 31);
}
/*
return alpha in [0;255] Granularity and 32-Bit ARGB
add highbit alpha ( alpha > 127 ? + 1 )
*/
static inline u32 packAlpha(const u32 c)
{
return (c > 127 ? c - 1 : c) << 24;
}
/*!
Scale Color by (1/value)
value 0 - 256 ( alpha )
@ -408,365 +362,11 @@ static void executeBlit_TextureCopy_32_to_24(const SBlitJob *job)
}
}
/*!
*/
static void executeBlit_TextureBlend_16_to_16(const SBlitJob *job)
{
const f18 wscale = f32_to_f18(job->x_stretch);
const f18 hscale = f32_to_f18(job->y_stretch);
f18 src_y = f18_zero;
u16 *dst = (u16 *)job->dst;
for (u32 dy = 0; dy < job->height; ++dy, src_y += hscale) {
const u16 *src = (u16 *)((u8 *)(job->src) + job->srcPitch * f18_floor(src_y));
f18 src_x = f18_zero;
for (u32 dx = 0; dx < job->width; ++dx, src_x += wscale) {
dst[dx] = PixelBlend16(dst[dx], src[f18_floor(src_x)]);
}
dst = (u16 *)((u8 *)(dst) + job->dstPitch);
}
}
/*!
*/
static void executeBlit_TextureBlend_32_to_32(const SBlitJob *job)
{
const f18 wscale = f32_to_f18(job->x_stretch);
const f18 hscale = f32_to_f18(job->y_stretch);
f18 src_y = f18_zero;
u32 *dst = (u32 *)job->dst;
for (u32 dy = 0; dy < job->height; ++dy, src_y += hscale) {
const u32 *src = (u32 *)((u8 *)(job->src) + job->srcPitch * f18_floor(src_y));
f18 src_x = f18_zero;
for (u32 dx = 0; dx < job->width; ++dx, src_x += wscale) {
dst[dx] = PixelBlend32(dst[dx], src[f18_floor(src_x)]);
}
dst = (u32 *)((u8 *)(dst) + job->dstPitch);
}
}
/*!
*/
static void executeBlit_TextureBlendColor_16_to_16(const SBlitJob *job)
{
const u16 blend = video::A8R8G8B8toA1R5G5B5(job->argb);
const f18 wscale = f32_to_f18(job->x_stretch);
const f18 hscale = f32_to_f18(job->y_stretch);
f18 src_y = f18_zero;
u16 *dst = (u16 *)job->dst;
for (u32 dy = 0; dy < job->height; ++dy, src_y += hscale) {
const u16 *src = (u16 *)((u8 *)(job->src) + job->srcPitch * f18_floor(src_y));
f18 src_x = f18_zero;
for (u32 dx = 0; dx < job->width; ++dx, src_x += wscale) {
u16 c0 = src[f18_floor(src_x)];
if (0 == (c0 & 0x8000))
continue;
dst[dx] = PixelMul16_2(c0, blend);
}
dst = (u16 *)((u8 *)(dst) + job->dstPitch);
}
}
/*!
*/
static void executeBlit_TextureBlendColor_32_to_32(const SBlitJob *job)
{
const f18 wscale = f32_to_f18(job->x_stretch);
const f18 hscale = f32_to_f18(job->y_stretch);
u32 *dst = (u32 *)job->dst;
f18 src_y = f18_zero;
for (u32 dy = 0; dy < job->height; ++dy, src_y += hscale) {
const u32 *src = (u32 *)((u8 *)(job->src) + job->srcPitch * f18_floor(src_y));
f18 src_x = f18_zero;
for (u32 dx = 0; dx < job->width; ++dx, src_x += wscale) {
dst[dx] = PixelBlend32(dst[dx], PixelMul32_2(src[f18_floor(src_x)], job->argb));
}
dst = (u32 *)((u8 *)(dst) + job->dstPitch);
}
}
/*!
*/
static void executeBlit_Color_16_to_16(const SBlitJob *job)
{
const u16 c = video::A8R8G8B8toA1R5G5B5(job->argb);
u16 *dst = (u16 *)job->dst;
for (u32 dy = 0; dy < job->height; ++dy) {
memset16(dst, c, job->srcPitch);
dst = (u16 *)((u8 *)(dst) + job->dstPitch);
}
}
/*!
*/
static void executeBlit_Color_32_to_32(const SBlitJob *job)
{
u32 *dst = (u32 *)job->dst;
for (u32 dy = 0; dy < job->height; ++dy) {
memset32(dst, job->argb, job->srcPitch);
dst = (u32 *)((u8 *)(dst) + job->dstPitch);
}
}
/*!
*/
static void executeBlit_ColorAlpha_16_to_16(const SBlitJob *job)
{
u16 *dst = (u16 *)job->dst;
const u16 alpha = extractAlpha(job->argb) >> 3;
if (0 == alpha)
return;
const u32 src = video::A8R8G8B8toA1R5G5B5(job->argb);
for (u32 dy = 0; dy != job->height; ++dy) {
for (u32 dx = 0; dx != job->width; ++dx) {
dst[dx] = PixelBlend16(dst[dx], src, alpha);
}
dst = (u16 *)((u8 *)(dst) + job->dstPitch);
}
}
/*!
*/
static void executeBlit_ColorAlpha_32_to_32(const SBlitJob *job)
{
const u32 alpha = extractAlpha(job->argb);
if (0 == alpha)
return;
u32 *dst = (u32 *)job->dst;
for (u32 dy = 0; dy < job->height; ++dy) {
for (u32 dx = 0; dx < job->width; ++dx) {
dst[dx] = PixelBlend32(dst[dx], job->argb, alpha);
}
dst = (u32 *)((u8 *)(dst) + job->dstPitch);
}
}
/*!
Pixel =>
color = sourceAlpha > 0 ? source, else dest
alpha = max(destAlpha, sourceAlpha)
*/
inline u16 PixelCombine16(const u16 c2, const u16 c1)
{
if (video::getAlpha(c1) > 0)
return c1;
else
return c2;
}
/*!
Combine alpha channels (increases alpha / reduces transparency)
*/
static void executeBlit_TextureCombineColor_16_to_16(const SBlitJob *job)
{
const u32 w = job->width * 2;
const u32 h = job->height * 2;
u16 *src = (u16 *)job->src;
u16 *dst = (u16 *)job->dst;
const u16 jobColor = video::A8R8G8B8toA1R5G5B5(job->argb);
/*
Stretch not supported.
*/
for (u32 dy = 0; dy != h; dy++) {
for (u32 dx = 0; dx != w; dx++) {
const u16 src_x = src[dx];
const u16 dst_x = dst[dx];
dst[dx] = PixelCombine16(dst_x, PixelMul16_2(src_x, jobColor));
}
src = (u16 *)((u8 *)(src) + job->srcPitch);
dst = (u16 *)((u8 *)(dst) + job->dstPitch);
}
}
/*!
Combine alpha channels (increases alpha / reduces transparency)
*/
static void executeBlit_TextureCombineColor_16_to_24(const SBlitJob *job)
{
const u32 w = job->width;
const u32 h = job->height;
const u16 *src = static_cast<const u16 *>(job->src);
u8 *dst = static_cast<u8 *>(job->dst);
const u16 jobColor = video::A8R8G8B8toA1R5G5B5(job->argb);
if (job->stretch) {
const float wscale = job->x_stretch;
const float hscale = job->y_stretch;
for (u32 dy = 0; dy < h; ++dy) {
const u32 src_y = (u32)(dy * hscale);
src = (u16 *)((u8 *)(job->src) + job->srcPitch * src_y);
for (u32 dx = 0; dx < w; ++dx) {
const u32 src_x = (u32)(dx * wscale);
u32 color = PixelMul16_2(video::A1R5G5B5toA8R8G8B8(src[src_x]), jobColor);
u8 *writeTo = &dst[dx * 3];
if (video::getAlpha(src[src_x]) > 0) { // only overlay if source has visible alpha (alpha == 1)
*writeTo++ = (color >> 16) & 0xFF;
*writeTo++ = (color >> 8) & 0xFF;
*writeTo++ = color & 0xFF;
}
}
dst += job->dstPitch;
}
} else {
for (u32 dy = 0; dy != h; ++dy) {
for (u32 dx = 0; dx != w; ++dx) {
u32 color = PixelMul16_2(video::A1R5G5B5toA8R8G8B8(src[dx]), jobColor);
u8 *writeTo = &dst[dx * 3];
if (video::getAlpha(src[dx]) > 0) { // only overlay if source has visible alpha (alpha == 1)
*writeTo++ = (color >> 16) & 0xFF;
*writeTo++ = (color >> 8) & 0xFF;
*writeTo++ = color & 0xFF;
}
}
src = (u16 *)((u8 *)(src) + job->srcPitch);
dst += job->dstPitch;
}
}
}
/*!
Pixel =>
color = dest * ( 1 - SourceAlpha ) + source * SourceAlpha,
alpha = destAlpha * ( 1 - SourceAlpha ) + sourceAlpha
where "1" means "full scale" (255)
*/
inline u32 PixelCombine32(const u32 c2, const u32 c1)
{
// alpha test
u32 alpha = c1 & 0xFF000000;
if (0 == alpha)
return c2;
if (0xFF000000 == alpha) {
return c1;
}
alpha >>= 24;
// add highbit alpha, if ( alpha > 127 ) alpha += 1;
// stretches [0;255] to [0;256] to avoid division by 255. use division 256 == shr 8
alpha += (alpha >> 7);
u32 srcRB = c1 & 0x00FF00FF;
u32 srcXG = c1 & 0x0000FF00;
u32 dstRB = c2 & 0x00FF00FF;
u32 dstXG = c2 & 0x0000FF00;
u32 rb = srcRB - dstRB;
u32 xg = srcXG - dstXG;
rb *= alpha;
xg *= alpha;
rb >>= 8;
xg >>= 8;
rb += dstRB;
xg += dstXG;
rb &= 0x00FF00FF;
xg &= 0x0000FF00;
u32 sa = c1 >> 24;
u32 da = c2 >> 24;
u32 blendAlpha_fix8 = (sa * 256 + da * (256 - alpha)) >> 8;
return blendAlpha_fix8 << 24 | rb | xg;
}
/*!
Combine alpha channels (increases alpha / reduces transparency)
Destination alpha is treated as full 255
*/
static void executeBlit_TextureCombineColor_32_to_24(const SBlitJob *job)
{
const u32 w = job->width;
const u32 h = job->height;
const u32 *src = static_cast<const u32 *>(job->src);
u8 *dst = static_cast<u8 *>(job->dst);
if (job->stretch) {
const float wscale = job->x_stretch;
const float hscale = job->y_stretch;
for (u32 dy = 0; dy < h; ++dy) {
const u32 src_y = (u32)(dy * hscale);
src = (u32 *)((u8 *)(job->src) + job->srcPitch * src_y);
for (u32 dx = 0; dx < w; ++dx) {
const u32 src_x = src[(u32)(dx * wscale)];
u8 *writeTo = &dst[dx * 3];
const u32 dst_x = 0xFF000000 | writeTo[0] << 16 | writeTo[1] << 8 | writeTo[2];
const u32 combo = PixelCombine32(dst_x, PixelMul32_2(src_x, job->argb));
*writeTo++ = (combo >> 16) & 0xFF;
*writeTo++ = (combo >> 8) & 0xFF;
*writeTo++ = combo & 0xFF;
}
dst += job->dstPitch;
}
} else {
for (u32 dy = 0; dy != h; ++dy) {
for (u32 dx = 0; dx != w; ++dx) {
u8 *writeTo = &dst[dx * 3];
const u32 dst_x = 0xFF000000 | writeTo[0] << 16 | writeTo[1] << 8 | writeTo[2];
const u32 combo = PixelCombine32(dst_x, PixelMul32_2(src[dx], job->argb));
*writeTo++ = (combo >> 16) & 0xFF;
*writeTo++ = (combo >> 8) & 0xFF;
*writeTo++ = combo & 0xFF;
}
src = (u32 *)((u8 *)(src) + job->srcPitch);
dst += job->dstPitch;
}
}
}
/*!
Combine alpha channels (increases alpha / reduces transparency)
*/
static void executeBlit_TextureCombineColor_32_to_32(const SBlitJob *job)
{
u32 *src = (u32 *)job->src;
u32 *dst = (u32 *)job->dst;
for (u32 dy = 0; dy != job->height; ++dy) {
for (u32 dx = 0; dx != job->width; ++dx) {
dst[dx] = PixelCombine32(dst[dx], PixelMul32_2(src[dx], job->argb));
}
src = (u32 *)((u8 *)(src) + job->srcPitch);
dst = (u32 *)((u8 *)(dst) + job->dstPitch);
}
}
// Blitter Operation
enum eBlitter
{
BLITTER_INVALID = 0,
BLITTER_COLOR,
BLITTER_COLOR_ALPHA,
BLITTER_TEXTURE,
BLITTER_TEXTURE_ALPHA_BLEND,
BLITTER_TEXTURE_ALPHA_COLOR_BLEND,
BLITTER_TEXTURE_COMBINE_ALPHA,
};
typedef void (*tExecuteBlit)(const SBlitJob *job);
@ -789,22 +389,6 @@ static const blitterTable blitTable[] = {
{BLITTER_TEXTURE, video::ECF_A8R8G8B8, video::ECF_R8G8B8, executeBlit_TextureCopy_24_to_32},
{BLITTER_TEXTURE, video::ECF_R8G8B8, video::ECF_A1R5G5B5, executeBlit_TextureCopy_16_to_24},
{BLITTER_TEXTURE, video::ECF_R8G8B8, video::ECF_A8R8G8B8, executeBlit_TextureCopy_32_to_24},
{BLITTER_TEXTURE_ALPHA_BLEND, video::ECF_A1R5G5B5, video::ECF_A1R5G5B5, executeBlit_TextureBlend_16_to_16},
{BLITTER_TEXTURE_ALPHA_BLEND, video::ECF_A8R8G8B8, video::ECF_A8R8G8B8, executeBlit_TextureBlend_32_to_32},
{BLITTER_TEXTURE_ALPHA_COLOR_BLEND, video::ECF_A1R5G5B5, video::ECF_A1R5G5B5, executeBlit_TextureBlendColor_16_to_16},
{BLITTER_TEXTURE_ALPHA_COLOR_BLEND, video::ECF_A8R8G8B8, video::ECF_A8R8G8B8, executeBlit_TextureBlendColor_32_to_32},
{BLITTER_COLOR, video::ECF_A1R5G5B5, -1, executeBlit_Color_16_to_16},
{BLITTER_COLOR, video::ECF_A8R8G8B8, -1, executeBlit_Color_32_to_32},
{BLITTER_COLOR_ALPHA, video::ECF_A1R5G5B5, -1, executeBlit_ColorAlpha_16_to_16},
{BLITTER_COLOR_ALPHA, video::ECF_A8R8G8B8, -1, executeBlit_ColorAlpha_32_to_32},
{BLITTER_TEXTURE_COMBINE_ALPHA, video::ECF_A8R8G8B8, video::ECF_A8R8G8B8, executeBlit_TextureCombineColor_32_to_32},
{BLITTER_TEXTURE_COMBINE_ALPHA, video::ECF_A8R8G8B8, video::ECF_R8G8B8, executeBlit_TextureCopy_24_to_32},
{BLITTER_TEXTURE_COMBINE_ALPHA, video::ECF_R8G8B8, video::ECF_A8R8G8B8, executeBlit_TextureCombineColor_32_to_24},
{BLITTER_TEXTURE_COMBINE_ALPHA, video::ECF_R8G8B8, video::ECF_R8G8B8, executeBlit_TextureCopy_x_to_x},
{BLITTER_TEXTURE_COMBINE_ALPHA, video::ECF_A1R5G5B5, video::ECF_R8G8B8, executeBlit_TextureCopy_24_to_16},
{BLITTER_TEXTURE_COMBINE_ALPHA, video::ECF_A1R5G5B5, video::ECF_A1R5G5B5, executeBlit_TextureCombineColor_16_to_16},
{BLITTER_TEXTURE_COMBINE_ALPHA, video::ECF_A1R5G5B5, video::ECF_R8G8B8, executeBlit_TextureCopy_24_to_16},
{BLITTER_TEXTURE_COMBINE_ALPHA, video::ECF_R8G8B8, video::ECF_A1R5G5B5, executeBlit_TextureCombineColor_16_to_24},
{BLITTER_INVALID, -1, -1, 0},
};