mirror of
https://github.com/holub/mame
synced 2025-06-08 05:44:09 +03:00
Merge pull request #4420 from cam900/nslasher
deco32.cpp : Make ACE related mixing routine now related to cliprect
This commit is contained in:
commit
cbf1582e4f
@ -242,27 +242,27 @@ void nslasher_state::mixDualAlphaSprites(screen_device &screen, bitmap_rgb32 &bi
|
|||||||
const pen_t *pal0 = &pens[gfx0->colorbase()];
|
const pen_t *pal0 = &pens[gfx0->colorbase()];
|
||||||
const pen_t *pal1 = &pens[gfx1->colorbase()];
|
const pen_t *pal1 = &pens[gfx1->colorbase()];
|
||||||
const pen_t *pal2 = &pens[m_gfxdecode->gfx((m_pri & 1) ? 1 : 2)->colorbase()];
|
const pen_t *pal2 = &pens[m_gfxdecode->gfx((m_pri & 1) ? 1 : 2)->colorbase()];
|
||||||
int x,y;
|
|
||||||
bitmap_ind16& sprite0_mix_bitmap = m_sprgen[0]->get_sprite_temp_bitmap();
|
bitmap_ind16& sprite0_mix_bitmap = m_sprgen[0]->get_sprite_temp_bitmap();
|
||||||
bitmap_ind16& sprite1_mix_bitmap = m_sprgen[1]->get_sprite_temp_bitmap();
|
bitmap_ind16& sprite1_mix_bitmap = m_sprgen[1]->get_sprite_temp_bitmap();
|
||||||
|
|
||||||
|
|
||||||
/* Mix sprites into main bitmap, based on priority & alpha */
|
/* Mix sprites into main bitmap, based on priority & alpha */
|
||||||
for (y=8; y<248; y++) {
|
for (int y = cliprect.top(); y <= cliprect.bottom(); y++)
|
||||||
|
{
|
||||||
uint8_t* tilemapPri = &screen.priority().pix8(y);
|
uint8_t* tilemapPri = &screen.priority().pix8(y);
|
||||||
uint16_t* sprite0 = &sprite0_mix_bitmap.pix16(y);
|
uint16_t* sprite0 = &sprite0_mix_bitmap.pix16(y);
|
||||||
uint16_t* sprite1 = &sprite1_mix_bitmap.pix16(y);
|
uint16_t* sprite1 = &sprite1_mix_bitmap.pix16(y);
|
||||||
uint32_t* destLine = &bitmap.pix32(y);
|
uint32_t* destLine = &bitmap.pix32(y);
|
||||||
uint16_t* alphaTilemap = &m_tilemap_alpha_bitmap->pix16(y);
|
uint16_t* alphaTilemap = &m_tilemap_alpha_bitmap->pix16(y);
|
||||||
|
|
||||||
for (x=0; x<320; x++) {
|
for (int x = cliprect.left(); x <= cliprect.right(); x++)
|
||||||
uint16_t priColAlphaPal0=sprite0[x];
|
{
|
||||||
uint16_t priColAlphaPal1=sprite1[x];
|
uint16_t const priColAlphaPal0 = sprite0[x];
|
||||||
uint16_t pri0=(priColAlphaPal0&0x6000)>>13;
|
uint16_t const priColAlphaPal1 = sprite1[x];
|
||||||
uint16_t pri1=(priColAlphaPal1&0x6000)>>13;
|
uint16_t const pri0 = (priColAlphaPal0 & 0x6000) >> 13;
|
||||||
uint16_t col0=((priColAlphaPal0&0x1f00)>>8) % gfx0->colors();
|
uint16_t const pri1 = (priColAlphaPal1 & 0x6000) >> 13;
|
||||||
uint16_t col1=((priColAlphaPal1&0x0f00)>>8) % gfx1->colors();
|
uint16_t const col0 = (((priColAlphaPal0 & 0x1f00) >> 8) % gfx0->colors()) * gfx0->granularity();
|
||||||
uint16_t alpha1=priColAlphaPal1&0x8000;
|
uint16_t const col1 = (((priColAlphaPal1 & 0x0f00) >> 8) % gfx1->colors()) * gfx1->granularity();
|
||||||
|
uint16_t const alpha1 = priColAlphaPal1 & 0x8000;
|
||||||
|
|
||||||
// Apply sprite bitmap 0 according to priority rules
|
// Apply sprite bitmap 0 according to priority rules
|
||||||
if ((priColAlphaPal0 & 0xff) != 0)
|
if ((priColAlphaPal0 & 0xff) != 0)
|
||||||
@ -277,17 +277,17 @@ void nslasher_state::mixDualAlphaSprites(screen_device &screen, bitmap_rgb32 &bi
|
|||||||
*/
|
*/
|
||||||
if ((pri0 & 0x3) == 0 || (pri0 & 0x3) == 1 || ((pri0 & 0x3) == 2 && mixAlphaTilemap)) // Spri0 on top of everything, or under alpha playfield
|
if ((pri0 & 0x3) == 0 || (pri0 & 0x3) == 1 || ((pri0 & 0x3) == 2 && mixAlphaTilemap)) // Spri0 on top of everything, or under alpha playfield
|
||||||
{
|
{
|
||||||
destLine[x]=pal0[(priColAlphaPal0&0xff) + (gfx0->granularity() * col0)];
|
destLine[x] = pal0[(priColAlphaPal0 & 0xff) + col0];
|
||||||
}
|
}
|
||||||
else if ((pri0 & 0x3) == 2) // Spri0 under top playfield
|
else if ((pri0 & 0x3) == 2) // Spri0 under top playfield
|
||||||
{
|
{
|
||||||
if (tilemapPri[x] < 4)
|
if (tilemapPri[x] < 4)
|
||||||
destLine[x]=pal0[(priColAlphaPal0&0xff) + (gfx0->granularity() * col0)];
|
destLine[x] = pal0[(priColAlphaPal0 & 0xff) + col0];
|
||||||
}
|
}
|
||||||
else // Spri0 under top & middle playfields
|
else // Spri0 under top & middle playfields
|
||||||
{
|
{
|
||||||
if (tilemapPri[x] < 2)
|
if (tilemapPri[x] < 2)
|
||||||
destLine[x]=pal0[(priColAlphaPal0&0xff) + (gfx0->granularity() * col0)];
|
destLine[x] = pal0[(priColAlphaPal0 & 0xff) + col0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,14 +317,14 @@ void nslasher_state::mixDualAlphaSprites(screen_device &screen, bitmap_rgb32 &bi
|
|||||||
if (pri1 == 0 && (((priColAlphaPal0 & 0xff) == 0 || ((pri0 & 0x3) != 0 && (pri0 & 0x3) != 1 && (pri0 & 0x3) != 2))))
|
if (pri1 == 0 && (((priColAlphaPal0 & 0xff) == 0 || ((pri0 & 0x3) != 0 && (pri0 & 0x3) != 1 && (pri0 & 0x3) != 2))))
|
||||||
{
|
{
|
||||||
if ((m_pri & 1) == 0 || ((m_pri & 1) == 1 && tilemapPri[x] < 4) || ((m_pri & 1) == 1 && mixAlphaTilemap))
|
if ((m_pri & 1) == 0 || ((m_pri & 1) == 1 && tilemapPri[x] < 4) || ((m_pri & 1) == 1 && mixAlphaTilemap))
|
||||||
destLine[x]=alpha_blend_r32(destLine[x], pal1[(priColAlphaPal1&0xff) + (gfx1->granularity() * col1)], 0x80);
|
destLine[x] = alpha_blend_r32(destLine[x], pal1[(priColAlphaPal1 & 0xff) + col1], 0x80);
|
||||||
}
|
}
|
||||||
else if (pri1 == 1 && ((priColAlphaPal0 & 0xff) == 0 || ((pri0 & 0x3) != 0 && (pri0 & 0x3) != 1 && (pri0 & 0x3) != 2)))
|
else if (pri1 == 1 && ((priColAlphaPal0 & 0xff) == 0 || ((pri0 & 0x3) != 0 && (pri0 & 0x3) != 1 && (pri0 & 0x3) != 2)))
|
||||||
destLine[x]=alpha_blend_r32(destLine[x], pal1[(priColAlphaPal1&0xff) + (gfx1->granularity() * col1)], 0x80);
|
destLine[x] = alpha_blend_r32(destLine[x], pal1[(priColAlphaPal1 & 0xff) + col1], 0x80);
|
||||||
else if (pri1 == 2) // TOdo
|
else if (pri1 == 2) // TOdo
|
||||||
destLine[x]=alpha_blend_r32(destLine[x], pal1[(priColAlphaPal1&0xff) + (gfx1->granularity() * col1)], 0x80);
|
destLine[x] = alpha_blend_r32(destLine[x], pal1[(priColAlphaPal1 & 0xff) + col1], 0x80);
|
||||||
else if (pri1 == 3) // TOdo
|
else if (pri1 == 3) // TOdo
|
||||||
destLine[x]=alpha_blend_r32(destLine[x], pal1[(priColAlphaPal1&0xff) + (gfx1->granularity() * col1)], 0x80);
|
destLine[x] = alpha_blend_r32(destLine[x], pal1[(priColAlphaPal1 & 0xff) + col1], 0x80);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -334,13 +334,13 @@ void nslasher_state::mixDualAlphaSprites(screen_device &screen, bitmap_rgb32 &bi
|
|||||||
Pri 0 - Under sprite 0 pri 0, over all tilemaps
|
Pri 0 - Under sprite 0 pri 0, over all tilemaps
|
||||||
*/
|
*/
|
||||||
if (pri1 == 0 && ((priColAlphaPal0 & 0xff) == 0 || ((pri0 & 0x3) != 0)))
|
if (pri1 == 0 && ((priColAlphaPal0 & 0xff) == 0 || ((pri0 & 0x3) != 0)))
|
||||||
destLine[x]=pal1[(priColAlphaPal1&0xff) + (gfx1->granularity() * col1)];
|
destLine[x] = pal1[(priColAlphaPal1 & 0xff) + col1];
|
||||||
else if (pri1 == 1) // todo
|
else if (pri1 == 1) // todo
|
||||||
destLine[x]=pal1[(priColAlphaPal1&0xff) + (gfx1->granularity() * col1)];
|
destLine[x] = pal1[(priColAlphaPal1 & 0xff) + col1];
|
||||||
else if (pri1 == 2) // todo
|
else if (pri1 == 2) // todo
|
||||||
destLine[x]=pal1[(priColAlphaPal1&0xff) + (gfx1->granularity() * col1)];
|
destLine[x] = pal1[(priColAlphaPal1 & 0xff) + col1];
|
||||||
else if (pri1 == 3) // todo
|
else if (pri1 == 3) // todo
|
||||||
destLine[x]=pal1[(priColAlphaPal1&0xff) + (gfx1->granularity() * col1)];
|
destLine[x] = pal1[(priColAlphaPal1 & 0xff) + col1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user