Added some block functions - more work to do here

This commit is contained in:
Adam Greenwood-Byrne 2021-03-09 22:37:23 +00:00
parent 762c847d02
commit e49504d577
4 changed files with 99 additions and 0 deletions

View file

@ -16,6 +16,15 @@ void *memset(void *dest, int val, unsigned len)
return dest;
}
void *memcpy(void *dest, const void *src, unsigned len)
{
char *d = dest;
const char *s = src;
while (len--)
*d++ = *s++;
return dest;
}
int abs(int i)
{
return i < 0 ? -i : i;

View file

@ -47,6 +47,7 @@ extern short bx,by,tx,ty;
// ######## HELPER FUNCTIONS ########
void *memset(void *dest, int val, unsigned len);
void *memcpy(void *dest, const void *src, unsigned len);
int abs(int i);
int strlen(const char *str);
@ -80,3 +81,8 @@ void wtextbackground (unsigned int col);
void wtexttransparent (short transparent);
void wtextgrid (short onoff);
void wregionfill (short x, short y);
void wfreeblock (block ptr);
short wgetblockwidth (block ptr);
short wgetblockheight (block ptr);
block wnewblock (short x, short y, short x2, short y2);
block wallocblock (short width, short height);

20
part12-wgt/wmiscb.c Normal file
View file

@ -0,0 +1,20 @@
#include "wgt.h"
#include "include/mem.h"
extern short bx,by,tx,ty;
void wfreeblock (block ptr)
{
free (ptr);
}
short wgetblockwidth (block ptr)
{
return *(short *)ptr; /* Width is first 2 bytes of data */
}
short wgetblockheight (block ptr)
{
ptr += 2; /* Skip width */
return *(short *)ptr; /* Height is second 2 bytes of data */
}

64
part12-wgt/wnpblock.c Normal file
View file

@ -0,0 +1,64 @@
#include "wgt.h"
#include "include/mem.h"
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 = (int)width * (int)height + 5;
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;
*(short *)ptr = width; /* store the width */
ptr += 2; /* and height */
*(short *)ptr = height;
ptr += 2;
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 = (int)width * (int)height + 5;
ptr = malloc (size);
if (ptr == NULL)
return NULL;
orig = ptr;
*(short *)ptr = width; /* store the width */
ptr += 2;
*(short *)ptr = height; /* and height */
ptr += 2;
memset (ptr, 0, size - 4);
return orig;
}