shithub: libnate

ref: 855a60a7698acb993b68f8e64448bd2fc3ff86da
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 Rectangle
image_calcrect(Nelem *nelem, Image*, Rectangle r)
{
	Point p;
	NImage *i = (NImage*)nelem;
	GUARD(i);
	
	if (!i->autosize) {
		i->slot.r = r;
		return i->slot.r;
	}
	
	p = ZP;
	if (i->image)
		p = Pt(Dx(i->image->r), Dy(i->image->r));
	r.max = addpt(r.min, p);
	i->slot.r = r;
	return i->slot.r;
}

static Point
image_desiredsize(Nelem *nelem, Image*)
{
	NImage *i = (NImage*)nelem;
	GUARD(i);
	
	if (!i->image)
		return ZP;
	return subpt(i->image->r.max, i->image->r.min);
}

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

static Nelemfunctions Nimagefunctions = {
	.calcrect = image_calcrect,
	.desiredsize = image_desiredsize,
	.draw = image_draw,
};

DEF_ACCESSOR_OneParam(NImage, image_image, Image*, image);
DEF_ACCESSOR_OneParam(NImage, image_offset, Point, offset);
DEF_ACCESSOR_OneParam(NImage, image_autosize, int, autosize);

NImage*
New_Image(char *name)
{
	NImage *i = MakeNelem(NImage, NImage_Type, &Nimagefunctions, name, 0);
	
	i->image = nil;
	i->offset = ZP;
	
	i->Image = image_image;
	i->Offset = image_offset;
	i->AutoSize = image_autosize;
	nc_push(i);
	return i;
}