From 4c08395ada93f9e4cd0cfe35106f340ad627f77d Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 30 Mar 2016 14:33:18 +0200 Subject: [PATCH] namcos22: optimization to gamma mix for non-super system22 --- src/mame/video/namcos22.cpp | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/mame/video/namcos22.cpp b/src/mame/video/namcos22.cpp index 317b78cc12a..ddd733a3313 100644 --- a/src/mame/video/namcos22.cpp +++ b/src/mame/video/namcos22.cpp @@ -1954,6 +1954,10 @@ void namcos22_state::namcos22_mix_text_layer(screen_device &screen, bitmap_rgb32 UINT32 *dest; UINT8 *pri; + const UINT8 *rlut = &m_gamma_proms[0x000]; + const UINT8 *glut = &m_gamma_proms[0x100]; + const UINT8 *blut = &m_gamma_proms[0x200]; + // prepare fader and shadow factor bool fade_enabled = m_mixer_flags & 2 && m_poly_fade_enabled; bool shadow_enabled = (m_mixer_flags & 0x100) != 0; // ? (ridgerac is the only game not using shadow) @@ -1973,6 +1977,8 @@ void namcos22_state::namcos22_mix_text_layer(screen_device &screen, bitmap_rgb32 pri = &screen.priority().pix8(y); for (int x = cliprect.min_x; x <= cliprect.max_x; x++) { + UINT32 pixel = dest[x]; + // skip if transparent or under poly if (pri[x] == 2) { @@ -1985,7 +1991,7 @@ void namcos22_state::namcos22_mix_text_layer(screen_device &screen, bitmap_rgb32 case 0xfe: if (shadow_enabled) { - rgb.set(dest[x]); + rgb.set(pixel); rgb.scale_and_clamp(rgb_mix[(src[x] & 0xf) - 0xc]); break; } @@ -2004,8 +2010,11 @@ void namcos22_state::namcos22_mix_text_layer(screen_device &screen, bitmap_rgb32 // eg. a rr-gg-bb of 3f-7f-00 will fade to ff-ff-00 and not ff-ff-ff // seen in victlapw attract mode - dest[x] = rgb.to_rgba(); + pixel = rgb.to_rgba(); } + + // final mix gamma here + dest[x] = (rlut[(pixel >> 16) & 0xff] << 16) | (glut[(pixel >> 8) & 0xff] << 8) | blut[pixel & 0xff]; } } } @@ -2333,24 +2342,7 @@ UINT32 namcos22_state::screen_update_namcos22(screen_device &screen, bitmap_rgb3 // layers draw_polygons(bitmap); m_poly->render_scene(screen, bitmap); - draw_text_layer(screen, bitmap, cliprect); - - // apply gamma - const UINT8 *rlut = &m_gamma_proms[0x000]; - const UINT8 *glut = &m_gamma_proms[0x100]; - const UINT8 *blut = &m_gamma_proms[0x200]; - for (int y = cliprect.min_y; y <= cliprect.max_y; y++) - { - UINT32 *dest = &bitmap.pix32(y); - for (int x = cliprect.min_x; x <= cliprect.max_x; x++) - { - int rgb = dest[x]; - int r = rlut[(rgb >> 16) & 0xff]; - int g = glut[(rgb >> 8) & 0xff]; - int b = blut[rgb & 0xff]; - dest[x] = (r << 16) | (g << 8) | b; - } - } + draw_text_layer(screen, bitmap, cliprect); // text layer + final mix(gamma) return 0; }