| version 1.1.1.1, 2003/10/16 17:58:47 | version 1.26, 2007/11/11 12:46:07 | 
| Line 1 | Line 1 | 
 | #include        "compiler.h" | #include        "compiler.h" | 
 | #include        <ddraw.h> | #include        <ddraw.h> | 
 |  | #ifndef __GNUC__ | 
 | #include        <winnls32.h> | #include        <winnls32.h> | 
 |  | #endif | 
 | #include        "resource.h" | #include        "resource.h" | 
 | #include        "np2.h" | #include        "np2.h" | 
 |  | #include        "winloc.h" | 
 | #include        "mousemng.h" | #include        "mousemng.h" | 
 | #include        "scrnmng.h" | #include        "scrnmng.h" | 
 | #include        "sysmng.h" | #include        "sysmng.h" | 
 |  | #include        "menu.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" | #include        "dclock.h" | 
| #include        "menu.h" | #endif | 
|  |  | 
|  | extern WINLOCEX np2_winlocexallwin(HWND base); | 
 |  |  | 
 |  |  | 
 | typedef struct { | typedef struct { | 
| Line 18  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; | 
| 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 48  static SCRNSTAT scrnstat; | Line 63  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 119  static void renewalclientsize(void) { | Line 146  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; | 
 | if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) { | if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) { | 
| if (np2oscfg.paddingx) { | if ((np2oscfg.paddingx) && (multiple == 8)) { | 
 | extend = min(scrnstat.extend, ddraw.extend); | extend = min(scrnstat.extend, ddraw.extend); | 
 | } | } | 
 | scrnwidth = (width * multiple) >> 3; | scrnwidth = (width * multiple) >> 3; | 
| Line 138  static void renewalclientsize(void) { | Line 221  static void renewalclientsize(void) { | 
 | ddraw.scrn.top = np2oscfg.paddingy; | ddraw.scrn.top = np2oscfg.paddingy; | 
 | } | } | 
 | else { | else { | 
| if (np2oscfg.paddingy) { | if ((np2oscfg.paddingy) && (multiple == 8)) { | 
 | extend = min(scrnstat.extend, ddraw.extend); | extend = min(scrnstat.extend, ddraw.extend); | 
 | } | } | 
 | scrnwidth = (height * multiple) >> 3; | scrnwidth = (height * multiple) >> 3; | 
| Line 150  static void renewalclientsize(void) { | Line 233  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 204  static void clearoutofrect(const RECT *t | Line 294  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 216  static void clearoutscreen(void) { | Line 314  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 225  static void paletteinit(void) { | Line 340  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 = dclock_pal[i].p.b; | ddraw.pal[i+START_PALORG].peBlue = dclockpal.pal32[i].p.b; | 
| ddraw.pal[i+START_PALORG].peRed = dclock_pal[i].p.r; | ddraw.pal[i+START_PALORG].peRed = dclockpal.pal32[i].p.r; | 
| ddraw.pal[i+START_PALORG].peGreen = dclock_pal[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 258  static void paletteset(void) { | Line 375  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; | 
| while((rmask & 0xffffff0) && (sft < 32)) { | while((rmask & 0xffffff00) && (sft < 32)) { | 
 | 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; | 
| while((gmask & 0xffffff0) && (sft < 32)) { | while((gmask & 0xffffff00) && (sft < 32)) { | 
 | 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 294  void scrnmng_initialize(void) { | Line 411  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 305  BOOL scrnmng_create(BYTE scrnmode) { | Line 422  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 339  BOOL scrnmng_create(BYTE scrnmode) { | Line 468  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 370  BOOL scrnmng_create(BYTE scrnmode) { | Line 524  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 405  BOOL scrnmng_create(BYTE scrnmode) { | Line 565  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 419  BOOL scrnmng_create(BYTE scrnmode) { | Line 579  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 445  BOOL scrnmng_create(BYTE scrnmode) { | Line 606  BOOL scrnmng_create(BYTE scrnmode) { | 
 | else { | else { | 
 | goto scre_err; | goto scre_err; | 
 | } | } | 
 |  | 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 462  scre_err: | Line 625  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 496  void scrnmng_querypalette(void) { | Line 671  void scrnmng_querypalette(void) { | 
 | } | } | 
 | } | } | 
 |  |  | 
| UINT16 scrnmng_makepal16(RGB32 pal32) { | RGB16 scrnmng_makepal16(RGB32 pal32) { | 
 |  |  | 
 | RGB32   pal; | RGB32   pal; | 
 |  |  | 
 | pal.d = pal32.d & ddraw.pal16mask.d; | 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))); | (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); | 
 | } | } | 
| WINNLSEnableIME(hWndMain, TRUE); | #ifndef __GNUC__ | 
|  | WINNLSEnableIME(g_hWndMain, TRUE); | 
|  | #endif | 
 | } | } | 
 | } | } | 
 |  |  | 
 | void scrnmng_clearwinui(void) { | void scrnmng_clearwinui(void) { | 
 |  |  | 
 | if ((ddraw.cliping > 0) && (!(--ddraw.cliping))) { | if ((ddraw.cliping > 0) && (!(--ddraw.cliping))) { | 
| WINNLSEnableIME(hWndMain, FALSE); | #ifndef __GNUC__ | 
|  | WINNLSEnableIME(g_hWndMain, FALSE); | 
|  | #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; | 
 |  | } | 
 |  | else { | 
 |  | if (np2oscfg.wintype) { | 
 |  | np2class_enablemenu(g_hWndMain, FALSE); | 
 |  | InvalidateRect(g_hWndMain, NULL, TRUE); | 
 |  | } | 
 | } | } | 
| mouse_running(MOUSE_CONT); | 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 587  void scrnmng_update(void) { | Line 804  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 598  void scrnmng_update(void) { | Line 818  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 611  void scrnmng_update(void) { | Line 842  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 628  void scrnmng_update(void) { | Line 862  void scrnmng_update(void) { | 
 |  |  | 
 | // ---- | // ---- | 
 |  |  | 
| static const RECT rectclk = {0, 0, DCLOCK_X, DCLOCK_Y}; | void scrnmng_setmultiple(int multiple) { | 
|  |  | 
|  | if (scrnstat.multiple != multiple) { | 
|  | scrnstat.multiple = multiple; | 
|  | renewalclientsize(TRUE); | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | // ---- | 
|  |  | 
|  | #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 | 
 | } | } | 
 |  |  |