ref: 08aef1095811c8f436a469208b088002e8f4ed21
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; }