home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / art2 / src.lzh / SCREEN.C < prev    next >
C/C++ Source or Header  |  1995-06-18  |  2KB  |  107 lines

  1. /*
  2.     screen.c
  3.     
  4.     スクリーンビットマップオブジェクト実現部
  5.  
  6.     SCRBITMAP scrbitmap_new(int wid, int ht);
  7.     void scrbitmap_delete(SCRBITMAP bm);
  8.     void scrbitmap_draw(SCRBITMAP bm, int x,int y);
  9.  
  10. void scrbitmap_setpixel(SCRBITMAP bm, int x,int y, int r,int g,int b);
  11. void scrbitmap_clear(SCRBITMAP bm);
  12.  
  13. */
  14. #define MODULE_SCREEN
  15.  
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <winb.h>
  20. #include <te.h>
  21. #include <fntb.h>
  22. #include <gui.h>
  23. #include <fmcfrb.h>
  24. #include <file_dlg.h>
  25. #include <egb.h>
  26. #include <wgb.h>
  27. #include <msdos.cf>
  28.  
  29. #include "art.h"
  30. #include "wgbmac.h"
  31. #include "screen.h"
  32.  
  33. #include "pic.h"  // RGBコーディングマクロを使うため
  34.  
  35. SCRBITMAP scrbitmap_new(int wid, int ht)
  36. {
  37.     SCRBITMAP bm;
  38.     bm = TL_calloc(1,sizeof(SCRBITMAP_DATA));
  39.     if (bm == NULL)
  40.         return NULL;
  41.     bm->wid = wid;
  42.     bm->ht = ht;
  43.     bm->pixelsize = scrPixelSize;
  44.     if ((bm->buf = TL_calloc(1,bm->pixelsize*wid*ht/8)) == NULL)
  45.     {
  46.         TL_free(bm);
  47.         return NULL;
  48.     }
  49.     return bm;
  50. }
  51.  
  52. void scrbitmap_delete(SCRBITMAP bm)
  53. {
  54.     TL_free(bm->buf);
  55.     TL_free(bm);
  56. }
  57.  
  58. void scrbitmap_draw(SCRBITMAP bm, int x,int y)
  59. {
  60.     WGB_PUTBLOCK(guiEgbPtr, bm->buf, x,y, bm->wid, bm->ht);
  61. }
  62.  
  63. void scrbitmap_drawPart(SCRBITMAP bm, FRAME* frDraw, int ofsx,int ofsy)
  64. // frDraw:SCRBITMAP 内座標(x,y,wid,ht)
  65. // ofsx,ofsy:SCRBITMAPの原点の画面上での座標
  66. {
  67.     char *tempBuf;
  68.     tempBuf = TL_calloc(1,frDraw->WID*frDraw->HT*bm->pixelsize/8);
  69.     if (tempBuf == NULL)
  70.         return;
  71.     int i;
  72.     for (i=0; i<frDraw->HT; i++)
  73.     {
  74.         if (frDraw->Y + i >= bm->ht)
  75.             break;
  76.         char *destptr;
  77.         char *srcptr;
  78.         destptr = tempBuf + (frDraw->WID*i) * bm->pixelsize / 8;
  79.         srcptr = bm->buf+(bm->wid*(frDraw->Y+i)+frDraw->X) * bm->pixelsize / 8;
  80.         int size = _min(frDraw->WID, bm->wid-frDraw->X) * bm->pixelsize / 8;
  81.         memcpy(destptr, srcptr, size);
  82.     }
  83.     WGB_PUTBLOCK(guiEgbPtr, tempBuf,
  84.         ofsx+frDraw->X, ofsy+frDraw->Y, frDraw->WID,frDraw->HT);
  85.     TL_free(tempBuf);
  86. }
  87.  
  88. void scrbitmap_setpixel(SCRBITMAP bm, int x,int y, int r,int g,int b)
  89. {
  90.     if (bm==NULL || bm->buf == NULL)
  91.         return;
  92.     if (x < 0 || bm->wid <= x || y < 0 || bm->ht <= y)
  93.         return;
  94.     char *dp = bm->buf + BMOFFSET(bm,x,y);
  95.     if (bm->pixelsize == 16)
  96.         SETRGB31(WORD(dp), r>>3,g>>3,b>>3);
  97.     else
  98.         dp[0]=r,dp[1]=g,dp[2]=b;
  99. }
  100.  
  101. void scrbitmap_clear(SCRBITMAP bm)
  102. {
  103.     if (bm==NULL)
  104.         return;
  105.     memset(bm->buf,0xff,bm->wid*bm->ht*bm->pixelsize/8);
  106. }
  107.