--- np2/macosx/scrnmng.cpp 2003/10/16 17:59:38 1.1 +++ np2/macosx/scrnmng.cpp 2004/02/25 17:16:31 1.7 @@ -1,56 +1,104 @@ #include "compiler.h" #include "np2.h" #include "scrnmng.h" +#include "toolwin.h" typedef struct { + int width; + int height; BOOL exist; WindowPtr hWnd; GWorldPtr gw; PixMapHandle pm; Rect rect; + GWorldPtr gwp; + GDHandle hgd; } _QDRAW, *QDRAW; - static _QDRAW qdraw; -static GDHandle hgd; -static GWorldPtr gwp; static SCRNSURF scrnsurf; -#ifdef NP2GCC -#define macosx_only +#define WINDOWTITLEOFFSET 22 + +static void changeclientsize(int width, int height, BYTE mode) { + + QDRAW qd; + BYTE opentoolwin = np2oscfg.toolwin; + + qd = &qdraw; + if (!qd->exist) { + return; + } + if (!(mode & SCRNMODE_FULLSCREEN)) { + if (opentoolwin) { + toolwin_close(); + } + if (!(mode & SCRNMODE_ROTATE)) { + qd->width = width; + qd->height = height; + } + else { + qd->width = height; + qd->height = width; + } + SizeWindow(qd->hWnd, qd->width, qd->height, TRUE); + SetRect(&qd->rect, 0, 0, qd->width, qd->height); + if (opentoolwin) { + toolwin_open(); + } + } + else { + GetWindowBounds(qd->hWnd, kWindowContentRgn, &qd->rect); + } +} + +#if defined(SUPPORT_16BPP) +UINT16 scrnmng_makepal16(RGB32 pal32) { +//win9xのをちょこっと改造(tk800) + RGB32 pal; + + pal.d = pal32.d & 0xF8F8F8; + return((UINT16)((pal.p.g << 2) + + (pal.p.r << 7) + (pal.p.b >> 3))); +} +#else +UINT16 scrnmng_makepal16(RGB32 pal32) { + return(0); +} #endif +//ディスプレイの色深度を返す(tk800) +int scrnmng_getbpp(void) { + return(CGDisplayBitsPerPixel(kCGDirectMainDisplay)); +} + void scrnmng_initialize(void) { + + QDRAW qd; + + qd = &qdraw; + qd->width = 640; + qd->height = 400; } -BOOL scrnmng_create(BYTE scrnmode) { +BOOL scrnmng_create(BYTE mode) { QDRAW qd; qd = &qdraw; - SetRect(&qd->rect, 0, 0, 640, 480); -#if defined(macosx_only) //GWorldの代わりに直接ウィンドウバッファを設定(tk800) GrafPtr dstport; dstport = GetWindowPort(hWndMain); if (dstport) { - LockPortBits(dstport);//こうしないと描画位置がおかしくなる qd->pm = GetPortPixMap(dstport); qd->exist = TRUE; qd->hWnd = hWndMain; + changeclientsize(qd->width, qd->height, mode); return(SUCCESS); } -#else - if (NewGWorld(&qd->gw, 32, &qd->rect, NULL, NULL, useTempMem) == noErr) { - qd->pm = GetGWorldPixMap(qd->gw); - qd->exist = TRUE; - qd->hWnd = hWndMain; - return(SUCCESS); - } -#endif else { - (void)scrnmode; + (void)mode; return(FAILURE); } } @@ -62,17 +110,19 @@ void scrnmng_destroy(void) { qd = &qdraw; if (qd->exist) { qd->exist = FALSE; - DisposeGWorld(qd->gw); } -#if defined(macosx_only) - UnlockPortBits(GetWindowPort(hWndMain)); -#endif } void scrnmng_setwidth(int posx, int width) { + QDRAW qd; + + qd = &qdraw; + if (qd->width != width) { + qd->width = width; + changeclientsize(width, qd->height, scrnmode); + } (void)posx; - (void)width; } void scrnmng_setextend(int extend) { @@ -82,42 +132,52 @@ void scrnmng_setextend(int extend) { void scrnmng_setheight(int posy, int height) { + QDRAW qd; + + qd = &qdraw; + if (qd->height != height) { + qd->height = height; + changeclientsize(qd->width, height, scrnmode); + } (void)posy; - (void)height; } const SCRNSURF *scrnmng_surflock(void) { QDRAW qd; - GDHandle hgd; - GWorldPtr gwp; -#if 0 && defined(macosx_only) -//色深度が32ビットじゃないときはさようなら(tk800) - if (CGDisplayBitsPerPixel(kCGDirectMainDisplay)!=32) { - return(NULL); - } -#endif qd = &qdraw; if (!qd->exist) { return(NULL); } -#if defined(macosx_only) + scrnsurf.width = qd->width; + scrnsurf.height = qd->height; //描画位置をウィンドウバーの下に設定(tk800) + LockPortBits(GetWindowPort(hWndMain));//こうしないと描画位置がおかしくなる(tk800) LockPixels(qd->pm); - scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm) + +640*4*22; -#else - GetGWorld(&gwp, &hgd); - LockPixels(qd->pm); - SetGWorld(qd->gw, NULL); - - scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm); -#endif - scrnsurf.xalign = 4; - scrnsurf.yalign = ((*qd->pm)->rowBytes) & 0x3fff; - scrnsurf.width = 640; - scrnsurf.height = 400; + long rowbyte = GetPixRowBytes(qd->pm); + scrnsurf.bpp = scrnmng_getbpp(); + if (!(scrnmode & SCRNMODE_ROTATE)) { + scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm) + rowbyte*WINDOWTITLEOFFSET; + scrnsurf.xalign = scrnsurf.bpp >> 3; + scrnsurf.yalign = rowbyte; + } + else if (!(scrnmode & SCRNMODE_ROTATEDIR)) { + scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm) + rowbyte*WINDOWTITLEOFFSET; + scrnsurf.ptr += (scrnsurf.width - 1) * rowbyte; + scrnsurf.xalign = 0 - rowbyte; + scrnsurf.yalign = scrnsurf.bpp >> 3; + } + else { + scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm) + rowbyte*WINDOWTITLEOFFSET; + scrnsurf.ptr += (scrnsurf.height - 1) * (scrnsurf.bpp >> 3); + scrnsurf.xalign = rowbyte; + scrnsurf.yalign = 0 - (scrnsurf.bpp >> 3); + } + if (scrnmode & SCRNMODE_FULLSCREEN) { + scrnsurf.ptr += ((CGDisplayPixelsWide(kCGDirectMainDisplay)-qd->width)/2+1)*(scrnsurf.bpp >> 3); + } scrnsurf.extend = 0; return(&scrnsurf); } @@ -129,44 +189,11 @@ void scrnmng_surfunlock(const SCRNSURF * if (surf) { qd = &qdraw; -#if defined(macosx_only) //画面を更新するようWindow Serverに指示(tk800) GrafPtr dstport; - dstport = GetWindowPort(hWndMain); + dstport = GetWindowPort(qd->hWnd); QDAddRectToDirtyRegion(dstport, &qd->rect); - QDFlushPortBuffer(dstport, NULL); - UnlockPixels(qd->pm); -#else - -#if TARGET_API_MAC_CARBON - { - GrafPtr thePort; - RgnHandle theVisibleRgn = NewRgn(); - - theVisibleRgn = NewRgn(); - if (!EmptyRgn(GetPortVisibleRegion(GetWindowPort(qd->hWnd), - theVisibleRgn))) { - LockPortBits(GetWindowPort(qd->hWnd)); - LockPixels(qd->pm); - GetPort(&thePort); - SetPortWindowPort(qd->hWnd); - CopyBits((BitMap*)(*qd->pm), - GetPortBitMapForCopyBits(GetWindowPort(qd->hWnd)), - &qd->rect, &qd->rect, srcCopy, theVisibleRgn); - SetPort(thePort); - UnlockPixels(qd->pm); - UnlockPortBits(GetWindowPort(qd->hWnd)); - } - DisposeRgn(theVisibleRgn); - } -#else - CopyBits((BitMap *)(*qd->pm), &(qd->hWnd->portBits), &qd->rect, - &qd->rect, srcCopy, qd->hWnd->visRgn); -#endif - UnlockPixels(qd->pm); - SetGWorld(gwp, hgd); -#endif + UnlockPortBits(dstport); } } -