From 6f87cee7edbd2b7d6907a2d03be48ce04398665d Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 26 Jun 2010 21:42:34 +0300 Subject: [PATCH] 2200b12 --- cfgfile.cpp | 56 ++++++++++ filesys.cpp | 21 ++-- include/options.h | 2 + od-win32/direct3d.cpp | 118 ++++++++++++++++++++- od-win32/win32.h | 6 +- od-win32/win32gfx.cpp | 2 + od-win32/winuae_msvc10/winuae_msvc.vcxproj | 12 +-- od-win32/winuaechangelog.txt | 10 ++ 8 files changed, 203 insertions(+), 24 deletions(-) diff --git a/cfgfile.cpp b/cfgfile.cpp index b012b6e9..074a9cfa 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -747,6 +747,19 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_dwrite (f, L"gfx_contrast", L"%d", p->gfx_contrast); cfgfile_dwrite (f, L"gfx_gamma", L"%d", p->gfx_gamma); cfgfile_dwrite_str (f, L"gfx_filter_mask", p->gfx_filtermask); + if (p->gfx_filteroverlay[0]) { + cfgfile_dwrite (f, L"gfx_filter_overlay", L"%s:%d%s,%d%s,%d%s,%d%s", + p->gfx_filteroverlay, + p->gfx_filteroverlay_pos.x >= -24000 ? p->gfx_filteroverlay_pos.x : -p->gfx_filteroverlay_pos.x - 30000, + p->gfx_filteroverlay_pos.x >= -24000 ? L"" : L"%", + p->gfx_filteroverlay_pos.y >= -24000 ? p->gfx_filteroverlay_pos.y : -p->gfx_filteroverlay_pos.y - 30000, + p->gfx_filteroverlay_pos.y >= -24000 ? L"" : L"%", + p->gfx_filteroverlay_pos.width >= -24000 ? p->gfx_filteroverlay_pos.width : -p->gfx_filteroverlay_pos.width - 30000, + p->gfx_filteroverlay_pos.width >= -24000 ? L"" : L"%", + p->gfx_filteroverlay_pos.height >= -24000 ? p->gfx_filteroverlay_pos.height : -p->gfx_filteroverlay_pos.height - 300000, + p->gfx_filteroverlay_pos.height >= -24000 ? L"" : L"%" + ); + } #endif cfgfile_write_bool (f, L"immediate_blits", p->immediate_blits); @@ -1261,6 +1274,49 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) } #ifdef GFXFILTER + if (_tcscmp (option, L"gfx_filter_overlay") == 0) { + TCHAR *s = _tcschr (value, ':'); + p->gfx_filteroverlay_pos.x = 0; + p->gfx_filteroverlay_pos.y = 0; + p->gfx_filteroverlay_pos.width = 0; + p->gfx_filteroverlay_pos.height = 0; + while (s) { + *s++ = 0; + p->gfx_filteroverlay_pos.x = _tstol (s); + s = _tcschr (s, ','); + if (!s) + break; + if (s[-1] == '%') + p->gfx_filteroverlay_pos.x = -30000 - p->gfx_filteroverlay_pos.x; + *s++ = 0; + p->gfx_filteroverlay_pos.y = _tstol (s); + s = _tcschr (s, ','); + if (!s) + break; + if (s[-1] == '%') + p->gfx_filteroverlay_pos.y = -30000 - p->gfx_filteroverlay_pos.y; + *s++ = 0; + p->gfx_filteroverlay_pos.width = _tstol (s); + s = _tcschr (s, ','); + if (!s) + break; + if (s[-1] == '%') + p->gfx_filteroverlay_pos.width = -30000 - p->gfx_filteroverlay_pos.width; + *s++ = 0; + p->gfx_filteroverlay_pos.height = _tstol (s); + TCHAR *s2 = _tcschr (s, ','); + if (s2) + *s2 = 0; + s = s + _tcslen (s); + if (s[-1] == '%') + p->gfx_filteroverlay_pos.height = -30000 - p->gfx_filteroverlay_pos.height; + break; + } + _tcsncpy (p->gfx_filteroverlay, value, sizeof p->gfx_filteroverlay / sizeof (TCHAR) - 1); + p->gfx_filteroverlay[sizeof p->gfx_filteroverlay / sizeof (TCHAR) - 1] = 0; + return 1; + } + if (_tcscmp (option, L"gfx_filter") == 0) { int i = 0; TCHAR *s = _tcschr (value, ':'); diff --git a/filesys.cpp b/filesys.cpp index 1322babc..df5156b9 100644 --- a/filesys.cpp +++ b/filesys.cpp @@ -3644,8 +3644,8 @@ static void { Key *k = lookup_key (unit, GET_PCK_ARG1 (packet)); uaecptr addr = GET_PCK_ARG2 (packet); - long size = (uae_s32)GET_PCK_ARG3 (packet); - int actual; + uae_u32 size = GET_PCK_ARG3 (packet); + uae_u32 actual; if (k == 0) { PUT_PCK_RES1 (packet, DOS_FALSE); @@ -3666,9 +3666,10 @@ static void possible_loadseg(); } #endif - if (valid_address (addr, size)) { - uae_u8 *realpt; - realpt = get_real_address (addr); + if (size == 0) { + actual = 0; + } else if (valid_address (addr, size)) { + uae_u8 *realpt = get_real_address (addr); actual = fs_read (k->fd, realpt, size); if (actual == 0) { @@ -3723,8 +3724,8 @@ static void { Key *k = lookup_key (unit, GET_PCK_ARG1 (packet)); uaecptr addr = GET_PCK_ARG2 (packet); - long size = GET_PCK_ARG3 (packet); - long actual; + uae_u32 size = GET_PCK_ARG3 (packet); + uae_u32 actual; uae_u8 *buf; int i; @@ -3743,12 +3744,12 @@ static void return; } - if (valid_address (addr, size)) { + if (size == 0) { + actual = 0; + } else if (valid_address (addr, size)) { uae_u8 *realpt = get_real_address (addr); actual = fs_write (k->fd, realpt, size); - } else { - write_log (L"unixfs warning: Bad pointer passed for write: %08x, size %d\n", addr, size); /* ugh this is inefficient but easy */ buf = xmalloc (uae_u8, size); diff --git a/include/options.h b/include/options.h index a502e701..a385949d 100644 --- a/include/options.h +++ b/include/options.h @@ -193,6 +193,8 @@ struct uae_prefs { int gfx_filter; TCHAR gfx_filtershader[MAX_DPATH]; TCHAR gfx_filtermask[MAX_DPATH]; + TCHAR gfx_filteroverlay[MAX_DPATH]; + struct wh gfx_filteroverlay_pos; int gfx_filter_scanlines; int gfx_filter_scanlineratio; int gfx_filter_scanlinelevel; diff --git a/od-win32/direct3d.cpp b/od-win32/direct3d.cpp index 71e90851..692b0060 100644 --- a/od-win32/direct3d.cpp +++ b/od-win32/direct3d.cpp @@ -40,8 +40,8 @@ static D3DDISPLAYMODEEX modeex; static IDirect3DDevice9 *d3ddev; static IDirect3DDevice9Ex *d3ddevex; static D3DSURFACE_DESC dsdbb; -static LPDIRECT3DTEXTURE9 texture, sltexture, ledtexture, masktexture; -static int masktexture_w, masktexture_h; +static LPDIRECT3DTEXTURE9 texture, sltexture, ledtexture, masktexture, mask2texture; +static int masktexture_w, masktexture_h, mask2texture_w, mask2texture_h; static LPDIRECT3DTEXTURE9 lpWorkTexture1, lpWorkTexture2, lpTempTexture; LPDIRECT3DTEXTURE9 cursorsurfaced3d; static LPDIRECT3DVOLUMETEXTURE9 lpHq2xLookupTexture; @@ -1158,7 +1158,64 @@ static int createsltexture (void) return 1; } -static int createmasktexture (TCHAR *filename) +static int createmask2texture (const TCHAR *filename) +{ + struct zfile *zf; + int size; + uae_u8 *buf; + LPDIRECT3DTEXTURE9 tx; + HRESULT hr; + D3DXIMAGE_INFO dinfo; + TCHAR tmp[MAX_DPATH]; + + if (filename[0] == 0 || WIN32GFX_IsPicassoScreen ()) + return 0; + zf = NULL; + for (int i = 0; i < 2; i++) { + if (i == 0) + _stprintf (tmp, L"%s%soverlays\\%s", start_path_exe, WIN32_PLUGINDIR, filename); + else + _tcscpy (tmp, filename); + zf = zfile_fopen (tmp, L"rb", ZFD_NORMAL); + if (zf) + break; + TCHAR tmp2[MAX_DPATH]; + TCHAR *s = _tcsrchr (tmp, '.'); + if (s) { + _tcscpy (tmp2, s); + _stprintf (s, L"_%dx%d%s", window_w, window_h, tmp2); + zf = zfile_fopen (tmp, L"rb", ZFD_NORMAL); + if (zf) + break; + } + } + if (!zf) { + write_log (L"%s: couldn't open overlay '%s'\n", D3DHEAD, filename); + return 0; + } + size = zfile_size (zf); + buf = xmalloc (uae_u8, size); + zfile_fread (buf, size, 1, zf); + zfile_fclose (zf); + hr = D3DXCreateTextureFromFileInMemoryEx (d3ddev, buf, size, + D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, + D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0, &dinfo, NULL, &tx); + xfree (buf); + if (FAILED (hr)) { + write_log (L"%s: overlay texture load failed: %s\n", D3DHEAD, D3D_ErrorString (hr)); + goto end; + } + mask2texture_w = dinfo.Width; + mask2texture_h = dinfo.Height; + mask2texture = tx; + return 1; +end: + if (tx) + tx->Release (); + return 0; +} + +static int createmasktexture (const TCHAR *filename) { int ww = window_w; int hh = window_h; @@ -1410,6 +1467,10 @@ static void invalidatedeviceobjects (void) masktexture->Release (); masktexture = NULL; } + if (mask2texture) { + mask2texture->Release (); + mask2texture = NULL; + } if (lpTempTexture) { lpTempTexture->Release (); lpTempTexture = NULL; @@ -1490,13 +1551,15 @@ static int restoredeviceobjects (void) if (wasshader && !shaderon) write_log (L"Falling back to non-shader mode\n"); + createmask2texture (currprefs.gfx_filteroverlay); + if (!createtexture (tin_w, tin_h)) return 0; createledtexture (); hr = D3DXCreateSprite (d3ddev, &sprite); if (FAILED (hr)) { - write_log (L"%s: LED D3DXSprite failed: %s\n", D3DHEAD, D3D_ErrorString (hr)); + write_log (L"%s: D3DXSprite failed: %s\n", D3DHEAD, D3D_ErrorString (hr)); } int curw = CURSORMAXWIDTH, curh = CURSORMAXHEIGHT; @@ -2043,7 +2106,7 @@ static void D3D_render22 (void) } } - if (sprite && ((ledtexture) || (cursorsurfaced3d && cursor_v))) { + if (sprite && ((ledtexture) || (mask2texture) || (cursorsurfaced3d && cursor_v))) { D3DXVECTOR3 v; sprite->Begin (D3DXSPRITE_ALPHABLEND); if (cursorsurfaced3d && cursor_v) { @@ -2058,6 +2121,51 @@ static void D3D_render22 (void) MatrixScaling (&t, 1, 1, 0); sprite->SetTransform (&t); } + if (mask2texture) { + D3DXMATRIX t; + float w = (float)window_w / mask2texture_w; + float h = (float)window_h / mask2texture_h; + + if (currprefs.gfx_filteroverlay_pos.width > 0) + w = (float)currprefs.gfx_filteroverlay_pos.width / mask2texture_w; + else if (currprefs.gfx_filteroverlay_pos.width == -1) + w = 1.0; + else if (currprefs.gfx_filteroverlay_pos.width <= -24000) + w = w * (-currprefs.gfx_filteroverlay_pos.width - 30000) / 100.0; + + if (currprefs.gfx_filteroverlay_pos.height > 0) + h = (float)currprefs.gfx_filteroverlay_pos.height / mask2texture_h; + else if (currprefs.gfx_filteroverlay_pos.height == -1) + h = 1; + else if (currprefs.gfx_filteroverlay_pos.height <= -24000) + h = h * (-currprefs.gfx_filteroverlay_pos.height - 30000) / 100.0; + + MatrixScaling (&t, w, h, 0); + + v.x = 0; + if (currprefs.gfx_filteroverlay_pos.x == -1) + v.x = (window_w - (mask2texture_w * w)) / 2; + else if (currprefs.gfx_filteroverlay_pos.x > -24000) + v.x = currprefs.gfx_filteroverlay_pos.x; + else + v.x = (window_w - (mask2texture_w * w)) / 2 + (-currprefs.gfx_filteroverlay_pos.x - 30100) * window_w / 100.0; + + v.y = 0; + if (currprefs.gfx_filteroverlay_pos.y == -1) + v.y = (window_h - (mask2texture_h * h)) / 2; + else if (currprefs.gfx_filteroverlay_pos.y > -24000) + v.y = currprefs.gfx_filteroverlay_pos.y; + else + v.y = (window_h - (mask2texture_h * h)) / 2 + (-currprefs.gfx_filteroverlay_pos.y - 30100) * window_h / 100.0; + + v.x /= w; + v.y /= h; + v.z = 0; + sprite->SetTransform (&t); + sprite->Draw (mask2texture, NULL, NULL, &v, 0xffffffff); + MatrixScaling (&t, 1, 1, 0); + sprite->SetTransform (&t); + } if (ledtexture && (((currprefs.leds_on_screen & STATUSLINE_RTG) && WIN32GFX_IsPicassoScreen ()) || ((currprefs.leds_on_screen & STATUSLINE_CHIPSET) && !WIN32GFX_IsPicassoScreen ()))) { v.x = 0; v.y = window_h - TD_TOTAL_HEIGHT; diff --git a/od-win32/win32.h b/od-win32/win32.h index cf468874..7fc9e12d 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -18,9 +18,9 @@ #define WINUAEPUBLICBETA 1 #define LANG_DLL 1 -#define WINUAEBETA L"11" -#define WINUAEDATE MAKEBD(2010, 6, 22) -#define WINUAEEXTRA L"RC2" +#define WINUAEBETA L"12" +#define WINUAEDATE MAKEBD(2010, 6, 26) +#define WINUAEEXTRA L"RC3" #define WINUAEREV L"" #define IHF_WINDOWHIDDEN 6 diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index 831181f1..2f6b9982 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -1275,6 +1275,7 @@ int check_prefs_changed_gfx (void) c |= currprefs.gfx_filter != changed_prefs.gfx_filter ? (2|8) : 0; c |= _tcscmp (currprefs.gfx_filtershader, changed_prefs.gfx_filtershader) ? (2|8) : 0; c |= _tcscmp (currprefs.gfx_filtermask, changed_prefs.gfx_filtermask) ? (2|8) : 0; + c |= _tcscmp (currprefs.gfx_filteroverlay, changed_prefs.gfx_filteroverlay) ? (2|8) : 0; c |= currprefs.gfx_filter_filtermode != changed_prefs.gfx_filter_filtermode ? (2|8) : 0; c |= currprefs.gfx_filter_bilinear != changed_prefs.gfx_filter_bilinear ? (2|8) : 0; c |= currprefs.gfx_filter_horiz_zoom_mult != changed_prefs.gfx_filter_horiz_zoom_mult ? (1|8) : 0; @@ -1335,6 +1336,7 @@ int check_prefs_changed_gfx (void) currprefs.gfx_filter = changed_prefs.gfx_filter; _tcscpy (currprefs.gfx_filtershader, changed_prefs.gfx_filtershader); _tcscpy (currprefs.gfx_filtermask, changed_prefs.gfx_filtermask); + _tcscpy (currprefs.gfx_filteroverlay, changed_prefs.gfx_filteroverlay); currprefs.gfx_filter_filtermode = changed_prefs.gfx_filter_filtermode; currprefs.gfx_filter_bilinear = changed_prefs.gfx_filter_bilinear; currprefs.gfx_filter_horiz_zoom_mult = changed_prefs.gfx_filter_horiz_zoom_mult; diff --git a/od-win32/winuae_msvc10/winuae_msvc.vcxproj b/od-win32/winuae_msvc10/winuae_msvc.vcxproj index 1cf74857..a604530f 100644 --- a/od-win32/winuae_msvc10/winuae_msvc.vcxproj +++ b/od-win32/winuae_msvc10/winuae_msvc.vcxproj @@ -160,7 +160,7 @@ /MACHINE:I386 %(AdditionalOptions) ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9d.lib;winio.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;libpng.lib;lglcd.lib;wpcap.lib;packet.lib;openal32.lib;wintab32.lib;portaudio_x86.lib;vfw32.lib;wtsapi32.lib;enet.lib;prowizard.lib;lzmalib.lib;%(AdditionalDependencies) NotSet - d:\amiga\winuae.exe + $(OutDir)$(TargetName)$(TargetExt) true LIBCMT;%(IgnoreSpecificDefaultLibraries) wpcap.dll;packet.dll;d3dx9_43.dll;openal32.dll;wintab32.dll;portaudio_x86.dll;ws2_32.dll;msacm32.dll;wtsapi32.dll;dsound.dll;%(DelayLoadDLLs) @@ -218,7 +218,7 @@ ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;vfw32.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;portaudio_x64.lib;packet.lib;wpcap.lib;openal32.lib;libpng.lib;lglcd.lib;wtsapi32.lib;wntab32x.lib;enet_x64.lib;prowizard_x64.lib;lzmalib.lib;%(AdditionalDependencies) - d:\amiga\winuae64.exe + $(OutDir)$(TargetName)$(TargetExt) true %(IgnoreSpecificDefaultLibraries) wpcap.dll;packet.dll;d3dx9_42.dll;openal32.dll;wintab32.dll;portaudio_x64.dll;ws2_32.dll;msacm32.dll;wtsapi32.dll;dsound.dll;%(DelayLoadDLLs) @@ -285,7 +285,7 @@ ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;winio.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;libpng.lib;lglcd.lib;wpcap.lib;packet.lib;openal32.lib;wintab32.lib;portaudio_x86.lib;vfw32.lib;wtsapi32.lib;enet.lib;lzmalib.lib;prowizard.lib;%(AdditionalDependencies) - d:\amiga\winuae.exe + $(OutDir)$(TargetName)$(TargetExt) true %(AdditionalLibraryDirectories);$(SolutionDir)\..\lib\ %(AdditionalManifestDependencies) @@ -359,7 +359,7 @@ ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;vfw32.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;portaudio_x64.lib;packet.lib;wpcap.lib;openal32.lib;libpng.lib;lglcd.lib;wtsapi32.lib;wntab32x.lib;enet_x64.lib;prowizard_x64.lib;lzmalib.lib;%(AdditionalDependencies) NotSet - d:\amiga\winuae64.exe + $(OutDir)$(TargetName)$(TargetExt) true %(AdditionalLibraryDirectories);$(SolutionDir)\..\lib\ %(IgnoreSpecificDefaultLibraries) @@ -430,7 +430,7 @@ ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;winio.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;libpng.lib;lglcd.lib;wpcap.lib;packet.lib;openal32.lib;wintab32.lib;portaudio_x86.lib;vfw32.lib;wtsapi32.lib;avrt.lib;enet.lib;prowizard.lib;lzmalib.lib;%(AdditionalDependencies) - d:\amiga\winuae.exe + $(OutDir)$(TargetName)$(TargetExt) true %(AdditionalLibraryDirectories);$(SolutionDir)\..\lib\ %(AdditionalManifestDependencies) @@ -505,7 +505,7 @@ ws2_32.lib;ddraw.lib;dxguid.lib;winmm.lib;comctl32.lib;version.lib;vfw32.lib;msacm32.lib;dsound.lib;dinput8.lib;d3d9.lib;d3dx9.lib;setupapi.lib;wininet.lib;dxerr.lib;shlwapi.lib;zlibstat.lib;portaudio_x64.lib;packet.lib;wpcap.lib;openal32.lib;libpng.lib;lglcd.lib;wtsapi32.lib;wntab32x.lib;enet_x64.lib;prowizard_x64.lib;lzmalib.lib;%(AdditionalDependencies) NotSet - d:\amiga\winuae64.exe + $(OutDir)$(TargetName)$(TargetExt) true %(AdditionalLibraryDirectories);$(SolutionDir)\..\lib\ %(IgnoreSpecificDefaultLibraries) diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index e17fe08b..eae37801 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,4 +1,14 @@ +Beta 12: (RC3) + +- directory filesystem action_read/action_write with length=0 special handling + added (host OS routines may have returned weird errors in some situations) +- monitor "bezel" overlay image support added, direct3d and configuration file only. + gfx_filter_overlay=:x,y,width,height (only path is mandatory) + x and y: position of overlay relative to top/left corner. -1 = center, value% = relative to window size. + width and height: width of overlay image. -1 = scale to window size, 0 = use original size, + > 0 = scale to this size. value% = scale to window size + %adjustment. + Beta 11: (RC2) - DirectInput keyboard and mouse didn't work in Test/Remap mode after emulation was started -- 2.47.3