Diff for /np2/macosx/scrnmng.cpp between versions 1.1.1.1 and 1.5

version 1.1.1.1, 2003/10/16 17:59:38 version 1.5, 2003/11/13 15:52:04
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
 #include        "np2.h"  #include        "np2.h"
 #include        "scrnmng.h"  #include        "scrnmng.h"
   #include        "toolwin.h"
   
   
 typedef struct {  typedef struct {
           int                             width;
           int                             height;
         BOOL                    exist;          BOOL                    exist;
         WindowPtr               hWnd;          WindowPtr               hWnd;
         GWorldPtr               gw;          GWorldPtr               gw;
         PixMapHandle    pm;          PixMapHandle    pm;
         Rect                    rect;          Rect                    rect;
           GWorldPtr               gwp;
           GDHandle                hgd;
 } _QDRAW, *QDRAW;  } _QDRAW, *QDRAW;
   
   
 static  _QDRAW          qdraw;  static  _QDRAW          qdraw;
 static  GDHandle        hgd;  
 static  GWorldPtr       gwp;  
 static  SCRNSURF        scrnsurf;  static  SCRNSURF        scrnsurf;
   
 #ifdef NP2GCC  #define WINDOWTITLEOFFSET 22
 #define macosx_only  
   static void changeclientsize(int width, int height, BYTE mode) {
   
           QDRAW           qd;
       int                 scrnwidth, scrnheight;
       BYTE                opentoolwin = np2oscfg.toolwin;
   
           qd = &qdraw;
           if (!qd->exist) {
                   return;
           }
       if (!(mode & SCRNMODE_FULLSCREEN)) {
           if (opentoolwin) {
               toolwin_close();
           }
           if (!(mode & SCRNMODE_ROTATE)) {
               scrnwidth = width;
               scrnheight = height;
           }
           else {
               scrnwidth = height;
               scrnheight = width;
           }
           SizeWindow(qd->hWnd, scrnwidth, scrnheight, TRUE);
           SetRect(&qd->rect, 0, 0, scrnwidth, scrnheight);
           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  #endif
   
   //ディスプレイの色深度を返す(tk800)
   int     scrnmng_getbpp(void) {
       return(CGDisplayBitsPerPixel(kCGDirectMainDisplay));
   }
   
 void scrnmng_initialize(void) {  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;          QDRAW   qd;
   
         qd = &qdraw;          qd = &qdraw;
         SetRect(&qd->rect, 0, 0, 640, 480);  
 #if defined(macosx_only)     
 //GWorldの代わりに直接ウィンドウバッファを設定(tk800)  //GWorldの代わりに直接ウィンドウバッファを設定(tk800)
     GrafPtr             dstport;      GrafPtr             dstport;
     dstport = GetWindowPort(hWndMain);      dstport = GetWindowPort(hWndMain);
     if (dstport) {      if (dstport) {
         LockPortBits(dstport);//こうしないと描画位置がおかしくなる  
         qd->pm = GetPortPixMap(dstport);          qd->pm = GetPortPixMap(dstport);
         qd->exist = TRUE;          qd->exist = TRUE;
         qd->hWnd = hWndMain;          qd->hWnd = hWndMain;
           changeclientsize(qd->width, qd->height, mode);
         return(SUCCESS);          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 {          else {
                 (void)scrnmode;                  (void)mode;
                 return(FAILURE);                  return(FAILURE);
         }          }
 }  }
Line 62  void scrnmng_destroy(void) { Line 111  void scrnmng_destroy(void) {
         qd = &qdraw;          qd = &qdraw;
         if (qd->exist) {          if (qd->exist) {
                 qd->exist = FALSE;                  qd->exist = FALSE;
                 DisposeGWorld(qd->gw);  
         }          }
 #if defined(macosx_only)      
     UnlockPortBits(GetWindowPort(hWndMain));  
 #endif  
 }  }
   
 void scrnmng_setwidth(int posx, int width) {  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)posx;
         (void)width;  
 }  }
   
 void scrnmng_setextend(int extend) {  void scrnmng_setextend(int extend) {
Line 82  void scrnmng_setextend(int extend) { Line 133  void scrnmng_setextend(int extend) {
   
 void scrnmng_setheight(int posy, int height) {  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)posy;
         (void)height;  
 }  }
   
 const SCRNSURF *scrnmng_surflock(void) {  const SCRNSURF *scrnmng_surflock(void) {
   
         QDRAW           qd;          QDRAW           qd;
         GDHandle        hgd;  
         GWorldPtr       gwp;  
   
 #if 0 && defined(macosx_only)      
 //色深度が32ビットじゃないときはさようなら(tk800)  
     if (CGDisplayBitsPerPixel(kCGDirectMainDisplay)!=32) {  
         return(NULL);  
     }  
 #endif  
         qd = &qdraw;          qd = &qdraw;
         if (!qd->exist) {          if (!qd->exist) {
                 return(NULL);                  return(NULL);
         }          }
   
 #if defined(macosx_only)             scrnsurf.width = qd->width;
           scrnsurf.height = qd->height;
 //描画位置をウィンドウバーの下に設定(tk800)   //描画位置をウィンドウバーの下に設定(tk800) 
       LockPortBits(GetWindowPort(hWndMain));//こうしないと描画位置がおかしくなる(tk800)
         LockPixels(qd->pm);          LockPixels(qd->pm);
         scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm) + +640*4*22;      long        rowbyte = GetPixRowBytes(qd->pm);
 #else          scrnsurf.bpp = scrnmng_getbpp();
         GetGWorld(&gwp, &hgd);          if (!(scrnmode & SCRNMODE_ROTATE)) {
         LockPixels(qd->pm);                  scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm) + rowbyte*WINDOWTITLEOFFSET;
         SetGWorld(qd->gw, NULL);                  scrnsurf.xalign = scrnsurf.bpp >> 3;
                   scrnsurf.yalign = rowbyte;
         scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm);          }
 #endif          else if (!(scrnmode & SCRNMODE_ROTATEDIR)) {
         scrnsurf.xalign = 4;                  scrnsurf.ptr = (BYTE *)GetPixBaseAddr(qd->pm) + rowbyte*WINDOWTITLEOFFSET;
         scrnsurf.yalign = ((*qd->pm)->rowBytes) & 0x3fff;                  scrnsurf.ptr += (scrnsurf.width - 1) * rowbyte;
         scrnsurf.width = 640;                  scrnsurf.xalign = 0 - rowbyte;
         scrnsurf.height = 400;                  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);
       }
         scrnsurf.extend = 0;          scrnsurf.extend = 0;
         return(&scrnsurf);          return(&scrnsurf);
 }  }
Line 129  void scrnmng_surfunlock(const SCRNSURF * Line 187  void scrnmng_surfunlock(const SCRNSURF *
         if (surf) {          if (surf) {
                 qd = &qdraw;                  qd = &qdraw;
   
 #if defined(macosx_only)  
 //画面を更新するようWindow Serverに指示(tk800)  //画面を更新するようWindow Serverに指示(tk800)
         GrafPtr         dstport;          GrafPtr         dstport;
         dstport = GetWindowPort(hWndMain);          dstport = GetWindowPort(qd->hWnd);
         QDAddRectToDirtyRegion(dstport, &qd->rect);          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);                  UnlockPixels(qd->pm);
                 SetGWorld(gwp, hgd);          UnlockPortBits(dstport);
 #endif  
         }          }
 }  }
   

Removed from v.1.1.1.1  
changed lines
  Added in v.1.5


RetroPC.NET-CVS <cvs@retropc.net>