chiark / gitweb /
pointmap command for use by moebius2
[moebius.git] / x11.cc
diff --git a/x11.cc b/x11.cc
index b724594e676253fef6a5bb80082704495b67838a..c8eb915cac381c706762b10167080273670c997c 100644 (file)
--- a/x11.cc
+++ b/x11.cc
@@ -4,18 +4,37 @@
 
 
 #include "x11.hh"
+#include "parameter.hh"
 
-X11Output::X11Output() {
+static Parameter<int> x11size("x11size", "X11 window size", 500, 100, 10, 10000);
+
+GC X11Output::gc(const char *colour_name) {
   XGCValues gcvalues;
+  XColor colour;
+  Status st;
+
+  st= XAllocNamedColor(display,cmap,colour_name,&colour,&colour);
+  if (!st) {
+    cerr << "cannot allocate colour " << colour_name << ", quitting\n";
+    exit(1);
+  }
+
+  gcvalues.foreground= gcvalues.background= colour.pixel;
+  return XCreateGC(display,window,GCForeground|GCBackground,&gcvalues);
+}
+
+X11Output::X11Output() {
   display= XOpenDisplay(0);
   window= XCreateSimpleWindow(display,
                               DefaultRootWindow(display),
-                              0,0, 500,500, 0,0,0);
-  gcvalues.background= 0;
-  fabric= XCreateGC(display,window,GCBackground,&gcvalues);
-  gcvalues.foreground= 1;
-  gcvalues.background= 1;
-  mesh= XCreateGC(display,window,GCForeground|GCBackground,&gcvalues);
+                              0,0, x11size,x11size, 0,0,0);
+  cmap= DefaultColormap(display,DefaultScreen(display));
+
+  black= gc("black");
+  white= gc("white");
+  blue= gc("blue");
+  red= gc("red");
+
   XSelectInput(display,window,0);
   XMapWindow(display,window);
   XFlush(display);
@@ -33,14 +52,24 @@ X11Output::~X11Output() {
   XCloseDisplay(display);
 }
 
-void X11Output::drawcell(const Point* list, int n) {
+void X11Output::drawcell(const Point* list, int n, Colour colour) {
+  GC fill, draw;
+  
   XPoint xp[n+1];
   for (int i=0; i<n; i++) {
     Onscreen here= Onscreen(list[i]);
-    xp[i].x= (int)((here.x+1.0)*250.0);
-    xp[i].y= (int)((-here.y+1.0)*250.0);
+    xp[i].x= (int)((here.x+1.0)*(x11size*0.5));
+    xp[i].y= (int)((-here.y+1.0)*(x11size*0.5));
+  }
+  switch (colour) {
+  case grid:       fill= black;  draw= white;  break;
+  case solidblack: fill= red;    draw= 0;      break;
+  case solidwhite: fill= blue;   draw= 0;      break;
+  default: abort();
+  }
+  XFillPolygon(display,window,fill,xp,n,Nonconvex,CoordModeOrigin);
+  if (draw) {
+    xp[n]= xp[0];
+    XDrawLines(display,window,draw,xp,n+1,CoordModeOrigin);
   }
-  XFillPolygon(display,window,fabric,xp,n,Nonconvex,CoordModeOrigin);
-  xp[n]= xp[0];
-  XDrawLines(display,window,mesh,xp,n+1,CoordModeOrigin);
 }