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