shithub: libnate

ref: 08aef1095811c8f436a469208b088002e8f4ed21
dir: /n_image.c/

View raw version
#include <u.h>
#include <libc.h>
#include <draw.h>
#include <event.h>
#include "nate.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,
};

#define NTYPE NImage
#define NACCS NImageAccessors

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

static NACCS accs = {
	.Image = image_image,
	.Offset = image_offset,
	.AutoSize = image_autosize,
};

NACCS*
New_Image(char *name)
{
	NImage *i = MakeNelem(NImage, NImage_Type, &Nimagefunctions, &accs, name, 0);
	
	i->image = nil;
	i->offset = ZP;
	nc_push(i);
	return &accs;
}