|
|
| version 1.21, 2005/05/14 19:38:59 | version 1.23, 2007/01/08 01:16:59 |
|---|---|
| Line 9 | Line 9 |
| #include "mousemng.h" | #include "mousemng.h" |
| #include "scrnmng.h" | #include "scrnmng.h" |
| #include "sysmng.h" | #include "sysmng.h" |
| #include "dclock.h" | |
| #include "menu.h" | #include "menu.h" |
| #include "np2class.h" | #include "np2class.h" |
| #include "pccore.h" | #include "pccore.h" |
| #include "scrndraw.h" | #include "scrndraw.h" |
| #include "palettes.h" | #include "palettes.h" |
| #if defined(SUPPORT_DCLOCK) | |
| #include "dclock.h" | |
| #endif | |
| extern WINLOCEX np2_winlocexallwin(HWND base); | extern WINLOCEX np2_winlocexallwin(HWND base); |
| Line 25 typedef struct { | Line 27 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; |
| UINT scrnmode; | UINT scrnmode; |
| Line 41 typedef struct { | Line 45 typedef struct { |
| int menusize; | int menusize; |
| RECT scrn; | RECT scrn; |
| RECT rect; | RECT rect; |
| RECT scrnclip; | |
| RECT rectclip; | |
| PALETTEENTRY pal[256]; | PALETTEENTRY pal[256]; |
| } DDRAW; | } DDRAW; |
| Line 125 static void renewalclientsize(BOOL winlo | Line 131 static void renewalclientsize(BOOL winlo |
| int width; | int width; |
| int height; | int height; |
| int extend; | int extend; |
| UINT fscrnmod; | |
| int multiple; | int multiple; |
| int scrnwidth; | int scrnwidth; |
| int scrnheight; | int scrnheight; |
| int tmpcy; | |
| WINLOCEX wlex; | WINLOCEX wlex; |
| width = min(scrnstat.width, ddraw.width); | width = min(scrnstat.width, ddraw.width); |
| Line 138 static void renewalclientsize(BOOL winlo | Line 146 static void renewalclientsize(BOOL winlo |
| 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 169 static void renewalclientsize(BOOL winlo | Line 233 static void renewalclientsize(BOOL winlo |
| } | } |
| ddraw.scrn.right = np2oscfg.paddingx + scrnwidth; | ddraw.scrn.right = np2oscfg.paddingx + scrnwidth; |
| ddraw.scrn.bottom = np2oscfg.paddingy + scrnheight; | ddraw.scrn.bottom = np2oscfg.paddingy + scrnheight; |
| wlex = NULL; | wlex = NULL; |
| if (winloc) { | if (winloc) { |
| wlex = np2_winlocexallwin(hWndMain); | wlex = np2_winlocexallwin(hWndMain); |
| Line 250 static void clearoutscreen(void) { | Line 315 static void clearoutscreen(void) { |
| static void clearoutfullscreen(void) { | static void clearoutfullscreen(void) { |
| RECT base; | RECT base; |
| const RECT *scrn; | |
| base.left = 0; | base.left = 0; |
| base.top = (GetWindowLong(hWndMain, NP2GWL_HMENU))?0:ddraw.menusize; | base.top = 0; |
| base.right = ddraw.width; // (+ ddraw.extend) | base.right = ddraw.width; |
| base.bottom = ddraw.height; | base.bottom = ddraw.height; |
| clearoutofrect(&ddraw.scrn, &base); | if (GetWindowLong(hWndMain, NP2GWL_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 267 static void paletteinit(void) { | Line 343 static void paletteinit(void) { |
| hdc = GetDC(hWndMain); | hdc = GetDC(hWndMain); |
| GetSystemPaletteEntries(hdc, 0, 256, ddraw.pal); | GetSystemPaletteEntries(hdc, 0, 256, ddraw.pal); |
| ReleaseDC(hWndMain, hdc); | ReleaseDC(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 344 BRESULT scrnmng_create(UINT8 scrnmode) { | Line 422 BRESULT scrnmng_create(UINT8 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(hWndMain, GWL_STYLE); |
| Line 387 BRESULT scrnmng_create(UINT8 scrnmode) { | Line 468 BRESULT scrnmng_create(UINT8 scrnmode) { |
| ddraw.ddraw2 = ddraw2; | ddraw.ddraw2 = ddraw2; |
| if (scrnmode & SCRNMODE_FULLSCREEN) { | if (scrnmode & SCRNMODE_FULLSCREEN) { |
| #if defined(SUPPORT_DCLOCK) | |
| dclock_init(); | dclock_init(); |
| #endif | |
| ddraw2->SetCooperativeLevel(hWndMain, | ddraw2->SetCooperativeLevel(hWndMain, |
| DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); |
| height = (np2oscfg.force400)?400:480; | width = np2oscfg.fscrn_cx; |
| height = np2oscfg.fscrn_cy; | |
| bitcolor = np2oscfg.fscrnbpp; | 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 (bitcolor == 0) { |
| #if !defined(SUPPORT_PC9821) | #if !defined(SUPPORT_PC9821) |
| bitcolor = (scrnmode & SCRNMODE_HIGHCOLOR)?16:8; | bitcolor = (scrnmode & SCRNMODE_HIGHCOLOR)?16:8; |
| Line 399 BRESULT scrnmng_create(UINT8 scrnmode) { | Line 498 BRESULT scrnmng_create(UINT8 scrnmode) { |
| bitcolor = 16; | bitcolor = 16; |
| #endif | #endif |
| } | } |
| if (ddraw2->SetDisplayMode(640, height, bitcolor, 0, 0) != DD_OK) { | 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); |
| Line 425 BRESULT scrnmng_create(UINT8 scrnmode) { | Line 524 BRESULT scrnmng_create(UINT8 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; |
| } | } |
| Line 442 BRESULT scrnmng_create(UINT8 scrnmode) { | Line 541 BRESULT scrnmng_create(UINT8 scrnmode) { |
| else { | else { |
| goto scre_err; | goto scre_err; |
| } | } |
| #if defined(SUPPORT_DCLOCK) | |
| dclock_palset(bitcolor); | 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; |
| Line 452 BRESULT scrnmng_create(UINT8 scrnmode) { | Line 551 BRESULT scrnmng_create(UINT8 scrnmode) { |
| ddsd.dwHeight = DCLOCK_HEIGHT; | 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(hWndMain, DDSCL_NORMAL); |
| Line 479 BRESULT scrnmng_create(UINT8 scrnmode) { | Line 579 BRESULT scrnmng_create(UINT8 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 510 BRESULT scrnmng_create(UINT8 scrnmode) { | Line 611 BRESULT scrnmng_create(UINT8 scrnmode) { |
| scrnmng.bpp = (UINT8)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(FALSE); | renewalclientsize(FALSE); |
| Line 527 void scrnmng_destroy(void) { | Line 628 void scrnmng_destroy(void) { |
| if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { | if (scrnmng.flag & SCRNFLAG_FULLSCREEN) { |
| np2class_enablemenu(hWndMain, (!np2oscfg.wintype)); | np2class_enablemenu(hWndMain, (!np2oscfg.wintype)); |
| } | } |
| #if defined(SUPPORT_DCLOCK) | |
| if (ddraw.clocksurf) { | if (ddraw.clocksurf) { |
| ddraw.clocksurf->Release(); | ddraw.clocksurf->Release(); |
| ddraw.clocksurf = NULL; | ddraw.clocksurf = NULL; |
| } | } |
| #endif | |
| if (ddraw.backsurf) { | if (ddraw.backsurf) { |
| ddraw.backsurf->Release(); | ddraw.backsurf->Release(); |
| ddraw.backsurf = NULL; | ddraw.backsurf = NULL; |
| Line 701 void scrnmng_update(void) { | Line 804 void scrnmng_update(void) { |
| POINT clip; | POINT clip; |
| RECT dst; | RECT dst; |
| RECT *rect; | |
| RECT *scrn; | |
| HRESULT r; | HRESULT r; |
| if (scrnmng.palchanged) { | if (scrnmng.palchanged) { |
| Line 713 void scrnmng_update(void) { | Line 818 void scrnmng_update(void) { |
| scrnmng.allflash = 0; | scrnmng.allflash = 0; |
| clearoutfullscreen(); | clearoutfullscreen(); |
| } | } |
| r = ddraw.primsurf->Blt(&ddraw.scrn, ddraw.backsurf, &ddraw.rect, | if (GetWindowLong(hWndMain, NP2GWL_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); | DDBLT_WAIT, NULL); |
| if (r == DDERR_SURFACELOST) { | if (r == DDERR_SURFACELOST) { |
| ddraw.backsurf->Restore(); | ddraw.backsurf->Restore(); |
| ddraw.primsurf->Restore(); | ddraw.primsurf->Restore(); |
| ddraw.primsurf->Blt(&ddraw.scrn, ddraw.backsurf, &ddraw.rect, | ddraw.primsurf->Blt(scrn, ddraw.backsurf, rect, |
| DDBLT_WAIT, NULL); | DDBLT_WAIT, NULL); |
| } | } |
| } | } |
| Line 757 void scrnmng_setmultiple(int multiple) { | Line 870 void scrnmng_setmultiple(int multiple) { |
| } | } |
| } | } |
| // ---- | |
| #if defined(SUPPORT_DCLOCK) | |
| static const RECT rectclk = {0, 0, DCLOCK_WIDTH, DCLOCK_HEIGHT}; | 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_HEIGHT) && (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 (GetWindowLong(hWndMain, NP2GWL_HMENU)) { |
| dclock_out8(dest.lpSurface, dest.lPitch); | scrn = &ddraw.scrn; |
| } | } |
| else if (scrnmng.bpp == 16) { | else { |
| dclock_out16(dest.lpSurface, dest.lPitch); | scrn = &ddraw.scrnclip; |
| } | } |
| else if (scrnmng.bpp == 24) { | if ((scrn->bottom + DCLOCK_HEIGHT) > ddraw.height) { |
| dclock_out24(dest.lpSurface, dest.lPitch); | return; |
| } | } |
| else if (scrnmng.bpp == 32) { | dclock_make(); |
| dclock_out32(dest.lpSurface, dest.lPitch); | ZeroMemory(&dest, sizeof(dest)); |
| } | dest.dwSize = sizeof(dest); |
| ddraw.clocksurf->Unlock(NULL); | if (ddraw.clocksurf->Lock(NULL, &dest, DDLOCK_WAIT, NULL) == DD_OK) { |
| if (scrnmng.bpp == 8) { | |
| dclock_out8(dest.lpSurface, dest.lPitch); | |
| } | } |
| if (ddraw.primsurf->BltFast(640 - DCLOCK_WIDTH - 4, | 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.primsurf->BltFast(ddraw.width - DCLOCK_WIDTH - 4, | |
| ddraw.height - DCLOCK_HEIGHT, | 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 | |
| // ---- | // ---- |