/* Copyright (C) 1996-1997 Aleksey Volynskov
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License ONLY.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
/*
#include
#include
#include
//#include "..\averr.h"
#include "vga.h"
#include "glob.h"
#define MAXRECT 500
typedef struct{short x,w,y,h;}rect;
static rect *rt,*rp;
static redraw_f *fn;
static short sl,st,sr,sb;
void *RD_init(short x,short w,short y,short h) {
rect *p;
if(!(p=malloc((MAXRECT*2+1)*sizeof(rect))))
{error(0,0,ENOMEM,NULL,NULL);return NULL;}//{error(EZ_VGALIB,ET_STD,ENOMEM,NULL,NULL);return NULL;}
p->x=x;p->w=x+w-1;p->y=y;p->h=y+h-1;
memset(p+1,0,MAXRECT*2*sizeof(rect));
return p;
}
void RD_start(void *p,redraw_f *f) {
rt=p;fn=f;
sl=rt->x;sr=rt->w;
st=rt->y;sb=rt->h;
++rt;
rp=rt;
}
static void add(short x,short r,short y,short b) {
int i;
short rx,rr,ry,rb;
for(i=0;i(rr=(rx=rp[i].x)+rp[i].w-1)) continue;
if(r(rb=(ry=rp[i].y)+rp[i].h-1)) continue;
if(brr) add(rr+1,r,y,b);
if(yrb) add(max(rx,x),min(rr,r),rb+1,b);
return;
}
for(i=0;isr) return;
if(x+w<=sl) return;
if(y>sb) return;
if(y+h<=st) return;
w+=x-1;h+=y-1;
if(xsr) w=sr;
if(h>sb) h=sb;
add(x,w,y,h);
}
void RD_spr(short x,short y,vgaimg *v) {
RD_rect(x-v->sx,v->w,y-v->sy,v->h);
}
void RD_spr2(short x,short y,vgaimg *v) {
RD_rect(x-v->w+v->sx,v->w,y-v->sy,v->h);
}
void RD_end(void) {
int i;
V_setscr(scrbuf);
rp=rt+MAXRECT;
for(i=0;i