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

  1. #if 0
  2.  
  3. AREA area_new(int x,int y,int wid,int ht);
  4. void area_delete(AREA area);
  5. void area_clear(AREA area);
  6. void area_hline(AREA area,int x1,int x2,int y);
  7. int area_getSect(AREA area,int x,int y,int *sx1,int *sx2);
  8.     // (x,y)から右方向に調べて、ON ビットの連続領域を得る(sx1,sx2)
  9. void area_polygon(AREA area,POINT *points,int nPoint);
  10. void area_forEachSect(AREA area,int y,void hline(int x1,int x2,int y)!);
  11.  
  12. #endif
  13.  
  14. #define    MODULE_AREA
  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 <egb.h>
  24. #include <wgb.h>
  25. #include <msdos.cf>
  26. #include "art.h"
  27. #include "guisub.h"
  28. #include "wgbmac.H"
  29. #include "alert.h"
  30. #include "subgrp.h"
  31.  
  32. #include "imagewin.h"
  33. #include "imgwin.h"
  34. #include "desktop.h"
  35.  
  36. #include "area.h"
  37.  
  38. AREA area_new(int x,int y,int wid,int ht)
  39. {
  40.     AREA area;
  41.     if ((area = TL_calloc(1,sizeof(AREA_DATA))) == NULL)
  42.         return NULL;
  43.     if ((area->buf = TL_calloc(1,((wid+7)/8)*ht)) == NULL)
  44.         { TL_free(area);  return NULL; }
  45.     area->x = x;
  46.     area->y = y;
  47.     area->wid = wid;
  48.     area->ht = ht;
  49.     memset(area->buf, 0, ((area->wid+7)/8) * area->ht);
  50.     return area;
  51. }
  52.  
  53. void area_delete(AREA area)
  54. {
  55.     TL_free(area->buf);
  56.     TL_free(area);
  57. }
  58.  
  59. void area_clear(AREA area)
  60. {
  61.     memset(area->buf, 0, ((area->wid+7)/8) * area->ht);
  62. }
  63.  
  64. static char bitmask[] = {128,64,32,16,8,4,2,1};
  65.  
  66. static BOOL area_chkbit(AREA area,int x,int y)
  67. {
  68.     if (x < area->x || area->x + area->wid <= x ||
  69.         y < area->y || area->y + area->ht <= y)
  70.         return FALSE;
  71.     char *p = area->buf + ((area->wid+7)/8) * (y-area->y) + ((x-area->x)>>3);
  72.     if (*p & bitmask[(x-area->x)&7])
  73.         return TRUE;
  74.     else
  75.         return FALSE;
  76. }
  77.  
  78. static void area_setbit(AREA area,int x,int y)
  79. {
  80.     if (x < area->x || area->x + area->wid <= x ||
  81.         y < area->y || area->y + area->ht <= y)
  82.         return;
  83.     char *p = area->buf + ((area->wid+7)/8) * (y-area->y) + (x-area->x)/8;
  84.     *p |= bitmask[(x-area->x)&7];
  85. }
  86.  
  87. void area_hline(AREA area,int x1,int x2,int y)
  88. {
  89.     for (int i=x1; i<=x2; i++)
  90.         area_setbit(area,i,y);
  91. }
  92.  
  93. int area_getSect(AREA area,int x,int y,int *sx1,int *sx2)
  94.     // (x,y)から右方向に調べて、ON ビットの連続領域を得る(sx1,sx2)
  95. {
  96.     while (x < area->x+area->wid && !area_chkbit(area,x,y))
  97.         x++;
  98.     if (x >= area->x + area->wid)
  99.         return -1;
  100.     *sx1 = x;
  101.     while (x+1 < area->x + area->wid && area_chkbit(area,x+1,y))
  102.         x++;
  103.     *sx2 = x;
  104.     return NOERR;
  105. }
  106.  
  107. void area_polygon(AREA area,POINT *points,int nPoint)
  108. {
  109.     void hline(int x1,int x2,int y)
  110.     {
  111.         area_hline(area,x1,x2,y);
  112.     }
  113.     do_polygon(points,nPoint,hline);
  114. }
  115.  
  116. void area_forEachSect(AREA area,int y,void hline(int x1,int x2,int y)!)
  117. {
  118.     int tx,sx1,sx2;
  119.     tx = area->x;
  120.     for (;;)
  121.     {
  122.         if (area_getSect(area,tx,y,&sx1,&sx2) != NOERR)
  123.             break;
  124.         hline(sx1,sx2,y);
  125.         tx = sx2+1;
  126.     }
  127. }
  128.