|
|
| version 1.4, 2003/10/21 14:57:41 | version 1.27, 2011/03/07 09:54:11 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | /** |
| #include <ddraw.h> | * @file scrnmng.cpp |
| * @brief Screen Manager (DirectDraw2) | |
| * | |
| * @author $Author$ | |
| * @date $Date$ | |
| */ | |
| #include "compiler.h" | |
| #include <ddraw.h> | |
| #ifndef __GNUC__ | #ifndef __GNUC__ |
| #include <winnls32.h> | #include <winnls32.h> |
| #endif | |
| #include "resource.h" | |
| #include "np2.h" | |
| #include "winloc.h" | |
| #include "mousemng.h" | |
| #include "scrnmng.h" | |
| #include "sysmng.h" | |
| #include "menu.h" | |
| #include "np2class.h" | |
| #include "pccore.h" | |
| #include "scrndraw.h" | |
| #include "palettes.h" | |
| #if defined(SUPPORT_DCLOCK) | |
| #include "dclock.h" | |
| #endif | #endif |
| #include "resource.h" | |
| #include "np2.h" | #if !defined(__GNUC__) |
| #include "mousemng.h" | #pragma comment(lib, "ddraw.lib") |
| #include "scrnmng.h" | #pragma comment(lib, "dxguid.lib") |
| #include "sysmng.h" | #endif // !defined(__GNUC__) |
| #include "dclock.h" | |
| #include "menu.h" | extern WINLOCEX np2_winlocexallwin(HWND base); |
| #include "scrndraw.h" | |
| #include "palettes.h" | |
| typedef struct { | typedef struct { |
| Line 19 typedef struct { | Line 40 typedef struct { |
| LPDIRECTDRAW2 ddraw2; | LPDIRECTDRAW2 ddraw2; |
| LPDIRECTDRAWSURFACE primsurf; | LPDIRECTDRAWSURFACE primsurf; |
| LPDIRECTDRAWSURFACE backsurf; | LPDIRECTDRAWSURFACE backsurf; |
| #if defined(SUPPORT_DCLOCK) | |
| LPDIRECTDRAWSURFACE clocksurf; | LPDIRECTDRAWSURFACE clocksurf; |
| #endif | |
| LPDIRECTDRAWCLIPPER clipper; | LPDIRECTDRAWCLIPPER clipper; |
| LPDIRECTDRAWPALETTE palette; | LPDIRECTDRAWPALETTE palette; |
| BYTE scrnmode; | UINT scrnmode; |
| int width; | int width; |
| int height; | int height; |
| int extend; | int extend; |
| int cliping; | int cliping; |
| RGB32 pal16mask; | RGB32 pal16mask; |
| BYTE r16b; | UINT8 r16b; |
| BYTE l16r; | UINT8 l16r; |
| BYTE l16g; | UINT8 l16g; |
| UINT8 menudisp; | |
| int menusize; | |
| RECT scrn; | RECT scrn; |
| RECT rect; | RECT rect; |
| RECT scrnclip; | |
| RECT rectclip; | |
| PALETTEENTRY pal[256]; | PALETTEENTRY pal[256]; |
| } DDRAW; | } DDRAW; |
| Line 49 static SCRNSTAT scrnstat; | Line 76 static SCRNSTAT scrnstat; |
| static SCRNSURF scrnsurf; | static SCRNSURF scrnsurf; |
| static void setwindowsize(int width, int height) { | static void setwindowsize(HWND hWnd, int width, int height) { |
| RECT workrc; | |
| int scx; | |
| int scy; | |
| UINT cnt; | |
| RECT rectwindow; | RECT rectwindow; |
| RECT rectclient; | RECT rectclient; |
| RECT workrc; | int cx; |
| int scx, scy; | int cy; |
| UINT update; | UINT update; |
| GetWindowRect(hWndMain, &rectwindow); | |
| GetClientRect(hWndMain, &rectclient); | |
| width += np2oscfg.paddingx * 2; | |
| width += rectwindow.right - rectwindow.left; | |
| width -= rectclient.right - rectclient.left; | |
| height += np2oscfg.paddingy * 2; | |
| height += rectwindow.bottom - rectwindow.top; | |
| height -= rectclient.bottom - rectclient.top; | |
| SystemParametersInfo(SPI_GETWORKAREA, 0, &workrc, 0); | SystemParametersInfo(SPI_GETWORKAREA, 0, &workrc, 0); |
| scx = GetSystemMetrics(SM_CXSCREEN); | scx = GetSystemMetrics(SM_CXSCREEN); |
| scy = GetSystemMetrics(SM_CYSCREEN); | scy = GetSystemMetrics(SM_CYSCREEN); |
| update = 0; | cnt = 2; |
| if (scx < width) { | do { |
| np2oscfg.winx = (scx - width) / 2; | GetWindowRect(hWnd, &rectwindow); |
| update |= SYS_UPDATEOSCFG; | GetClientRect(hWnd, &rectclient); |
| } | cx = width; |
| else { | cx += np2oscfg.paddingx * 2; |
| if ((np2oscfg.winx + width) > workrc.right) { | cx += rectwindow.right - rectwindow.left; |
| np2oscfg.winx = workrc.right - width; | cx -= rectclient.right - rectclient.left; |
| cy = height; | |
| cy += np2oscfg.paddingy * 2; | |
| cy += rectwindow.bottom - rectwindow.top; | |
| cy -= rectclient.bottom - rectclient.top; | |
| update = 0; | |
| if (scx < cx) { | |
| np2oscfg.winx = (scx - cx) / 2; | |
| update |= SYS_UPDATEOSCFG; | update |= SYS_UPDATEOSCFG; |
| } | } |
| if (np2oscfg.winx < workrc.left) { | else { |
| np2oscfg.winx = workrc.left; | if ((np2oscfg.winx + cx) > workrc.right) { |
| update |= SYS_UPDATEOSCFG; | np2oscfg.winx = workrc.right - cx; |
| update |= SYS_UPDATEOSCFG; | |
| } | |
| if (np2oscfg.winx < workrc.left) { | |
| np2oscfg.winx = workrc.left; | |
| update |= SYS_UPDATEOSCFG; | |
| } | |
| } | } |
| } | if (scy < cy) { |
| if (scy < height) { | np2oscfg.winy = (scy - cy) / 2; |
| np2oscfg.winy = (scy - height) / 2; | |
| update |= SYS_UPDATEOSCFG; | |
| } | |
| else { | |
| if ((np2oscfg.winy + height) > workrc.bottom) { | |
| np2oscfg.winy = workrc.bottom - height; | |
| update |= SYS_UPDATEOSCFG; | update |= SYS_UPDATEOSCFG; |
| } | } |
| if (np2oscfg.winy < workrc.top) { | else { |
| np2oscfg.winy = workrc.top; | if ((np2oscfg.winy + cy) > workrc.bottom) { |
| update |= SYS_UPDATEOSCFG; | np2oscfg.winy = workrc.bottom - cy; |
| update |= SYS_UPDATEOSCFG; | |
| } | |
| if (np2oscfg.winy < workrc.top) { | |
| np2oscfg.winy = workrc.top; | |
| update |= SYS_UPDATEOSCFG; | |
| } | |
| } | } |
| } | sysmng_update(update); |
| sysmng_update(update); | MoveWindow(hWnd, np2oscfg.winx, np2oscfg.winy, cx, cy, TRUE); |
| MoveWindow(hWndMain, np2oscfg.winx, np2oscfg.winy, width, height, TRUE); | } while(--cnt); |
| } | } |
| static void renewalclientsize(void) { | static void renewalclientsize(BOOL winloc) { |
| int width; | int width; |
| int height; | int height; |
| int extend; | int extend; |
| int multiple; | UINT fscrnmod; |
| int scrnwidth; | int multiple; |
| int scrnheight; | int scrnwidth; |
| int scrnheight; | |
| int tmpcy; | |
| WINLOCEX wlex; | |
| width = min(scrnstat.width, ddraw.width); | width = min(scrnstat.width, ddraw.width); |
| height = min(scrnstat.height, ddraw.height); | height = min(scrnstat.height, ddraw.height); |
| Line 120 static void renewalclientsize(void) { | Line 159 static void renewalclientsize(void) { |
| if (ddraw.scrnmode & SCRNMODE_FULLSCREEN) { | if (ddraw.scrnmode & SCRNMODE_FULLSCREEN) { |
| ddraw.rect.right = width; | ddraw.rect.right = width; |
| ddraw.rect.bottom = height; | ddraw.rect.bottom = height; |
| ddraw.scrn.left = (ddraw.width - width) / 2; | scrnwidth = width; |
| ddraw.scrn.top = (ddraw.height - height) / 2; | scrnheight = height; |
| ddraw.scrn.right = ddraw.scrn.left + width; | fscrnmod = np2oscfg.fscrnmod & FSCRNMOD_ASPECTMASK; |
| ddraw.scrn.bottom = ddraw.scrn.top + height; | switch(fscrnmod) { |
| default: | |
| case FSCRNMOD_NORESIZE: | |
| break; | |
| case FSCRNMOD_ASPECTFIX8: | |
| scrnwidth = (ddraw.width << 3) / width; | |
| scrnheight = (ddraw.height << 3) / height; | |
| multiple = min(scrnwidth, scrnheight); | |
| scrnwidth = (width * multiple) >> 3; | |
| scrnheight = (height * multiple) >> 3; | |
| break; | |
| case FSCRNMOD_ASPECTFIX: | |
| scrnwidth = ddraw.width; | |
| scrnheight = (scrnwidth * height) / width; | |
| if (scrnheight >= ddraw.height) { | |
| scrnheight = ddraw.height; | |
| scrnwidth = (scrnheight * width) / height; | |
| } | |
| break; | |
| case FSCRNMOD_LARGE: | |
| scrnwidth = ddraw.width; | |
| scrnheight = ddraw.height; | |
| break; | |
| } | |
| ddraw.scrn.left = (ddraw.width - scrnwidth) / 2; | |
| ddraw.scrn.top = (ddraw.height - scrnheight) / 2; | |
| ddraw.scrn.right = ddraw.scrn.left + scrnwidth; | |
| ddraw.scrn.bottom = ddraw.scrn.top + scrnheight; | |
| // メニュー表示時の描画領域 | |
| ddraw.rectclip = ddraw.rect; | |
| ddraw.scrnclip = ddraw.scrn; | |
| if (ddraw.scrnclip.top < ddraw.menusize) { | |
| ddraw.scrnclip.top = ddraw.menusize; | |
| tmpcy = ddraw.height - ddraw.menusize; | |
| if (scrnheight > tmpcy) { | |
| switch(fscrnmod) { | |
| default: | |
| case FSCRNMOD_NORESIZE: | |
| tmpcy = min(tmpcy, height); | |
| ddraw.rectclip.bottom = tmpcy; | |
| break; | |
| case FSCRNMOD_ASPECTFIX8: | |
| case FSCRNMOD_ASPECTFIX: | |
| ddraw.rectclip.bottom = (tmpcy * height) / scrnheight; | |
| break; | |
| case FSCRNMOD_LARGE: | |
| break; | |
| } | |
| } | |
| ddraw.scrnclip.bottom = ddraw.menusize + tmpcy; | |
| } | |
| } | } |
| else { | else { |
| multiple = scrnstat.multiple; | multiple = scrnstat.multiple; |
| Line 151 static void renewalclientsize(void) { | Line 246 static void renewalclientsize(void) { |
| } | } |
| ddraw.scrn.right = np2oscfg.paddingx + scrnwidth; | ddraw.scrn.right = np2oscfg.paddingx + scrnwidth; |
| ddraw.scrn.bottom = np2oscfg.paddingy + scrnheight; | ddraw.scrn.bottom = np2oscfg.paddingy + scrnheight; |
| setwindowsize(scrnwidth, scrnheight); | |
| setwindowsize(scrnwidth, scrnheight); | wlex = NULL; |
| if (winloc) { | |
| wlex = np2_winlocexallwin(g_hWndMain); | |
| } | |
| winlocex_setholdwnd(wlex, g_hWndMain); | |
| setwindowsize(g_hWndMain, scrnwidth, scrnheight); | |
| winlocex_move(wlex); | |
| winlocex_destroy(wlex); | |
| } | } |
| scrnsurf.width = width; | scrnsurf.width = width; |
| scrnsurf.height = height; | scrnsurf.height = height; |
| Line 205 static void clearoutofrect(const RECT *t | Line 307 static void clearoutofrect(const RECT *t |
| static void clearoutscreen(void) { | static void clearoutscreen(void) { |
| RECT base; | RECT base; |
| POINT clipt; | |
| RECT target; | RECT target; |
| GetClientRect(hWndMain, &base); | GetClientRect(g_hWndMain, &base); |
| clipt.x = 0; | |
| clipt.y = 0; | |
| ClientToScreen(g_hWndMain, &clipt); | |
| base.left += clipt.x; | |
| base.top += clipt.y; | |
| base.right += clipt.x; | |
| base.bottom += clipt.y; | |
| target.left = base.left + ddraw.scrn.left; | target.left = base.left + ddraw.scrn.left; |
| target.top = base.top + ddraw.scrn.top; | target.top = base.top + ddraw.scrn.top; |
| target.right = base.left + ddraw.scrn.right; | target.right = base.left + ddraw.scrn.right; |
| Line 217 static void clearoutscreen(void) { | Line 327 static void clearoutscreen(void) { |
| static void clearoutfullscreen(void) { | static void clearoutfullscreen(void) { |
| clearoutofrect(&ddraw.scrn, &ddraw.rect); | RECT base; |
| const RECT *scrn; | |
| base.left = 0; | |
| base.top = 0; | |
| base.right = ddraw.width; | |
| base.bottom = ddraw.height; | |
| if (GetWindowLongPtr(g_hWndMain, NP2GWLP_HMENU)) { | |
| scrn = &ddraw.scrn; | |
| base.top = 0; | |
| } | |
| else { | |
| scrn = &ddraw.scrnclip; | |
| base.top = ddraw.menusize; | |
| } | |
| clearoutofrect(scrn, &base); | |
| #if defined(SUPPORT_DCLOCK) | |
| dclock_redraw(); | dclock_redraw(); |
| #endif | |
| } | } |
| static void paletteinit(void) { | static void paletteinit(void) { |
| Line 226 static void paletteinit(void) { | Line 353 static void paletteinit(void) { |
| HDC hdc; | HDC hdc; |
| UINT i; | UINT i; |
| hdc = GetDC(hWndMain); | hdc = GetDC(g_hWndMain); |
| GetSystemPaletteEntries(hdc, 0, 256, ddraw.pal); | GetSystemPaletteEntries(hdc, 0, 256, ddraw.pal); |
| ReleaseDC(hWndMain, hdc); | ReleaseDC(g_hWndMain, hdc); |
| #if defined(SUPPORT_DCLOCK) | |
| for (i=0; i<4; i++) { | for (i=0; i<4; i++) { |
| ddraw.pal[i+START_PALORG].peBlue = dclockpal.pal32[i].p.b; | ddraw.pal[i+START_PALORG].peBlue = dclockpal.pal32[i].p.b; |
| ddraw.pal[i+START_PALORG].peRed = dclockpal.pal32[i].p.r; | ddraw.pal[i+START_PALORG].peRed = dclockpal.pal32[i].p.r; |
| ddraw.pal[i+START_PALORG].peGreen = dclockpal.pal32[i].p.g; | ddraw.pal[i+START_PALORG].peGreen = dclockpal.pal32[i].p.g; |
| ddraw.pal[i+START_PALORG].peFlags = PC_RESERVED | PC_NOCOLLAPSE; | ddraw.pal[i+START_PALORG].peFlags = PC_RESERVED | PC_NOCOLLAPSE; |
| } | } |
| #endif | |
| for (i=0; i<NP2PAL_TOTAL; i++) { | for (i=0; i<NP2PAL_TOTAL; i++) { |
| ddraw.pal[i+START_PAL].peFlags = PC_RESERVED | PC_NOCOLLAPSE; | ddraw.pal[i+START_PAL].peFlags = PC_RESERVED | PC_NOCOLLAPSE; |
| } | } |
| Line 259 static void paletteset(void) { | Line 388 static void paletteset(void) { |
| static void make16mask(DWORD bmask, DWORD rmask, DWORD gmask) { | static void make16mask(DWORD bmask, DWORD rmask, DWORD gmask) { |
| BYTE sft; | UINT8 sft; |
| sft = 0; | sft = 0; |
| while((!(bmask & 0x80)) && (sft < 32)) { | while((!(bmask & 0x80)) && (sft < 32)) { |
| bmask <<= 1; | bmask <<= 1; |
| sft++; | sft++; |
| } | } |
| ddraw.pal16mask.p.b = (BYTE)bmask; | ddraw.pal16mask.p.b = (UINT8)bmask; |
| ddraw.r16b = sft; | ddraw.r16b = sft; |
| sft = 0; | sft = 0; |
| Line 274 static void make16mask(DWORD bmask, DWOR | Line 403 static void make16mask(DWORD bmask, DWOR |
| rmask >>= 1; | rmask >>= 1; |
| sft++; | sft++; |
| } | } |
| ddraw.pal16mask.p.r = (BYTE)rmask; | ddraw.pal16mask.p.r = (UINT8)rmask; |
| ddraw.l16r = sft; | ddraw.l16r = sft; |
| sft = 0; | sft = 0; |
| Line 282 static void make16mask(DWORD bmask, DWOR | Line 411 static void make16mask(DWORD bmask, DWOR |
| gmask >>= 1; | gmask >>= 1; |
| sft++; | sft++; |
| } | } |
| ddraw.pal16mask.p.g = (BYTE)gmask; | ddraw.pal16mask.p.g = (UINT8)gmask; |
| ddraw.l16g = sft; | ddraw.l16g = sft; |
| } | } |
| Line 295 void scrnmng_initialize(void) { | Line 424 void scrnmng_initialize(void) { |
| scrnstat.height = 400; | scrnstat.height = 400; |
| scrnstat.extend = 1; | scrnstat.extend = 1; |
| scrnstat.multiple = 8; | scrnstat.multiple = 8; |
| setwindowsize(640, 400); | setwindowsize(g_hWndMain, 640, 400); |
| } | } |
| BOOL scrnmng_create(BYTE scrnmode) { | BRESULT scrnmng_create(UINT8 scrnmode) { |
| DWORD winstyle; | DWORD winstyle; |
| DWORD winstyleex; | DWORD winstyleex; |
| Line 306 BOOL scrnmng_create(BYTE scrnmode) { | Line 435 BOOL scrnmng_create(BYTE scrnmode) { |
| LPDIRECTDRAW2 ddraw2; | LPDIRECTDRAW2 ddraw2; |
| DDSURFACEDESC ddsd; | DDSURFACEDESC ddsd; |
| DDPIXELFORMAT ddpf; | DDPIXELFORMAT ddpf; |
| UINT bitcolor; | int width; |
| int height; | int height; |
| UINT bitcolor; | |
| UINT fscrnmod; | |
| DEVMODE devmode; | |
| ZeroMemory(&scrnmng, sizeof(scrnmng)); | ZeroMemory(&scrnmng, sizeof(scrnmng)); |
| winstyle = GetWindowLong(hWndMain, GWL_STYLE); | winstyle = GetWindowLong(g_hWndMain, GWL_STYLE); |
| winstyleex = GetWindowLong(hWndMain, GWL_EXSTYLE); | winstyleex = GetWindowLong(g_hWndMain, GWL_EXSTYLE); |
| hmenu = GetMenu(hWndMain); | hmenu = GetMenu(g_hWndMain); |
| if (scrnmode & SCRNMODE_FULLSCREEN) { | if (scrnmode & SCRNMODE_FULLSCREEN) { |
| scrnmode &= ~SCRNMODE_ROTATEMASK; | scrnmode &= ~SCRNMODE_ROTATEMASK; |
| scrnmng.flag = SCRNFLAG_FULLSCREEN; | scrnmng.flag = SCRNFLAG_FULLSCREEN; |
| winstyle &= ~(WS_CAPTION | WS_OVERLAPPED | WS_SYSMENU); | winstyle &= ~(WS_CAPTION | WS_SYSMENU | WS_THICKFRAME); |
| winstyle |= WS_POPUP; | winstyle |= WS_POPUP; |
| winstyleex |= WS_EX_TOPMOST; | winstyleex |= WS_EX_TOPMOST; |
| CheckMenuItem(hmenu, IDM_WINDOW, MF_UNCHECKED); | CheckMenuItem(hmenu, IDM_WINDOW, MF_UNCHECKED); |
| CheckMenuItem(hmenu, IDM_FULLSCREEN, MF_CHECKED); | CheckMenuItem(hmenu, IDM_FULLSCREEN, MF_CHECKED); |
| ddraw.menudisp = 0; | |
| ddraw.menusize = GetSystemMetrics(SM_CYMENU); | |
| np2class_enablemenu(g_hWndMain, FALSE); | |
| } | } |
| else { | else { |
| scrnmng.flag = SCRNFLAG_HAVEEXTEND; | scrnmng.flag = SCRNFLAG_HAVEEXTEND; |
| winstyle |= WS_CAPTION | WS_OVERLAPPED | WS_SYSMENU; | winstyle |= WS_SYSMENU; |
| if (np2oscfg.thickframe) { | |
| winstyle |= WS_THICKFRAME; | |
| } | |
| if (np2oscfg.wintype < 2) { | |
| winstyle |= WS_CAPTION; | |
| } | |
| winstyle &= ~WS_POPUP; | winstyle &= ~WS_POPUP; |
| winstyleex &= ~WS_EX_TOPMOST; | winstyleex &= ~WS_EX_TOPMOST; |
| CheckMenuItem(hmenu, IDM_WINDOW, MF_CHECKED); | CheckMenuItem(hmenu, IDM_WINDOW, MF_CHECKED); |
| CheckMenuItem(hmenu, IDM_FULLSCREEN, MF_UNCHECKED); | CheckMenuItem(hmenu, IDM_FULLSCREEN, MF_UNCHECKED); |
| } | } |
| SetWindowLong(hWndMain, GWL_STYLE, winstyle); | SetWindowLong(g_hWndMain, GWL_STYLE, winstyle); |
| SetWindowLong(hWndMain, GWL_EXSTYLE, winstyleex); | SetWindowLong(g_hWndMain, GWL_EXSTYLE, winstyleex); |
| if (DirectDrawCreate(NULL, &ddraw.ddraw1, NULL) != DD_OK) { | if (DirectDrawCreate(NULL, &ddraw.ddraw1, NULL) != DD_OK) { |
| goto scre_err; | goto scre_err; |
| Line 340 BOOL scrnmng_create(BYTE scrnmode) { | Line 481 BOOL scrnmng_create(BYTE scrnmode) { |
| ddraw.ddraw2 = ddraw2; | ddraw.ddraw2 = ddraw2; |
| if (scrnmode & SCRNMODE_FULLSCREEN) { | if (scrnmode & SCRNMODE_FULLSCREEN) { |
| #if defined(SUPPORT_DCLOCK) | |
| dclock_init(); | dclock_init(); |
| ddraw2->SetCooperativeLevel(hWndMain, | #endif |
| DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT); | ddraw2->SetCooperativeLevel(g_hWndMain, |
| height = (np2oscfg.force400)?400:480; | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); |
| bitcolor = (scrnmode & SCRNMODE_HIGHCOLOR)?16:8; | width = np2oscfg.fscrn_cx; |
| if (ddraw2->SetDisplayMode(640, height, bitcolor, 0, 0) != DD_OK) { | height = np2oscfg.fscrn_cy; |
| bitcolor = np2oscfg.fscrnbpp; | |
| fscrnmod = np2oscfg.fscrnmod; | |
| if ((fscrnmod & (FSCRNMOD_SAMERES | FSCRNMOD_SAMEBPP)) && | |
| (EnumDisplaySettings(NULL, ENUM_REGISTRY_SETTINGS, &devmode))) { | |
| if (fscrnmod & FSCRNMOD_SAMERES) { | |
| width = devmode.dmPelsWidth; | |
| height = devmode.dmPelsHeight; | |
| } | |
| if (fscrnmod & FSCRNMOD_SAMEBPP) { | |
| bitcolor = devmode.dmBitsPerPel; | |
| } | |
| } | |
| if ((width == 0) || (height == 0)) { | |
| width = 640; | |
| height = (np2oscfg.force400)?400:480; | |
| } | |
| if (bitcolor == 0) { | |
| #if !defined(SUPPORT_PC9821) | |
| bitcolor = (scrnmode & SCRNMODE_HIGHCOLOR)?16:8; | |
| #else | |
| bitcolor = 16; | |
| #endif | |
| } | |
| if (ddraw2->SetDisplayMode(width, height, bitcolor, 0, 0) != DD_OK) { | |
| goto scre_err; | goto scre_err; |
| } | } |
| ddraw2->CreateClipper(0, &ddraw.clipper, NULL); | ddraw2->CreateClipper(0, &ddraw.clipper, NULL); |
| ddraw.clipper->SetHWnd(0, hWndMain); | ddraw.clipper->SetHWnd(0, g_hWndMain); |
| ZeroMemory(&ddsd, sizeof(ddsd)); | ZeroMemory(&ddsd, sizeof(ddsd)); |
| ddsd.dwSize = sizeof(ddsd); | ddsd.dwSize = sizeof(ddsd); |
| Line 371 BOOL scrnmng_create(BYTE scrnmode) { | Line 537 BOOL scrnmng_create(BYTE scrnmode) { |
| ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; | ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; |
| ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; | ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; |
| ddsd.dwWidth = 640; | ddsd.dwWidth = 640; |
| ddsd.dwHeight = height; | ddsd.dwHeight = 480; |
| if (ddraw2->CreateSurface(&ddsd, &ddraw.backsurf, NULL) != DD_OK) { | if (ddraw2->CreateSurface(&ddsd, &ddraw.backsurf, NULL) != DD_OK) { |
| goto scre_err; | goto scre_err; |
| } | } |
| if (bitcolor == 8) { | if (bitcolor == 8) { |
| paletteinit(); | paletteinit(); |
| dclock_init8(); | } |
| else if (bitcolor == 16) { | |
| make16mask(ddpf.dwBBitMask, ddpf.dwRBitMask, ddpf.dwGBitMask); | |
| } | |
| else if (bitcolor == 24) { | |
| } | |
| else if (bitcolor == 32) { | |
| } | } |
| else { | else { |
| make16mask(ddpf.dwBBitMask, ddpf.dwRBitMask, | goto scre_err; |
| ddpf.dwGBitMask); | |
| dclock_init16(); | |
| } | } |
| #if defined(SUPPORT_DCLOCK) | |
| dclock_palset(bitcolor); | |
| ZeroMemory(&ddsd, sizeof(ddsd)); | ZeroMemory(&ddsd, sizeof(ddsd)); |
| ddsd.dwSize = sizeof(ddsd); | ddsd.dwSize = sizeof(ddsd); |
| ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; | ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; |
| ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; | ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; |
| ddsd.dwWidth = DCLOCK_X; | ddsd.dwWidth = DCLOCK_WIDTH; |
| ddsd.dwHeight = DCLOCK_Y; | ddsd.dwHeight = DCLOCK_HEIGHT; |
| ddraw2->CreateSurface(&ddsd, &ddraw.clocksurf, NULL); | ddraw2->CreateSurface(&ddsd, &ddraw.clocksurf, NULL); |
| dclock_reset(); | dclock_reset(); |
| #endif | |
| } | } |
| else { | else { |
| ddraw2->SetCooperativeLevel(hWndMain, DDSCL_NORMAL); | ddraw2->SetCooperativeLevel(g_hWndMain, DDSCL_NORMAL); |
| ZeroMemory(&ddsd, sizeof(ddsd)); | ZeroMemory(&ddsd, sizeof(ddsd)); |
| ddsd.dwSize = sizeof(ddsd); | ddsd.dwSize = sizeof(ddsd); |
| Line 406 BOOL scrnmng_create(BYTE scrnmode) { | Line 578 BOOL scrnmng_create(BYTE scrnmode) { |
| } | } |
| ddraw2->CreateClipper(0, &ddraw.clipper, NULL); | ddraw2->CreateClipper(0, &ddraw.clipper, NULL); |
| ddraw.clipper->SetHWnd(0, hWndMain); | ddraw.clipper->SetHWnd(0, g_hWndMain); |
| ddraw.primsurf->SetClipper(ddraw.clipper); | ddraw.primsurf->SetClipper(ddraw.clipper); |
| ZeroMemory(&ddpf, sizeof(ddpf)); | ZeroMemory(&ddpf, sizeof(ddpf)); |
| Line 420 BOOL scrnmng_create(BYTE scrnmode) { | Line 592 BOOL scrnmng_create(BYTE scrnmode) { |
| ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; | ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; |
| ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; | ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; |
| if (!(scrnmode & SCRNMODE_ROTATE)) { | if (!(scrnmode & SCRNMODE_ROTATE)) { |
| ddsd.dwWidth = 641; | ddsd.dwWidth = 640 + 1; |
| ddsd.dwHeight = 480; | ddsd.dwHeight = 480; |
| } | } |
| else { | else { |
| ddsd.dwWidth = 480; | ddsd.dwWidth = 480; |
| ddsd.dwHeight = 641; | ddsd.dwHeight = 640 + 1; |
| } | } |
| width = 640; | |
| height = 480; | height = 480; |
| if (ddraw2->CreateSurface(&ddsd, &ddraw.backsurf, NULL) != DD_OK) { | if (ddraw2->CreateSurface(&ddsd, &ddraw.backsurf, NULL) != DD_OK) { |
| Line 448 BOOL scrnmng_create(BYTE scrnmode) { | Line 621 BOOL scrnmng_create(BYTE scrnmode) { |
| } | } |
| ddraw.extend = 1; | ddraw.extend = 1; |
| } | } |
| scrnmng.bpp = (BYTE)bitcolor; | scrnmng.bpp = (UINT8)bitcolor; |
| scrnsurf.bpp = bitcolor; | scrnsurf.bpp = bitcolor; |
| ddraw.scrnmode = scrnmode; | ddraw.scrnmode = scrnmode; |
| ddraw.width = 640; | ddraw.width = width; |
| ddraw.height = height; | ddraw.height = height; |
| ddraw.cliping = 0; | ddraw.cliping = 0; |
| renewalclientsize(); | renewalclientsize(FALSE); |
| // screenupdate = 3; // update! | |
| return(SUCCESS); | return(SUCCESS); |
| scre_err: | scre_err: |
| Line 464 scre_err: | Line 638 scre_err: |
| void scrnmng_destroy(void) { | void scrnmng_destroy(void) { |
| if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | |
| np2class_enablemenu(g_hWndMain, (!np2oscfg.wintype)); | |
| } | |
| #if defined(SUPPORT_DCLOCK) | |
| if (ddraw.clocksurf) { | if (ddraw.clocksurf) { |
| ddraw.clocksurf->Release(); | ddraw.clocksurf->Release(); |
| ddraw.clocksurf = NULL; | |
| } | } |
| #endif | |
| if (ddraw.backsurf) { | if (ddraw.backsurf) { |
| ddraw.backsurf->Release(); | ddraw.backsurf->Release(); |
| ddraw.backsurf = NULL; | |
| } | } |
| if (ddraw.palette) { | if (ddraw.palette) { |
| ddraw.palette->Release(); | ddraw.palette->Release(); |
| ddraw.palette = NULL; | |
| } | } |
| if (ddraw.clipper) { | if (ddraw.clipper) { |
| ddraw.clipper->Release(); | ddraw.clipper->Release(); |
| ddraw.clipper = NULL; | |
| } | } |
| if (ddraw.primsurf) { | if (ddraw.primsurf) { |
| ddraw.primsurf->Release(); | ddraw.primsurf->Release(); |
| ddraw.primsurf = NULL; | |
| } | } |
| if (ddraw.ddraw2) { | if (ddraw.ddraw2) { |
| if (ddraw.scrnmode & SCRNMODE_FULLSCREEN) { | if (ddraw.scrnmode & SCRNMODE_FULLSCREEN) { |
| ddraw.ddraw2->SetCooperativeLevel(hWndMain, DDSCL_NORMAL); | ddraw.ddraw2->SetCooperativeLevel(g_hWndMain, DDSCL_NORMAL); |
| } | } |
| ddraw.ddraw2->Release(); | ddraw.ddraw2->Release(); |
| ddraw.ddraw2 = NULL; | |
| } | } |
| if (ddraw.ddraw1) { | if (ddraw.ddraw1) { |
| ddraw.ddraw1->Release(); | ddraw.ddraw1->Release(); |
| ddraw.ddraw1 = NULL; | |
| } | } |
| ZeroMemory(&ddraw, sizeof(ddraw)); | ZeroMemory(&ddraw, sizeof(ddraw)); |
| } | } |
| Line 507 RGB16 scrnmng_makepal16(RGB32 pal32) { | Line 693 RGB16 scrnmng_makepal16(RGB32 pal32) { |
| (pal.p.r << ddraw.l16r) + (pal.p.b >> ddraw.r16b))); | (pal.p.r << ddraw.l16r) + (pal.p.b >> ddraw.r16b))); |
| } | } |
| void scrnmng_fullscrnmenu(int y) { | |
| UINT8 menudisp; | |
| if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | |
| menudisp = ((y >= 0) && (y < ddraw.menusize))?1:0; | |
| if (ddraw.menudisp != menudisp) { | |
| ddraw.menudisp = menudisp; | |
| if (menudisp == 1) { | |
| np2class_enablemenu(g_hWndMain, TRUE); | |
| } | |
| else { | |
| np2class_enablemenu(g_hWndMain, FALSE); | |
| clearoutfullscreen(); | |
| } | |
| } | |
| } | |
| } | |
| void scrnmng_topwinui(void) { | void scrnmng_topwinui(void) { |
| mouse_running(MOUSE_STOP); | mousemng_disable(MOUSEPROC_WINUI); |
| if (!ddraw.cliping++) { // ver0.28 | if (!ddraw.cliping++) { // ver0.28 |
| if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { |
| ddraw.primsurf->SetClipper(ddraw.clipper); | ddraw.primsurf->SetClipper(ddraw.clipper); |
| } | } |
| #ifndef __GNUC__ | #ifndef __GNUC__ |
| WINNLSEnableIME(hWndMain, TRUE); | WINNLSEnableIME(g_hWndMain, TRUE); |
| #endif | #endif |
| } | } |
| } | } |
| Line 524 void scrnmng_clearwinui(void) { | Line 729 void scrnmng_clearwinui(void) { |
| if ((ddraw.cliping > 0) && (!(--ddraw.cliping))) { | if ((ddraw.cliping > 0) && (!(--ddraw.cliping))) { |
| #ifndef __GNUC__ | #ifndef __GNUC__ |
| WINNLSEnableIME(hWndMain, FALSE); | WINNLSEnableIME(g_hWndMain, FALSE); |
| #endif | #endif |
| if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { |
| ddraw.primsurf->SetClipper(0); | ddraw.primsurf->SetClipper(0); |
| } | } |
| } | } |
| if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { |
| np2class_enablemenu(g_hWndMain, FALSE); | |
| clearoutfullscreen(); | clearoutfullscreen(); |
| ddraw.menudisp = 0; | |
| } | } |
| mouse_running(MOUSE_CONT); | else { |
| if (np2oscfg.wintype) { | |
| np2class_enablemenu(g_hWndMain, FALSE); | |
| InvalidateRect(g_hWndMain, NULL, TRUE); | |
| } | |
| } | |
| mousemng_enable(MOUSEPROC_WINUI); | |
| } | } |
| void scrnmng_setwidth(int posx, int width) { | void scrnmng_setwidth(int posx, int width) { |
| scrnstat.width = width; | scrnstat.width = width; |
| renewalclientsize(); | renewalclientsize(TRUE); |
| } | } |
| void scrnmng_setextend(int extend) { | void scrnmng_setextend(int extend) { |
| scrnstat.extend = extend; | scrnstat.extend = extend; |
| renewalclientsize(); | scrnmng.allflash = TRUE; |
| renewalclientsize(TRUE); | |
| } | } |
| void scrnmng_setheight(int posy, int height) { | void scrnmng_setheight(int posy, int height) { |
| scrnstat.height = height; | scrnstat.height = height; |
| renewalclientsize(); | renewalclientsize(TRUE); |
| } | } |
| const SCRNSURF *scrnmng_surflock(void) { | const SCRNSURF *scrnmng_surflock(void) { |
| DDSURFACEDESC destscrn; | DDSURFACEDESC destscrn; |
| HRESULT r; | |
| ZeroMemory(&destscrn, sizeof(destscrn)); | ZeroMemory(&destscrn, sizeof(destscrn)); |
| destscrn.dwSize = sizeof(destscrn); | destscrn.dwSize = sizeof(destscrn); |
| if (ddraw.backsurf->Lock(NULL, &destscrn, DDLOCK_WAIT, NULL) != DD_OK) { | if (ddraw.backsurf == NULL) { |
| return(NULL); | |
| } | |
| r = ddraw.backsurf->Lock(NULL, &destscrn, DDLOCK_WAIT, NULL); | |
| if (r == DDERR_SURFACELOST) { | |
| ddraw.backsurf->Restore(); | |
| r = ddraw.backsurf->Lock(NULL, &destscrn, DDLOCK_WAIT, NULL); | |
| } | |
| if (r != DD_OK) { | |
| // TRACEOUT(("backsurf lock error: %d (%d)", r)); | |
| return(NULL); | return(NULL); |
| } | } |
| if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) { | if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) { |
| scrnsurf.ptr = (BYTE *)destscrn.lpSurface; | scrnsurf.ptr = (UINT8 *)destscrn.lpSurface; |
| scrnsurf.xalign = scrnsurf.bpp >> 3; | scrnsurf.xalign = scrnsurf.bpp >> 3; |
| scrnsurf.yalign = destscrn.lPitch; | scrnsurf.yalign = destscrn.lPitch; |
| } | } |
| else if (!(ddraw.scrnmode & SCRNMODE_ROTATEDIR)) { | else if (!(ddraw.scrnmode & SCRNMODE_ROTATEDIR)) { |
| scrnsurf.ptr = (BYTE *)destscrn.lpSurface; | scrnsurf.ptr = (UINT8 *)destscrn.lpSurface; |
| scrnsurf.ptr += (scrnsurf.width - 1) * destscrn.lPitch; | scrnsurf.ptr += (scrnsurf.width - 1) * destscrn.lPitch; |
| scrnsurf.xalign = 0 - destscrn.lPitch; | scrnsurf.xalign = 0 - destscrn.lPitch; |
| scrnsurf.yalign = scrnsurf.bpp >> 3; | scrnsurf.yalign = scrnsurf.bpp >> 3; |
| } | } |
| else { | else { |
| scrnsurf.ptr = (BYTE *)destscrn.lpSurface; | scrnsurf.ptr = (UINT8 *)destscrn.lpSurface; |
| scrnsurf.ptr += (scrnsurf.height - 1) * (scrnsurf.bpp >> 3); | scrnsurf.ptr += (scrnsurf.height - 1) * (scrnsurf.bpp >> 3); |
| scrnsurf.xalign = destscrn.lPitch; | scrnsurf.xalign = destscrn.lPitch; |
| scrnsurf.yalign = 0 - (scrnsurf.bpp >> 3); | scrnsurf.yalign = 0 - (scrnsurf.bpp >> 3); |
| Line 593 void scrnmng_update(void) { | Line 817 void scrnmng_update(void) { |
| POINT clip; | POINT clip; |
| RECT dst; | RECT dst; |
| RECT *rect; | |
| RECT *scrn; | |
| HRESULT r; | |
| if (scrnmng.palchanged) { | if (scrnmng.palchanged) { |
| scrnmng.palchanged = FALSE; | scrnmng.palchanged = FALSE; |
| Line 604 void scrnmng_update(void) { | Line 831 void scrnmng_update(void) { |
| scrnmng.allflash = 0; | scrnmng.allflash = 0; |
| clearoutfullscreen(); | clearoutfullscreen(); |
| } | } |
| if (ddraw.primsurf->Blt(&ddraw.scrn, ddraw.backsurf, &ddraw.rect, | if (GetWindowLongPtr(g_hWndMain, NP2GWLP_HMENU)) { |
| DDBLT_WAIT, NULL) == DDERR_SURFACELOST) { | rect = &ddraw.rect; |
| ddraw.primsurf->Restore(); | scrn = &ddraw.scrn; |
| } | |
| else { | |
| rect = &ddraw.rectclip; | |
| scrn = &ddraw.scrnclip; | |
| } | |
| r = ddraw.primsurf->Blt(scrn, ddraw.backsurf, rect, | |
| DDBLT_WAIT, NULL); | |
| if (r == DDERR_SURFACELOST) { | |
| ddraw.backsurf->Restore(); | ddraw.backsurf->Restore(); |
| ddraw.primsurf->Restore(); | |
| ddraw.primsurf->Blt(scrn, ddraw.backsurf, rect, | |
| DDBLT_WAIT, NULL); | |
| } | } |
| } | } |
| else { | else { |
| Line 617 void scrnmng_update(void) { | Line 855 void scrnmng_update(void) { |
| } | } |
| clip.x = 0; | clip.x = 0; |
| clip.y = 0; | clip.y = 0; |
| ClientToScreen(hWndMain, &clip); | ClientToScreen(g_hWndMain, &clip); |
| dst.left = clip.x + ddraw.scrn.left; | dst.left = clip.x + ddraw.scrn.left; |
| dst.top = clip.y + ddraw.scrn.top; | dst.top = clip.y + ddraw.scrn.top; |
| dst.right = clip.x + ddraw.scrn.right; | dst.right = clip.x + ddraw.scrn.right; |
| dst.bottom = clip.y + ddraw.scrn.bottom; | dst.bottom = clip.y + ddraw.scrn.bottom; |
| if (ddraw.primsurf->Blt(&dst, ddraw.backsurf, &ddraw.rect, | r = ddraw.primsurf->Blt(&dst, ddraw.backsurf, &ddraw.rect, |
| DDBLT_WAIT, NULL) == DDERR_SURFACELOST) { | DDBLT_WAIT, NULL); |
| ddraw.primsurf->Restore(); | if (r == DDERR_SURFACELOST) { |
| ddraw.backsurf->Restore(); | ddraw.backsurf->Restore(); |
| ddraw.primsurf->Restore(); | |
| ddraw.primsurf->Blt(&dst, ddraw.backsurf, &ddraw.rect, | |
| DDBLT_WAIT, NULL); | |
| } | } |
| } | } |
| } | } |
| Line 638 void scrnmng_setmultiple(int multiple) { | Line 879 void scrnmng_setmultiple(int multiple) { |
| if (scrnstat.multiple != multiple) { | if (scrnstat.multiple != multiple) { |
| scrnstat.multiple = multiple; | scrnstat.multiple = multiple; |
| renewalclientsize(); | renewalclientsize(TRUE); |
| } | } |
| } | } |
| static const RECT rectclk = {0, 0, DCLOCK_X, DCLOCK_Y}; | |
| // ---- | |
| #if defined(SUPPORT_DCLOCK) | |
| static const RECT rectclk = {0, 0, DCLOCK_WIDTH, DCLOCK_HEIGHT}; | |
| BOOL scrnmng_isdispclockclick(const POINT *pt) { | |
| if (pt->y >= (ddraw.height - DCLOCK_HEIGHT)) { | |
| return(TRUE); | |
| } | |
| else { | |
| return(FALSE); | |
| } | |
| } | |
| void scrnmng_dispclock(void) { | void scrnmng_dispclock(void) { |
| DDSURFACEDESC dest; | DDSURFACEDESC dest; |
| const RECT *scrn; | |
| // ver0.26 | // ver0.26 |
| if ((ddraw.clocksurf) && | if (!ddraw.clocksurf) { |
| (ddraw.scrn.top >= DCLOCK_Y) && (dclock_disp())) { | return; |
| dclock_make(); | } |
| ZeroMemory(&dest, sizeof(dest)); | if (!dclock_disp()) { |
| dest.dwSize = sizeof(dest); | return; |
| if (ddraw.clocksurf->Lock(NULL, &dest, DDLOCK_WAIT, NULL) == DD_OK) { | } |
| if (scrnmng.bpp == 8) { | if (GetWindowLongPtr(g_hWndMain, NP2GWLP_HMENU)) { |
| dclock_out8(dest.lpSurface, dest.lPitch); | scrn = &ddraw.scrn; |
| } | } |
| else { | else { |
| dclock_out16(dest.lpSurface, dest.lPitch); | scrn = &ddraw.scrnclip; |
| } | } |
| ddraw.clocksurf->Unlock(NULL); | if ((scrn->bottom + DCLOCK_HEIGHT) > ddraw.height) { |
| return; | |
| } | |
| dclock_make(); | |
| ZeroMemory(&dest, sizeof(dest)); | |
| dest.dwSize = sizeof(dest); | |
| if (ddraw.clocksurf->Lock(NULL, &dest, DDLOCK_WAIT, NULL) == DD_OK) { | |
| if (scrnmng.bpp == 8) { | |
| dclock_out8(dest.lpSurface, dest.lPitch); | |
| } | |
| else if (scrnmng.bpp == 16) { | |
| dclock_out16(dest.lpSurface, dest.lPitch); | |
| } | |
| else if (scrnmng.bpp == 24) { | |
| dclock_out24(dest.lpSurface, dest.lPitch); | |
| } | } |
| if (ddraw.primsurf->BltFast(640 - DCLOCK_X - 4, | else if (scrnmng.bpp == 32) { |
| ddraw.height - DCLOCK_Y, | dclock_out32(dest.lpSurface, dest.lPitch); |
| } | |
| ddraw.clocksurf->Unlock(NULL); | |
| } | |
| if (ddraw.primsurf->BltFast(ddraw.width - DCLOCK_WIDTH - 4, | |
| ddraw.height - DCLOCK_HEIGHT, | |
| ddraw.clocksurf, (RECT *)&rectclk, | ddraw.clocksurf, (RECT *)&rectclk, |
| DDBLTFAST_WAIT) == DDERR_SURFACELOST) { | DDBLTFAST_WAIT) == DDERR_SURFACELOST) { |
| ddraw.primsurf->Restore(); | ddraw.primsurf->Restore(); |
| ddraw.clocksurf->Restore(); | ddraw.clocksurf->Restore(); |
| } | } |
| dclock_cntdown(np2oscfg.DRAW_SKIP); | dclock_cntdown(np2oscfg.DRAW_SKIP); |
| } | |
| #endif | |
| // ---- | |
| typedef struct { | |
| int bx; | |
| int by; | |
| int cx; | |
| int cy; | |
| int mul; | |
| } SCRNSIZING; | |
| static SCRNSIZING scrnsizing; | |
| enum { | |
| SIZING_ADJUST = 12 | |
| }; | |
| void scrnmng_entersizing(void) { | |
| RECT rectwindow; | |
| RECT rectclient; | |
| int cx; | |
| int cy; | |
| GetWindowRect(g_hWndMain, &rectwindow); | |
| GetClientRect(g_hWndMain, &rectclient); | |
| scrnsizing.bx = (np2oscfg.paddingx * 2) + | |
| (rectwindow.right - rectwindow.left) - | |
| (rectclient.right - rectclient.left); | |
| scrnsizing.by = (np2oscfg.paddingy * 2) + | |
| (rectwindow.bottom - rectwindow.top) - | |
| (rectclient.bottom - rectclient.top); | |
| cx = min(scrnstat.width, ddraw.width); | |
| cx = (cx + 7) >> 3; | |
| cy = min(scrnstat.height, ddraw.height); | |
| cy = (cy + 7) >> 3; | |
| if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) { | |
| scrnsizing.cx = cx; | |
| scrnsizing.cy = cy; | |
| } | |
| else { | |
| scrnsizing.cx = cy; | |
| scrnsizing.cy = cx; | |
| } | |
| scrnsizing.mul = scrnstat.multiple; | |
| } | |
| void scrnmng_sizing(UINT side, RECT *rect) { | |
| int width; | |
| int height; | |
| int mul; | |
| if ((side != WMSZ_TOP) && (side != WMSZ_BOTTOM)) { | |
| width = rect->right - rect->left - scrnsizing.bx + SIZING_ADJUST; | |
| width /= scrnsizing.cx; | |
| } | |
| else { | |
| width = 16; | |
| } | |
| if ((side != WMSZ_LEFT) && (side != WMSZ_RIGHT)) { | |
| height = rect->bottom - rect->top - scrnsizing.by + SIZING_ADJUST; | |
| height /= scrnsizing.cy; | |
| } | |
| else { | |
| height = 16; | |
| } | } |
| mul = min(width, height); | |
| if (mul <= 0) { | |
| mul = 1; | |
| } | |
| else if (mul > 16) { | |
| mul = 16; | |
| } | |
| width = scrnsizing.bx + (scrnsizing.cx * mul); | |
| height = scrnsizing.by + (scrnsizing.cy * mul); | |
| switch(side) { | |
| case WMSZ_LEFT: | |
| case WMSZ_TOPLEFT: | |
| case WMSZ_BOTTOMLEFT: | |
| rect->left = rect->right - width; | |
| break; | |
| case WMSZ_RIGHT: | |
| case WMSZ_TOP: | |
| case WMSZ_TOPRIGHT: | |
| case WMSZ_BOTTOM: | |
| case WMSZ_BOTTOMRIGHT: | |
| default: | |
| rect->right = rect->left + width; | |
| break; | |
| } | |
| switch(side) { | |
| case WMSZ_TOP: | |
| case WMSZ_TOPLEFT: | |
| case WMSZ_TOPRIGHT: | |
| rect->top = rect->bottom - height; | |
| break; | |
| case WMSZ_LEFT: | |
| case WMSZ_RIGHT: | |
| case WMSZ_BOTTOM: | |
| case WMSZ_BOTTOMLEFT: | |
| case WMSZ_BOTTOMRIGHT: | |
| default: | |
| rect->bottom = rect->top + height; | |
| break; | |
| } | |
| scrnsizing.mul = mul; | |
| } | |
| void scrnmng_exitsizing(void) { | |
| sysmenu_setscrnmul(scrnsizing.mul); | |
| scrnmng_setmultiple(scrnsizing.mul); | |
| InvalidateRect(g_hWndMain, NULL, TRUE); // ugh | |
| } | } |