mirror of
https://github.com/holub/mame
synced 2025-07-04 01:18:59 +03:00
rendersw: fix fatalerror with PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_RGB_MULTIPLY). rename draw_quad_argb32_multiply to draw_quad_rgb32_multiply since it actually doesn't multiply per pixel alpha (nw)
This commit is contained in:
parent
0065559bd7
commit
dcc2b9ec83
@ -1296,6 +1296,124 @@ private:
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// draw_quad_rgb32_multiply - perform
|
||||
// rasterization using RGB multiply
|
||||
//-------------------------------------------------
|
||||
|
||||
static void draw_quad_rgb32_multiply(const render_primitive &prim, _PixelType *dstdata, u32 pitch, quad_setup_data &setup)
|
||||
{
|
||||
const rgb_t *palbase = prim.texture.palette;
|
||||
s32 dudx = setup.dudx;
|
||||
s32 dvdx = setup.dvdx;
|
||||
s32 endx = setup.endx;
|
||||
|
||||
// simply can't do this without reading from the dest
|
||||
if (_NoDestRead)
|
||||
return;
|
||||
|
||||
// fast case: no coloring, no alpha
|
||||
if (prim.color.r >= 1.0f && prim.color.g >= 1.0f && prim.color.b >= 1.0f && is_opaque(prim.color.a))
|
||||
{
|
||||
// loop over rows
|
||||
for (s32 y = setup.starty; y < setup.endy; y++)
|
||||
{
|
||||
_PixelType *dest = dstdata + y * pitch + setup.startx;
|
||||
s32 curu = setup.startu + (y - setup.starty) * setup.dudy;
|
||||
s32 curv = setup.startv + (y - setup.starty) * setup.dvdy;
|
||||
|
||||
// no lookup case
|
||||
if (palbase == nullptr)
|
||||
{
|
||||
// loop over cols
|
||||
for (s32 x = setup.startx; x < endx; x++)
|
||||
{
|
||||
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
||||
u32 r = (source32_r(pix) * dest_r(dpix)) >> (8 - _SrcShiftR);
|
||||
u32 g = (source32_g(pix) * dest_g(dpix)) >> (8 - _SrcShiftG);
|
||||
u32 b = (source32_b(pix) * dest_b(dpix)) >> (8 - _SrcShiftB);
|
||||
|
||||
*dest++ = dest_assemble_rgb(r, g, b);
|
||||
curu += dudx;
|
||||
curv += dvdx;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// loop over cols
|
||||
for (s32 x = setup.startx; x < endx; x++)
|
||||
{
|
||||
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
||||
u32 r = (palbase[(pix >> 16) & 0xff] * dest_r(dpix)) >> 8;
|
||||
u32 g = (palbase[(pix >> 8) & 0xff] * dest_g(dpix)) >> 8;
|
||||
u32 b = (palbase[(pix >> 0) & 0xff] * dest_b(dpix)) >> 8;
|
||||
|
||||
*dest++ = dest_assemble_rgb(r, g, b);
|
||||
curu += dudx;
|
||||
curv += dvdx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// alpha and/or coloring case
|
||||
else
|
||||
{
|
||||
u32 sr = u32(256.0f * prim.color.r * prim.color.a);
|
||||
u32 sg = u32(256.0f * prim.color.g * prim.color.a);
|
||||
u32 sb = u32(256.0f * prim.color.b * prim.color.a);
|
||||
|
||||
// clamp R,G,B to 0-256 range
|
||||
if (sr > 0x100) { if (s32(sr) < 0) sr = 0; else sr = 0x100; }
|
||||
if (sg > 0x100) { if (s32(sg) < 0) sg = 0; else sg = 0x100; }
|
||||
if (sb > 0x100) { if (s32(sb) < 0) sb = 0; else sb = 0x100; }
|
||||
|
||||
// loop over rows
|
||||
for (s32 y = setup.starty; y < setup.endy; y++)
|
||||
{
|
||||
_PixelType *dest = dstdata + y * pitch + setup.startx;
|
||||
s32 curu = setup.startu + (y - setup.starty) * setup.dudy;
|
||||
s32 curv = setup.startv + (y - setup.starty) * setup.dvdy;
|
||||
|
||||
// no lookup case
|
||||
if (palbase == nullptr)
|
||||
{
|
||||
// loop over cols
|
||||
for (s32 x = setup.startx; x < endx; x++)
|
||||
{
|
||||
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
||||
u32 r = (source32_r(pix) * sr * dest_r(dpix)) >> (16 - _SrcShiftR);
|
||||
u32 g = (source32_g(pix) * sg * dest_g(dpix)) >> (16 - _SrcShiftG);
|
||||
u32 b = (source32_b(pix) * sb * dest_b(dpix)) >> (16 - _SrcShiftB);
|
||||
|
||||
*dest++ = dest_assemble_rgb(r, g, b);
|
||||
curu += dudx;
|
||||
curv += dvdx;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// loop over cols
|
||||
for (s32 x = setup.startx; x < endx; x++)
|
||||
{
|
||||
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
||||
u32 r = (palbase[(pix >> 16) & 0xff] * sr * dest_r(dpix)) >> 16;
|
||||
u32 g = (palbase[(pix >> 8) & 0xff] * sg * dest_g(dpix)) >> 16;
|
||||
u32 b = (palbase[(pix >> 0) & 0xff] * sb * dest_b(dpix)) >> 16;
|
||||
|
||||
*dest++ = dest_assemble_rgb(r, g, b);
|
||||
curu += dudx;
|
||||
curv += dvdx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// 32-BIT ARGB QUAD RASTERIZERS
|
||||
@ -1447,125 +1565,6 @@ private:
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// draw_quad_argb32_multiply - perform
|
||||
// rasterization using RGB multiply
|
||||
//-------------------------------------------------
|
||||
|
||||
static void draw_quad_argb32_multiply(const render_primitive &prim, _PixelType *dstdata, u32 pitch, quad_setup_data &setup)
|
||||
{
|
||||
const rgb_t *palbase = prim.texture.palette;
|
||||
s32 dudx = setup.dudx;
|
||||
s32 dvdx = setup.dvdx;
|
||||
s32 endx = setup.endx;
|
||||
|
||||
// simply can't do this without reading from the dest
|
||||
if (_NoDestRead)
|
||||
return;
|
||||
|
||||
// fast case: no coloring, no alpha
|
||||
if (prim.color.r >= 1.0f && prim.color.g >= 1.0f && prim.color.b >= 1.0f && is_opaque(prim.color.a))
|
||||
{
|
||||
// loop over rows
|
||||
for (s32 y = setup.starty; y < setup.endy; y++)
|
||||
{
|
||||
_PixelType *dest = dstdata + y * pitch + setup.startx;
|
||||
s32 curu = setup.startu + (y - setup.starty) * setup.dudy;
|
||||
s32 curv = setup.startv + (y - setup.starty) * setup.dvdy;
|
||||
|
||||
// no lookup case
|
||||
if (palbase == nullptr)
|
||||
{
|
||||
// loop over cols
|
||||
for (s32 x = setup.startx; x < endx; x++)
|
||||
{
|
||||
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
||||
u32 r = (source32_r(pix) * dest_r(dpix)) >> (8 - _SrcShiftR);
|
||||
u32 g = (source32_g(pix) * dest_g(dpix)) >> (8 - _SrcShiftG);
|
||||
u32 b = (source32_b(pix) * dest_b(dpix)) >> (8 - _SrcShiftB);
|
||||
|
||||
*dest++ = dest_assemble_rgb(r, g, b);
|
||||
curu += dudx;
|
||||
curv += dvdx;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// loop over cols
|
||||
for (s32 x = setup.startx; x < endx; x++)
|
||||
{
|
||||
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
||||
u32 r = (palbase[(pix >> 16) & 0xff] * dest_r(dpix)) >> 8;
|
||||
u32 g = (palbase[(pix >> 8) & 0xff] * dest_g(dpix)) >> 8;
|
||||
u32 b = (palbase[(pix >> 0) & 0xff] * dest_b(dpix)) >> 8;
|
||||
|
||||
*dest++ = dest_assemble_rgb(r, g, b);
|
||||
curu += dudx;
|
||||
curv += dvdx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// alpha and/or coloring case
|
||||
else
|
||||
{
|
||||
u32 sr = u32(256.0f * prim.color.r * prim.color.a);
|
||||
u32 sg = u32(256.0f * prim.color.g * prim.color.a);
|
||||
u32 sb = u32(256.0f * prim.color.b * prim.color.a);
|
||||
|
||||
// clamp R,G,B and inverse A to 0-256 range
|
||||
if (sr > 0x100) { if (s32(sr) < 0) sr = 0; else sr = 0x100; }
|
||||
if (sg > 0x100) { if (s32(sg) < 0) sg = 0; else sg = 0x100; }
|
||||
if (sb > 0x100) { if (s32(sb) < 0) sb = 0; else sb = 0x100; }
|
||||
|
||||
// loop over rows
|
||||
for (s32 y = setup.starty; y < setup.endy; y++)
|
||||
{
|
||||
_PixelType *dest = dstdata + y * pitch + setup.startx;
|
||||
s32 curu = setup.startu + (y - setup.starty) * setup.dudy;
|
||||
s32 curv = setup.startv + (y - setup.starty) * setup.dvdy;
|
||||
|
||||
// no lookup case
|
||||
if (palbase == nullptr)
|
||||
{
|
||||
// loop over cols
|
||||
for (s32 x = setup.startx; x < endx; x++)
|
||||
{
|
||||
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
||||
u32 r = (source32_r(pix) * sr * dest_r(dpix)) >> (16 - _SrcShiftR);
|
||||
u32 g = (source32_g(pix) * sg * dest_g(dpix)) >> (16 - _SrcShiftG);
|
||||
u32 b = (source32_b(pix) * sb * dest_b(dpix)) >> (16 - _SrcShiftB);
|
||||
|
||||
*dest++ = dest_assemble_rgb(r, g, b);
|
||||
curu += dudx;
|
||||
curv += dvdx;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// loop over cols
|
||||
for (s32 x = setup.startx; x < endx; x++)
|
||||
{
|
||||
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
||||
u32 r = (palbase[(pix >> 16) & 0xff] * sr * dest_r(dpix)) >> 16;
|
||||
u32 g = (palbase[(pix >> 8) & 0xff] * sg * dest_g(dpix)) >> 16;
|
||||
u32 b = (palbase[(pix >> 0) & 0xff] * sb * dest_b(dpix)) >> 16;
|
||||
|
||||
*dest++ = dest_assemble_rgb(r, g, b);
|
||||
curu += dudx;
|
||||
curv += dvdx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// draw_quad_argb32_add - perform
|
||||
// rasterization by using RGB add
|
||||
@ -1803,6 +1802,11 @@ private:
|
||||
draw_quad_rgb32(prim, dstdata, pitch, setup);
|
||||
break;
|
||||
|
||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_RGB_MULTIPLY):
|
||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_RGB_MULTIPLY):
|
||||
draw_quad_rgb32_multiply(prim, dstdata, pitch, setup);
|
||||
break;
|
||||
|
||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_ADD):
|
||||
draw_quad_rgb32_add(prim, dstdata, pitch, setup);
|
||||
break;
|
||||
@ -1811,10 +1815,6 @@ private:
|
||||
draw_quad_argb32_alpha(prim, dstdata, pitch, setup);
|
||||
break;
|
||||
|
||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_RGB_MULTIPLY):
|
||||
draw_quad_argb32_multiply(prim, dstdata, pitch, setup);
|
||||
break;
|
||||
|
||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_ADD):
|
||||
draw_quad_argb32_add(prim, dstdata, pitch, setup);
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user