mirror of
https://github.com/holub/mame
synced 2025-07-01 08:18:59 +03:00
k001604: Implemented front layer rotate and zoom. [Ville Linde]
This commit is contained in:
parent
ffbc31a9a2
commit
f1497bb159
@ -274,14 +274,72 @@ void k001604_device::draw_back_layer( bitmap_rgb32 &bitmap, const rectangle &cli
|
|||||||
|
|
||||||
void k001604_device::draw_front_layer( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect )
|
void k001604_device::draw_front_layer( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect )
|
||||||
{
|
{
|
||||||
m_layer_8x8[0]->set_scrollx(-cliprect.min_x);
|
int32_t x = (int16_t)((m_reg[0x00] >> 16) & 0xffff);
|
||||||
m_layer_8x8[0]->set_scrolly(-cliprect.min_y);
|
int32_t y = (int16_t)((m_reg[0x00] >> 0) & 0xffff);
|
||||||
|
int32_t yy = (int16_t)((m_reg[0x01] >> 0) & 0xffff);
|
||||||
|
int32_t xy = (int16_t)((m_reg[0x01] >> 16) & 0xffff);
|
||||||
|
int32_t yx = (int16_t)((m_reg[0x02] >> 0) & 0xffff);
|
||||||
|
int32_t xx = (int16_t)((m_reg[0x02] >> 16) & 0xffff);
|
||||||
|
|
||||||
m_layer_8x8[1]->set_scrollx(-cliprect.min_x);
|
int pivotx = (int16_t)(0xfec0);
|
||||||
m_layer_8x8[1]->set_scrolly(-cliprect.min_y);
|
int pivoty = (int16_t)(0xff28);
|
||||||
|
|
||||||
|
int startx = ((x - pivotx) * 256) * 32;
|
||||||
|
int starty = ((y - pivoty) * 256) * 32;
|
||||||
|
int incxx = (xx) * 32;
|
||||||
|
int incxy = (-xy) * 32;
|
||||||
|
int incyx = (-yx) * 32;
|
||||||
|
int incyy = (yy) * 32;
|
||||||
|
|
||||||
//m_layer_8x8[1]->draw(bitmap, cliprect, 0,0);
|
bitmap_ind16& pixmap = m_layer_8x8[0]->pixmap();
|
||||||
m_layer_8x8[0]->draw(screen, bitmap, cliprect, 0,0);
|
|
||||||
|
// extract start/end points
|
||||||
|
int sx = cliprect.min_x;
|
||||||
|
int sy = cliprect.min_y;
|
||||||
|
int ex = cliprect.max_x;
|
||||||
|
int ey = cliprect.max_y;
|
||||||
|
|
||||||
|
const rgb_t *clut = palette().palette()->entry_list_raw();
|
||||||
|
|
||||||
|
int window_x, window_y, window_xmask, window_ymask;
|
||||||
|
|
||||||
|
window_x = 0;
|
||||||
|
window_y = 0;
|
||||||
|
window_xmask = pixmap.width() - 1;
|
||||||
|
window_ymask = pixmap.height() - 1;
|
||||||
|
|
||||||
|
|
||||||
|
// loop over rows
|
||||||
|
while (sy <= ey)
|
||||||
|
{
|
||||||
|
// initialize X counters
|
||||||
|
int x = sx;
|
||||||
|
uint32_t cx = startx;
|
||||||
|
uint32_t cy = starty;
|
||||||
|
|
||||||
|
uint32_t *dest = &bitmap.pix(sy, sx);
|
||||||
|
|
||||||
|
// loop over columns
|
||||||
|
while (x <= ex)
|
||||||
|
{
|
||||||
|
uint16_t pix = pixmap.pix16(((cy >> 16) & window_ymask) + window_y, ((cx >> 16) & window_xmask) + window_x);
|
||||||
|
if ((pix & 0xff) != 0)
|
||||||
|
{
|
||||||
|
*dest = clut[pix];
|
||||||
|
}
|
||||||
|
|
||||||
|
// advance in X
|
||||||
|
cx += incxx;
|
||||||
|
cy += incxy;
|
||||||
|
x++;
|
||||||
|
dest++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// advance in Y
|
||||||
|
startx += incyx;
|
||||||
|
starty += incyy;
|
||||||
|
sy++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
READ32_MEMBER( k001604_device::tile_r )
|
READ32_MEMBER( k001604_device::tile_r )
|
||||||
|
Loading…
Reference in New Issue
Block a user