ref: d990c25d5795b16c181e875bf2f55aa06c2f75f9
dir: /libtk/cimag.c/
#include "lib9.h"
#include "draw.h"
#include "tk.h"
#include "canvs.h"
#define O(t, e) ((long)(&((t*)0)->e))
/* Image Options (+ means implemented)
+anchor
+image
*/
typedef struct TkCimag TkCimag;
struct TkCimag
{
int anchor;
Point anchorp;
TkImg* tki;
};
static
TkOption imgopts[] =
{
"anchor", OPTstab, O(TkCimag, anchor), tkanchor,
"image", OPTimag, O(TkCimag, tki), nil,
nil
};
static
TkOption itemopts[] =
{
"tags", OPTctag, O(TkCitem, tags), nil,
nil
};
void
tkcvsimgsize(TkCitem *i)
{
Point o;
int dx, dy;
TkCimag *t;
t = TKobj(TkCimag, i);
i->p.bb = bbnil;
if(t->tki == nil)
return;
dx = t->tki->w;
dy = t->tki->h;
o = tkcvsanchor(i->p.drawpt[0], dx, dy, t->anchor);
i->p.bb.min.x = o.x;
i->p.bb.min.y = o.y;
i->p.bb.max.x = o.x + dx;
i->p.bb.max.y = o.y + dy;
t->anchorp = subpt(o, i->p.drawpt[0]);
}
char*
tkcvsimgcreat(Tk* tk, char *arg, char **val)
{
char *e;
TkCimag *t;
TkCitem *i;
TkCanvas *c;
TkOptab tko[3];
c = TKobj(TkCanvas, tk);
i = tkcnewitem(tk, TkCVimage, sizeof(TkCitem)+sizeof(TkCimag));
if(i == nil)
return TkNomem;
t = TKobj(TkCimag, i);
e = tkparsepts(tk->env->top, &i->p, &arg, 0);
if(e != nil) {
tkcvsfreeitem(i);
return e;
}
if(i->p.npoint != 1) {
tkcvsfreeitem(i);
return TkFewpt;
}
tko[0].ptr = t;
tko[0].optab = imgopts;
tko[1].ptr = i;
tko[1].optab = itemopts;
tko[2].ptr = nil;
e = tkparse(tk->env->top, arg, tko, nil);
if(e != nil) {
tkcvsfreeitem(i);
return e;
}
e = tkcaddtag(tk, i, 1);
if(e != nil) {
tkcvsfreeitem(i);
return e;
}
tkcvsimgsize(i);
e = tkvalue(val, "%d", i->id);
if(e != nil) {
tkcvsfreeitem(i);
return e;
}
tkcvsappend(c, i);
tkbbmax(&c->update, &i->p.bb);
tkcvssetdirty(tk);
return nil;
}
char*
tkcvsimgcget(TkCitem *i, char *arg, char **val)
{
TkOptab tko[3];
TkCimag *t = TKobj(TkCimag, i);
tko[0].ptr = t;
tko[0].optab = imgopts;
tko[1].ptr = i;
tko[1].optab = itemopts;
tko[2].ptr = nil;
return tkgencget(tko, arg, val, i->env->top);
}
char*
tkcvsimgconf(Tk *tk, TkCitem *i, char *arg)
{
char *e;
TkOptab tko[3];
TkCimag *t = TKobj(TkCimag, i);
tko[0].ptr = t;
tko[0].optab = imgopts;
tko[1].ptr = i;
tko[1].optab = itemopts;
tko[2].ptr = nil;
e = tkparse(tk->env->top, arg, tko, nil);
tkcvsimgsize(i);
return e;
}
void
tkcvsimgfree(TkCitem *i)
{
TkCimag *t;
t = TKobj(TkCimag, i);
if(t->tki)
tkimgput(t->tki);
}
void
tkcvsimgdraw(Image *img, TkCitem *i, TkEnv *pe)
{
TkCimag *t;
TkImg *tki;
Rectangle r;
Image *fg;
USED(pe);
t = TKobj(TkCimag, i);
tki = t->tki;
if(tki == nil)
return;
fg = tki->img;
if(fg == nil)
return;
r.min = addpt(t->anchorp, i->p.drawpt[0]);
r.max = r.min;
r.max.x += tki->w;
r.max.y += tki->h;
draw(img, r, fg, nil, ZP);
}
char*
tkcvsimgcoord(TkCitem *i, char *arg, int x, int y)
{
char *e;
TkCpoints p;
if(arg == nil) {
tkxlatepts(i->p.parampt, i->p.npoint, x, y);
tkxlatepts(i->p.drawpt, i->p.npoint, TKF2I(x), TKF2I(y));
i->p.bb = rectaddpt(i->p.bb, Pt(TKF2I(x), TKF2I(y)));
}
else {
e = tkparsepts(i->env->top, &p, &arg, 0);
if(e != nil)
return e;
if(p.npoint != 1) {
tkfreepoint(&p);
return TkFewpt;
}
tkfreepoint(&i->p);
i->p = p;
tkcvsimgsize(i);
}
return nil;
}