shithub: libnate

ref: a0b15f88e6274b4892061a7dfe790d85eb211078
dir: /n_image.c/

View raw version
#include <u.h>
#include <libc.h>
#include <draw.h>
#include <event.h>
#include "nate_construct.h"
#include "n_image.h"

#define N_TYPE NImage_Type
char *NImage_Type = "NImage";

static Point
image_calcsize(Nelem *nelem, Image*)
{
	NImage *i = (NImage*)nelem;
	GUARD(i);
	
	if (i->image)
		return Pt(Dx(i->image->r), Dy(i->image->r));
	return ZP;
}

static void
image_draw(Nelem *nelem, Image *img, Rectangle r)
{
	NImage *i = (NImage*)nelem;
	GUARD(i);
	
	if (!i->image) {
		draw(img, r, display->white, nil, ZP);
		return;
	}
	draw(img, r, i->image, nil, i->offset);
}

static Nelem*
image_checkhit(Nelem *nelem, Image *screen, Rectangle r, Mouse m)
{
	GUARD(nelem);
	return nil;
}

static int
image_hit(Nelem *nelem, Mouse m)
{
	GUARD(nelem);
	return -1;
}

static void
image_free(Nelem *nelem)
{
	GUARD(nelem);
	if (nisroot(nelem))
		return;
	free(nelem);
}

static Nlist*
image_getchildren(Nelem*)
{
	return nil;
}

static Nelemfunctions Nimagefunctions = {
	.calcsize = image_calcsize,
	.draw = image_draw,
	.checkhit = image_checkhit,
	.hit = image_hit,
	.free = image_free,
	.getchildren = image_getchildren,
};

static NImage*
setimage(Image *img)
{
	NImage *i = (NImage*)nc_get();
	GUARD(i);
	i->image = img;
	return i;
}

static NImage*
setimageoffset(Point p)
{
	NImage *i = (NImage*)nc_get();
	GUARD(i);
	i->offset = p;
	return i;
}

NImage*
New_Image()
{
	NImage *i = malloc(sizeof(NImage));
	assert(i);
	i->type = NImage_Type;
	i->funcs = &Nimagefunctions;
	
	i->image = nil;
	i->offset = ZP;
	
	i->Image = setimage;
	i->ImageOffset = setimageoffset;
	nc_push(i);
	return i;
}