summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/namco_c355spr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/namco_c355spr.cpp')
-rw-r--r--src/mame/video/namco_c355spr.cpp271
1 files changed, 185 insertions, 86 deletions
diff --git a/src/mame/video/namco_c355spr.cpp b/src/mame/video/namco_c355spr.cpp
index 42944cebafd..556234aa3a8 100644
--- a/src/mame/video/namco_c355spr.cpp
+++ b/src/mame/video/namco_c355spr.cpp
@@ -39,20 +39,16 @@ namco_c355spr_device::namco_c355spr_device(const machine_config &mconfig, const
/**************************************************************************************/
void namco_c355spr_device::zdrawgfxzoom(
- screen_device &screen,
bitmap_ind16 &dest_bmp,const rectangle &clip,gfx_element *gfx,
u32 code,u32 color,bool flipx,bool flipy,int sx,int sy,
- int scalex, int scaley, int zpos)
+ int scalex, int scaley, u8 prival)
{
if (!scalex || !scaley) return;
if (dest_bmp.bpp() == 16)
{
if (gfx)
{
- device_palette_interface &palette = gfx->palette();
- const int shadow_offset = (palette.shadows_enabled()) ? palette.entries() : 0;
- const pen_t black = palette.black_pen();
- const pen_t *pal = &palette.pen(gfx->colorbase() + gfx->granularity() * (color % gfx->colors()));
+ const u32 pal = gfx->colorbase() + gfx->granularity() * (color % gfx->colors());
const u8 *source_base = gfx->get_data(code % gfx->elements());
int sprite_screen_height = (scaley * gfx->height() + 0x8000) >> 16;
int sprite_screen_width = (scalex * gfx->width() + 0x8000) >> 16;
@@ -113,67 +109,91 @@ void namco_c355spr_device::zdrawgfxzoom(
if (ex > sx)
{ /* skip if inner loop doesn't draw anything */
- bitmap_ind8 &priority_bitmap = screen.priority();
- if (priority_bitmap.valid())
+ for (int y = sy; y < ey; y++)
{
- for (int y = sy; y < ey; y++)
+ const u8 *source = source_base + (y_index>>16) * gfx->rowbytes();
+ u16 *dest = &dest_bmp.pix16(y);
+ int x_index = x_index_base;
+ for (int x = sx; x < ex; x++)
{
- const u8 *source = source_base + (y_index>>16) * gfx->rowbytes();
- u16 *dest = &dest_bmp.pix16(y);
- u8 *pri = &priority_bitmap.pix8(y);
- int x_index = x_index_base;
- if (m_palxor)
+ const u8 c = source[x_index>>16];
+ if (c != 0xff)
{
- for (int x = sx; x < ex; x++)
- {
- const u8 c = source[x_index>>16];
- if (c != 0xff)
- {
- if (pri[x] <= zpos)
- {
- switch (c)
- {
- case 0:
- dest[x] = 0x4000|(dest[x] & 0x1fff);
- break;
- case 1:
- dest[x] = 0x6000|(dest[x] & 0x1fff);
- break;
- default:
- dest[x] = pal[c];
- break;
- }
- pri[x] = zpos;
- }
- }
- x_index += dx;
- }
- y_index += dy;
+ dest[x] = ((prival & 0xf) << 12) | ((pal + c) & 0xfff);
+ }
+ x_index += dx;
+ }
+ y_index += dy;
+ }
+ }
+ }
+ }
+ }
+} /* zdrawgfxzoom */
+
+void namco_c355spr_device::copybitmap(bitmap_ind16 &dest_bmp, const rectangle &clip, u8 pri)
+{
+ device_palette_interface &palette = gfx(0)->palette();
+ const int shadow_offset = (palette.shadows_enabled()) ? palette.entries() : 0;
+ const pen_t black = palette.black_pen();
+ if (m_palxor)
+ {
+ for (int y = clip.min_y; y <= clip.max_y; y++)
+ {
+ u16 *src = &m_tempbitmap.pix16(y);
+ u16 *dest = &dest_bmp.pix16(y);
+ for (int x = clip.min_x; x <= clip.max_x; x++)
+ {
+ if (src[x] != 0xffff)
+ {
+ u8 srcpri = (src[x] >> 12) & 0xf;
+ u16 c = src[x] & 0xfff;
+ if (srcpri == pri)
+ {
+ if ((c & 0xff) != 0xff)
+ {
+ switch (c & 0xff)
+ {
+ case 0:
+ dest[x] = 0x4000|(dest[x] & 0x1fff);
+ break;
+ case 1:
+ dest[x] = 0x6000|(dest[x] & 0x1fff);
+ break;
+ default:
+ dest[x] = c;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ for (int y = clip.min_y; y <= clip.max_y; y++)
+ {
+ u16 *src = &m_tempbitmap.pix16(y);
+ u16 *dest = &dest_bmp.pix16(y);
+ for (int x = clip.min_x; x <= clip.max_x; x++)
+ {
+ if (src[x] != 0xffff)
+ {
+ u8 srcpri = (src[x] >> 12) & 0xf;
+ u16 c = src[x] & 0xfff;
+ if (srcpri == pri)
+ {
+ if ((c & 0xff) != 0xff)
+ {
+ if (c == 0xffe && shadow_offset)
+ {
+ if (dest[x] != black)
+ dest[x] |= shadow_offset;
}
else
{
- for (int x = sx; x < ex; x++)
- {
- const u8 c = source[x_index>>16];
- if (c != 0xff)
- {
- if (pri[x] <= zpos)
- {
- if (color == 0xf && c == 0xfe && shadow_offset)
- {
- if (dest[x] != black)
- dest[x] |= shadow_offset;
- }
- else
- {
- dest[x] = pal[c];
- }
- pri[x] = zpos;
- }
- }
- x_index += dx;
- }
- y_index += dy;
+ dest[x] = c;
}
}
}
@@ -181,19 +201,93 @@ void namco_c355spr_device::zdrawgfxzoom(
}
}
}
-} /* zdrawgfxzoom */
+}
-void namco_c355spr_device::zdrawgfxzoom(
- screen_device &screen,
- bitmap_rgb32 &dest_bmp,const rectangle &clip,gfx_element *gfx,
- u32 code,u32 color,bool flipx,bool flipy,int sx,int sy,
- int scalex, int scaley, int zpos)
+void namco_c355spr_device::copybitmap(bitmap_rgb32 &dest_bmp, const rectangle &clip, u8 pri)
{
- /* nop */
+ device_palette_interface &palette = gfx(0)->palette();
+ const int shadow_offset = (palette.shadows_enabled()) ? palette.entries() : 0;
+ const pen_t black = palette.black_pen();
+ const pen_t *pal = palette.pens();
+ if (m_palxor)
+ {
+ for (int y = clip.min_y; y <= clip.max_y; y++)
+ {
+ u16 *src = &m_tempbitmap.pix16(y);
+ u16 *srcrender = &m_screenbitmap.pix16(y);
+ u32 *dest = &dest_bmp.pix32(y);
+ for (int x = clip.min_x; x <= clip.max_x; x++)
+ {
+ if (src[x] != 0xffff)
+ {
+ u8 srcpri = (src[x] >> 12) & 0xf;
+ u16 c = src[x] & 0xfff;
+ if (srcpri == pri)
+ {
+ if ((c & 0xff) != 0xff)
+ {
+ switch (c & 0xff)
+ {
+ case 0:
+ srcrender[x] = 0x4000|(srcrender[x] & 0x1fff);
+ break;
+ case 1:
+ srcrender[x] = 0x6000|(srcrender[x] & 0x1fff);
+ break;
+ default:
+ srcrender[x] = c;
+ break;
+ }
+ dest[x] = pal[srcrender[x]];
+ }
+ }
+ }
+ else if (srcrender[x] != 0xffff)
+ dest[x] = pal[srcrender[x]];
+ }
+ }
+ }
+ else
+ {
+ for (int y = clip.min_y; y <= clip.max_y; y++)
+ {
+ u16 *src = &m_tempbitmap.pix16(y);
+ u16 *srcrender = &m_screenbitmap.pix16(y);
+ u32 *dest = &dest_bmp.pix32(y);
+ for (int x = clip.min_x; x <= clip.max_x; x++)
+ {
+ if (src[x] != 0xffff)
+ {
+ u8 srcpri = (src[x] >> 12) & 0xf;
+ u16 c = src[x] & 0xfff;
+ if (srcpri == pri)
+ {
+ if ((c & 0xff) != 0xff)
+ {
+ if (c == 0xffe && shadow_offset)
+ {
+ if (srcrender[x] != black)
+ srcrender[x] |= shadow_offset;
+ }
+ else
+ {
+ srcrender[x] = c;
+ }
+ dest[x] = pal[srcrender[x]];
+ }
+ }
+ }
+ else if (srcrender[x] != 0xffff)
+ dest[x] = pal[srcrender[x]];
+ }
+ }
+ }
}
void namco_c355spr_device::device_start()
{
+ screen().register_screen_bitmap(m_tempbitmap);
+ screen().register_screen_bitmap(m_screenbitmap);
gfx_layout obj_layout =
{
16,16,
@@ -435,7 +529,7 @@ void namco_c355spr_device::get_list(int no, const u16 *pSpriteList16, const u16
m_sprite_end[no] = sprite_ptr;
}
-void namco_c355spr_device::get_sprites()
+void namco_c355spr_device::get_sprites(const rectangle cliprect)
{
int buffer = std::max(0, m_buffer - 1);
// int offs = spriteram16[0x18000/2]; /* end-of-sprite-list */
@@ -445,22 +539,14 @@ void namco_c355spr_device::get_sprites()
get_list(0, &m_spriteram[buffer][0x02000/2], &m_spriteram[buffer][0x00000/2]);
// else
get_list(1, &m_spriteram[buffer][0x14000/2], &m_spriteram[buffer][0x10000/2]);
+
+ copy_sprites(cliprect);
}
-template<class BitmapClass>
-void namco_c355spr_device::draw_sprites(screen_device &screen, BitmapClass &bitmap, const rectangle &cliprect, int pri)
+void namco_c355spr_device::copy_sprites(const rectangle cliprect)
{
// int offs = spriteram16[0x18000/2]; /* end-of-sprite-list */
- if (pri == 0)
- {
- if (!m_external_prifill)
- {
- screen.priority().fill(0, cliprect);
- if (m_buffer == 0) // not buffered sprites
- get_sprites();
- }
- }
-
+ m_tempbitmap.fill(0xffff, cliprect);
for (int no = 0; no < 2; no++)
{
//if (offs == no)
@@ -470,7 +556,7 @@ void namco_c355spr_device::draw_sprites(screen_device &screen, BitmapClass &bitm
while (sprite_ptr != m_sprite_end[no])
{
- if ((sprite_ptr->pri == pri) && (sprite_ptr->disable == false))
+ if ((sprite_ptr->disable == false))
{
rectangle clip = sprite_ptr->clip;
clip &= cliprect;
@@ -479,15 +565,14 @@ void namco_c355spr_device::draw_sprites(screen_device &screen, BitmapClass &bitm
if ((sprite_ptr->tile[ind] & 0x8000) == 0)
{
zdrawgfxzoom(
- screen,
- bitmap,
+ m_tempbitmap,
clip,
gfx(0),
m_code2tile(sprite_ptr->tile[ind]) + sprite_ptr->offset,
sprite_ptr->color,
sprite_ptr->flipx, sprite_ptr->flipy,
sprite_ptr->x[ind], sprite_ptr->y[ind],
- sprite_ptr->zoomx[ind], sprite_ptr->zoomy[ind], i);
+ sprite_ptr->zoomx[ind], sprite_ptr->zoomy[ind], sprite_ptr->pri);
}
}
}
@@ -498,6 +583,20 @@ void namco_c355spr_device::draw_sprites(screen_device &screen, BitmapClass &bitm
}
}
+template<class BitmapClass>
+void namco_c355spr_device::draw_sprites(screen_device &screen, BitmapClass &bitmap, const rectangle &cliprect, int pri)
+{
+ if (pri == 0)
+ {
+ if (!m_external_prifill)
+ {
+ if (m_buffer == 0) // not buffered sprites
+ get_sprites(cliprect);
+ }
+ }
+ copybitmap(bitmap, cliprect, pri);
+}
+
void namco_c355spr_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri)
{
draw_sprites(screen, bitmap, cliprect, pri);
@@ -523,7 +622,7 @@ WRITE_LINE_MEMBER(namco_c355spr_device::vblank)
if (state)
{
if (m_buffer > 0)
- get_sprites();
+ get_sprites(screen().visible_area());
if (m_buffer > 1)
std::copy_n(m_spriteram[0].get(), 0x20000/2, m_spriteram[1].get());