--- np2/win9x/scrnmng.cpp 2003/10/21 11:22:05 1.3 +++ np2/win9x/scrnmng.cpp 2007/01/08 07:52:01 1.24 @@ -5,34 +5,48 @@ #endif #include "resource.h" #include "np2.h" +#include "winloc.h" #include "mousemng.h" #include "scrnmng.h" #include "sysmng.h" -#include "dclock.h" #include "menu.h" +#include "np2class.h" +#include "pccore.h" #include "scrndraw.h" #include "palettes.h" +#if defined(SUPPORT_DCLOCK) +#include "dclock.h" +#endif + +extern WINLOCEX np2_winlocexallwin(HWND base); + typedef struct { LPDIRECTDRAW ddraw1; LPDIRECTDRAW2 ddraw2; LPDIRECTDRAWSURFACE primsurf; LPDIRECTDRAWSURFACE backsurf; +#if defined(SUPPORT_DCLOCK) LPDIRECTDRAWSURFACE clocksurf; +#endif LPDIRECTDRAWCLIPPER clipper; LPDIRECTDRAWPALETTE palette; - BYTE scrnmode; + UINT scrnmode; int width; int height; int extend; int cliping; RGB32 pal16mask; - BYTE r16b; - BYTE l16r; - BYTE l16g; + UINT8 r16b; + UINT8 l16r; + UINT8 l16g; + UINT8 menudisp; + int menusize; RECT scrn; RECT rect; + RECT scrnclip; + RECT rectclip; PALETTEENTRY pal[256]; } DDRAW; @@ -49,68 +63,80 @@ static SCRNSTAT scrnstat; 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 rectclient; - RECT workrc; - int scx, scy; + int cx; + int cy; 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); scx = GetSystemMetrics(SM_CXSCREEN); scy = GetSystemMetrics(SM_CYSCREEN); - update = 0; - if (scx < width) { - np2oscfg.winx = (scx - width) / 2; - update |= SYS_UPDATEOSCFG; - } - else { - if ((np2oscfg.winx + width) > workrc.right) { - np2oscfg.winx = workrc.right - width; + cnt = 2; + do { + GetWindowRect(hWnd, &rectwindow); + GetClientRect(hWnd, &rectclient); + cx = width; + cx += np2oscfg.paddingx * 2; + cx += rectwindow.right - rectwindow.left; + 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; } - if (np2oscfg.winx < workrc.left) { - np2oscfg.winx = workrc.left; - update |= SYS_UPDATEOSCFG; + else { + if ((np2oscfg.winx + cx) > workrc.right) { + np2oscfg.winx = workrc.right - cx; + update |= SYS_UPDATEOSCFG; + } + if (np2oscfg.winx < workrc.left) { + np2oscfg.winx = workrc.left; + update |= SYS_UPDATEOSCFG; + } } - } - if (scy < height) { - np2oscfg.winy = (scy - height) / 2; - update |= SYS_UPDATEOSCFG; - } - else { - if ((np2oscfg.winy + height) > workrc.bottom) { - np2oscfg.winy = workrc.bottom - height; + if (scy < cy) { + np2oscfg.winy = (scy - cy) / 2; update |= SYS_UPDATEOSCFG; } - if (np2oscfg.winy < workrc.top) { - np2oscfg.winy = workrc.top; - update |= SYS_UPDATEOSCFG; + else { + if ((np2oscfg.winy + cy) > workrc.bottom) { + np2oscfg.winy = workrc.bottom - cy; + update |= SYS_UPDATEOSCFG; + } + if (np2oscfg.winy < workrc.top) { + np2oscfg.winy = workrc.top; + update |= SYS_UPDATEOSCFG; + } } - } - sysmng_update(update); - MoveWindow(hWndMain, np2oscfg.winx, np2oscfg.winy, width, height, TRUE); -} - -static void renewalclientsize(void) { - - int width; - int height; - int extend; - int multiple; - int scrnwidth; - int scrnheight; + sysmng_update(update); + MoveWindow(hWnd, np2oscfg.winx, np2oscfg.winy, cx, cy, TRUE); + } while(--cnt); +} + +static void renewalclientsize(BOOL winloc) { + + int width; + int height; + int extend; + UINT fscrnmod; + int multiple; + int scrnwidth; + int scrnheight; + int tmpcy; + WINLOCEX wlex; width = min(scrnstat.width, ddraw.width); height = min(scrnstat.height, ddraw.height); @@ -120,10 +146,66 @@ static void renewalclientsize(void) { if (ddraw.scrnmode & SCRNMODE_FULLSCREEN) { ddraw.rect.right = width; ddraw.rect.bottom = height; - ddraw.scrn.left = (ddraw.width - width) / 2; - ddraw.scrn.top = (ddraw.height - height) / 2; - ddraw.scrn.right = ddraw.scrn.left + width; - ddraw.scrn.bottom = ddraw.scrn.top + height; + scrnwidth = width; + scrnheight = height; + fscrnmod = np2oscfg.fscrnmod & FSCRNMOD_ASPECTMASK; + 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 { multiple = scrnstat.multiple; @@ -151,8 +233,15 @@ static void renewalclientsize(void) { } ddraw.scrn.right = np2oscfg.paddingx + scrnwidth; ddraw.scrn.bottom = np2oscfg.paddingy + scrnheight; - setwindowsize(scrnwidth, scrnheight); - setwindowsize(scrnwidth, scrnheight); + + wlex = NULL; + if (winloc) { + wlex = np2_winlocexallwin(hWndMain); + } + winlocex_setholdwnd(wlex, hWndMain); + setwindowsize(hWndMain, scrnwidth, scrnheight); + winlocex_move(wlex); + winlocex_destroy(wlex); } scrnsurf.width = width; scrnsurf.height = height; @@ -205,9 +294,17 @@ static void clearoutofrect(const RECT *t static void clearoutscreen(void) { RECT base; + POINT clipt; RECT target; GetClientRect(hWndMain, &base); + clipt.x = 0; + clipt.y = 0; + ClientToScreen(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.top = base.top + ddraw.scrn.top; target.right = base.left + ddraw.scrn.right; @@ -217,8 +314,25 @@ static void clearoutscreen(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(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(); +#endif } static void paletteinit(void) { @@ -229,12 +343,14 @@ static void paletteinit(void) { hdc = GetDC(hWndMain); GetSystemPaletteEntries(hdc, 0, 256, ddraw.pal); ReleaseDC(hWndMain, hdc); +#if defined(SUPPORT_DCLOCK) for (i=0; i<4; i++) { 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].peGreen = dclockpal.pal32[i].p.g; ddraw.pal[i+START_PALORG].peFlags = PC_RESERVED | PC_NOCOLLAPSE; } +#endif for (i=0; i>= 1; sft++; } - ddraw.pal16mask.p.r = (BYTE)rmask; + ddraw.pal16mask.p.r = (UINT8)rmask; ddraw.l16r = sft; sft = 0; @@ -282,7 +398,7 @@ static void make16mask(DWORD bmask, DWOR gmask >>= 1; sft++; } - ddraw.pal16mask.p.g = (BYTE)gmask; + ddraw.pal16mask.p.g = (UINT8)gmask; ddraw.l16g = sft; } @@ -295,10 +411,10 @@ void scrnmng_initialize(void) { scrnstat.height = 400; scrnstat.extend = 1; scrnstat.multiple = 8; - setwindowsize(640, 400); + setwindowsize(hWndMain, 640, 400); } -BOOL scrnmng_create(BYTE scrnmode) { +BRESULT scrnmng_create(UINT8 scrnmode) { DWORD winstyle; DWORD winstyleex; @@ -306,8 +422,11 @@ BOOL scrnmng_create(BYTE scrnmode) { LPDIRECTDRAW2 ddraw2; DDSURFACEDESC ddsd; DDPIXELFORMAT ddpf; - UINT bitcolor; + int width; int height; + UINT bitcolor; + UINT fscrnmod; + DEVMODE devmode; ZeroMemory(&scrnmng, sizeof(scrnmng)); winstyle = GetWindowLong(hWndMain, GWL_STYLE); @@ -316,15 +435,24 @@ BOOL scrnmng_create(BYTE scrnmode) { if (scrnmode & SCRNMODE_FULLSCREEN) { scrnmode &= ~SCRNMODE_ROTATEMASK; scrnmng.flag = SCRNFLAG_FULLSCREEN; - winstyle &= ~(WS_CAPTION | WS_OVERLAPPED | WS_SYSMENU); + winstyle &= ~(WS_CAPTION | WS_SYSMENU | WS_THICKFRAME); winstyle |= WS_POPUP; winstyleex |= WS_EX_TOPMOST; CheckMenuItem(hmenu, IDM_WINDOW, MF_UNCHECKED); CheckMenuItem(hmenu, IDM_FULLSCREEN, MF_CHECKED); + ddraw.menudisp = 0; + ddraw.menusize = GetSystemMetrics(SM_CYMENU); + np2class_enablemenu(hWndMain, FALSE); } else { 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; winstyleex &= ~WS_EX_TOPMOST; CheckMenuItem(hmenu, IDM_WINDOW, MF_CHECKED); @@ -340,12 +468,37 @@ BOOL scrnmng_create(BYTE scrnmode) { ddraw.ddraw2 = ddraw2; if (scrnmode & SCRNMODE_FULLSCREEN) { +#if defined(SUPPORT_DCLOCK) dclock_init(); +#endif ddraw2->SetCooperativeLevel(hWndMain, - DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT); - height = (np2oscfg.force400)?400:480; - bitcolor = (scrnmode & SCRNMODE_HIGHCOLOR)?16:8; - if (ddraw2->SetDisplayMode(640, height, bitcolor, 0, 0) != DD_OK) { + DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + width = np2oscfg.fscrn_cx; + 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; } ddraw2->CreateClipper(0, &ddraw.clipper, NULL); @@ -371,28 +524,34 @@ BOOL scrnmng_create(BYTE scrnmode) { ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.dwWidth = 640; - ddsd.dwHeight = height; + ddsd.dwHeight = 480; if (ddraw2->CreateSurface(&ddsd, &ddraw.backsurf, NULL) != DD_OK) { goto scre_err; } if (bitcolor == 8) { paletteinit(); - dclock_init8(); + } + else if (bitcolor == 16) { + make16mask(ddpf.dwBBitMask, ddpf.dwRBitMask, ddpf.dwGBitMask); + } + else if (bitcolor == 24) { + } + else if (bitcolor == 32) { } else { - make16mask(ddpf.dwBBitMask, ddpf.dwRBitMask, - ddpf.dwGBitMask); - dclock_init16(); + goto scre_err; } - +#if defined(SUPPORT_DCLOCK) + dclock_palset(bitcolor); ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - ddsd.dwWidth = DCLOCK_X; - ddsd.dwHeight = DCLOCK_Y; + ddsd.dwWidth = DCLOCK_WIDTH; + ddsd.dwHeight = DCLOCK_HEIGHT; ddraw2->CreateSurface(&ddsd, &ddraw.clocksurf, NULL); dclock_reset(); +#endif } else { ddraw2->SetCooperativeLevel(hWndMain, DDSCL_NORMAL); @@ -420,13 +579,14 @@ BOOL scrnmng_create(BYTE scrnmode) { ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; if (!(scrnmode & SCRNMODE_ROTATE)) { - ddsd.dwWidth = 641; + ddsd.dwWidth = 640 + 1; ddsd.dwHeight = 480; } else { ddsd.dwWidth = 480; - ddsd.dwHeight = 641; + ddsd.dwHeight = 640 + 1; } + width = 640; height = 480; if (ddraw2->CreateSurface(&ddsd, &ddraw.backsurf, NULL) != DD_OK) { @@ -448,13 +608,14 @@ BOOL scrnmng_create(BYTE scrnmode) { } ddraw.extend = 1; } - scrnmng.bpp = (BYTE)bitcolor; + scrnmng.bpp = (UINT8)bitcolor; scrnsurf.bpp = bitcolor; ddraw.scrnmode = scrnmode; - ddraw.width = 640; + ddraw.width = width; ddraw.height = height; ddraw.cliping = 0; - renewalclientsize(); + renewalclientsize(FALSE); + screenupdate = 3; // update! return(SUCCESS); scre_err: @@ -464,29 +625,41 @@ scre_err: void scrnmng_destroy(void) { + if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { + np2class_enablemenu(hWndMain, (!np2oscfg.wintype)); + } +#if defined(SUPPORT_DCLOCK) if (ddraw.clocksurf) { ddraw.clocksurf->Release(); + ddraw.clocksurf = NULL; } +#endif if (ddraw.backsurf) { ddraw.backsurf->Release(); + ddraw.backsurf = NULL; } if (ddraw.palette) { ddraw.palette->Release(); + ddraw.palette = NULL; } if (ddraw.clipper) { ddraw.clipper->Release(); + ddraw.clipper = NULL; } if (ddraw.primsurf) { ddraw.primsurf->Release(); + ddraw.primsurf = NULL; } if (ddraw.ddraw2) { if (ddraw.scrnmode & SCRNMODE_FULLSCREEN) { ddraw.ddraw2->SetCooperativeLevel(hWndMain, DDSCL_NORMAL); } ddraw.ddraw2->Release(); + ddraw.ddraw2 = NULL; } if (ddraw.ddraw1) { ddraw.ddraw1->Release(); + ddraw.ddraw1 = NULL; } ZeroMemory(&ddraw, sizeof(ddraw)); } @@ -498,18 +671,37 @@ void scrnmng_querypalette(void) { } } -UINT16 scrnmng_makepal16(RGB32 pal32) { +RGB16 scrnmng_makepal16(RGB32 pal32) { RGB32 pal; pal.d = pal32.d & ddraw.pal16mask.d; - return((UINT16)((pal.p.g << ddraw.l16g) + + return((RGB16)((pal.p.g << ddraw.l16g) + (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(hWndMain, TRUE); + } + else { + np2class_enablemenu(hWndMain, FALSE); + clearoutfullscreen(); + } + } + } +} + void scrnmng_topwinui(void) { - mouse_running(MOUSE_STOP); + mousemng_disable(MOUSEPROC_WINUI); if (!ddraw.cliping++) { // ver0.28 if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { ddraw.primsurf->SetClipper(ddraw.clipper); @@ -531,51 +723,70 @@ void scrnmng_clearwinui(void) { } } if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { + np2class_enablemenu(hWndMain, FALSE); clearoutfullscreen(); + ddraw.menudisp = 0; } - mouse_running(MOUSE_CONT); + else { + if (np2oscfg.wintype) { + np2class_enablemenu(hWndMain, FALSE); + InvalidateRect(hWndMain, NULL, TRUE); + } + } + mousemng_enable(MOUSEPROC_WINUI); } void scrnmng_setwidth(int posx, int width) { scrnstat.width = width; - renewalclientsize(); + renewalclientsize(TRUE); } void scrnmng_setextend(int extend) { scrnstat.extend = extend; - renewalclientsize(); + scrnmng.allflash = TRUE; + renewalclientsize(TRUE); } void scrnmng_setheight(int posy, int height) { scrnstat.height = height; - renewalclientsize(); + renewalclientsize(TRUE); } const SCRNSURF *scrnmng_surflock(void) { DDSURFACEDESC destscrn; + HRESULT r; ZeroMemory(&destscrn, 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); } if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) { - scrnsurf.ptr = (BYTE *)destscrn.lpSurface; + scrnsurf.ptr = (UINT8 *)destscrn.lpSurface; scrnsurf.xalign = scrnsurf.bpp >> 3; scrnsurf.yalign = destscrn.lPitch; } else if (!(ddraw.scrnmode & SCRNMODE_ROTATEDIR)) { - scrnsurf.ptr = (BYTE *)destscrn.lpSurface; + scrnsurf.ptr = (UINT8 *)destscrn.lpSurface; scrnsurf.ptr += (scrnsurf.width - 1) * destscrn.lPitch; scrnsurf.xalign = 0 - destscrn.lPitch; scrnsurf.yalign = scrnsurf.bpp >> 3; } else { - scrnsurf.ptr = (BYTE *)destscrn.lpSurface; + scrnsurf.ptr = (UINT8 *)destscrn.lpSurface; scrnsurf.ptr += (scrnsurf.height - 1) * (scrnsurf.bpp >> 3); scrnsurf.xalign = destscrn.lPitch; scrnsurf.yalign = 0 - (scrnsurf.bpp >> 3); @@ -593,6 +804,9 @@ void scrnmng_update(void) { POINT clip; RECT dst; + RECT *rect; + RECT *scrn; + HRESULT r; if (scrnmng.palchanged) { scrnmng.palchanged = FALSE; @@ -604,10 +818,21 @@ void scrnmng_update(void) { scrnmng.allflash = 0; clearoutfullscreen(); } - if (ddraw.primsurf->Blt(&ddraw.scrn, ddraw.backsurf, &ddraw.rect, - DDBLT_WAIT, NULL) == DDERR_SURFACELOST) { - ddraw.primsurf->Restore(); + if (GetWindowLongPtr(hWndMain, NP2GWLP_HMENU)) { + rect = &ddraw.rect; + 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.primsurf->Restore(); + ddraw.primsurf->Blt(scrn, ddraw.backsurf, rect, + DDBLT_WAIT, NULL); } } else { @@ -622,10 +847,13 @@ void scrnmng_update(void) { dst.top = clip.y + ddraw.scrn.top; dst.right = clip.x + ddraw.scrn.right; dst.bottom = clip.y + ddraw.scrn.bottom; - if (ddraw.primsurf->Blt(&dst, ddraw.backsurf, &ddraw.rect, - DDBLT_WAIT, NULL) == DDERR_SURFACELOST) { - ddraw.primsurf->Restore(); + r = ddraw.primsurf->Blt(&dst, ddraw.backsurf, &ddraw.rect, + DDBLT_WAIT, NULL); + if (r == DDERR_SURFACELOST) { ddraw.backsurf->Restore(); + ddraw.primsurf->Restore(); + ddraw.primsurf->Blt(&dst, ddraw.backsurf, &ddraw.rect, + DDBLT_WAIT, NULL); } } } @@ -638,38 +866,191 @@ void scrnmng_setmultiple(int multiple) { if (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) { DDSURFACEDESC dest; +const RECT *scrn; // ver0.26 - if ((ddraw.clocksurf) && - (ddraw.scrn.top >= DCLOCK_Y) && (dclock_disp())) { - 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 { - dclock_out16(dest.lpSurface, dest.lPitch); - } - ddraw.clocksurf->Unlock(NULL); + if (!ddraw.clocksurf) { + return; + } + if (!dclock_disp()) { + return; + } + if (GetWindowLongPtr(hWndMain, NP2GWLP_HMENU)) { + scrn = &ddraw.scrn; + } + else { + scrn = &ddraw.scrnclip; + } + 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); + } + else if (scrnmng.bpp == 32) { + dclock_out32(dest.lpSurface, dest.lPitch); } - if (ddraw.primsurf->BltFast(640 - DCLOCK_X - 4, - ddraw.height - DCLOCK_Y, + ddraw.clocksurf->Unlock(NULL); + } + if (ddraw.primsurf->BltFast(ddraw.width - DCLOCK_WIDTH - 4, + ddraw.height - DCLOCK_HEIGHT, ddraw.clocksurf, (RECT *)&rectclk, DDBLTFAST_WAIT) == DDERR_SURFACELOST) { - ddraw.primsurf->Restore(); - ddraw.clocksurf->Restore(); - } - dclock_cntdown(np2oscfg.DRAW_SKIP); + ddraw.primsurf->Restore(); + ddraw.clocksurf->Restore(); + } + 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(hWndMain, &rectwindow); + GetClientRect(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(hWndMain, NULL, TRUE); // ugh }