home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix Heaven Sunny 2
/
APPARE2.BIN
/
oh_towns
/
art2
/
src.lzh
/
AREA.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-17
|
3KB
|
128 lines
#if 0
AREA area_new(int x,int y,int wid,int ht);
void area_delete(AREA area);
void area_clear(AREA area);
void area_hline(AREA area,int x1,int x2,int y);
int area_getSect(AREA area,int x,int y,int *sx1,int *sx2);
// (x,y)から右方向に調べて、ON ビットの連続領域を得る(sx1,sx2)
void area_polygon(AREA area,POINT *points,int nPoint);
void area_forEachSect(AREA area,int y,void hline(int x1,int x2,int y)!);
#endif
#define MODULE_AREA
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <egb.h>
#include <wgb.h>
#include <msdos.cf>
#include "art.h"
#include "guisub.h"
#include "wgbmac.H"
#include "alert.h"
#include "subgrp.h"
#include "imagewin.h"
#include "imgwin.h"
#include "desktop.h"
#include "area.h"
AREA area_new(int x,int y,int wid,int ht)
{
AREA area;
if ((area = TL_calloc(1,sizeof(AREA_DATA))) == NULL)
return NULL;
if ((area->buf = TL_calloc(1,((wid+7)/8)*ht)) == NULL)
{ TL_free(area); return NULL; }
area->x = x;
area->y = y;
area->wid = wid;
area->ht = ht;
memset(area->buf, 0, ((area->wid+7)/8) * area->ht);
return area;
}
void area_delete(AREA area)
{
TL_free(area->buf);
TL_free(area);
}
void area_clear(AREA area)
{
memset(area->buf, 0, ((area->wid+7)/8) * area->ht);
}
static char bitmask[] = {128,64,32,16,8,4,2,1};
static BOOL area_chkbit(AREA area,int x,int y)
{
if (x < area->x || area->x + area->wid <= x ||
y < area->y || area->y + area->ht <= y)
return FALSE;
char *p = area->buf + ((area->wid+7)/8) * (y-area->y) + ((x-area->x)>>3);
if (*p & bitmask[(x-area->x)&7])
return TRUE;
else
return FALSE;
}
static void area_setbit(AREA area,int x,int y)
{
if (x < area->x || area->x + area->wid <= x ||
y < area->y || area->y + area->ht <= y)
return;
char *p = area->buf + ((area->wid+7)/8) * (y-area->y) + (x-area->x)/8;
*p |= bitmask[(x-area->x)&7];
}
void area_hline(AREA area,int x1,int x2,int y)
{
for (int i=x1; i<=x2; i++)
area_setbit(area,i,y);
}
int area_getSect(AREA area,int x,int y,int *sx1,int *sx2)
// (x,y)から右方向に調べて、ON ビットの連続領域を得る(sx1,sx2)
{
while (x < area->x+area->wid && !area_chkbit(area,x,y))
x++;
if (x >= area->x + area->wid)
return -1;
*sx1 = x;
while (x+1 < area->x + area->wid && area_chkbit(area,x+1,y))
x++;
*sx2 = x;
return NOERR;
}
void area_polygon(AREA area,POINT *points,int nPoint)
{
void hline(int x1,int x2,int y)
{
area_hline(area,x1,x2,y);
}
do_polygon(points,nPoint,hline);
}
void area_forEachSect(AREA area,int y,void hline(int x1,int x2,int y)!)
{
int tx,sx1,sx2;
tx = area->x;
for (;;)
{
if (area_getSect(area,tx,y,&sx1,&sx2) != NOERR)
break;
hline(sx1,sx2,y);
tx = sx2+1;
}
}