ref: a0b15f88e6274b4892061a7dfe790d85eb211078
dir: /n_image.c/
#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;
}