From: Toni Wilen Date: Thu, 4 Oct 2018 13:51:03 +0000 (+0300) Subject: Added scanline vertical offset option. X-Git-Tag: 4100~69 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=dcafb55ca5c63f79219d0da2ae6cd4026a4c5562;p=francis%2Fwinuae.git Added scanline vertical offset option. --- diff --git a/cfgfile.cpp b/cfgfile.cpp index 49d29961..bcdcf5c6 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -2126,10 +2126,11 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_dwrite_ext (f, _T("gfx_filter_top_border"), ext, _T("%d"), gf->gfx_filter_top_border); cfgfile_dwrite_ext (f, _T("gfx_filter_bottom_border"), ext, _T("%d"), gf->gfx_filter_bottom_border); - cfgfile_dwrite_ext (f, _T("gfx_filter_scanlines"), ext, _T("%d"), gf->gfx_filter_scanlines); - cfgfile_dwrite_ext (f, _T("gfx_filter_scanlinelevel"), ext, _T("%d"), gf->gfx_filter_scanlinelevel); - cfgfile_dwrite_ext (f, _T("gfx_filter_scanlineratio"), ext, _T("%d"), gf->gfx_filter_scanlineratio); - + cfgfile_dwrite_ext(f, _T("gfx_filter_scanlines"), ext, _T("%d"), gf->gfx_filter_scanlines); + cfgfile_dwrite_ext(f, _T("gfx_filter_scanlinelevel"), ext, _T("%d"), gf->gfx_filter_scanlinelevel); + cfgfile_dwrite_ext(f, _T("gfx_filter_scanlineratio"), ext, _T("%d"), gf->gfx_filter_scanlineratio); + cfgfile_dwrite_ext(f, _T("gfx_filter_scanlineoffset"), ext, _T("%d"), gf->gfx_filter_scanlineoffset); + cfgfile_dwrite_ext (f, _T("gfx_filter_luminance"), ext, _T("%d"), gf->gfx_filter_luminance); cfgfile_dwrite_ext (f, _T("gfx_filter_contrast"), ext, _T("%d"), gf->gfx_filter_contrast); cfgfile_dwrite_ext (f, _T("gfx_filter_saturation"), ext, _T("%d"), gf->gfx_filter_saturation); @@ -3287,31 +3288,32 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) || cfgfile_strval (option, value, _T("gfx_filter_autoscale_limit"), ext, &gf->gfx_filter_integerscalelimit, autoscalelimit, 0)) return 1; - if (cfgfile_floatval (option, value, _T("gfx_filter_vert_zoomf"), ext, &gf->gfx_filter_vert_zoom) - || cfgfile_floatval (option, value, _T("gfx_filter_horiz_zoomf"), ext, &gf->gfx_filter_horiz_zoom) - || cfgfile_floatval (option, value, _T("gfx_filter_vert_zoom_multf"), ext, &gf->gfx_filter_vert_zoom_mult) - || cfgfile_floatval (option, value, _T("gfx_filter_horiz_zoom_multf"), ext, &gf->gfx_filter_horiz_zoom_mult) - || cfgfile_floatval (option, value, _T("gfx_filter_vert_offsetf"), ext, &gf->gfx_filter_vert_offset) - || cfgfile_floatval (option, value, _T("gfx_filter_horiz_offsetf"), ext, &gf->gfx_filter_horiz_offset) - || cfgfile_intval (option, value, _T("gfx_filter_left_border"), ext, &gf->gfx_filter_left_border, 1) - || cfgfile_intval (option, value, _T("gfx_filter_right_border"), ext, &gf->gfx_filter_right_border, 1) - || cfgfile_intval (option, value, _T("gfx_filter_top_border"), ext, &gf->gfx_filter_top_border, 1) - || cfgfile_intval (option, value, _T("gfx_filter_bottom_border"), ext, &gf->gfx_filter_bottom_border, 1) - || cfgfile_intval (option, value, _T("gfx_filter_scanlines"), ext, &gf->gfx_filter_scanlines, 1) - || cfgfile_intval (option, value, _T("gfx_filter_scanlinelevel"), ext, &gf->gfx_filter_scanlinelevel, 1) - || cfgfile_intval (option, value, _T("gfx_filter_scanlineratio"), ext, &gf->gfx_filter_scanlineratio, 1) - || cfgfile_intval (option, value, _T("gfx_filter_luminance"), ext, &gf->gfx_filter_luminance, 1) - || cfgfile_intval (option, value, _T("gfx_filter_contrast"), ext, &gf->gfx_filter_contrast, 1) - || cfgfile_intval (option, value, _T("gfx_filter_saturation"), ext, &gf->gfx_filter_saturation, 1) - || cfgfile_intval (option, value, _T("gfx_filter_gamma"), ext, &gf->gfx_filter_gamma, 1) - || cfgfile_intval (option, value, _T("gfx_filter_gamma_r"), ext, &gf->gfx_filter_gamma_ch[0], 1) - || cfgfile_intval (option, value, _T("gfx_filter_gamma_g"), ext, &gf->gfx_filter_gamma_ch[1], 1) - || cfgfile_intval (option, value, _T("gfx_filter_gamma_b"), ext, &gf->gfx_filter_gamma_ch[2], 1) - || cfgfile_intval (option, value, _T("gfx_filter_blur"), ext, &gf->gfx_filter_blur, 1) - || cfgfile_intval (option, value, _T("gfx_filter_noise"), ext, &gf->gfx_filter_noise, 1) - || cfgfile_intval (option, value, _T("gfx_filter_bilinear"), ext, &gf->gfx_filter_bilinear, 1) - || cfgfile_intval (option, value, _T("gfx_filter_keep_autoscale_aspect"), ext, &gf->gfx_filter_keep_autoscale_aspect, 1) - || cfgfile_string (option, value, _T("gfx_filter_mask"), ext, gf->gfx_filtermask[2 * MAX_FILTERSHADERS], sizeof gf->gfx_filtermask[2 * MAX_FILTERSHADERS] / sizeof (TCHAR))) + if (cfgfile_floatval(option, value, _T("gfx_filter_vert_zoomf"), ext, &gf->gfx_filter_vert_zoom) + || cfgfile_floatval(option, value, _T("gfx_filter_horiz_zoomf"), ext, &gf->gfx_filter_horiz_zoom) + || cfgfile_floatval(option, value, _T("gfx_filter_vert_zoom_multf"), ext, &gf->gfx_filter_vert_zoom_mult) + || cfgfile_floatval(option, value, _T("gfx_filter_horiz_zoom_multf"), ext, &gf->gfx_filter_horiz_zoom_mult) + || cfgfile_floatval(option, value, _T("gfx_filter_vert_offsetf"), ext, &gf->gfx_filter_vert_offset) + || cfgfile_floatval(option, value, _T("gfx_filter_horiz_offsetf"), ext, &gf->gfx_filter_horiz_offset) + || cfgfile_intval(option, value, _T("gfx_filter_left_border"), ext, &gf->gfx_filter_left_border, 1) + || cfgfile_intval(option, value, _T("gfx_filter_right_border"), ext, &gf->gfx_filter_right_border, 1) + || cfgfile_intval(option, value, _T("gfx_filter_top_border"), ext, &gf->gfx_filter_top_border, 1) + || cfgfile_intval(option, value, _T("gfx_filter_bottom_border"), ext, &gf->gfx_filter_bottom_border, 1) + || cfgfile_intval(option, value, _T("gfx_filter_scanlines"), ext, &gf->gfx_filter_scanlines, 1) + || cfgfile_intval(option, value, _T("gfx_filter_scanlinelevel"), ext, &gf->gfx_filter_scanlinelevel, 1) + || cfgfile_intval(option, value, _T("gfx_filter_scanlineratio"), ext, &gf->gfx_filter_scanlineratio, 1) + || cfgfile_intval(option, value, _T("gfx_filter_scanlineoffset"), ext, &gf->gfx_filter_scanlineoffset, 1) + || cfgfile_intval(option, value, _T("gfx_filter_luminance"), ext, &gf->gfx_filter_luminance, 1) + || cfgfile_intval(option, value, _T("gfx_filter_contrast"), ext, &gf->gfx_filter_contrast, 1) + || cfgfile_intval(option, value, _T("gfx_filter_saturation"), ext, &gf->gfx_filter_saturation, 1) + || cfgfile_intval(option, value, _T("gfx_filter_gamma"), ext, &gf->gfx_filter_gamma, 1) + || cfgfile_intval(option, value, _T("gfx_filter_gamma_r"), ext, &gf->gfx_filter_gamma_ch[0], 1) + || cfgfile_intval(option, value, _T("gfx_filter_gamma_g"), ext, &gf->gfx_filter_gamma_ch[1], 1) + || cfgfile_intval(option, value, _T("gfx_filter_gamma_b"), ext, &gf->gfx_filter_gamma_ch[2], 1) + || cfgfile_intval(option, value, _T("gfx_filter_blur"), ext, &gf->gfx_filter_blur, 1) + || cfgfile_intval(option, value, _T("gfx_filter_noise"), ext, &gf->gfx_filter_noise, 1) + || cfgfile_intval(option, value, _T("gfx_filter_bilinear"), ext, &gf->gfx_filter_bilinear, 1) + || cfgfile_intval(option, value, _T("gfx_filter_keep_autoscale_aspect"), ext, &gf->gfx_filter_keep_autoscale_aspect, 1) + || cfgfile_string(option, value, _T("gfx_filter_mask"), ext, gf->gfx_filtermask[2 * MAX_FILTERSHADERS], sizeof gf->gfx_filtermask[2 * MAX_FILTERSHADERS] / sizeof (TCHAR))) return 1; } #endif @@ -7639,6 +7641,7 @@ void default_prefs (struct uae_prefs *p, bool reset, int type) struct gfx_filterdata *f = &p->gf[i]; f->gfx_filter = 0; f->gfx_filter_scanlineratio = (1 << 4) | 1; + f->gfx_filter_scanlineoffset = 1; for (int j = 0; j <= 2 * MAX_FILTERSHADERS; j++) { f->gfx_filtershader[i][0] = 0; f->gfx_filtermask[i][0] = 0; diff --git a/include/options.h b/include/options.h index 1e1a78e6..cf280f24 100644 --- a/include/options.h +++ b/include/options.h @@ -353,6 +353,7 @@ struct gfx_filterdata int gfx_filter_scanlines; int gfx_filter_scanlineratio; int gfx_filter_scanlinelevel; + int gfx_filter_scanlineoffset; float gfx_filter_horiz_zoom, gfx_filter_vert_zoom; float gfx_filter_horiz_zoom_mult, gfx_filter_vert_zoom_mult; float gfx_filter_horiz_offset, gfx_filter_vert_offset; diff --git a/od-win32/direct3d.cpp b/od-win32/direct3d.cpp index 229d5dda..a62a33b6 100644 --- a/od-win32/direct3d.cpp +++ b/od-win32/direct3d.cpp @@ -195,7 +195,7 @@ struct d3dstruct struct gfx_filterdata *filterd3d; int filterd3didx; - int scanline_osl1, scanline_osl2, scanline_osl3; + int scanline_osl1, scanline_osl2, scanline_osl3, scanline_osl4; D3DXHANDLE postSourceTextureHandle; D3DXHANDLE postMaskTextureHandle; @@ -1438,12 +1438,15 @@ static void createscanlines (struct d3dstruct *d3d, int force) if (d3d->scanline_osl1 == d3d->filterd3d->gfx_filter_scanlines && d3d->scanline_osl3 == d3d->filterd3d->gfx_filter_scanlinelevel && - d3d->scanline_osl2 == d3d->filterd3d->gfx_filter_scanlineratio && !force) + d3d->scanline_osl2 == d3d->filterd3d->gfx_filter_scanlineratio && + d3d->scanline_osl4 == d3d->filterd3d->gfx_filter_scanlineoffset && + !force) return; bpp = d3d->t_depth < 32 ? 2 : 4; d3d->scanline_osl1 = d3d->filterd3d->gfx_filter_scanlines; d3d->scanline_osl3 = d3d->filterd3d->gfx_filter_scanlinelevel; d3d->scanline_osl2 = d3d->filterd3d->gfx_filter_scanlineratio; + d3d->scanline_osl4 = d3d->filterd3d->gfx_filter_scanlineoffset; sl4 = d3d->filterd3d->gfx_filter_scanlines * 16 / 100; sl42 = d3d->filterd3d->gfx_filter_scanlinelevel * 16 / 100; if (sl4 > 15) @@ -1469,13 +1472,15 @@ static void createscanlines (struct d3dstruct *d3d, int force) return; } sld = (uae_u8*)locked.pBits; - for (y = 0; y < d3d->required_sl_texture_h; y++) - memset (sld + y * locked.Pitch, 0, d3d->required_sl_texture_w * bpp); - for (y = 1; y < d3d->required_sl_texture_h; y += l1 + l2) { + for (y = 0; y < d3d->required_sl_texture_h; y++) { + memset(sld + y * locked.Pitch, 0, d3d->required_sl_texture_w * bpp); + } + for (y = 0; y < d3d->required_sl_texture_h; y += l1 + l2) { + int y2 = y + (d3d->filterd3d->gfx_filter_scanlineoffset % (l1 + 1)); for (yy = 0; yy < l2 && y + yy < d3d->required_sl_texture_h; yy++) { for (x = 0; x < d3d->required_sl_texture_w; x++) { uae_u8 sll = sl42; - p = &sld[(y + yy) * locked.Pitch + (x * bpp)]; + p = &sld[(y + y2) * locked.Pitch + (x * bpp)]; if (bpp < 4) { /* 16-bit, A4R4G4B4 */ p[1] = (sl4 << 4) | (sll << 0); diff --git a/od-win32/direct3d11.cpp b/od-win32/direct3d11.cpp index f87862d7..5514522d 100644 --- a/od-win32/direct3d11.cpp +++ b/od-win32/direct3d11.cpp @@ -295,7 +295,7 @@ struct d3d11struct struct gfx_filterdata *filterd3d; int filterd3didx; - int scanline_osl1, scanline_osl2, scanline_osl3; + int scanline_osl1, scanline_osl2, scanline_osl3, scanline_osl4; struct shaderdata11 shaders[MAX_SHADERS]; ID3DX11EffectTechnique *technique; @@ -2149,12 +2149,15 @@ static void createscanlines(struct d3d11struct *d3d, int force) if (d3d->scanline_osl1 == d3d->filterd3d->gfx_filter_scanlines && d3d->scanline_osl3 == d3d->filterd3d->gfx_filter_scanlinelevel && - d3d->scanline_osl2 == d3d->filterd3d->gfx_filter_scanlineratio && !force) + d3d->scanline_osl2 == d3d->filterd3d->gfx_filter_scanlineratio && + d3d->scanline_osl4 == d3d->filterd3d->gfx_filter_scanlineoffset && + !force) return; bpp = 4; d3d->scanline_osl1 = d3d->filterd3d->gfx_filter_scanlines; d3d->scanline_osl3 = d3d->filterd3d->gfx_filter_scanlinelevel; d3d->scanline_osl2 = d3d->filterd3d->gfx_filter_scanlineratio; + d3d->scanline_osl4 = d3d->filterd3d->gfx_filter_scanlineoffset; sl4 = d3d->filterd3d->gfx_filter_scanlines * 16 / 100; sl42 = d3d->filterd3d->gfx_filter_scanlinelevel * 16 / 100; if (sl4 > 15) @@ -2180,13 +2183,15 @@ static void createscanlines(struct d3d11struct *d3d, int force) return; } sld = (uae_u8*)map.pData; - for (y = 0; y < d3d->m_screenHeight; y++) + for (y = 0; y < d3d->m_screenHeight; y++) { memset(sld + y * map.RowPitch, 0, d3d->m_screenWidth * bpp); - for (y = 1; y < d3d->m_screenHeight; y += l1 + l2) { + } + for (y = 0; y < d3d->m_screenHeight; y += l1 + l2) { + int y2 = y + (d3d->filterd3d->gfx_filter_scanlineoffset % (l1 + 1)); for (yy = 0; yy < l2 && y + yy < d3d->m_screenHeight; yy++) { for (x = 0; x < d3d->m_screenWidth; x++) { uae_u8 sll = sl42; - p = &sld[(y + yy) * map.RowPitch + (x * bpp)]; + p = &sld[(y2 + yy) * map.RowPitch + (x * bpp)]; /* 32-bit, A8R8G8B8 */ uae_u8 sll4 = sl4 | (sl4 << 4); uae_u8 sll2 = sll | (sll << 4); diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index 88174af0..1a55e996 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -2151,7 +2151,7 @@ END STRINGTABLE BEGIN IDS_FILTER_PAL_EXTRA "Brightness\nContrast\nSaturation\nGamma\nScanlines\nBlurriness\nNoise\n" - IDS_FILTER_3D_EXTRA "Point/Bilinear\nScanline opacity\nScanline level\n" + IDS_FILTER_3D_EXTRA "Point/Bilinear\nScanline opacity\nScanline level\nScanline offset\n" IDS_ALWAYS_ON "Always on" IDS_DISPLAY_ATTRIBUTES "Brightness\nContrast\nGamma\nGamma [R]\nGamma [G]\nGamma [B]\nDark palette fix" IDS_NUMSG_NO_PPC "PPC CPU was started but PPC CPU emulation core plugin was not found. Download available from http://www.winuae.net/" diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index 7c54a1c9..fdde3e20 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -2291,7 +2291,8 @@ int check_prefs_changed_gfx (void) c |= gf->gfx_filter_scanlines != gfc->gfx_filter_scanlines ? (1|8) : 0; c |= gf->gfx_filter_scanlinelevel != gfc->gfx_filter_scanlinelevel ? (1|8) : 0; - c |= gf->gfx_filter_scanlineratio != gfc->gfx_filter_scanlineratio ? (1|8) : 0; + c |= gf->gfx_filter_scanlineratio != gfc->gfx_filter_scanlineratio ? (1 | 8) : 0; + c |= gf->gfx_filter_scanlineoffset != gfc->gfx_filter_scanlineoffset ? (1 | 8) : 0; c |= gf->gfx_filter_horiz_zoom_mult != gfc->gfx_filter_horiz_zoom_mult ? (1) : 0; c |= gf->gfx_filter_vert_zoom_mult != gfc->gfx_filter_vert_zoom_mult ? (1) : 0; diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index b97ddffa..070c1ab9 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -18517,6 +18517,7 @@ static struct filterxtra filter_3d_extra[] = _T("Point/Bilinear"), &workprefs.gf[0].gfx_filter_bilinear, &workprefs.gf[1].gfx_filter_bilinear, &currprefs.gf[0].gfx_filter_bilinear, &currprefs.gf[1].gfx_filter_bilinear, 0, 1, 1, _T("Scanline opacity"), &workprefs.gf[0].gfx_filter_scanlines, &workprefs.gf[1].gfx_filter_scanlines, &currprefs.gf[0].gfx_filter_scanlines, &currprefs.gf[1].gfx_filter_scanlines, 0, 100, 10, _T("Scanline level"), &workprefs.gf[0].gfx_filter_scanlinelevel, &workprefs.gf[1].gfx_filter_scanlinelevel, &currprefs.gf[0].gfx_filter_scanlinelevel, &currprefs.gf[1].gfx_filter_scanlinelevel, 0, 100, 10, + _T("Scanline offset"), &workprefs.gf[0].gfx_filter_scanlineoffset, &workprefs.gf[1].gfx_filter_scanlineoffset, &currprefs.gf[0].gfx_filter_scanlineoffset, &currprefs.gf[1].gfx_filter_scanlineoffset, 0, 3, 1, NULL }; static int dummy_in, dummy_out;