ref: 2d1e449a474444fa3288c56937a033c4f5f019f7
dir: /util.c/
#include <u.h> #include <libc.h> #include <draw.h> #include <memdraw.h> #include <event.h> #include <keyboard.h> #include "blie.h" Memimage* dupmemimage(Memimage *i) { Memimage *d; d = gencanvas(i); memimagedraw(d, i->r, i, ZP, nil, ZP, SoverD); return d; } Memimage* gencanvas(Memimage *i) { return allocmemimage(i->r, RGBA32); } Memimage* gencomposite(Memimage *A, Memimage *B, Memimage *M, Drawop op) { Memimage *d; d = dupmemimage(A); memimagedraw(d, B->r, B, ZP, M, ZP, op); return d; } Memimage* ecomposite(Layer *l, Memimage *img) { Memimage *s; Memimage *m; s = l->editor->raw(l); m = l->editor->mask(l); if (!img) { if (bliedebug > 1) fprint(2, " c: raw image\n"); return dupmemimage(s); } if (bliedebug > 1) fprint(2, " c: combine images\n"); return gencomposite(img, s, m, l->op); } Point scalepos(Point xy) { xy = addpt(xy, vstate.offset); xy.x = xy.x / vstate.zoom; xy.y = xy.y / vstate.zoom; return xy; } ulong color2value(Color c) { int r, g, b, a; r = c.r * 256; g = c.g * 256; b = c.b * 256; a = c.a * 256; return r<<24 | g<<16 | b<<8 | a; } Image **askcolimage; char *askcolprompt; static void askcolorredraw(Image *i) { border(i, i->r, 1, display->black, ZP); string(i, addpt(i->r.min, Pt(10, 0)), display->black, ZP, font, askcolprompt); } Color askcolor(char *prompt) { Event ev; int e; Color c; Rectangle r; Image *col = nil; ulong val; Point xy; r.min = vstate.mousepos; r.max = addpt(r.min, Pt(100, 100+vdata.fontheight)); askcolprompt = prompt; askcolimage = reqwin(r, 0xccccccff, askcolorredraw); r.min.y += vdata.fontheight; for (;;) { e = event(&ev); switch (e) { case Ekeyboard: if (ev.kbdc == Kesc || ev.kbdc == 'q') goto Abort; else if (ev.kbdc == '\n') goto Accept; break; case Emouse: if (!ev.mouse.buttons) break; if (!ptinrect(ev.mouse.xy, r)) break; xy = subpt(ev.mouse.xy, (*askcolimage)->r.min); xy.y -= vdata.fontheight; c.r = (double)xy.x / 100; c.g = (double)xy.y / 100; c.b = 0.; c.a = 1.; val = color2value(c); if (col) freeimage(col); col = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, val); border(*askcolimage, (*askcolimage)->r, 2, col, ZP); // fprint(2, "col: %f %f %f %f\n", c.r, c.g, c.b, c.a); break; } } Abort: c.r = -1.; Accept: setmodedirty(1); unreqwin(askcolimage); askcolimage = nil; return c; }