#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;
	}
}
