1 module ws.x.drawSimple; 2 3 version(Posix): 4 5 6 import 7 std.string, 8 std.algorithm, 9 std.math, 10 std.conv, 11 std.range, 12 x11.X, 13 x11.Xlib, 14 x11.extensions.render, 15 x11.extensions.Xrender, 16 x11.extensions.Xfixes, 17 ws.draw, 18 ws.wm, 19 ws.bindings.xft, 20 ws.gui.point, 21 ws.x.backbuffer, 22 ws.x.font; 23 24 25 class Color { 26 27 ulong pix; 28 XftColor rgb; 29 long[4] rgba; 30 31 this(Display* dpy, int screen, long[4] values){ 32 Colormap cmap = DefaultColormap(dpy, screen); 33 Visual* vis = DefaultVisual(dpy, screen); 34 rgba = values; 35 auto name = "#%02x%02x%02x".format(values[0], values[1], values[2]); 36 if(!XftColorAllocName(dpy, vis, cmap, name.toStringz, &rgb)) 37 throw new Exception("Cannot allocate color " ~ name); 38 pix = rgb.pixel; 39 } 40 41 } 42 43 44 class XDrawSimple: DrawEmpty { 45 46 int[2] size; 47 Display* dpy; 48 int screen; 49 x11.X.Window window; 50 GC gc; 51 52 Color color; 53 Color[long[4]] colors; 54 55 this(ws.wm.Window window){ 56 this(wm.displayHandle, window.windowHandle); 57 } 58 59 this(Display* dpy, x11.X.Window window){ 60 XWindowAttributes wa; 61 XGetWindowAttributes(dpy, window, &wa); 62 this.dpy = dpy; 63 screen = DefaultScreen(dpy); 64 this.window = window; 65 this.size = [wa.width, wa.height]; 66 XGCValues gcValues; 67 gcValues.subwindow_mode = IncludeInferiors; 68 gc = XCreateGC(dpy, window, GCSubwindowMode, &gcValues); 69 XSetBackground(dpy,gc,0); 70 XSetLineAttributes(dpy, gc, 1, LineSolid, CapButt, JoinMiter); 71 XSetFillStyle(dpy, gc, FillSolid); 72 } 73 74 override void resize(int[2] size){ 75 this.size = size; 76 } 77 78 override void destroy(){ 79 XFreeGC(dpy, gc); 80 } 81 82 override void setColor(float[3] color){ 83 setColor([color[0], color[1], color[2], 1]); 84 } 85 86 override void setColor(float[4] color){ 87 long[4] values = [ 88 (color[0]*255).lround.max(0).min(255), 89 (color[1]*255).lround.max(0).min(255), 90 (color[2]*255).lround.max(0).min(255), 91 (color[3]*255).lround.max(0).min(255) 92 ]; 93 if(values !in colors) 94 colors[values] = new Color(dpy, screen, values); 95 this.color = colors[values]; 96 } 97 98 override void rect(int[2] pos, int[2] size){ 99 XSetForeground(dpy, gc, color.pix); 100 XFillRectangle(dpy, window, gc, pos.x, pos.y, size.w, size.h); 101 } 102 103 override void line(int[2] start, int[2] end){ 104 XSetForeground(dpy, gc, color.pix); 105 XDrawLine(dpy, window, gc, start.x, start.y, end.x, end.y); 106 } 107 108 override void clear(){ 109 XClearWindow(dpy, window); 110 } 111 112 }