From d72268192280286b469c828bd30ce295adf50f5b Mon Sep 17 00:00:00 2001 From: gho tik Date: Sun, 10 Aug 2014 12:39:50 -0400 Subject: [PATCH] v2_02_94_src Former-commit-id: 1bb8aa8a0938f8cd4b435d66231ff9276002c95e --- Include/dxwnd.h | 10 +- build/Resources_CN.dll | 4 +- build/Resources_EN.dll | 4 +- build/Resources_IT.dll | 4 +- build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/dxwnd.ini | 4 +- build/exports/Celtic Kings Rage of War.dxw | 28 ++ build/exports/Evil Dead Hail to the King.dxw | 28 ++ build/exports/Fighting Force.dxw | 28 ++ build/exports/Stronghold Crusader HD.dxw | 28 ++ build/exports/Worms 2 (GOG).dxw | 28 ++ build/readme-relnotes.txt | 13 + dll/bilinear.cpp | 270 ++++++++++++++++++ dll/ddraw.cpp | 158 ++++++---- dll/dxemublt.cpp | 15 +- dll/dxhelper.cpp | 2 + dll/dxhook.cpp | 35 +-- dll/dxhook.h | 2 + dll/dxwcore.cpp | 28 +- dll/dxwcore.hpp | 4 + dll/dxwnd.aps | Bin 37664 -> 37664 bytes dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 280576 -> 280576 bytes dll/dxwnd.vs2008.vcproj | 8 + dll/gdi32.cpp | 2 + dll/hd3d.cpp | 25 +- dll/hddraw.h | 1 + dll/imagehlp.cpp | 61 ++++ dll/kernel32.cpp | 12 +- dll/syslibs.h | 1 + dll/user32.cpp | 14 +- host/Resource.h | Bin 30000 -> 30578 bytes host/TabCompat.cpp | 2 + host/TabDebug.cpp | 3 +- host/TabDirectX.cpp | 7 +- host/TabTiming.cpp | 1 + host/TargetDlg.cpp | 8 +- host/TargetDlg.h | 9 +- host/dxwndhost.aps | Bin 182232 -> 177980 bytes host/dxwndhost.rc | Bin 87484 -> 88730 bytes host/dxwndhost.vs2008.suo | Bin 99328 -> 110592 bytes host/dxwndhost.vs2008.vcproj | 8 + host/dxwndhostView.cpp | 55 ++-- host/host.aps | Bin 0 -> 47496 bytes host/host.rc | 1 + host/resource1.h | 14 + locale/cn/RCa05260 | Bin 0 -> 77592 bytes locale/cn/Release/BuildLog.htm | Bin 0 -> 6532 bytes .../Resources_CN.dll.intermediate.manifest | 10 + locale/cn/Release/Resources_CN.res | Bin 0 -> 127732 bytes locale/cn/Release/mt.dep | 1 + .../cn/Resources_CN.vcproj.User-PC.User.user | 65 +++++ locale/cn/Resources_Cn.ncb | Bin 27648 -> 35840 bytes locale/cn/Resources_Cn.rc | Bin 80842 -> 82246 bytes locale/cn/Resources_Cn.suo | Bin 7168 -> 7168 bytes locale/cn/Resources_EN.rc | Bin 0 -> 88626 bytes locale/en/Resources_EN.rc | Bin 87248 -> 88730 bytes locale/en/Resources_En.ncb | Bin 27648 -> 35840 bytes locale/en/Resources_En.suo | Bin 7168 -> 7168 bytes locale/it/Resources_IT.rc | Bin 87150 -> 88560 bytes locale/it/Resources_It.ncb | Bin 27648 -> 35840 bytes locale/it/Resources_It.suo | Bin 7168 -> 7168 bytes 63 files changed, 833 insertions(+), 178 deletions(-) create mode 100644 build/exports/Celtic Kings Rage of War.dxw create mode 100644 build/exports/Evil Dead Hail to the King.dxw create mode 100644 build/exports/Fighting Force.dxw create mode 100644 build/exports/Stronghold Crusader HD.dxw create mode 100644 build/exports/Worms 2 (GOG).dxw create mode 100644 dll/bilinear.cpp create mode 100644 dll/imagehlp.cpp create mode 100644 host/host.aps create mode 100644 host/host.rc create mode 100644 host/resource1.h create mode 100644 locale/cn/RCa05260 create mode 100644 locale/cn/Release/BuildLog.htm create mode 100644 locale/cn/Release/Resources_CN.dll.intermediate.manifest create mode 100644 locale/cn/Release/Resources_CN.res create mode 100644 locale/cn/Release/mt.dep create mode 100644 locale/cn/Resources_CN.vcproj.User-PC.User.user create mode 100644 locale/cn/Resources_EN.rc diff --git a/Include/dxwnd.h b/Include/dxwnd.h index a49db9e..94b800e 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -123,7 +123,7 @@ #define DISABLEFOGGING 0x00000080 // Disable D3D fogging #define NOPOWER2FIX 0x00000100 // Handle textures whose size is not a power of 2 (32, 64, 128 ...) #define NOPERFCOUNTER 0x00000200 // Disables the GetPerfCounter performance metrics API,as if it was not supported.... -#define BILINEARFILTER 0x00000400 // attempt to smooth low-res graphic by applying biulinear filtering in emulation mode +#define BILINEAR2XFILTER 0x00000400 // attempt to smooth low-res graphic by applying biulinear filtering in emulation mode #define INTERCEPTRDTSC 0x00000800 // Intercapts RDTSC opcodes to hook at assembly level #define LIMITSCREENRES 0x00001000 // Limit available screen resolution up to defined maximum #define NOFILLRECT 0x00002000 // Suppress FillRect calls @@ -150,12 +150,14 @@ #define DIABLOTWEAK 0x00000001 // ... ??? ... #define CLEARTARGET 0x00000002 // forces a D3D clean on target surface upon each BeginScene invocation #define NOWINPOSCHANGES 0x00000004 // suppress WM_WINDOWPOSCHANGING/CHANGED messages (RollerCoaster Tycoon...) -#define SYSTEMMEMORY 0x00000008 // forces usage of DDSCAPS_SYSTEMMEMORY capability on front & backbuffer surfaces +#define NOSYSTEMMEMORY 0x00000008 // forces suppression of DDSCAPS_SYSTEMMEMORY capability on surfaces #define NOBLT 0x00000010 // suppress blit to primary surface -#define UNUSEDFLAG1 0x00000020 // unused - mapped to AEROBOOST +#define NOSYSTEMEMULATED 0x00000020 // forces suppression of DDSCAPS_SYSTEMMEMORY capability on emulated front & backbuffer surfaces #define DOFASTBLT 0x00000040 // use FastBlt to primary surface #define AEROBOOST 0x00000080 // Optimize for AERO environment: does all stretching in sysmemory surfaces -#define LIMITFULLBLT 0x00000100 // Limit FPS only for blt operation of the whole primary surface +#define QUARTERBLT 0x00000100 // Consider a screen update (to count or limit FPS) only blt operations bigger than a quarter of the whole primary surface +#define NOIMAGEHLP 0x00000200 // Interceptd Imagehlp.dll unsupported calls (used by "the 5th element") +#define BILINEARFILTER 0x00000400 // experimental bilinear filtering // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/Resources_CN.dll b/build/Resources_CN.dll index 02139f6..7337cbb 100644 --- a/build/Resources_CN.dll +++ b/build/Resources_CN.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:84f85cf7b70b388793e41f61533229ee60eab599aa6a44407cde99c1ceaa5fdf -size 132096 +oid sha256:2b88d6c9d24ee068087275664ae0d9082c85e8424e47e7b177fbd026763a5631 +size 132608 diff --git a/build/Resources_EN.dll b/build/Resources_EN.dll index 5561296..f535033 100644 --- a/build/Resources_EN.dll +++ b/build/Resources_EN.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:642c9b8d73a7154b70bbb29ebfc13935cd6a26d178eef9989581b4ae8329457f -size 137728 +oid sha256:55f9e6985c7b7f0f5a538ad93199152d964f7d8dc4a552a7bed38fb93cc760e1 +size 116224 diff --git a/build/Resources_IT.dll b/build/Resources_IT.dll index 930e133..70f8408 100644 --- a/build/Resources_IT.dll +++ b/build/Resources_IT.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2a8bd736f7b90333f36f1de42e4d8804431732488e553d89391f5daae705a152 -size 138752 +oid sha256:02e79b180737b4f5e1989026e05e6c48065de39060d977c158ab286a87a5d940 +size 139264 diff --git a/build/dxwnd.dll b/build/dxwnd.dll index c612fee..f2ce6d0 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0f5388e87978467245275dcb12d802fcb1ce55d4f4a0ee2217711fcef520bd3a -size 506368 +oid sha256:f3a3c1ff5c9ff0497a5155abf197a32ac7481a31130d4c441ece3e50b022e6eb +size 525312 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 20d0dc8..06dd726 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:46e406641683f8f3314bd14855187c086991f84bd234780f15e49f4de3f5c197 -size 557568 +oid sha256:f379180ba2b97d28926280bc4a1b02ed95f3f90cd191aa3fa94d4757bdd106b3 +size 558592 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index cbf8478..6f8d080 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -1,6 +1,6 @@ [window] -posx=1207 -posy=326 +posx=1182 +posy=638 sizx=320 sizy=200 lang=automatic diff --git a/build/exports/Celtic Kings Rage of War.dxw b/build/exports/Celtic Kings Rage of War.dxw new file mode 100644 index 0000000..aebc866 --- /dev/null +++ b/build/exports/Celtic Kings Rage of War.dxw @@ -0,0 +1,28 @@ +[target] +title0=Celtic Kings Rage of War +path0=D:\Games\Celtic Kings RoW\Celtic kings.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=671088674 +flagg0=1744830466 +flagh0=65556 +flagi0=138412036 +flagj0=128 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Evil Dead Hail to the King.dxw b/build/exports/Evil Dead Hail to the King.dxw new file mode 100644 index 0000000..226a75f --- /dev/null +++ b/build/exports/Evil Dead Hail to the King.dxw @@ -0,0 +1,28 @@ +[target] +title0=Evil Dead Hail to the King +path0=D:\Games\Evil Dead\EvilDead.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=168 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Fighting Force.dxw b/build/exports/Fighting Force.dxw new file mode 100644 index 0000000..cec77f1 --- /dev/null +++ b/build/exports/Fighting Force.dxw @@ -0,0 +1,28 @@ +[target] +title0=Fighting Force +path0=D:\Games\Fighting Force\fforce.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134218272 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=128 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Stronghold Crusader HD.dxw b/build/exports/Stronghold Crusader HD.dxw new file mode 100644 index 0000000..047ffd2 --- /dev/null +++ b/build/exports/Stronghold Crusader HD.dxw @@ -0,0 +1,28 @@ +[target] +title0=Stronghold Crusader HD +path0=d:\Games\Stronghold Crusader.exe +launchpath0=d:\Games\Stronghold Crusader.exe +module0= +opengllib0= +ver0=0 +coord0=3 +flag0=134218400 +flagg0=1275068432 +flagh0=1048596 +flagi0=136314884 +flagj0=128 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=1280 +sizy0=1024 +maxfps0=0 +initts0=0 +winver0=1 +maxres0=-1 diff --git a/build/exports/Worms 2 (GOG).dxw b/build/exports/Worms 2 (GOG).dxw new file mode 100644 index 0000000..1c3161d --- /dev/null +++ b/build/exports/Worms 2 (GOG).dxw @@ -0,0 +1,28 @@ +[target] +title0=Worms 2 (GOG) +path0=D:\Games\Worms 2\worms2.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134218272 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=128 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index fab13f9..33697a9 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -603,3 +603,16 @@ fix: Skip / Limit FPS now acting on full scren blits only. For instance, they no v2.02.93 fix: handling of primary / backbuffer surfaces when DDSCAPS_3DDEVICE is set (es. Fifa 99 in Direct3D mode) + +v2.02.94 +fix: handling of "Keep aspect ratio" for aspect ratios different from 4:3 +fix: missing resolution 400x300 in "Limit resolution" handling +fix: surface handling switch in automatic mode. +added two flags for DDSCAPS_SYSTEMMEMORY handling on different contexts. Added extra performances and compatibility with D3D in emulated mode. +added "Updated bigger than 1/4 screen size" flag, to perform FPS counting or limitations upon substantial screen updated (heuristic: bigger than 1/4 of the total size...) +added true bilinear filter. Previous one was renamed as fast 2x filter (BILINEAR2XFILTER). +fix: when the window was minimized & the "do not notify on task switch" flag was on, the game crashed. Now the blitting operations to invalid rect coordinates are suppressed. +fix: debug option "highlight blit to primary" was causing game crashes when the updated rect was too little. +fix: trapped sporadic CloseHandle(hMenu) crashes in a try/catch clause. +fix: attempt to fix FIXD3DFRAME option +fix: added SetStretchBltMode(hdc,HALFTONE) to SetDIBitsToDevice hooker to improve stretching: fixes "Celtic Kings Rage of War" diff --git a/dll/bilinear.cpp b/dll/bilinear.cpp new file mode 100644 index 0000000..6c8cdef --- /dev/null +++ b/dll/bilinear.cpp @@ -0,0 +1,270 @@ +/* ============================================================================= + +Source Code for Smooth Image Resampling (Resizing) in C/C++ (Visual Studio) +by Ryan Geiss - 3 July 2008 + + The code below performs a fairly-well-optimized high-quality resample + (smooth resize) of a 3-channel image that is padded to 4 bytes per + pixel. The pixel format is assumed to be ARGB. If you want to make + it handle an alpha channel, the changes should be very straightforward. + + In general, if the image is being enlarged, bilinear interpolation + is used; if the image is being downsized, all input pixels are weighed + appropriately to produce the correct result. + + In order to be efficient, it actually performs 1 of 4 routines. First, + if you are cutting the image size *exactly* in half (common when generating + mipmap levels), it will use a specialized routine to do just that. There + are actually two versions of this routine - an MMX one and a non-MMX one. + It detects if MMX is present and chooses the right one. + + If you're not cutting the image perfectly in half, it executes one + of two general resize routines. If upsampling (increasing width and height) + on both X and Y, then it executes a faster resize algorithm that just performs + a 2x2 bilinear interpolation of the appropriate input pixels, for each output + pixel. + + If downsampling on either X or Y (or both), though, the general-purpose + routine gets run. It iterates over every output pixel, and for each one, it + iterates over the input pixels that map to that output pixel [there will + usually be more than 1 in this case]. Each input pixel is properly weighted + to produce exactly the right image. There's a little bit of extra bookkeeping, + but in general, it's pretty efficient. + + Note that on extreme downsizing (2,800 x 2,800 -> 1x1 or greater ratio), + the colors can overflow. If you want to fix this lazily, just break + your resize into two passes. + + Also note that when your program exits, or when you are done using this + function, you should delete [] g_px1a and g_px1ab if they have been + allocated. + + I posted this here because this is pretty common code that is a bit of + a pain to write; I've written it several times over the years, and I really + don't feel like writing it again. So - here it is - for my reference, and + for yours. Enjoy! +/* ========================================================================== */ + +#include +#include +#include + +static int* g_px1a = NULL; +static int g_px1a_w = 0; +static int* g_px1ab = NULL; +static int g_px1ab_w = 0; + +static bool g_bMMX = false; +static bool g_bMMX_known = false; + +void Resize_HQ_4ch( unsigned char* src, RECT *srcrect, int srcpitch, + unsigned char* dest, RECT *destrect, int destpitch) +{ + // Both buffers must be in ARGB format, and a scanline should be w*4 bytes. + + // NOTE: THIS WILL OVERFLOW for really major downsizing (2800x2800 to 1x1 or more) + // (2800 ~ sqrt(2^23)) - for a lazy fix, just call this in two passes. + + int w1, w2, h1, h2; + w1 = srcrect->right - srcrect->left; + h1 = srcrect->bottom - srcrect->top; + w2 = destrect->right - destrect->left; + h2 = destrect->bottom - destrect->top; + + if(!srcpitch) srcpitch=w1<<2; + if(!destpitch) destpitch=w1<<2; + + // GHO addiction: new variables + // p1, p2: pitch offsets of source and dest surfaces in DWORD offset, that is pitch / sizeof(DWORD) + // beware: current version can operate on displaced source rect, but assumes the dest rect is always the full surface!! + unsigned int p1 = srcpitch >> 2; + unsigned int p2 = destpitch >> 2; + unsigned int *dsrc = (unsigned int *)src + (srcrect->top * p1) + srcrect->left; + unsigned int *ddest = (unsigned int *)dest; + + // arbitrary resize. + + bool bUpsampleX = (w1 < w2); + bool bUpsampleY = (h1 < h2); + + // If too many input pixels map to one output pixel, our 32-bit accumulation values + // could overflow - so, if we have huge mappings like that, cut down the weights: + // 256 max color value + // *256 weight_x + // *256 weight_y + // *256 (16*16) maximum # of input pixels (x,y) - unless we cut the weights down... + int weight_shift = 0; + float source_texels_per_out_pixel = ( (w1/(float)w2 + 1) + * (h1/(float)h2 + 1) + ); + float weight_per_pixel = source_texels_per_out_pixel * 256 * 256; //weight_x * weight_y + float accum_per_pixel = weight_per_pixel*256; //color value is 0-255 + float weight_div = accum_per_pixel / 4294967000.0f; + if (weight_div > 1) + weight_shift = (int)ceilf( logf((float)weight_div)/logf(2.0f) ); + weight_shift = min(15, weight_shift); // this could go to 15 and still be ok. + + float fh = 256*h1/(float)h2; + float fw = 256*w1/(float)w2; + + if (bUpsampleX && bUpsampleY) + { + // faster to just do 2x2 bilinear interp here + + // cache x1a, x1b for all the columns: + // ...and your OS better have garbage collection on process exit :) + if (g_px1a_w < w2) + { + if (g_px1a) delete [] g_px1a; + g_px1a = new int[w2*2 * 1]; + g_px1a_w = w2*2; + } + for (int x2=0; x2> 8; + + // unsigned int *ddest = &((unsigned int *)dest)[y2*w2 + 0]; + unsigned int *ddest = &((unsigned int *)dest)[y2*p2 + 0]; + + for (int x2=0; x2> 8; + + //unsigned int *dsrc2 = &dsrc[y1c*w1 + x1c]; + unsigned int *dsrc2 = &dsrc[y1c*p1 + x1c]; // GHO + + // PERFORM BILINEAR INTERPOLATION on 2x2 pixels + unsigned int r=0, g=0, b=0, a=0; + unsigned int weight_x = 256 - (x1a & 0xFF); + unsigned int weight_y = 256 - (y1a & 0xFF); + for (int y=0; y<2; y++) + { + for (int x=0; x<2; x++) + { + //unsigned int c = dsrc2[x + y*w1]; + unsigned int c = dsrc2[x + y*p1]; // GHO + unsigned int r_src = (c ) & 0xFF; + unsigned int g_src = (c>> 8) & 0xFF; + unsigned int b_src = (c>>16) & 0xFF; + unsigned int w = (weight_x * weight_y) >> weight_shift; + r += r_src * w; + g += g_src * w; + b += b_src * w; + weight_x = 256 - weight_x; + } + weight_y = 256 - weight_y; + } + + unsigned int c = ((r>>16)) | ((g>>8) & 0xFF00) | (b & 0xFF0000); + //*ddest++ = c;//ddest[y2*w2 + x2] = c; + *ddest++ = c; + //ddest+=(w2-p2); + } + } + } + else // either downscale on vertical or horizontal direction ... + { + // cache x1a, x1b for all the columns: + // ...and your OS better have garbage collection on process exit :) + if (g_px1ab_w < w2) + { + if (g_px1ab) delete [] g_px1ab; + g_px1ab = new int[w2*2 * 2]; + g_px1ab_w = w2*2; + } + for (int x2=0; x2 we want to interpolate between two pixels! + x1b = x1a + 256; + x1b = min(x1b, 256*w1 - 1); + g_px1ab[x2*2+0] = x1a; + g_px1ab[x2*2+1] = x1b; + } + + // FOR EVERY OUTPUT PIXEL + for (int y2=0; y2 we want to interpolate between two pixels! + y1b = y1a + 256; + y1b = min(y1b, 256*h1 - 1); + int y1c = y1a >> 8; + int y1d = y1b >> 8; + + ddest = &((unsigned int *)dest)[y2*p2 + 0]; + + for (int x2=0; x2> 8; + int x1d = x1b >> 8; + + // ADD UP ALL INPUT PIXELS CONTRIBUTING TO THIS OUTPUT PIXEL: + unsigned int r=0, g=0, b=0, a=0; + for (int y=y1c; y<=y1d; y++) + { + unsigned int weight_y = 256; + if (y1c != y1d) + { + if (y==y1c) + weight_y = 256 - (y1a & 0xFF); + else if (y==y1d) + weight_y = (y1b & 0xFF); + } + + //unsigned int *dsrc2 = &dsrc[y*w1 + x1c]; + unsigned int *dsrc2 = &dsrc[y*p1 + x1c]; // GHO + for (int x=x1c; x<=x1d; x++) + { + unsigned int weight_x = 256; + if (x1c != x1d) + { + if (x==x1c) + weight_x = 256 - (x1a & 0xFF); + else if (x==x1d) + weight_x = (x1b & 0xFF); + } + + //unsigned int c = *dsrc2++;//dsrc[y*w1 + x]; + unsigned int c = dsrc[y*p1 + x]; + unsigned int r_src = (c ) & 0xFF; + unsigned int g_src = (c>> 8) & 0xFF; + unsigned int b_src = (c>>16) & 0xFF; + unsigned int w = (weight_x * weight_y) >> weight_shift; + r += r_src * w; + g += g_src * w; + b += b_src * w; + a += w; + } + } + + // write results + unsigned int c = ((r/a)) | ((g/a)<<8) | ((b/a)<<16); + //*ddest++ = c;//ddest[y2*w2 + x2] = c; + *ddest++ = c; + //ddest+=(w2-p2); + } + } + } +} \ No newline at end of file diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 020f419..155d13d 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -1499,8 +1499,6 @@ HRESULT WINAPI extDirectDrawCreate(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, I OutTraceDDRAW("DirectDrawCreate: guid=%x(%s)\n", lpguid, ExplainGUID(lpguid)); - if (dxw.dwFlags1 & AUTOMATIC) dxw.dwFlags1 |= EMULATESURFACE; - if(!pDirectDrawCreate){ // not hooked yet.... HINSTANCE hinst; hinst = LoadLibrary("ddraw.dll"); @@ -1582,8 +1580,6 @@ HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid, OutTraceDDRAW("DirectDrawCreateEx: guid=%x(%s) refiid=%x\n", lpguid, ExplainGUID(lpguid), iid); - if (dxw.dwFlags1 & AUTOMATIC) dxw.dwFlags1 |= EMULATESURFACE; - // v2.1.70: auto-hooking (just in case...) if(!pDirectDrawCreateEx){ // not hooked yet.... HINSTANCE hinst; @@ -2408,25 +2404,6 @@ static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) // v2.02.50: don't alter surfaces with different color depth if((lpddsd->dwFlags & DDSD_PIXELFORMAT) && (lpddsd->ddpfPixelFormat.dwRGBBitCount != dxw.VirtualPixelFormat.dwRGBBitCount)) return; -#if 0 - // v2.02.43: don't alter MIPMAP surfaces - if((lpddsd->dwFlags & DDSD_MIPMAPCOUNT) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_MIPMAP)) { - //GetPixFmt(lpddsd); - return; - } -#endif - -#if 0 - // HoM&M3/4 fix.... - if(((lpddsd->dwFlags & (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT)) == (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) && - ((lpddsd->ddsCaps.dwCaps & ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_VIDEOMEMORY) == DDSCAPS_OFFSCREENPLAIN)){ - //lpddsd->ddsCaps.dwCaps = 0; - lpddsd->dwFlags = (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT); - lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); - GetPixFmt(lpddsd); - return; - } -#endif // default case: adjust pixel format OutTraceB("FixSurfaceCaps: suppress DDSCAPS_VIDEOMEMORY case\n"); lpddsd->dwFlags |= (DDSD_CAPS|DDSD_PIXELFORMAT); @@ -2463,7 +2440,9 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf ddsd.dwFlags |= (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT); ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces - ddsd.ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); + ddsd.ddsCaps.dwCaps |= (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); + // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... + if(dxw.dwFlags5 & NOSYSTEMEMULATED) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwHeight = dxw.GetScreenHeight(); @@ -2528,10 +2507,13 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if(lpDDSEmu_Back==NULL){ ClearSurfaceDesc((void *)&ddsd, dxversion); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; + // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces + ddsd.ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); + // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... + if(dxw.dwFlags5 & NOSYSTEMEMULATED) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwHeight = dxw.GetScreenHeight(); - if(dxw.dwFlags4 & BILINEARFILTER){ + if(dxw.dwFlags4 & BILINEAR2XFILTER){ // double backbuffer size ddsd.dwWidth = dxw.GetScreenWidth() << 1; ddsd.dwHeight = dxw.GetScreenHeight() << 1; @@ -2630,6 +2612,8 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_BACKBUFFER|DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces ddsd.ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); + // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... + if(dxw.dwFlags5 & NOSYSTEMMEMORY) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwHeight = dxw.GetScreenHeight(); GetPixFmt(&ddsd); @@ -2713,6 +2697,8 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy over .... FixSurfaceCaps(&ddsd, dxversion); + // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... + if(dxw.dwFlags5 & NOSYSTEMMEMORY) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]" , __LINE__); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); @@ -2977,13 +2963,6 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet OutTraceDDRAW("GetAttachedSurface(%d): lpdds=%x%s caps=%x(%s)\n", dxversion, lpdds, (IsPrim?"(PRIM)":(IsBack ? "(BACK)":"")), lpddsc->dwCaps, ExplainDDSCaps(lpddsc->dwCaps)); -#if 0 - if(lpddsc->dwCaps & DDSCAPS_MIPMAP){ - OutTraceDW("GetAttachedSurface: emulate MIPMAP capability\n"); - lpddsc->dwCaps &= ~DDSCAPS_MIPMAP; - } -#endif - // this is yet to be proven utility..... // v2.02.45: No - it prevents "Praetorians" to work!!! -> commented out. // @@ -3141,6 +3120,88 @@ HRESULT WINAPI PrimaryStretchBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, L return res; } +HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) +{ + HRESULT res; + extern void Resize_HQ_4ch( unsigned char*, RECT *, int, unsigned char*, RECT *, int); + /* to be implemented .... */ + DDSURFACEDESC ddsd; + RECT TmpRect, SrcRect; + LPDIRECTDRAWSURFACE lpddsTmp; + LPDIRECTDRAWSURFACE lpddsBak; + LPDIRECTDRAWSURFACE lpddsCopy=NULL; + DDSCAPS caps; + BYTE *bSourceBuf, *bDestBuf; + LONG dwWidth, dwHeight; + int SrcPitch, DestPitch; + caps.dwCaps = DDSCAPS_BACKBUFFER; + memset(&ddsd, 0, sizeof(DDSURFACEDESC)); + ddsd.dwSize = sizeof(DDSURFACEDESC); + if(lpddssrc==NULL){ + // blit from backbuffer + lpdds->GetAttachedSurface(&caps, &lpddsBak); + if(lpddsBak) lpddsBak->GetSurfaceDesc(&ddsd); + } + else{ + // blit from surface + lpddssrc->GetSurfaceDesc(&ddsd); + } + + // assign source RECT values anyway.... + if(!lpsrcrect){ + lpsrcrect = &SrcRect; + lpsrcrect->left = lpsrcrect->top = 0; + lpsrcrect->right = dxw.GetScreenWidth(); + lpsrcrect->bottom = dxw.GetScreenHeight(); + } + + dwWidth = lpdestrect->right - lpdestrect->left; + dwHeight = lpdestrect->bottom - lpdestrect->top; + TmpRect.left = TmpRect.top = 0; + TmpRect.bottom = ddsd.dwHeight = dwHeight; + TmpRect.right = ddsd.dwWidth = dwWidth; + ddsd.dwFlags = (DDSD_HEIGHT | DDSD_WIDTH | DDSD_CAPS); + // work only on even width surfaces, or you'd have to take in account proper pitch! + // dwWidth = ddsd.dwWidth = ((dwWidth + 1) >> 1) << 1; + // capabilities must cope with primary / backbuffer surface capabilities to get speedy operations + ddsd.ddsCaps.dwCaps = bIs3DPrimarySurfaceDevice ? DDSCAPS_OFFSCREENPLAIN : (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); + res=(*pCreateSurface1)(lpPrimaryDD, (LPDDSURFACEDESC)&ddsd, &lpddsTmp, NULL); + if(res) OutTraceE("CreateSurface: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + + // get informations + memset(&ddsd,0,sizeof(DDSURFACEDESC)); + ddsd.dwSize = sizeof(DDSURFACEDESC); + ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; + res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0); + if(res) OutTraceE("Lock: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + bSourceBuf = (BYTE *)ddsd.lpSurface; + SrcPitch = ddsd.lPitch; + memset(&ddsd,0,sizeof(DDSURFACEDESC)); + ddsd.dwSize = sizeof(DDSURFACEDESC); + ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; + res=(*pLock)(lpddsTmp, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0); + if(res) OutTraceE("Lock: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + bDestBuf = (BYTE *)ddsd.lpSurface; + DestPitch = ddsd.lPitch; + + // do the filtering + Resize_HQ_4ch( + bSourceBuf, lpsrcrect, SrcPitch, + bDestBuf, lpdestrect, DestPitch); + + // fast-blit to primary + //(*pUnlockMethod(lpddssrc))(lpddssrc, NULL); + //(*pUnlockMethod(lpddsTmp))(lpddsTmp, NULL); + (*pUnlock1)(lpddssrc, NULL); + //(*pUnlock1)(lpddsTmp, NULL); + lpddsTmp->Unlock(NULL); // this surface is unhooked!!! + res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT); + if(res) OutTraceE("BltFast: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + (*pReleaseS)(lpddsTmp); + if(lpddsCopy) (*pReleaseS)(lpddsCopy); + return res; +} + HRESULT WINAPI PrimaryNoBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) { return DD_OK; @@ -3300,8 +3361,15 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, // Blit to primary surface // ========================= - if(!lpdestrect || - (lpdestrect && (lpdestrect->bottom == dxw.GetScreenHeight()) && (lpdestrect->right == dxw.GetScreenWidth()))) + if(dxw.dwFlags5 & QUARTERBLT){ + BOOL QuarterUpdate; + QuarterUpdate = lpdestrect ? + (((lpdestrect->bottom - lpdestrect->top) * (lpdestrect->right - lpdestrect->left)) > ((LONG)(dxw.GetScreenHeight() * dxw.GetScreenWidth()) >> 2)) + : + TRUE; + if(QuarterUpdate) if(dxw.HandleFPS()) return DD_OK; + } + else if(dxw.HandleFPS()) return DD_OK; if(dxw.dwFlags5 & NOBLT) return DD_OK; @@ -3393,6 +3461,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, // blit only when source and dest surface are different. Should make ScreenRefresh faster. if (lpdds != lpddssrc){ if (IsDebug) BlitTrace("SRC2EMU", &emurect, &destrect, __LINE__); + if(destrect.top == -32000) return DD_OK; // happens when window is minimized & do not notify on task switch ... res=(*pBlt)(lpdds, &emurect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); } @@ -4385,33 +4454,14 @@ HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) return res; } -#if 0 -static HRESULT WINAPI RestoreAll(LPDIRECTDRAWSURFACE7 lpDDSurface, LPDDSURFACEDESC2 lpDDSurfaceDesc, LPVOID lpContext) -{ - HRESULT res; - //res=lpDDSurface->Restore(); - res=(*pRestore)((LPDIRECTDRAWSURFACE)lpDDSurface); - OutTraceB("TestCooperativeLevel: Restore lpdds=%x res=%x(%s)\n", lpDDSurface, res, ExplainDDError(res)); - (*pReleaseS)((LPDIRECTDRAWSURFACE)lpDDSurface); - if(res) return DDENUMRET_CANCEL; - return DDENUMRET_OK; -} -#endif - HRESULT WINAPI extTestCooperativeLevel(LPDIRECTDRAW lpdd) { HRESULT res; res=(*pTestCooperativeLevel)(lpdd); OutTraceB("TestCooperativeLevel: lpdd=%x res=%x(%s)\n", lpdd, res, ExplainDDError(res)); if(res==DDERR_WRONGMODE) { -#if 0 - (*pEnumSurfaces4)(lpdd, DDENUMSURFACES_DOESEXIST|DDENUMSURFACES_ALL, NULL, NULL, (LPDDENUMSURFACESCALLBACK2)RestoreAll); - //lpDDSEmu_Prim->Restore(); - //res=(*pEnumSurfaces4)(lpdd, dwflags, lpddsd, lpContext, cb); -#else res=((LPDIRECTDRAW7)lpdd)->RestoreAllSurfaces(); if(res) OutTraceE("TestCooperativeLevel: RestoreAllSurfaces ERROR res=%x(%s)\n", res, ExplainDDError(res)); -#endif } if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; diff --git a/dll/dxemublt.cpp b/dll/dxemublt.cpp index 8173422..fd1edb6 100644 --- a/dll/dxemublt.cpp +++ b/dll/dxemublt.cpp @@ -37,7 +37,8 @@ static void MarkRect32(DWORD *dest, int w, int h, int destpitch) { int x, y; - for(x = 0; x < w; x ++) *(dest ++) = MARKBLITCOLOR32; + for(x = 0; x < w; x ++) *(dest ++) = MARKBLITCOLOR32; + if (h<3) return; dest += destpitch; for(y = 0; y < h-2; y ++){ *dest = MARKBLITCOLOR32; @@ -54,6 +55,7 @@ static void MarkRect16(SHORT *dest, int w, int h, int destpitch) int x, y; for(x = 0; x < w; x ++) *(dest ++) = MARKBLITCOLOR16; + if (h<3) return; dest += destpitch; for(y = 0; y < h-2; y ++){ *dest = MARKBLITCOLOR16; @@ -1528,13 +1530,13 @@ void SetBltTransformations() case 8: pRevBlt=RevBlt_32_to_8; pEmuBlt=EmuBlt_8_to_32; - if(dxw.dwFlags4 & BILINEARFILTER) pEmuBlt=BilinearBlt_8_to_32; + if(dxw.dwFlags4 & BILINEAR2XFILTER) pEmuBlt=BilinearBlt_8_to_32; OutTraceDW("set color transformation 8<->32\n"); break; case 16: pRevBlt=RevBlt_32_to_16; pEmuBlt=EmuBlt_16_to_32; - if(dxw.dwFlags4 & BILINEARFILTER) pEmuBlt=BilinearBlt_16_to_32; + if(dxw.dwFlags4 & BILINEAR2XFILTER) pEmuBlt=BilinearBlt_16_to_32; OutTraceDW("set color transformation 16<->32\n"); break; case 24: @@ -1544,7 +1546,7 @@ void SetBltTransformations() break; case 32: pEmuBlt=EmuBlt_32_to_32; - if(dxw.dwFlags4 & BILINEARFILTER) pEmuBlt=BilinearBlt_32_to_32; + if(dxw.dwFlags4 & BILINEAR2XFILTER) pEmuBlt=BilinearBlt_32_to_32; OutTraceDW("set color transformation 32->32\n"); break; default: @@ -1557,13 +1559,13 @@ void SetBltTransformations() case 8: pRevBlt=RevBlt_16_to_8; pEmuBlt=EmuBlt_8_to_16; - if(dxw.dwFlags4 & BILINEARFILTER) pEmuBlt=BilinearBlt_8_to_16; + if(dxw.dwFlags4 & BILINEAR2XFILTER) pEmuBlt=BilinearBlt_8_to_16; OutTraceDW("set color transformation 8<->16\n"); break; case 16: pRevBlt=RevBlt_16_to_16; pEmuBlt=EmuBlt_16_to_16; - if(dxw.dwFlags4 & BILINEARFILTER) pEmuBlt=BilinearBlt_16_to_16; + if(dxw.dwFlags4 & BILINEAR2XFILTER) pEmuBlt=BilinearBlt_16_to_16; OutTraceDW("set color transformation 16<->16\n"); break; case 24: @@ -1588,6 +1590,7 @@ void SetBltTransformations() pPrimaryBlt = PrimaryBlt; if(dxw.dwFlags5 & AEROBOOST) pPrimaryBlt = PrimaryStretchBlt; + if(dxw.dwFlags5 & BILINEARFILTER) pPrimaryBlt = PrimaryBilinearBlt; if(dxw.dwFlags5 & DOFASTBLT) pPrimaryBlt = PrimaryFastBlt; // debug opt if(dxw.dwFlags5 & NOBLT) pPrimaryBlt = PrimaryNoBlt; // debug opt return; diff --git a/dll/dxhelper.cpp b/dll/dxhelper.cpp index 665db9e..91c1d90 100644 --- a/dll/dxhelper.cpp +++ b/dll/dxhelper.cpp @@ -1,4 +1,6 @@ #define _CRT_SECURE_NO_DEPRECATE 1 +#define DIRECTINPUT_VERSION 0x0800 + #include #include #include diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index a2aee83..6368ea1 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -84,7 +84,7 @@ static char *Flag3Names[32]={ static char *Flag4Names[32]={ "NOALPHACHANNEL", "SUPPRESSCHILD", "FIXREFCOUNTER", "SHOWTIMESTRETCH", "ZBUFFERCLEAN", "ZBUFFER0CLEAN", "ZBUFFERALWAYS", "DISABLEFOGGING", - "NOPOWER2FIX", "NOPERFCOUNTER", "BILINEARFILTER", "INTERCEPTRDTSC", + "NOPOWER2FIX", "NOPERFCOUNTER", "BILINEAR2XFILTER", "INTERCEPTRDTSC", "LIMITSCREENRES", "NOFILLRECT", "HOOKGLIDE", "HIDEDESKTOP", "STRETCHTIMERS", "NOFLIPEMULATION", "NOTEXTURES", "RETURNNULLREF", "FINETIMING", "NATIVERES", "SUPPORTSVGA", "SUPPORTHDTV", @@ -93,9 +93,9 @@ static char *Flag4Names[32]={ }; static char *Flag5Names[32]={ - "DIABLOTWEAK", "CLEARTARGET", "NOWINPOSCHANGES", "SYSTEMMEMORY", - "NOBLT", "--DOSTRETCHBLT---", "DOFASTBLT", "AEROBOOST", - "", "", "", "", + "DIABLOTWEAK", "CLEARTARGET", "NOWINPOSCHANGES", "NOSYSTEMMEMORY", + "NOBLT", "NOSYSTEMEMULATED", "DOFASTBLT", "AEROBOOST", + "QUARTERBLT", "NOIMAGEHLP", "BILINEARFILTER", "", "", "", "", "", "", "", "", "", "", "", "", "", @@ -454,11 +454,11 @@ void CalculateWindowPos(HWND hwnd, DWORD width, DWORD height, LPWINDOWPOS wp) MaxY = dxw.iSizY; if (!MaxX) { MaxX = width; - if(dxw.dwFlags4 & BILINEARFILTER) MaxX <<= 1; // double + if(dxw.dwFlags4 & BILINEAR2XFILTER) MaxX <<= 1; // double } if (!MaxY) { MaxY = height; - if(dxw.dwFlags4 & BILINEARFILTER) MaxY <<= 1; // double + if(dxw.dwFlags4 & BILINEAR2XFILTER) MaxY <<= 1; // double } //GetClientRect(0, &desktop); (*pGetClientRect)(GetDesktopWindow(), &desktop); @@ -495,7 +495,7 @@ void CalculateWindowPos(HWND hwnd, DWORD width, DWORD height, LPWINDOWPOS wp) // BEWARE: from MSDN - If the window is a child window, the return value is undefined. hMenu = (dwStyle & WS_CHILD) ? NULL : GetMenu(hwnd); AdjustWindowRectEx(&rect, dwStyle, (hMenu!=NULL), dwExStyle); - if (hMenu) CloseHandle(hMenu); + if (hMenu) __try {CloseHandle(hMenu);} __except(EXCEPTION_EXECUTE_HANDLER){}; switch(dxw.Coordinates){ case DXW_DESKTOP_WORKAREA: case DXW_DESKTOP_FULL: @@ -773,24 +773,6 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp OutTrace("\n"); } -#if 0 - if(dxw.dwFlags2 & WALLPAPERMODE) { - static int t=0; - if ((*pGetTickCount)() - t > 100){ - //if (GetTopWindow(NULL)==hwnd){ - { - (*pSetWindowPos)(hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE); - t = (*pGetTickCount)(); - } - } - //if ((message >= WM_MOUSEFIRST) && (message <= WM_MOUSELAST)) return 0; - //if (message == WM_WINDOWPOSCHANGED) { - // t=0; - // return 0; - //} - } -#endif - if(dxw.dwFlags3 & FILTERMESSAGES){ switch(message){ case WM_NCMOUSEMOVE: @@ -1122,6 +1104,7 @@ void HookSysLibsInit() HookKernel32Init(); HookUser32Init(); HookGDI32Init(); + HookImagehlpInit(); } DEVMODE InitDevMode; @@ -1529,7 +1512,7 @@ void HookInit(TARGETMAP *target, HWND hwnd) "DirectX7", "DirectX8", "DirectX9", "DirectX10", "DirectX11", "None", "" }; static char *Resolutions[]={ - "unlimited", "320x200", "640x480", "800x600", "1024x768", "1280x960", "" // terminator + "unlimited", "320x200", "400x300", "640x480", "800x600", "1024x768", "1280x960", "" // terminator }; dxw.InitTarget(target); diff --git a/dll/dxhook.h b/dll/dxhook.h index 8987c34..4b2726e 100644 --- a/dll/dxhook.h +++ b/dll/dxhook.h @@ -10,6 +10,7 @@ extern void HookKernel32(HMODULE); extern void HookUser32(HMODULE); extern void HookWinMM(HMODULE); extern void HookAdvApi32(HMODULE); +extern void HookImagehlp(HMODULE); extern void InitPosition(int, int, int, int, int, int); //void InitWindowPos(int, int, int, int); @@ -35,6 +36,7 @@ extern FARPROC Remap_ImeLib_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_vfw_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_AdvApi32_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_Glide_ProcAddress(LPCSTR, HMODULE); +extern FARPROC Remap_Imagehlp_ProcAddress(LPCSTR, HMODULE); typedef enum { HOOK_IAT_CANDIDATE = 0, diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index f196db6..2ba86cb 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -107,6 +107,13 @@ void dxwCore::InitTarget(TARGETMAP *target) pTimeShifter = TimeShifterCoarse; pTimeShifter64 = TimeShifter64Coarse; } + iSizX = target->sizx; + iSizY = target->sizy; + iPosX = target->posx; + iPosY = target->posy; + // Aspect Ratio from window size, or traditional 4:3 by default + iRatioX = iSizX ? iSizX : 800; + iRatioY = iSizY ? iSizY : 600; } void dxwCore::SetScreenSize(void) @@ -132,6 +139,7 @@ void dxwCore::SetScreenSize(int x, int y) maxw=HUGE; maxh=HUGE; switch(dxw.MaxScreenRes){ case DXW_LIMIT_320x200: maxw=320; maxh=200; break; + case DXW_LIMIT_400x300: maxw=400; maxh=300; break; case DXW_LIMIT_640x480: maxw=640; maxh=480; break; case DXW_LIMIT_800x600: maxw=800; maxh=600; break; case DXW_LIMIT_1024x768: maxw=1024; maxh=768; break; @@ -412,11 +420,6 @@ POINT dxwCore::FixCursorPos(POINT prev) // remember: rect from GetClientRect always start at 0,0! if(dxw.dwFlags1 & MODIFYMOUSE){ int w, h, b; // width, height and border - int iRatioX, iRatioY; - - // ratio is the configured one, unless the values are 0. Then, it's the standard 4:3 ratio. - iRatioX = iSizX ? iSizX : 4; - iRatioY = iSizY ? iSizY : 3; if (!(*pGetClientRect)(hWnd, &rect)) { // v2.02.30: always use desktop win OutTraceDW("GetClientRect ERROR %d at %d\n", GetLastError(),__LINE__); @@ -564,11 +567,6 @@ void dxwCore::SethWnd(HWND hwnd) void dxwCore::FixWorkarea(LPRECT workarea) { int w, h, b; // width, height and border - int iRatioX, iRatioY; - - // ratio is the configured one, unless the values are 0. Then, it's the standard 4:3 ratio. - iRatioX = iSizX ? iSizX : 4; - iRatioY = iSizY ? iSizY : 3; w = workarea->right - workarea->left; h = workarea->bottom - workarea->top; @@ -590,11 +588,6 @@ RECT dxwCore::MapWindowRect(LPRECT lpRect) RECT RetRect; RECT ClientRect; int w, h, bx, by; // width, height and x,y borders - int iRatioX, iRatioY; - - // ratio is the configured one, unless the values are 0. Then, it's the standard 4:3 ratio. - iRatioX = iSizX ? iSizX : 4; - iRatioY = iSizY ? iSizY : 3; if (!(*pGetClientRect)(hWnd, &ClientRect)){ OutTraceE("GetClientRect ERROR: err=%d hwnd=%x at %d\n", GetLastError(), hWnd, __LINE__); @@ -1231,7 +1224,7 @@ void dxwCore::ShowOverlay(LPDIRECTDRAWSURFACE lpdds) if (FAILED(lpdds->GetDC(&hdc))) return; w = this->GetScreenWidth(); h = this->GetScreenHeight(); - if(this->dwFlags4 & BILINEARFILTER) { + if(this->dwFlags4 & BILINEAR2XFILTER) { w <<=1; h <<=1; } @@ -1443,6 +1436,7 @@ int dxwCore::GetDLLIndex(char *lpFileName) "wintrust", "d3dim", "d3dim700", + "imagehlp", // "+glide", // "+glide2x", // "+glide3x", @@ -1601,6 +1595,8 @@ BOOL dxwCore::ReleaseEmulatedDC(HWND hwnd) if(!(wdc=(*pGDIGetDC)(hwnd))) OutTraceE("GetDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__); //OutTrace("StretchBlt: destdc=%x destrect=(0,0)-(%d,%d) srcdc=%x srcrect=(0,0)-(%d,%d)\n", wdc, client.right, client.bottom, VirtualHDC, VirtualPicRect.right, VirtualPicRect.bottom); + // v2.02.94: set HALFTONE stretching. But causes problems with Imperialism II + // SetStretchBltMode(wdc,HALFTONE); if(!(*pGDIStretchBlt)(wdc, 0, 0, client.right, client.bottom, VirtualHDC, 0, 0, VirtualPicRect.right, VirtualPicRect.bottom, SRCCOPY)) OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__); //(*pInvalidateRect)(hwnd, NULL, 0); diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 95bc51d..6800dff 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -149,6 +149,8 @@ public: // simple data variables short iPosY; short iSizX; short iSizY; + int iRatioX; + int iRatioY; char *CustomOpenGLLib; WORD palVersion; WORD palNumEntries; @@ -217,6 +219,8 @@ typedef enum { SYSLIBIDX_WINTRUST, SYSLIBIDX_DIRECT3D, SYSLIBIDX_DIRECT3D700, +// SYSLIBIDX_DBGHELP, + SYSLIBIDX_IMAGEHLP, // SYSLIBIDX_GLIDE, // SYSLIBIDX_GLIDE2X, // SYSLIBIDX_GLIDE3X, diff --git a/dll/dxwnd.aps b/dll/dxwnd.aps index 0da9e5a234329a16fc5e5f8aa7191ef3df67c28f..fbcc6dc3a51dd6d9842377edb724a415fc597c10 100644 GIT binary patch delta 28 icmZ3mjA_9#rU?;@CL1F~`x#9(=l82H0jVhydl&(h;|c-* delta 28 icmZ3mjA_9#rU?;@h8rVA`xy;4=l82H0jVhydl&(haS8bV diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 8701f59..278516f 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.93.f1" +#define VERSION "2.02.94" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 440c27a2dffd91cebc2e4c2e2d870e58c23fc08e..683f2c76f203060e31bb114da65f7f5ed3ee6347 100644 GIT binary patch delta 23620 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 delta 18333 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 Gg?|S;meObd diff --git a/dll/dxwnd.vs2008.vcproj b/dll/dxwnd.vs2008.vcproj index f68a5a8..3c911f9 100644 --- a/dll/dxwnd.vs2008.vcproj +++ b/dll/dxwnd.vs2008.vcproj @@ -220,6 +220,10 @@ RelativePath=".\advapi.cpp" > + + @@ -372,6 +376,10 @@ RelativePath=".\iatpatch.cpp" > + + diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index c389747..6af95e4 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -1334,6 +1334,8 @@ int WINAPI extSetDIBitsToDevice(HDC hdc, int XDest, int YDest, DWORD dwWidth, DW OutTraceE("SelectObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__); if(!(*pSetDIBitsToDevice)(hTempDc, 0, 0, OrigWidth, OrigHeight, XSrc, YSrc, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse)) OutTraceE("SetDIBitsToDevice: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + // v2.02.94: set HALFTONE stretching. Fixes "Celtic Kings Rage of War" + SetStretchBltMode(hdc,HALFTONE); if(!(ret=(*pGDIStretchBlt)(hdc, XDest, YDest, dwWidth, dwHeight, hTempDc, 0, 0, OrigWidth, OrigHeight, SRCCOPY))) OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__); if(!(DeleteObject(hbmPic))) // v2.02.32 - avoid resource leakage diff --git a/dll/hd3d.cpp b/dll/hd3d.cpp index 62ac6d3..7c44e18 100644 --- a/dll/hd3d.cpp +++ b/dll/hd3d.cpp @@ -844,30 +844,39 @@ HRESULT WINAPI extGetAdapterDisplayMode9(void *lpd3d, UINT Adapter, D3DDISPLAYMO return res; } -void FixD3DWindowFrame(HWND hfocuswindow) +HWND FixD3DWindowFrame(HWND hFocusWin) { + extern void HookWindowProc(HWND); + HWND hRetWnd = hFocusWin; + if(!(dxw.dwFlags3 & NOWINDOWMOVE)) AdjustWindowFrame(dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); if(dxw.dwFlags3 & FIXD3DFRAME){ char ClassName[81]; RECT workarea; + HWND hChildWin; GetClassName(dxw.GethWnd(), ClassName, 80); (*pGetClientRect)(dxw.GethWnd(), &workarea); if (dxw.dwFlags2 & KEEPASPECTRATIO) dxw.FixWorkarea(&workarea); - hfocuswindow=(*pCreateWindowExA)( + hChildWin=(*pCreateWindowExA)( 0, ClassName, "child", WS_CHILD|WS_VISIBLE, //GetSystemMetrics(SM_CXSIZEFRAME), GetSystemMetrics(SM_CYSIZEFRAME)+GetSystemMetrics(SM_CYCAPTION), workarea.left, workarea.top, workarea.right-workarea.left, workarea.bottom-workarea.top, + //workarea.left+20, workarea.top+20, workarea.right-workarea.left-40, workarea.bottom-workarea.top-40, dxw.GethWnd(), NULL, NULL, NULL); - if (hfocuswindow) - OutTraceD3D("CreateDevice: updated hfocuswindow=%x pos=(%d,%d) size=(%d,%d)\n", - hfocuswindow, workarea.left, workarea.top, workarea.right-workarea.left, workarea.bottom-workarea.top); + if (hChildWin) + OutTraceD3D("CreateDevice: ChildWin=%x pos=(%d,%d) size=(%d,%d)\n", + hChildWin, workarea.left, workarea.top, workarea.right-workarea.left, workarea.bottom-workarea.top); else OutTraceE("CreateDevice: CreateWindowEx ERROR err=%d\n", GetLastError()); - dxw.SethWnd(hfocuswindow, dxw.GethWnd()); + dxw.SethWnd(hChildWin, dxw.GethWnd()); + HookWindowProc(hChildWin); + hRetWnd = hChildWin; } + + return hRetWnd; } HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, @@ -884,7 +893,7 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, dxw.SethWnd(hfocuswindow); dxw.SetScreenSize(param[0], param[1]); - if(dxw.Windowize) FixD3DWindowFrame(hfocuswindow); + if(dxw.Windowize) hfocuswindow=FixD3DWindowFrame(hfocuswindow); if(IsTraceD3D){ tmp = param; @@ -998,7 +1007,7 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp dxw.SethWnd(hfocuswindow); dxw.SetScreenSize(param[0], param[1]); - if(dxw.Windowize) FixD3DWindowFrame(hfocuswindow); + if(dxw.Windowize) hfocuswindow=FixD3DWindowFrame(hfocuswindow); tmp = param; if(IsTraceD3D){ diff --git a/dll/hddraw.h b/dll/hddraw.h index f2579da..1317006 100644 --- a/dll/hddraw.h +++ b/dll/hddraw.h @@ -19,6 +19,7 @@ extern HRESULT WINAPI PrimaryBlt(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFAC extern HRESULT WINAPI PrimaryNoBlt(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); extern HRESULT WINAPI PrimaryStretchBlt(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); extern HRESULT WINAPI PrimaryFastBlt(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); +extern HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT); // COM generic types typedef HRESULT (WINAPI *QueryInterface_Type)(void *, REFIID, LPVOID *); diff --git a/dll/imagehlp.cpp b/dll/imagehlp.cpp new file mode 100644 index 0000000..af6417b --- /dev/null +++ b/dll/imagehlp.cpp @@ -0,0 +1,61 @@ +#include "dxwnd.h" +#include "dxwcore.hpp" +#include "syslibs.h" +#include "dxhook.h" +#include "dxhelper.h" + +#include "stdio.h" +#include "Dbghelp.h" + +typedef PIMAGE_DEBUG_INFORMATION (WINAPI *MapDebugInformation_Type)(HANDLE, PCSTR, PCSTR, ULONG); +typedef BOOL (WINAPI *UnmapDebugInformation_Type)(PIMAGE_DEBUG_INFORMATION); +PIMAGE_DEBUG_INFORMATION WINAPI extMapDebugInformation(HANDLE, PCSTR, PCSTR, ULONG); +BOOL WINAPI extUnmapDebugInformation(PIMAGE_DEBUG_INFORMATION); +MapDebugInformation_Type pMapDebugInformation = NULL; +UnmapDebugInformation_Type pUnmapDebugInformation = NULL; + +static HookEntry_Type Hooks[]={ + {HOOK_IAT_CANDIDATE, "MapDebugInformation", (FARPROC)NULL, (FARPROC *)&pMapDebugInformation, (FARPROC)extMapDebugInformation}, + {HOOK_IAT_CANDIDATE, "UnmapDebugInformation", (FARPROC)NULL, (FARPROC *)&pUnmapDebugInformation, (FARPROC)extUnmapDebugInformation}, + {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator +}; + +static char *libname = "IMAGEHLP.DLL"; + +void HookImagehlpInit() +{ + HookLibInit(Hooks); +} + +void HookImagehlp(HMODULE module) +{ + if(dxw.dwFlags5 & NOIMAGEHLP) HookLibrary(module, Hooks, libname); +} + +FARPROC Remap_Imagehlp_ProcAddress(LPCSTR proc, HMODULE hModule) +{ + FARPROC addr; + + if(dxw.dwFlags5 & NOIMAGEHLP) { + if(addr=RemapLibrary(proc, hModule, Hooks)) return addr; + } + + return NULL; +} + +// =================== rerouted calls ========================== + +IMAGE_DEBUG_INFORMATION DummyDebugInfo; + +PIMAGE_DEBUG_INFORMATION WINAPI extMapDebugInformation(HANDLE FileHandle, PCSTR FileName, PCSTR SymbolPath, ULONG ImageBase) +{ + OutTrace("MapDebugInformation: FileHandle=%x FileName=%s SymbolPath=%s ImageBase=%x\n", FileHandle, FileName, SymbolPath, ImageBase); + memset(&DummyDebugInfo, 0, sizeof(IMAGE_DEBUG_INFORMATION)); + return &DummyDebugInfo; +} + +BOOL WINAPI extUnmapDebugInformation(PIMAGE_DEBUG_INFORMATION DebugInfo) +{ + OutTrace("UnmapDebugInformation: DebugInfo=%x\n", DebugInfo); + return TRUE; +} diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index 06c995b..96909f3 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -420,13 +420,6 @@ HMODULE WINAPI LoadLibraryExWrapper(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFl OutTraceDW("%s: hooking lib=\"%s\" handle=%x\n", api, lpFileName, libhandle); HookModule(libhandle, 0); } -#if 0 - switch(idx){ - case SYSLIBIDX_DIRECTDRAW: HookDirectDraw(libhandle, 0); break; - case SYSLIBIDX_DIRECT3D8: HookDirect3D(libhandle, 8); break; - case SYSLIBIDX_DIRECT3D9: HookDirect3D(libhandle, 9); break; - } -#endif return libhandle; } @@ -545,8 +538,11 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc) case SYSLIBIDX_DIRECT3D700: if (remap=Remap_d3d7_ProcAddress(proc, hModule)) return remap; break; - default: + case SYSLIBIDX_IMAGEHLP: + if (remap=Remap_Imagehlp_ProcAddress(proc, hModule)) return remap; break; + default: + break; } } else { diff --git a/dll/syslibs.h b/dll/syslibs.h index 8522a6a..da952e5 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -654,5 +654,6 @@ extern MMRESULT WINAPI exttimeKillEvent(UINT); extern void HookKernel32Init(); extern void HookUser32Init(); extern void HookGDI32Init(); +extern void HookImagehlpInit(); /* eof */ \ No newline at end of file diff --git a/dll/user32.cpp b/dll/user32.cpp index 4038b85..e2c3982 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -357,13 +357,6 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) // note: v2.1.93: compensation must refer to the client area, not the wp // window dimensions that include the window borders. if(BorderX==-1){ -#if 0 - RECT client, full; - (*pGetClientRect)(hwnd, &client); - (*pGetWindowRect)(hwnd, &full); - BorderX= full.right - full.left - client.right; - BorderY= full.bottom - full.top - client.bottom; -#else // v2.02.92: Fixed for AERO mode, where GetWindowRect substantially LIES! RECT client, full; LONG dwStyle, dwExStyle; @@ -375,10 +368,9 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) dwExStyle=(*pGetWindowLongA)(hwnd, GWL_EXSTYLE); hMenu = (dwStyle & WS_CHILD) ? NULL : GetMenu(hwnd); AdjustWindowRectEx(&full, dwStyle, (hMenu!=NULL), dwExStyle); - if (hMenu) CloseHandle(hMenu); + if (hMenu) __try {CloseHandle(hMenu);} __except(EXCEPTION_EXECUTE_HANDLER){}; BorderX= full.right - full.left - client.right; BorderY= full.bottom - full.top - client.bottom; -#endif OutTraceDW("%s: KEEPASPECTRATIO window borders=(%d,%d)\n", ApiName, BorderX, BorderY); } extern LRESULT LastCursorPos; @@ -389,7 +381,7 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) case HTBOTTOMRIGHT: case HTTOPLEFT: case HTTOPRIGHT: - cx = BorderX + ((wp->cy - BorderY) * dxw.GetScreenWidth()) / dxw.GetScreenHeight(); + cx = BorderX + ((wp->cy - BorderY) * dxw.iRatioX) / dxw.iRatioY; if(cx!=wp->cx){ OutTraceDW("%s: KEEPASPECTRATIO adjusted cx=%d->%d\n", ApiName, wp->cx, cx); wp->cx = cx; @@ -397,7 +389,7 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) break; case HTLEFT: case HTRIGHT: - cy = BorderY + ((wp->cx - BorderX) * dxw.GetScreenHeight()) / dxw.GetScreenWidth(); + cy = BorderY + ((wp->cx - BorderX) * dxw.iRatioY) / dxw.iRatioX; if(cy!=wp->cy){ OutTraceDW("%s: KEEPASPECTRATIO adjusted cy=%d->%d\n", ApiName, wp->cy, cy); wp->cy = cy; diff --git a/host/Resource.h b/host/Resource.h index ff0c350f334eb3f0e70d4991621764059f03cc4c..826c34cd28dea0743f73ea6fe8458bb274da726c 100644 GIT binary patch delta 299 zcmdn+it*Ds#tk}wlU>-QCL08?Fj`EW7$-eBAc#Xam?4rOm?4D0mBAMXL8SlWelz*W z0yb=uh4d6Q&k0mxoXnOZHCcd>Z}OTFsmT|3IE4Ke{24rfN*x*8fm%Emd>8^IZ?w>y z926ll`2!ydZy-Y`P%a2;Y|!M1Mw(#bHUMRTR*E8939>L0sNZq2eUUuSX>6Qk47?0n z4EhZElOHNdPu?KHC+q~24`JYhLqi6`$sY|AC$AF`VsxC$m?J;g!HSE~66~c9d~C`t xK${&I!WrCvZUpIc1@cjJGgwY`%oU%U5W=?kUC<%L$srM9lX*%+Cf_Ov0{{m_NoPerfCounter); DDX_Check(pDX, IDC_HIDECDROMEMPTY, cTarget->m_HideCDROMEmpty); DDX_Check(pDX, IDC_DIABLOTWEAK, cTarget->m_DiabloTweak); + DDX_Check(pDX, IDC_NOIMAGEHLP, cTarget->m_NoImagehlp); // 3D management DDX_Check(pDX, IDC_NOTEXTURES, cTarget->m_NoTextures); DDX_Check(pDX, IDC_WIREFRAME, cTarget->m_WireFrame); DDX_Check(pDX, IDC_DISABLEFOGGING, cTarget->m_DisableFogging); DDX_Check(pDX, IDC_CLEARTARGET, cTarget->m_ClearTarget); + DDX_Check(pDX, IDC_NOD3DRESET, cTarget->m_NoD3DReset); // Registry management DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry); diff --git a/host/TabDebug.cpp b/host/TabDebug.cpp index 998c4aa..5eee125 100644 --- a/host/TabDebug.cpp +++ b/host/TabDebug.cpp @@ -32,9 +32,8 @@ void CTabDebug::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_DXPROXED, cTarget->m_DXProxed); DDX_Check(pDX, IDC_ASSERT, cTarget->m_AssertDialog); DDX_Check(pDX, IDC_MARKBLIT, cTarget->m_MarkBlit); - DDX_Check(pDX, IDC_SYSTEMMEMORY, cTarget->m_SystemMemory); DDX_Check(pDX, IDC_NOBLT, cTarget->m_NoBlt); -// DDX_Check(pDX, IDC_STRETCHBLT, cTarget->m_StretchBlt); +// DDX_Check(pDX, IDC_BILINEARBLT, cTarget->m_BilinearBlt); DDX_Check(pDX, IDC_FASTBLT, cTarget->m_FastBlt); DDX_Check(pDX, IDC_ANALYTICMODE, cTarget->m_AnalyticMode); DDX_Check(pDX, IDC_SURFACEWARN, cTarget->m_SurfaceWarn); diff --git a/host/TabDirectX.cpp b/host/TabDirectX.cpp index 3f45d68..f40e48b 100644 --- a/host/TabDirectX.cpp +++ b/host/TabDirectX.cpp @@ -27,8 +27,10 @@ void CTabDirectX::DoDataExchange(CDataExchange* pDX) CDialog::DoDataExchange(pDX); CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent())); DDX_Radio(pDX, IDC_AUTO, cTarget->m_DXVersion); - DDX_Radio(pDX, IDC_NOEMULATESURFACE, cTarget->m_DxEmulationMode); + //DDX_Radio(pDX, IDC_NOEMULATESURFACE, cTarget->m_DxEmulationMode); + DDX_Radio(pDX, IDC_AUTOMATIC, cTarget->m_DxEmulationMode); //DDX_Check(pDX, IDC_HANDLEDC, cTarget->m_HandleDC); + DDX_Radio(pDX, IDC_DDRAWFILTER, cTarget->m_DxFilterMode); DDX_Check(pDX, IDC_SUPPRESSCLIPPING, cTarget->m_SuppressClipping); DDX_Check(pDX, IDC_BLITFROMBACKBUFFER, cTarget->m_BlitFromBackBuffer); DDX_Check(pDX, IDC_AUTOREFRESH, cTarget->m_AutoRefresh); @@ -42,11 +44,12 @@ void CTabDirectX::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_NOALPHACHANNEL, cTarget->m_NoAlphaChannel); DDX_Check(pDX, IDC_FIXREFCOUNTER, cTarget->m_FixRefCounter); DDX_Check(pDX, IDC_RETURNNULLREF, cTarget->m_ReturnNullRef); - DDX_Check(pDX, IDC_NOD3DRESET, cTarget->m_NoD3DReset); DDX_Check(pDX, IDC_NOFLIPEMULATION, cTarget->m_NoFlipEmulation); DDX_Check(pDX, IDC_FULLRECTBLT, cTarget->m_FullRectBlt); DDX_Check(pDX, IDC_SETCOMPATIBILITY, cTarget->m_SetCompatibility); DDX_Check(pDX, IDC_AEROBOOST, cTarget->m_AEROBoost); + DDX_Check(pDX, IDC_NOSYSTEMMEMORY, cTarget->m_NoSystemMemory); + DDX_Check(pDX, IDC_NOSYSTEMEMULATED, cTarget->m_NoSystemEmulated); } BEGIN_MESSAGE_MAP(CTabDirectX, CDialog) diff --git a/host/TabTiming.cpp b/host/TabTiming.cpp index 6275e2c..d5905d6 100644 --- a/host/TabTiming.cpp +++ b/host/TabTiming.cpp @@ -36,6 +36,7 @@ void CTabTiming::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_TIMESTRETCH, cTarget->m_TimeStretch); DDX_Check(pDX, IDC_INTERCEPTRDTSC, cTarget->m_InterceptRDTSC); DDX_Check(pDX, IDC_STRETCHTIMERS, cTarget->m_StretchTimers); + DDX_Check(pDX, IDC_QUARTERBLT, cTarget->m_QuarterBlt); DDX_Check(pDX, IDC_FINETIMING, cTarget->m_FineTiming); DDX_Text(pDX, IDC_MAXFPS, cTarget->m_MaxFPS); DDX_LBIndex(pDX, IDC_LISTTS, cTarget->m_InitTS); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 5b9a500..e225961 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -21,7 +21,6 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) { //{{AFX_DATA_INIT(CTargetDlg) m_DXVersion = 0; - m_BilinearFilter = 0; m_Coordinates = 0; m_DxEmulationMode = 4; // default: AUTOMATIC m_DCEmulationMode = 0; // default: no emulation @@ -42,6 +41,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_SetCompatibility = TRUE; // default true !! m_AEROBoost = TRUE; // default true !! m_DiabloTweak = FALSE; + m_NoImagehlp = FALSE; m_DisableHAL = FALSE; m_ForcesHEL = FALSE; m_ColorFix = FALSE; @@ -105,9 +105,10 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_UseRGB565 = FALSE; m_SuppressDXErrors = FALSE; m_MarkBlit = FALSE; - m_SystemMemory = FALSE; + m_NoSystemMemory = FALSE; + m_NoSystemEmulated = FALSE; m_NoBlt = FALSE; -// m_StretchBlt = FALSE; + m_BilinearBlt = FALSE; m_FastBlt = FALSE; m_PreventMaximize = FALSE; m_ClientRemapping = TRUE; // default true !! @@ -138,6 +139,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_ShowTimeStretch = FALSE; m_TimeStretch = FALSE; m_StretchTimers = FALSE; + m_QuarterBlt = FALSE; m_FineTiming = FALSE; m_ReleaseMouse = FALSE; m_FrameCompensation = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 5f90eb2..117b482 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -27,8 +27,8 @@ public: int m_DXVersion; int m_Coordinates; int m_DxEmulationMode; + int m_DxFilterMode; int m_DCEmulationMode; - BOOL m_BilinearFilter; BOOL m_HookDI; BOOL m_ModifyMouse; BOOL m_OutProxyTrace; @@ -83,9 +83,10 @@ public: BOOL m_UseRGB565; BOOL m_SuppressDXErrors; BOOL m_MarkBlit; - BOOL m_SystemMemory; + BOOL m_NoSystemMemory; + BOOL m_NoSystemEmulated; BOOL m_NoBlt; -// BOOL m_StretchBlt; + BOOL m_BilinearBlt; BOOL m_FastBlt; BOOL m_PreventMaximize; BOOL m_ClientRemapping; @@ -116,6 +117,7 @@ public: BOOL m_ShowTimeStretch; BOOL m_TimeStretch; BOOL m_StretchTimers; + BOOL m_QuarterBlt; BOOL m_FineTiming; BOOL m_ReleaseMouse; BOOL m_FrameCompensation; @@ -150,6 +152,7 @@ public: BOOL m_SetCompatibility; BOOL m_AEROBoost; BOOL m_DiabloTweak; + BOOL m_NoImagehlp; BOOL m_DisableHAL; BOOL m_ForcesHEL; BOOL m_ColorFix; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index cf6055df8c8e7779c3bafeb74889d0594bb08261..5cab8e8e4b80340b557559fc21584fd25ca4c479 100644 GIT binary patch delta 22039 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 Ohnl;NS^Ps&@c$pzQSz7o delta 28867 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 N#K#E?zt^X?{|nSGj@AGG diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 7772bd596638da219bdd1d0940a77fc245daaf4c..1a713bb722619ecb50a31496f221cf2f3a26ce9a 100644 GIT binary patch delta 1116 zcmZWoU2Icj7=90@opp?Dc4%ObtZU%HLZGMX&zhyn&R~o#`+?HMDMohsGupLuW$j=a z<7anV7%6*z8nfsM2?>zE$N?pW3onddVodR3Twn}>7XvS}_lEd>r(US!&G((YU*F&7 zdEfgt%%9ygFWa}t3OR9pv<(?=v!31dt$D%e=nc^fX_O%w^-`RYlw+~c7){V5e-p-w zjUxO_^U1J{X8bc|yyRIIc2V3;HQ^Vv5oeqxsaBVVp|_jJka|lnS)$VZWT= z<)RVx?fx$Zm`S(DDjk6OWGl-3%_t{p*^0LPK* z+@&9zCOY)Sj736iwifn@RoO!>XsZGAWv}De(Jr`;-o*5D7YfVk;hiktUalK8xjQ^m zE-;mmhQ%N4H2O{5-dW``>qRdMlnj-(a@!gl15B(aKsgLJwz= zow68Xq;M4VMNn9&h81HMry~Xj8siyfR{qVyAPvz0dY@02dT78n!_0>&bX1m4qcCTA zQ_LDi=GeC?tr#4&=r>QE-HOFNM_`z;9I_f(ERR^0!z|U+$nz3a7fhj@Jb*SPHOd1L zXW_NOA2;4^+E2rrE@TuCVxq+`3_Uz4xo~iGBfhS@VsK8Al79WOS3u zX+CixLabmig_wM16bePrDuU95i>atZ3kk7MX%W$JL|UA4@A>X`&OPTlcb*E1vqDhH z;ua{zhuXWW4guerQnf#dQ`RX=Mz<{kO%Eg_tMVa=Sw71qvyfMqk(tnIOAo)x&m+-e z7h&oi$CR3eRa=d4f>?R@+IkLdyN&1Ki~W&cCd`CaH_h11&}$!CB6RSyMD5R~g4xW> z6x^%NMMJv-2kjDNJ<0Eg7LSnsM5Fm+lHOt|wyMZR3hoena3GT`BNyWKwHurLhPM``}wn zz~t*R?aj#8F@(005Udt8@ANn0Uf_4f@mQ_t(~%fhCyt_LQ-7eC6|+iK#LlowbT;CN zCnZ{J5&Rj~?ILcWNd$E~e;yrrgw`;Tk#_TM`E<_5t@WC`U_iGKA8m!6eY@G9{i8>#(d diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index db99b625eb4d32ee27af1f83f51e3ce4cca61f76..90117f8898357872da36099af13fe0fce43442ff 100644 GIT binary patch delta 6281 zcmcIo3shBA8r~buy@Hqm@)7~>1wl|iK;-2k@KK-!3Y3~zysknbAYMzH>|V9!WTou% zOyvWeGEJvRZxhwzGn+9j!qT+InyhJNYF0Jba!u;Y$bA2~|A9N!n$=p<{C9nK|L5EP zew=^*`*qw8Sl#EW>k4JRy+z;o#Wn~bHUO1CIZzAS2rL6`S2y~XX;*rBdelz;qXRSM zS3i{W$G4?FvfKyM3hlV11?p>mF%NS2v=rpM&2T#}+w!_=) z6i;`AQ(6Y2NVr+V5|1aFYKxjirtL#6SSvs@C3`LpDGic-rkTf?_)&;lpl0O`_WGhe zcb*m~sn76ZkD8g3tlR@N&&6>cgc&YMQQZ+SDr)X<|7cO6+e>7=o|-5FlzUd8tW_ri zhv@^-G zsmNQrPNQ5BTO;Xyz0YE%T2*d0Iuz^QES9Ost`rIhqwpZ4=0F$(y@^??M#_0v(YDm- zSe!n&xv|kv>uhLlTAF^nqsh_QP@6ub!62$z+p4nW?Q_4T1&Vu7hAJULdb!nHGmKx;rIbpP1sFs{g&~2mS z`1UQsT|Y-Fj{s|dhXLx+qe#~Q>w$Ja0gnM2fQ^6-`~r9!cmjA5pmI+k-2&_aI)ID7 zc7XB-Peb1U?Cj%i?Rl0To=5sC)_=|EUQRto_XEEHUIjVRV4l#EC=|R@7 ztglW8IgW=Dz?;BZK$ptgvRhul|1kae6q%!JXCmYbCHEx4$wjA!s)=(V{2h49p0Tn* z&V;uUH`?V$)v;Mq<(u{?cUqh$Zu_U2YaWM2g|oGxX<@2u@zUDn*2adKRNGCC)}@G) z30dhG^h>o(Ue@Sb*6Nthb%=|Ig zj*Ptg`Ke~*zHwJvy|mt0UDN0=+M4t~H#UQ(1|mx~dE}nMQWp2lmT*g}aEPUzo?X)K z8cZC~iX{|o5ewA$osW7-Pu0oo&qeFU(xi=oQ9n6Sj&h9)-rNKeV=hG^Ex{bJBAtoU zoL7`jQVyc0XSujjG>JNn;E05kg_P%On}=r)b5TfNVEt`Q$(D48OLXI(h=IUK)<5AC zV=qW2iG&f^4FIB8kL8r?NGFM7j_ii9KElV2bdqF)8{@4og$>et3`rjf!_i0)xjjNG zH9UHYK5K+bz+7FDB-6C5AMP$yk5y*RJqXhn;3$9+Vl41GAQ<>PKpf!&Ku&p+pDCX< z1bT;4%pnn{fokAAWxsK7&>3jnPSn%FZ0FS^R=MxX(+}BXvGoTJRHM5$!iv8zX25)h{N>o4orDt)h{Yq5?$+Dm<#5`%BJ}5rWsDrEZ%vZME~nd9$z0ihMW<{>y43VZ$+A$Dp0cVh zJDkdIbKm0Az9&g9%*H}p+7X~$*fvA8tV~j0XT*7??0i+Kjx&`za%8Ap9xs!qc&9s6 zx~0+ah%7mA<1|?;7n^6DPUkeaR;rqnm8vT{N95U0nL%0#PdglkszRaGi0r78|d?YvMXXQbbNOi{|AkqNzw!=-|`RB)B7 z&*7A2bjelRL~ysL{Gy?eb(}K{i~~B!GJl~Tyjvc2QA88B4u3QQ*83RW!NxE7a4$1= zhB+I`oMrAyAMPvW=%ht$!~_0(>asHjN7OTmtM)Fn7|&?j7dN zx_rp@nf#c!5h#3)xj!>UL-H5q{?6P4aNjYPW9?gGbD@*uGe=u?0qYYubz%4gJ&;_> zBt>2m^fIK)KHOgDMd0=^XM0BS% z-ufTwk#_hGqwi2vabaptLTK;$U37Z1wqWD~1)LF~Z%^Xm8m+3@XVb=>R2?N@)VR@e zT4(~$H=))v=33}Iq$=tN*X9IXAHa1ayY{g$jp<830dUxdI|7|f3AERcJ7^lv0gmJY zfH*oFeh8491Bk=vsrP*L1#@+{*fis)iem9s`h$E6 zczv5CZW9@T{=Ii4oNi`MOr(PpHAX_aKgqQ~Ul}^gl7oAlh}(Xkxe5B5k8$-14d1r) z*{`Syb2v+&8=I%{>oCX1xKU^g$Ic%lUt@g2RM)N;%LvodxOR+|wZ@jGSEb8>PG>Rg zKP~qURPJ3?J#2<-#|d%O7@04t&D)=GV3c*V3pKZ=+GLipMu{-D}o&GO_fhhhEePNVA{-DT@fgK#cT5ehl2W; zL9`0=I+=8uIDyQeu!sic0z;WgL5fSgA*J{?y-7qKU`8CBbUg#`Mt z-7s$lNg#-$cO%`9IH|e^WvKbbnvAaxY4vxByTs4%K9dmXc?e7|(h!DOMxdsNO#G$* zX{G~?QH>C~yHdT00Nr6p&N63*{yuYG5U2LfU8CGLC*eJ*%q*;zl+xUuM7sX3Qp9(j zvD+37$+m7nA#)GTWmdD?0rR`fF}Fs;rpw~pr}Mow7A@c|*icvLYlmekOwQ_;a0J4g zns##39W)4J9<`36K#^Uh=`lCR&-9J)(x%(ovYP@o+Xyl8?kcmnpv@@ukx|MBTpSI| z0NsWhIx0gbq|p?Gy&I4B^p<`RHZ^3yHo0c$tlh}jY{WU1u<3!RBKe zvcyVMa3Ui52QJ4h<8my_>-v27RrKR)f57DC#VysXj@AIWuvav!aNqd^`@rg=8aGpnpOWcUKY~S$uoj~4J_~L4gP%? zL|%i836gKv&@A;gZN|I+oBOB%$ZTBY79iU3tp~TYg;>!Y*lE+mRD5&D6O%CuijYoH zc5O)DNZ}`G)eJIg8nqCwz6iCE%*IaLDi)!(Mre0lU8lKfSQ216$gClVZmC9btPp!k zWSOV%RJ8y1ZpGv1vqad{H`PXqnp768o@lg%8)p@+Cxg=hZY1s+^TtX&{r}!={qn`X E0n{xr>i_@% delta 1974 zcmcIlUu=_A6u+mt{peQN)^+Q~Qc7*RjV)c%bz@_Iv%oMg#{N`@Gm4Zs#xMgLtV@Q# zK0t{vLt%$;F#^&-=7I^C`%L;`Viipc5hw|Xgcvf64?Y-}W{H!B)pH9i==2T0=9ipv z?z!jw?md61PAclV%27WkpRN2uw{SL*NIcIN+eioyUL_0@-X!e6O&P8HHIi^F`mGZ(M^6GN|Wp55KJMB{2gd>&zG|EyA$=CU@!>)7q4qIuR=ai`J0&4k)0I+x)bf zcbMZ$)_R52lX+g+95%KpKx`6*lu4U5Ue&GO41lqh$+w$eC0zNmChy+t-GsE8Np}(I z{$YQP^cR>mo4p3`lKB}_b7$aJ>^H5~>uDt`b%fGQF;I{9P5Yrs>(6T8pt(1CDSaiU7mbubJx>Y8gLix zp|o#fJ84TV+seWux5%^b&_Ma-0ussz&k|A(t|U{zevuWx3fK<)d0iG`iA0T#QQYLW zbmtZRP-OOADeKaD+71}c@y@GcRcsYoI-y?TnLuSjff5O9D_yKjzuh>`n?t5tf{Bnv zFcb0#1q2JBkWfTeKqw|)&!F9qx~Fz@Fq9)4s(h$}ZV^&}V@qU0^sNIoUM#eWW;cuv zopH^VXUcDoA{@axA1~5!Z;XSOa)C?OE1_0=UJ1=2bO8Lq?}I(a#~dPl5-d1*mW$jY zP$YuY&^$7t$2<82V$*R5$lO&3`w>uf>}7k|Tda|J*&4d*O16ZpX0@!6Ze2}sJxMjR zQbTK%q^+VgFGuw`Q$lP`Tmn7#xAQRa|-;iH+)EU@!y!X4qdTnw(oxeTy%YT$NxcC)`Vzx zf*J4j=V7eS;L0Z^sjih{@;$;wgvae7SPoVUL>%d?YyN97E;L z6>dB9P28NR$V@fZ?6IwhQ4ZGVh#fBIMdMoVh%F30R;^+$*ENK@Tj8#s^^#PBg(<2&JZLG~7fs z*o}$G5^?Z-Q02X;kt2EH_6Oh)<8IRASaqL-pHW?A6Sfv8QD{Cg7Jd|@1vUcorS<7n zX!c-eEL)5_VYi6whnR4h($ diff --git a/host/dxwndhost.vs2008.vcproj b/host/dxwndhost.vs2008.vcproj index ec7733a..c5b14fd 100644 --- a/host/dxwndhost.vs2008.vcproj +++ b/host/dxwndhost.vs2008.vcproj @@ -319,6 +319,10 @@ RelativePath=".\getfname.cpp" > + + @@ -490,6 +494,10 @@ RelativePath="Resource.h" > + + diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 41d4428..4ace506 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -127,16 +127,22 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) t->flags &= ~EMULATEFLAGS; switch(dlg->m_DxEmulationMode){ - case 0: break; - case 1: t->flags |= EMULATEBUFFER; break; - case 2: t->flags |= LOCKEDSURFACE; break; - case 3: t->flags |= EMULATESURFACE; break; - case 4: t->flags |= AUTOMATIC; break; - case 5: - t->flags |= EMULATESURFACE; - t->flags4 |= BILINEARFILTER; + case 0: t->flags |= AUTOMATIC; break; + case 1: break; + case 2: t->flags |= EMULATEBUFFER; break; + case 3: t->flags |= LOCKEDSURFACE; break; + case 4: t->flags |= EMULATESURFACE; break; break; } + + t->flags4 &= ~BILINEAR2XFILTER; + t->flags5 &= ~BILINEARFILTER; + switch(dlg->m_DxFilterMode){ + case 0: break; + case 1: t->flags4 |= BILINEAR2XFILTER; break; + case 2: t->flags5 |= BILINEARFILTER; break; + } + t->flags2 &= ~GDISTRETCHED; t->flags &= ~MAPGDITOPRIMARY; t->flags3 &= ~GDIEMULATEDC; @@ -186,6 +192,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_SetCompatibility) t->flags2 |= SETCOMPATIBILITY; if(dlg->m_AEROBoost) t->flags5 |= AEROBOOST; if(dlg->m_DiabloTweak) t->flags5 |= DIABLOTWEAK; + if(dlg->m_NoImagehlp) t->flags5 |= NOIMAGEHLP; if(dlg->m_DisableHAL) t->flags3 |= DISABLEHAL; if(dlg->m_ForcesHEL) t->flags3 |= FORCESHEL; if(dlg->m_ColorFix) t->flags3 |= COLORFIX; @@ -222,9 +229,10 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_UseRGB565) t->flags |= USERGB565; if(dlg->m_SuppressDXErrors) t->flags |= SUPPRESSDXERRORS; if(dlg->m_MarkBlit) t->flags3 |= MARKBLIT; - if(dlg->m_SystemMemory) t->flags5 |= SYSTEMMEMORY; + if(dlg->m_NoSystemMemory) t->flags5 |= NOSYSTEMMEMORY; + if(dlg->m_NoSystemEmulated) t->flags5 |= NOSYSTEMEMULATED; if(dlg->m_NoBlt) t->flags5 |= NOBLT; - //if(dlg->m_StretchBlt) t->flags5 |= DOSTRETCHBLT; + //if(dlg->m_BilinearBlt) t->flags5 |= BILINEARFILTER; if(dlg->m_FastBlt) t->flags5 |= DOFASTBLT; if(dlg->m_PreventMaximize) t->flags |= PREVENTMAXIMIZE; if(dlg->m_ClientRemapping) t->flags |= CLIENTREMAPPING; @@ -255,6 +263,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_ShowTimeStretch) t->flags4 |= SHOWTIMESTRETCH; if(dlg->m_TimeStretch) t->flags2 |= TIMESTRETCH; if(dlg->m_StretchTimers) t->flags4 |= STRETCHTIMERS; + if(dlg->m_QuarterBlt) t->flags5 |= QUARTERBLT; if(dlg->m_FineTiming) t->flags4 |= FINETIMING; if(dlg->m_ReleaseMouse) t->flags4 |= RELEASEMOUSE; if(dlg->m_FrameCompensation) t->flags4 |= FRAMECOMPENSATION; @@ -315,16 +324,15 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_PeekAllMessages = t->flags3 & PEEKALLMESSAGES ? 1 : 0; dlg->m_NoWinPosChanges = t->flags5 & NOWINPOSCHANGES ? 1 : 0; - dlg->m_DxEmulationMode = 0; - dlg->m_BilinearFilter = FALSE; - if(t->flags & EMULATEBUFFER) dlg->m_DxEmulationMode = 1; - if(t->flags & LOCKEDSURFACE) dlg->m_DxEmulationMode = 2; - if(t->flags & EMULATESURFACE) dlg->m_DxEmulationMode = 3; - if(t->flags & AUTOMATIC) dlg->m_DxEmulationMode = 4; - if(t->flags4 & BILINEARFILTER) { - dlg->m_DxEmulationMode = 5; - dlg->m_BilinearFilter = TRUE; - } + dlg->m_DxEmulationMode = 1; // none + if(t->flags & AUTOMATIC) dlg->m_DxEmulationMode = 0; + if(t->flags & EMULATEBUFFER) dlg->m_DxEmulationMode = 2; + if(t->flags & LOCKEDSURFACE) dlg->m_DxEmulationMode = 3; + if(t->flags & EMULATESURFACE) dlg->m_DxEmulationMode = 4; + + dlg->m_DxFilterMode = 0; + if(t->flags4 & BILINEAR2XFILTER) dlg->m_DxFilterMode = 1; + if(t->flags5 & BILINEARFILTER) dlg->m_DxFilterMode = 2; dlg->m_DCEmulationMode = 0; if(t->flags2 & GDISTRETCHED) dlg->m_DCEmulationMode = 1; @@ -358,6 +366,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_SetCompatibility = t->flags2 & SETCOMPATIBILITY ? 1 : 0; dlg->m_AEROBoost = t->flags5 & AEROBOOST ? 1 : 0; dlg->m_DiabloTweak = t->flags5 & DIABLOTWEAK ? 1 : 0; + dlg->m_NoImagehlp = t->flags5 & NOIMAGEHLP ? 1 : 0; dlg->m_DisableHAL = t->flags3 & DISABLEHAL ? 1 : 0; dlg->m_ForcesHEL = t->flags3 & FORCESHEL ? 1 : 0; dlg->m_ColorFix = t->flags3 & COLORFIX ? 1 : 0; @@ -407,9 +416,10 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_UseRGB565 = t->flags & USERGB565 ? 1 : 0; dlg->m_SuppressDXErrors = t->flags & SUPPRESSDXERRORS ? 1 : 0; dlg->m_MarkBlit = t->flags3 & MARKBLIT ? 1 : 0; - dlg->m_SystemMemory = t->flags5 & SYSTEMMEMORY ? 1 : 0; + dlg->m_NoSystemMemory = t->flags5 & NOSYSTEMMEMORY ? 1 : 0; + dlg->m_NoSystemEmulated = t->flags5 & NOSYSTEMEMULATED ? 1 : 0; dlg->m_NoBlt = t->flags5 & NOBLT ? 1 : 0; - //dlg->m_StretchBlt = t->flags5 & DOSTRETCHBLT ? 1 : 0; + //dlg->m_BilinearBlt = t->flags5 & BILINEARFILTER ? 1 : 0; dlg->m_FastBlt = t->flags5 & DOFASTBLT ? 1 : 0; dlg->m_PreventMaximize = t->flags & PREVENTMAXIMIZE ? 1 : 0; dlg->m_ClientRemapping = t->flags & CLIENTREMAPPING ? 1 : 0; @@ -440,6 +450,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_ShowTimeStretch = t->flags4 & SHOWTIMESTRETCH ? 1 : 0; dlg->m_TimeStretch = t->flags2 & TIMESTRETCH ? 1 : 0; dlg->m_StretchTimers = t->flags4 & STRETCHTIMERS ? 1 : 0; + dlg->m_QuarterBlt = t->flags5 & QUARTERBLT ? 1 : 0; dlg->m_FineTiming = t->flags4 & FINETIMING ? 1 : 0; dlg->m_ReleaseMouse = t->flags4 & RELEASEMOUSE ? 1 : 0; dlg->m_FrameCompensation = t->flags4 & FRAMECOMPENSATION ? 1 : 0; diff --git a/host/host.aps b/host/host.aps new file mode 100644 index 0000000000000000000000000000000000000000..130bec54ab41a594fa773c5f5c1dcbeaf8e26a6d GIT binary patch literal 47496 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 literal 0 HcmV?d00001 diff --git a/host/host.rc b/host/host.rc new file mode 100644 index 0000000..7aebb81 --- /dev/null +++ b/host/host.rc @@ -0,0 +1 @@ +#include "afxres.rc" diff --git a/host/resource1.h b/host/resource1.h new file mode 100644 index 0000000..bd7651e --- /dev/null +++ b/host/resource1.h @@ -0,0 +1,14 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by host.rc + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/locale/cn/RCa05260 b/locale/cn/RCa05260 new file mode 100644 index 0000000000000000000000000000000000000000..723748295be84f7a14ec9b5df42ca03e527c8d7e GIT binary patch literal 77592 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%0DVX}yKUQuAC4x?mYlvsGD?5x- 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 + + + + + + + + + diff --git a/locale/cn/Release/Resources_CN.res b/locale/cn/Release/Resources_CN.res new file mode 100644 index 0000000000000000000000000000000000000000..ee878cdd57b954b923e63a3cc1a84e02f44eee3c GIT binary patch literal 127732 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
  • *k|_g z-5qS+&kbgP8%KV=%+*+Odx1Ijxs^!8Kiilw`>MSX_4PXtR|j8D_SE3xta`=Lvgog0 zZmmgv^7)kA{*7m!Yg3;R@4!4!c=zDx=GIY%|MI+a?VP?9s2A&jn_I4g$t@9nnz3Tg zBH{VMvyLYzY0>tqF3g}4(zbi_y)u1{K9|%~{ZlpZbl%ObP8Ajt55JrF{W>{xw{toD z)5f(bUkhnZ*U!WB)n=W<#L4Yn!Zq_VkQvJ^jXqweEBBtu?2rmyJ6?pLci%>&xX!94*(L@pYKJx?6qO z3AlHe=sN-5EZEU7=MpP+_8lJBj(@u=R{V6SG`;RGP@b$&yz}}eZsOVarY>W0?%BJ4 z$~a2@rp0`6wIo&EI>4vG7)|so7QAVAhLB}?s-Ld-?v04{b>GrKh}rY8*K+SSi4>yi znwvp9rCd1nGzkniwa$s!2YNdR*Z-iD`tPW{#7toi?u{fIGxhr0k+k+qNvp{A9^W$9 z&m!01#sYOla)7s1_W3*o-MayO$La_^T_S|ftv&8Z?(iAjJJ?4M!mXGteW&4_T1M|P mAX3)jQ_3m{XS=g + + + + + + + + + + diff --git a/locale/cn/Resources_Cn.ncb b/locale/cn/Resources_Cn.ncb index 5c73336d557ab29d830a4b28c3f3a384af8472df..a8d0402a368e7e634e10fd7647c489622b54afba 100644 GIT binary patch delta 678 zcmZp;!Pqc^X@Ul?G6Mrc1rURP>}ElM)66VC{xcld%*gSFnVEs%ACU2vS!Rl!A>&~| z{SXeIDvp^9-3x5zxJ^?%=OSysDmz)mWfG&w_aW39zyQRWNew zzPFi&M+#`sW_8|uDE4jE;J?8#NkN8@X|t@t4{@LhF$*n_LPyI5jLs(U#YM?6Ir+(n zIjJ$pc`?>0RxvIW;dv=BWk&G^M)8*D3K)P2QYy-k6aalGHQCNu0_AQk~)Q6QGu=-AE7 LD6^T-=f5}r3yz`J delta 391 zcmZpe!PIbrae@Y~Gy?-e1rURP@Mb}o)6C2d7(Q$kWO>g#S%HO*Q3A#k;9&$R0b`Ec zA2;(zNHH=RZC01u2c#xz@GDMc=T`s;M1& diff --git a/locale/cn/Resources_Cn.rc b/locale/cn/Resources_Cn.rc index e490e5d0a1a32903c3f4a1b47518c179d5c114a9..d1c1b76e090301ef8b5a089c240ac6662006c793 100644 GIT binary patch delta 1045 zcmZ8ge`r%z6h6Tg&Rk`ufI57PNhNY0`vDO>0XP?2pyP>d>0RBu#3XKGQa} zxcUo`LbbMj!w!*R-6)lf8F)|_lQ9N!qHMKbQ9+o4{jvQc4n+N96VH3fR>tMt%RTqp z?|kPw=iYo~zJ8*p@J9tAn=N>_wiwSV@=(Pe&}Okhw3I?BQ>F@U2sRYfnDMA$CE{i4 zAXZ5Fr534tU^Tf(#=#Fgn(8WMh-z1JI}KBmvLsRyB`8h(JVZ)TALV#Y85WUZyk~f3 z*(Yk;Bn`^|pLM_e>>sBD7B^H1el0EkQ>vY6yjgAvkOyb;b(n~#MGCE_8XUYHL@1gS zYH&4rrO0R4W=3kE?zCx_V}Gx(`>2MEZqnU7O5^L}z(Xm?hd4(k#FFaU1z82pnB+MpNlfp^}(I7gyb13WH1anF? z)iA+@bh#eS`ppr`z)xp?&!TNyVp2LKnTHNqi@%zx-;Z;~IaXtc^S?L!#hAo*+o*xI z&^}%psGaJl6C>$HotmkZd<-4596MaL<76JY(oUfci$e}XZmq+rZi~rJe#7D31?QQC zNp{E?6n{>?&2*{|+RG)5)FT zWpj3ZJKVY_H5!{bKI|OCs-?H=%T;TkR@j%)XvHWo?C4Sx%R_!dVTNxv0=DDoU?-q{5Z&&=L!)XVMB&0i$NpGT!CZkP;@lUkVaPkpT%1=0`)=SE c#5wDm9`1X+_Z2Mc{XkQ0d{V4UFRf3$1e(u8YybcN delta 565 zcmXAmUuaTM9LLX{f4DOnVh*%Oua^j;&30|NySB`lE4HA72nK~sx7}&B?e3ZGir%54o8v_4L3ge}P>N z!1PiJ|7;HVbO2`M2|mpRu&JbTDFX@$3u{GG^VdBsv>y@QQ!Ch_H5=({E6wR7JM^7N zzE$s{E6Jjs(!-QGhVqR?`ji4zBkkaFJTh}0M!=i7UkvT`_C7p_@>sjM0CUBHgBR`U zE{$|H#j_6?Bjgz#{vU0-gX97kASX$P?pLsS%eITB@FDt{1I;{+MxLbr PhrAz+GrZdW)gb)?ezeQ> diff --git a/locale/cn/Resources_Cn.suo b/locale/cn/Resources_Cn.suo index d8d7a0322add3a5592578763a259b4cc232c46c2..d434b50cf1740133f4e89e67e03b9d66a0a9c24f 100644 GIT binary patch delta 372 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 literal 0 HcmV?d00001 diff --git a/locale/en/Resources_EN.rc b/locale/en/Resources_EN.rc index 14b37726911da7867a0cba7073283d631b7bb6ad..1a713bb722619ecb50a31496f221cf2f3a26ce9a 100644 GIT binary patch delta 1108 zcmZWoT})GF7=DkZ#Rd_yutk{*rI8DfXitA>NC^i;tl_sp#B7gUq&5%YZvQa0+C{7s`8;#HeP4YQr zyx1trXOdTnbu{D8i1Cu;yU>f^YN8rHtJ`qSVUn8ldgWt>>?aq3;W|`y+p(Ci!W~JP zozz5b%uo3+JXDFtk*MTGZ**z1SG-d*q|pOhM=DI^SBx+R|u!_vix6vjIcj%Q^jBU6a9 z;I$Hrx)=MV*H2#+CW<@Qr6Fr(84_`N-Z^43W(u&*j)@p^Firg7m77@Y+ zse8XaN>K(zqtgsdltCKd?BhZBiF z-66Ki7*q&T`^r=GJ!MT5zNAE|~M+$*VpjuT<#YXTR8l*4Z+=d-^fHo@~R~^k=eHM zUF1+Dk_XPTNlyL38MA~>?zHCnb~6hP<}TsJH?17jiif}LFx$92Qz$&D=UXj8cW05F zvKT$2uov}FP-v-!7GoBplLq!0;}~N$p2ok2dg&+~=QThb)NQOm=0O#AJXw7cxjD;L z(P-?Mg-_gby^Nk=i@tL9?FK9!X$%Zfn%$P%i|G;5GRjh#jVw=5X~GoR&mCxELL=N9 zF&3UX{CW9>>V6vJkRc<95R)t#q4(}t$%$7scH&3Ziy~nDugy}0KK$vr6aN$&@$ID= zPmoK~j7VeLTxr_Jc_dl>Ut*9;Q+dKW=rDDm|JopILncW<;f{)rWqil=9W9H}j n{7mI9`91m67O7GXukYH5)lR#f`#m?B|GZz?@#S2XG+_A`p8`AD delta 634 zcmYLGQA|=%7(Pe1bfZOS>eL#-T|G42;t~i}Q%Yycm!z68TS9;YN`i>glp6XHkBrYr zYmHHDq_#Eknyr>wtsYxz$%7A6tA`$3W7e$o&_f5D>)}7={NMS`cmDtTZ$IJQ&v7}S ziJBqmA4qST2046lG)RBNkWMBN9Rf}*9QOs(d3AeOPFhJb3o~0qq9+E7I2+6Nx@U3( zT|5kdX=J==tU7JnVa95~mw}Urx}4OA&#pPn#4rP1-85nIg;M(9u8<+-R%~x&g3ZK4 zMBKe-M8D6E-7bOZp!L^d-Is-Js13!3JPLzRsQn6Bk~U#xC@wRyZ%V90pMaMEo)w_P zr|-2`@^&NU;W?4C5c3wJ@&xe_KZ{{9KrWFG(cpr=5$~>4AwAs9xMtS&f3*elFE=3b zLXdJno+2^H!@XQx0+5MSfe+oI1{~UGPian5If|hyYxKvjcH~DNVS3b3CgsCP)J<40 zJGKb#7{h)lp?faJd?bwA2#>yq61P^4V17|4g|04DY%`P{HkW0!Gak7M;a z1U9Tw4DZ;?;aTlv=80^&_Q>9(RgltaiOcvyHC%|ehybgiCgnX(g{NI-=sEr$%G>FU diff --git a/locale/en/Resources_En.ncb b/locale/en/Resources_En.ncb index 450c365f9c69afdd444d55f5b5531987aa84872a..08ac0fb9af16adb2327f7ca64464b4af23247bfc 100644 GIT binary patch delta 596 zcmZp;!Pqc^X@Ul?G6Mrc1rURP>}ElM)66VC{xcld%*gSFnVEs%ACU2vc@hsNOT)7O zrp>%Ol8lTdo7H*u0jbFv{ECy=`4xZy8vJ)yBrbF6hcE$+5lhxs@44)w%kl-sE?u58 zMR&4{%Os%c^)4lhMVnPzA22aiOlI}4XB7gfW!>!Qv7LF7jHnFI6fp}ekm-(=3mBbE z;){!tV{-D76LV5yQuAW0Q>OV delta 377 zcmZpe!PIbrae@Y~Gy?-e1rURP@Mb}Q)6C2d7(Q$kWO>g#S%HO*Q3A#kn8d@$!m;}% z<7QqSNk&Ga&FZ}SfYf9Se#Ob`{0cw;4gNbUs!uP;hA;xn5`FYFf6AsGew+8qSb13Q zrytk?AOVtN1ln_*S&{|F1Yrvxh5=?EgB2+KoOzRss0`3hF$*n_Wsa5$7@dvci;I$D za`KZCb5dhc^J1)1tYTa$!t+vM%8cR-jN&cP6)*r5q*Rn6DVV%oL~62~wFJ=N>qW#T z=UMZr@dNEV%LH*5%o$cdF(;5)pg@&z^Fr%*j!7ac61Y4#Sw>_M*whlnu+1u>513eG YfSUU@b9#JdW)#}YSn^+dv4RQ*09)N+tN;K2 diff --git a/locale/en/Resources_En.suo b/locale/en/Resources_En.suo index ce478a32a60d070825650f4af56fcbfe9a6b2e0b..4b60a88dcc6dab3b4bbbc6f3504991ba274dedda 100644 GIT binary patch delta 102 zcmZp$Xt3Cj!@_o<@@j7Fqs>Ju+gKP)HfwUuX5`^uU|`?{;{QM}`67$T-8+usOlDi| z5<&flD4)=v5C=*k7Ljfg1cm)KGT0wW#O6f*`qKXNFM99Ibt9I;Ip^};^FHr$p65O9 zZA|KK_ zoEnHR5T+2zr3n|~nWTOeG{i##8KP27Yo_hAjSljiLUf~l=sG<+(sNuP74y+5_M=z{gI~?(`=G>)l96$vmu{ae0(fxl~)(YkAaA9eBLP- zv41QZpHEDpBw3I6Z8KgEUp4R{{C={Qt64Gi+jT=VBmCP08ug2(ssxw%@RUKo==>IZ zK0PIP@c8uR+(uR2t2>9d1c*uj0sba!wa^JbXgtlr~4IT%jOUI>|4j=1nF)`pFj4&-941Jov+#7VD6Uyks2cd`u@ z#e;IzDn%FSOc63pPnwL9F(lWTuywfy z)e%EOC*dimKsc-hy^ZI{UfvMi#3N9`b_^$)3qd<}WGil7NueTl70UyR4w5|0dWfgi zct_6Hdx=lOLLeugqU=L!_&A*LGmu7%4IGVW^mn7B2_3$S<>;s)h7v6rx-a>Z@u|O( zEey+3Z{zq+itR$6+6RAXf%Vd{m$sTv$)13s?;W&p6r}ElM)66VC{xcld%*gSFnVEs%ACU2vS!Rl!A>;9M zlMoi5su1O+H>wg@d^QN5(tR8ht~^=BWfG&w>xSCB)a+Q!N0xIMNVs;>A z1>!g$<^p06*xbh(&Ir_@!LK-(onHaWx-rRvg|T8XtA{A0Op^pyK@MT$*zLTTherx%`DS(AeJF0&tigYS zWs-snBhzMCg&*QT6=D`zAcc;W3mBbE;){!tV{-D76LV5yGD~8tQ>dDNk;LW|V8FiFEaLHodC+@@Ws(RaPKixd@Hp*d yf}|EhkWOhJ2Bj83AQlEWAeP$b*v-r+vzgK7zc>Jm!?=I| delta 439 zcmZpe!PIbrae@Y~Gy?-e1rURP@Mb}o)6C2d7(Q$kWO>g#S%HO*Q3A#k;9&$R0po^e z5}SD>q!<~EHmghS15%SU_!TF!^D6)aG^B5^Ov+(VZMY;G0#dB_I%LAZMH$Z1@}~a0 zmN;J)WDf{{4FcMCoq3W7izo|F!~!f1A((*_D^T`1Gb7t(L6!f^lN4kaxi-rx{16A) zA!eZkvfI&e0i&}~d~s27Oiq4sVoqvIW=V{7idBqDMR;CHOqo%@j`vEcM=JMQLCRQ0Bvu`t} T$9HB%q0NjX|HT(8sBi!PWQJ%y diff --git a/locale/it/Resources_It.suo b/locale/it/Resources_It.suo index 5b0d3bf64425bcea36117b4bfd25efb78205a814..e7d7b34746c19e04fe614a2535d64b619d979e38 100644 GIT binary patch delta 287 zcmZp$Xt3De!@|flS&>Da?SWA0zJ^DWi&!r4h%zuRumkabAeelSMP>2<4wlIktN|P# z0T2KSHt?}*{=sU%%xJP%lXDg$FCzy~3lFlk22PgAKe)UnI|~|4KEMYwg4>&yfeomF z6-m|RFWmktKqdB*n*^MAK&JB|$xe3Q2bv+^!y^C{gj-)C7&6&IP-pTN!2ljkpd>ev zuFWMv0gOD%KoMbN(J#WAm>5kaYjVnOJ|DaO@MP^4Exo|MJ$(im>C!tIDz;-5KO+vqB8ja2g~FN)&LHE zWWfeLmd!s{4VW2?HfwUuV&r9DhswgWHE^;_{=wxv`LK}Ta)SV}=ojHlOpHd8H96%s9}}x%~(xpeavNggHus}yM&