--- np2/win9x/scrnmng.cpp 2006/12/24 00:52:29 1.22 +++ np2/win9x/scrnmng.cpp 2007/11/11 07:11:27 1.25 @@ -45,6 +45,8 @@ typedef struct { int menusize; RECT scrn; RECT rect; + RECT scrnclip; + RECT rectclip; PALETTEENTRY pal[256]; } DDRAW; @@ -129,9 +131,11 @@ static void renewalclientsize(BOOL winlo int width; int height; int extend; + UINT fscrnmod; int multiple; int scrnwidth; int scrnheight; + int tmpcy; WINLOCEX wlex; width = min(scrnstat.width, ddraw.width); @@ -142,10 +146,66 @@ static void renewalclientsize(BOOL winlo 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; @@ -173,12 +233,13 @@ static void renewalclientsize(BOOL winlo } ddraw.scrn.right = np2oscfg.paddingx + scrnwidth; ddraw.scrn.bottom = np2oscfg.paddingy + scrnheight; + wlex = NULL; if (winloc) { - wlex = np2_winlocexallwin(hWndMain); + wlex = np2_winlocexallwin(g_hWndMain); } - winlocex_setholdwnd(wlex, hWndMain); - setwindowsize(hWndMain, scrnwidth, scrnheight); + winlocex_setholdwnd(wlex, g_hWndMain); + setwindowsize(g_hWndMain, scrnwidth, scrnheight); winlocex_move(wlex); winlocex_destroy(wlex); } @@ -236,10 +297,10 @@ static void clearoutscreen(void) { POINT clipt; RECT target; - GetClientRect(hWndMain, &base); + GetClientRect(g_hWndMain, &base); clipt.x = 0; clipt.y = 0; - ClientToScreen(hWndMain, &clipt); + ClientToScreen(g_hWndMain, &clipt); base.left += clipt.x; base.top += clipt.y; base.right += clipt.x; @@ -254,12 +315,21 @@ static void clearoutscreen(void) { static void clearoutfullscreen(void) { RECT base; +const RECT *scrn; base.left = 0; - base.top = (GetWindowLong(hWndMain, NP2GWL_HMENU))?0:ddraw.menusize; - base.right = ddraw.width; // (+ ddraw.extend) + base.top = 0; + base.right = ddraw.width; base.bottom = ddraw.height; - clearoutofrect(&ddraw.scrn, &base); + 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(); #endif @@ -270,9 +340,9 @@ static void paletteinit(void) { HDC hdc; UINT i; - hdc = GetDC(hWndMain); + hdc = GetDC(g_hWndMain); GetSystemPaletteEntries(hdc, 0, 256, ddraw.pal); - ReleaseDC(hWndMain, hdc); + ReleaseDC(g_hWndMain, hdc); #if defined(SUPPORT_DCLOCK) for (i=0; i<4; i++) { ddraw.pal[i+START_PALORG].peBlue = dclockpal.pal32[i].p.b; @@ -341,7 +411,7 @@ void scrnmng_initialize(void) { scrnstat.height = 400; scrnstat.extend = 1; scrnstat.multiple = 8; - setwindowsize(hWndMain, 640, 400); + setwindowsize(g_hWndMain, 640, 400); } BRESULT scrnmng_create(UINT8 scrnmode) { @@ -352,13 +422,16 @@ BRESULT scrnmng_create(UINT8 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); - winstyleex = GetWindowLong(hWndMain, GWL_EXSTYLE); - hmenu = GetMenu(hWndMain); + winstyle = GetWindowLong(g_hWndMain, GWL_STYLE); + winstyleex = GetWindowLong(g_hWndMain, GWL_EXSTYLE); + hmenu = GetMenu(g_hWndMain); if (scrnmode & SCRNMODE_FULLSCREEN) { scrnmode &= ~SCRNMODE_ROTATEMASK; scrnmng.flag = SCRNFLAG_FULLSCREEN; @@ -369,7 +442,7 @@ BRESULT scrnmng_create(UINT8 scrnmode) { CheckMenuItem(hmenu, IDM_FULLSCREEN, MF_CHECKED); ddraw.menudisp = 0; ddraw.menusize = GetSystemMetrics(SM_CYMENU); - np2class_enablemenu(hWndMain, FALSE); + np2class_enablemenu(g_hWndMain, FALSE); } else { scrnmng.flag = SCRNFLAG_HAVEEXTEND; @@ -385,8 +458,8 @@ BRESULT scrnmng_create(UINT8 scrnmode) { CheckMenuItem(hmenu, IDM_WINDOW, MF_CHECKED); CheckMenuItem(hmenu, IDM_FULLSCREEN, MF_UNCHECKED); } - SetWindowLong(hWndMain, GWL_STYLE, winstyle); - SetWindowLong(hWndMain, GWL_EXSTYLE, winstyleex); + SetWindowLong(g_hWndMain, GWL_STYLE, winstyle); + SetWindowLong(g_hWndMain, GWL_EXSTYLE, winstyleex); if (DirectDrawCreate(NULL, &ddraw.ddraw1, NULL) != DD_OK) { goto scre_err; @@ -398,10 +471,26 @@ BRESULT scrnmng_create(UINT8 scrnmode) { #if defined(SUPPORT_DCLOCK) dclock_init(); #endif - ddraw2->SetCooperativeLevel(hWndMain, + ddraw2->SetCooperativeLevel(g_hWndMain, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); - height = (np2oscfg.force400)?400:480; + 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; @@ -409,11 +498,11 @@ BRESULT scrnmng_create(UINT8 scrnmode) { bitcolor = 16; #endif } - if (ddraw2->SetDisplayMode(640, height, bitcolor, 0, 0) != DD_OK) { + if (ddraw2->SetDisplayMode(width, height, bitcolor, 0, 0) != DD_OK) { goto scre_err; } ddraw2->CreateClipper(0, &ddraw.clipper, NULL); - ddraw.clipper->SetHWnd(0, hWndMain); + ddraw.clipper->SetHWnd(0, g_hWndMain); ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); @@ -435,7 +524,7 @@ BRESULT scrnmng_create(UINT8 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; } @@ -465,7 +554,7 @@ BRESULT scrnmng_create(UINT8 scrnmode) { #endif } else { - ddraw2->SetCooperativeLevel(hWndMain, DDSCL_NORMAL); + ddraw2->SetCooperativeLevel(g_hWndMain, DDSCL_NORMAL); ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); @@ -476,7 +565,7 @@ BRESULT scrnmng_create(UINT8 scrnmode) { } ddraw2->CreateClipper(0, &ddraw.clipper, NULL); - ddraw.clipper->SetHWnd(0, hWndMain); + ddraw.clipper->SetHWnd(0, g_hWndMain); ddraw.primsurf->SetClipper(ddraw.clipper); ZeroMemory(&ddpf, sizeof(ddpf)); @@ -490,13 +579,14 @@ BRESULT scrnmng_create(UINT8 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) { @@ -521,7 +611,7 @@ BRESULT scrnmng_create(UINT8 scrnmode) { scrnmng.bpp = (UINT8)bitcolor; scrnsurf.bpp = bitcolor; ddraw.scrnmode = scrnmode; - ddraw.width = 640; + ddraw.width = width; ddraw.height = height; ddraw.cliping = 0; renewalclientsize(FALSE); @@ -536,7 +626,7 @@ scre_err: void scrnmng_destroy(void) { if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { - np2class_enablemenu(hWndMain, (!np2oscfg.wintype)); + np2class_enablemenu(g_hWndMain, (!np2oscfg.wintype)); } #if defined(SUPPORT_DCLOCK) if (ddraw.clocksurf) { @@ -562,7 +652,7 @@ void scrnmng_destroy(void) { } if (ddraw.ddraw2) { if (ddraw.scrnmode & SCRNMODE_FULLSCREEN) { - ddraw.ddraw2->SetCooperativeLevel(hWndMain, DDSCL_NORMAL); + ddraw.ddraw2->SetCooperativeLevel(g_hWndMain, DDSCL_NORMAL); } ddraw.ddraw2->Release(); ddraw.ddraw2 = NULL; @@ -599,10 +689,10 @@ void scrnmng_fullscrnmenu(int y) { if (ddraw.menudisp != menudisp) { ddraw.menudisp = menudisp; if (menudisp == 1) { - np2class_enablemenu(hWndMain, TRUE); + np2class_enablemenu(g_hWndMain, TRUE); } else { - np2class_enablemenu(hWndMain, FALSE); + np2class_enablemenu(g_hWndMain, FALSE); clearoutfullscreen(); } } @@ -617,7 +707,7 @@ void scrnmng_topwinui(void) { ddraw.primsurf->SetClipper(ddraw.clipper); } #ifndef __GNUC__ - WINNLSEnableIME(hWndMain, TRUE); + WINNLSEnableIME(g_hWndMain, TRUE); #endif } } @@ -626,21 +716,21 @@ void scrnmng_clearwinui(void) { if ((ddraw.cliping > 0) && (!(--ddraw.cliping))) { #ifndef __GNUC__ - WINNLSEnableIME(hWndMain, FALSE); + WINNLSEnableIME(g_hWndMain, FALSE); #endif if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { ddraw.primsurf->SetClipper(0); } } if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { - np2class_enablemenu(hWndMain, FALSE); + np2class_enablemenu(g_hWndMain, FALSE); clearoutfullscreen(); ddraw.menudisp = 0; } else { if (np2oscfg.wintype) { - np2class_enablemenu(hWndMain, FALSE); - InvalidateRect(hWndMain, NULL, TRUE); + np2class_enablemenu(g_hWndMain, FALSE); + InvalidateRect(g_hWndMain, NULL, TRUE); } } mousemng_enable(MOUSEPROC_WINUI); @@ -714,6 +804,8 @@ void scrnmng_update(void) { POINT clip; RECT dst; + RECT *rect; + RECT *scrn; HRESULT r; if (scrnmng.palchanged) { @@ -726,12 +818,20 @@ void scrnmng_update(void) { scrnmng.allflash = 0; clearoutfullscreen(); } - r = ddraw.primsurf->Blt(&ddraw.scrn, ddraw.backsurf, &ddraw.rect, + if (GetWindowLongPtr(g_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(&ddraw.scrn, ddraw.backsurf, &ddraw.rect, + ddraw.primsurf->Blt(scrn, ddraw.backsurf, rect, DDBLT_WAIT, NULL); } } @@ -742,7 +842,7 @@ void scrnmng_update(void) { } clip.x = 0; clip.y = 0; - ClientToScreen(hWndMain, &clip); + ClientToScreen(g_hWndMain, &clip); dst.left = clip.x + ddraw.scrn.left; dst.top = clip.y + ddraw.scrn.top; dst.right = clip.x + ddraw.scrn.right; @@ -776,39 +876,62 @@ void scrnmng_setmultiple(int multiple) { #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_HEIGHT) && (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 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); - } - ddraw.clocksurf->Unlock(NULL); + if (!ddraw.clocksurf) { + return; + } + if (!dclock_disp()) { + return; + } + if (GetWindowLongPtr(g_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); } - if (ddraw.primsurf->BltFast(640 - DCLOCK_WIDTH - 4, + else if (scrnmng.bpp == 24) { + dclock_out24(dest.lpSurface, dest.lPitch); + } + else if (scrnmng.bpp == 32) { + 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, 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 @@ -836,8 +959,8 @@ void scrnmng_entersizing(void) { int cx; int cy; - GetWindowRect(hWndMain, &rectwindow); - GetClientRect(hWndMain, &rectclient); + GetWindowRect(g_hWndMain, &rectwindow); + GetClientRect(g_hWndMain, &rectclient); scrnsizing.bx = (np2oscfg.paddingx * 2) + (rectwindow.right - rectwindow.left) - (rectclient.right - rectclient.left); @@ -928,6 +1051,6 @@ void scrnmng_exitsizing(void) { sysmenu_setscrnmul(scrnsizing.mul); scrnmng_setmultiple(scrnsizing.mul); - InvalidateRect(hWndMain, NULL, TRUE); // ugh + InvalidateRect(g_hWndMain, NULL, TRUE); // ugh }