rpi4-osdev/part12-wgt/wgt/wnpblock.c
2021-03-25 09:20:48 +00:00

121 lines
2.3 KiB
C

#include "../include/wgt.h"
#include "../include/mem.h"
// We should replace this with faster version (and xray needs to do the right thing - not sure memcpy is a good replacement)
#define fastcopy memcpy
#define putxray memcpy_xray
block wnewblock (short x, short y, short x2, short y2)
{
block ptr,orig;
int temp,width,height;
int dispofs;
int size;
int ctr;
width = abs (x - x2) + 1;
height = abs (y - y2) + 1;
size = 4 * ((int)width * (int)height) + 12;
if (x2 < x)
{
temp = x; x = x2; x2 = temp;
}
if (y2 < y)
{
temp = y; y = y2; y2 = temp;
}
ptr = malloc (size);
if (ptr == NULL)
return NULL;
orig = ptr;
*ptr = width; /* store the width */
ptr ++; /* and height */
*ptr = height;
ptr ++;
dispofs = y * WGT_SYS.xres + x;
temp = width;
if (temp > WGT_SYS.xres)
temp = WGT_SYS.xres;
for (ctr = y; ctr <= y2; ctr++)
{
memcpy (ptr, &abuf[dispofs], temp);
/* read off the screen */
ptr += width;
dispofs += WGT_SYS.xres;
/* into the new ptr */
}
return orig;
}
block wallocblock (short width, short height)
{
block ptr,orig;
int size;
size = 4 * ((int)width * (int)height) + 12;
ptr = malloc (size);
if (ptr == NULL)
return NULL;
orig = ptr;
*ptr = width; /* store the width */
ptr ++;
*ptr = height; /* and height */
ptr ++;
memset (ptr, 0, (size - 12) / 4);
return orig;
}
void wputblock (short x, short y, block src, short method)
{
short width, height, display, maxy;
short ctr;
block dst;
if (src == NULL)
return;
width = *src;
src ++;
height = *src;
src ++;
if (x + width > bx)
display = (bx + 1) - x;
else display = width;
if (x < tx)
{
src += tx - x;
display -= tx - x;
x = tx;
} /* clip x */
if (display <= 0)
return;
maxy = y + height - 1;
if (maxy > by)
maxy = by;
if (y < ty)
{
src += (ty - y)*width;
y = ty;
} /* clip y */
dst = &abuf[y * WGT_SYS.xres + x];
if (method == 0)
for (ctr = y; ctr <= maxy; ctr++)
{
fastcopy (dst, src, display);
src += width;
dst += WGT_SYS.xres;
}
else
for (ctr = y; ctr <= maxy; ctr++)
{
putxray (dst, src, display);
src += width;
dst += WGT_SYS.xres;
}
}