From f0dd1c5a21cda8936d4d1e478b3aedeae5599c54 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 31 Jan 2016 15:40:16 +0200 Subject: [PATCH] Palette bypass + monochrome support. --- genlinetoscr.cpp | 40 +++++++++++++++++++++------------------- gfxutil.cpp | 19 ++++++++++++------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/genlinetoscr.cpp b/genlinetoscr.cpp index 43f40f5a..326440ad 100644 --- a/genlinetoscr.cpp +++ b/genlinetoscr.cpp @@ -142,7 +142,7 @@ static void out_linetoscr_do_srcpix (DEPTH_T bpp, HMODE_T hmode, int aga, CMODE_ if (aga && cmode != CMODE_DUALPF) { if (spr) outln ( " sprpix_val = pixdata.apixels[spix];"); - outln ( " spix_val = pixdata.apixels[spix] ^ xor_val;"); + outln ( " spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;"); } else if (cmode != CMODE_HAM) { outln ( " spix_val = pixdata.apixels[spix];"); if (spr) @@ -160,7 +160,7 @@ static void out_linetoscr_do_dstpix (DEPTH_T bpp, HMODE_T hmode, int aga, CMODE_ outln ( " dpix_val = CONVERT_RGB (spix_val);"); } else if (cmode == CMODE_HAM) { outln ( " spix_val = ham_linebuf[spix];"); - outln ( " dpix_val = xcolors[spix_val];"); + outln ( " dpix_val = p_xcolors[spix_val];"); if (spr) outln ( " sprpix_val = pixdata.apixels[spix];"); } else if (aga && cmode == CMODE_DUALPF) { @@ -169,23 +169,23 @@ static void out_linetoscr_do_dstpix (DEPTH_T bpp, HMODE_T hmode, int aga, CMODE_ outln ( " if (lookup_no[spix_val])"); outln ( " val += dblpfofs[bpldualpf2of];"); outln ( " val ^= xor_val;"); - outln ( " dpix_val = colors_for_drawing.acolors[val];"); + outln ( " dpix_val = p_acolors[val];"); outln ( " }"); } else if (cmode == CMODE_DUALPF) { - outln ( " dpix_val = colors_for_drawing.acolors[lookup[spix_val]];"); + outln ( " dpix_val = p_acolors[lookup[spix_val]];"); } else if (aga && cmode == CMODE_EXTRAHB) { outln ( " if (spix_val >= 32 && spix_val < 64) {"); outln ( " unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F;"); outln ( " dpix_val = CONVERT_RGB (c);"); outln ( " } else"); - outln ( " dpix_val = colors_for_drawing.acolors[spix_val];"); + outln ( " dpix_val = p_acolors[spix_val];"); } else if (cmode == CMODE_EXTRAHB) { outln ( " if (spix_val <= 31)"); - outln ( " dpix_val = colors_for_drawing.acolors[spix_val];"); + outln ( " dpix_val = p_acolors[spix_val];"); outln ( " else"); - outln ( " dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777];"); + outln ( " dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777];"); } else - outln ( " dpix_val = colors_for_drawing.acolors[spix_val];"); + outln ( " dpix_val = p_acolors[spix_val];"); } static void out_linetoscr_do_incspix (DEPTH_T bpp, HMODE_T hmode, int aga, CMODE_T cmode, int spr) @@ -287,7 +287,7 @@ static void out_sprite (DEPTH_T bpp, HMODE_T hmode, CMODE_T cmode, int aga, int outlnf ( " if (spritepixels[dpix].data) {"); outlnf ( " sprcol = render_sprites (dpix + 0, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga); outlnf(" if (sprcol) {"); - outlnf ( " out_val = colors_for_drawing.acolors[sprcol];"); + outlnf ( " out_val = p_acolors[sprcol];"); put_dpixsprgenlock(0, genlock); outlnf(" }"); outlnf(" }"); @@ -299,14 +299,14 @@ static void out_sprite (DEPTH_T bpp, HMODE_T hmode, CMODE_T cmode, int aga, int outlnf(" if (spritepixels[dpix + 0].data) {"); outlnf ( " sprcol = render_sprites (dpix + 0, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga); outlnf ( " if (sprcol) {"); - outlnf ( " out_val1 = colors_for_drawing.acolors[sprcol];"); + outlnf ( " out_val1 = p_acolors[sprcol];"); put_dpixsprgenlock(0, genlock); outlnf(" }"); outlnf(" }"); outlnf ( " if (spritepixels[dpix + 1].data) {"); outlnf ( " sprcol = render_sprites (dpix + 1, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga); outlnf ( " if (sprcol) {"); - outlnf ( " out_val2 = colors_for_drawing.acolors[sprcol];"); + outlnf ( " out_val2 = p_acolors[sprcol];"); put_dpixsprgenlock(1, genlock); outlnf(" }"); outlnf(" }"); @@ -322,28 +322,28 @@ static void out_sprite (DEPTH_T bpp, HMODE_T hmode, CMODE_T cmode, int aga, int outlnf(" if (spritepixels[dpix + 0].data) {"); outlnf ( " sprcol = render_sprites (dpix + 0, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga); outlnf ( " if (sprcol) {"); - outlnf ( " out_val1 = colors_for_drawing.acolors[sprcol];"); + outlnf ( " out_val1 = p_acolors[sprcol];"); put_dpixsprgenlock(0, genlock); outlnf(" }"); outlnf(" }"); outlnf ( " if (spritepixels[dpix + 1].data) {"); outlnf ( " sprcol = render_sprites (dpix + 1, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga); outlnf ( " if (sprcol) {"); - outlnf ( " out_val2 = colors_for_drawing.acolors[sprcol];"); + outlnf ( " out_val2 = p_acolors[sprcol];"); put_dpixsprgenlock(1, genlock); outlnf(" }"); outlnf(" }"); outlnf ( " if (spritepixels[dpix + 2].data) {"); outlnf ( " sprcol = render_sprites (dpix + 2, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga); outlnf ( " if (sprcol) {"); - outlnf ( " out_val3 = colors_for_drawing.acolors[sprcol];"); + outlnf ( " out_val3 = p_acolors[sprcol];"); put_dpixsprgenlock(2, genlock); outlnf(" }"); outlnf(" }"); outlnf ( " if (spritepixels[dpix + 3].data) {"); outlnf ( " sprcol = render_sprites (dpix + 3, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga); outlnf ( " if (sprcol) {"); - outlnf ( " out_val4 = colors_for_drawing.acolors[sprcol];"); + outlnf ( " out_val4 = p_acolors[sprcol];"); put_dpixsprgenlock(3, genlock); outlnf(" }"); outlnf(" }"); @@ -358,7 +358,7 @@ static void out_sprite (DEPTH_T bpp, HMODE_T hmode, CMODE_T cmode, int aga, int outlnf ( " sprcol = render_sprites (dpix, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga); put_dpixsprgenlock(0, genlock); outlnf(" if (sprcol) {"); - outlnf ( " uae_u32 spcol = colors_for_drawing.acolors[sprcol];"); + outlnf ( " uae_u32 spcol = p_acolors[sprcol];"); outlnf ( " out_val = spcol;"); outlnf ( " }"); outlnf ( " }"); @@ -414,7 +414,7 @@ static void out_linetoscr_mode (DEPTH_T bpp, HMODE_T hmode, int aga, int spr, CM if (spr >= 0) outln ( " out_val = dpix_val;"); else - outln ( " out_val = colors_for_drawing.acolors[0];"); + outln ( " out_val = p_acolors[0];"); if (hmode == HMODE_DOUBLE) { put_dpixgenlock(0, cmode, aga, genlock, NULL); @@ -532,8 +532,10 @@ static void out_linetoscr (DEPTH_T bpp, HMODE_T hmode, int aga, int spr, int gen outlnf(" uae_u8 *genlock_buf = xlinebuffer_genlock;"); if (spr) outln ( " uae_u8 sprcol;"); - if (aga && spr >= 0) - outln ( " uae_u8 xor_val = bplxor;"); + if (aga && spr >= 0) { + outln(" uae_u8 xor_val = bplxor;"); + outln(" uae_u8 and_val = bpland;"); + } outln ( ""); if (spr >= 0) { diff --git a/gfxutil.cpp b/gfxutil.cpp index ac269938..9580d4c1 100644 --- a/gfxutil.cpp +++ b/gfxutil.cpp @@ -154,12 +154,16 @@ static void video_calc_gammatable (void) v = video_gamma((float)(i - 256), gams[j], bri, con); vi = (uae_u32)v; - if (vi > 255) - vi = 255; if (currprefs.gfx_luminance == 0 && currprefs.gfx_contrast == 0 && currprefs.gfx_gamma == 0) vi = i & 0xff; + if (currprefs.gfx_threebitcolors) + vi *= 2; + + if (vi > 255) + vi = 255; + gamma[i][j] = vi; } } @@ -363,12 +367,13 @@ void alloc_colors64k (int rw, int gw, int bw, int rs, int gs, int bs, int aw, in r = gamma[r + j][0]; g = gamma[g + j][1]; b = gamma[b + j][2]; - xcolors[i] = doMask(r, rw, rs) | doMask(g, gw, gs) | doMask(b, bw, bs) | doAlpha (alpha, aw, as); + xcolors[i] = doMask(r, rw, rs) | doMask(g, gw, gs) | doMask(b, bw, bs) | doAlpha(alpha, aw, as); if (byte_swap) { - if (bpp <= 16) - xcolors[i] = bswap_16 (xcolors[i]); - else - xcolors[i] = bswap_32 (xcolors[i]); + if (bpp <= 16) { + xcolors[i] = bswap_16(xcolors[i]); + } else { + xcolors[i] = bswap_32(xcolors[i]); + } } if (bpp <= 16) { /* Fill upper 16 bits of each colour value -- 2.47.3