chiark / gitweb /
sotextpit
authorian <ian>
Sun, 3 Apr 2005 15:54:58 +0000 (15:54 +0000)
committerian <ian>
Sun, 3 Apr 2005 15:54:58 +0000 (15:54 +0000)
Makefile
dualx11.cc
dualx11.hh
graphics.cc
output.hh
postscript.cc
postscript.hh
x11.cc
x11.hh

index f092b5baf033e662435dd74ce7c127e3f9b189ad..54e80614be1022ad5c5235b0f6fb3f070066e0f7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
 CPPFLAGS= -I/usr/include \
-       -Wall -O2 -Wmissing-prototypes -Wstrict-prototypes \
+       -Wall -O2 -g -Wmissing-prototypes -Wstrict-prototypes \
        -Wno-deprecated \
        $(WERROR)
 WERROR=-Werror
index 5c40ba2ea2d93c683f52f4829c06a3895dfb4a1f..6a2edd5a796aeaac6e8e6fe288b62ea39cd0a9dd 100644 (file)
@@ -63,21 +63,36 @@ DualX11Output::~DualX11Output() {
   XCloseDisplay(display);
 }
 
-void DualX11Output::drawcell(const Point* list, int n) {
-  static Parameter<double> eyeseparation("eyesep",
-                                         "Distance from projection eye to origin", 
-                                         0.3, .1, 0., 100.);
+void DualX11Output::drawcell(const Point* list, int n, Colour colour) {
+  static Parameter<double>
+    eyeseparation("eyesep", "Distance from projection eye to origin", 
+                 0.3, .1, 0., 100.);
+
   for (int i=0; i<2; i++) {
+    GC fill;
+    bool draw;
+    
     Point::seteyex(eyeseparation*(i-0.5));
+
+    switch (colour) {
+    case grid:       fill= fabric[i]; draw= true;  break;
+    case solidblack: fill= fabric[i]; draw= false; break;
+    case solidwhite: fill= mesh[i];   draw= false; break;
+    default: abort();
+    }
+
     XPoint xp[n+1];
     for (int j=0; j<n; j++) {
       Onscreen here= Onscreen(list[j]);
       xp[j].x= (int)((here.x+1.0)*(dualx11size*0.5));
       xp[j].y= (int)((-here.y+1.0)*(dualx11size*0.5));
     }
-    XFillPolygon(display,window,fabric[i],xp,n,Nonconvex,CoordModeOrigin);
-    xp[n]= xp[0];
-    XDrawLines(display,window,mesh[i],xp,n+1,CoordModeOrigin);
+
+    XFillPolygon(display,window,fill,xp,n,Nonconvex,CoordModeOrigin);
+    if (draw) {
+      xp[n]= xp[0];
+      XDrawLines(display,window,mesh[i],xp,n+1,CoordModeOrigin);
+    }
   }
   Point::seteyex(0);
 }
index 042bc1127b0adbcdfa2146460fbd3c11238491f7..b779f4d3de579a33b806dbf3198c05c4e36af942 100644 (file)
@@ -13,7 +13,7 @@
 struct DualX11Output : Output {
   DualX11Output();
   ~DualX11Output();
-  void drawcell(const Point*, int);
+  void drawcell(const Point *list, int n, Colour colour);
   void startimage();
   void endimage();
 private:
index ae1659e97b69b4cae05e1043d5ff0198345bac3c..605d8834535925b2bcc85203e4b379b694fa357d 100644 (file)
@@ -12,6 +12,7 @@
 #include "library.hh"
 #include "graphics.hh"
 #include "output.hh"
+#include "parameter.hh"
 
 static int checkneededline(Onscreen a, Onscreen b) {
   double xd= a.x - b.x;
@@ -20,6 +21,10 @@ static int checkneededline(Onscreen a, Onscreen b) {
   return n>0 ? n : 1;
 }
 
+static Parameter<double>
+sotextpit("sotextpit", "Pitch of solid texture (0: grid mode)",
+         0., 1., 0., 1000.);
+
 void Cell::display(Output& o) {
   int nn[4];
   int totalnn= 0;
@@ -30,14 +35,28 @@ void Cell::display(Output& o) {
   }
   Point *array= new Point[totalnn];
   Point *inarrayp= array;
+  Point mean(0,0,0);
   for (i=0; i<4; i++) {
     for (int a=0; a<nn[i]; a++) {
       double fp= (double)a         / nn[i];
       double fn= (double)(nn[i]-a) / nn[i];
       *inarrayp++= p[i]*fn + p[(i+1)&3]*fp;
     }
+    mean = mean + p[i];
+  }
+  mean = mean * 0.25;
+  Output::Colour colour= Output::grid;
+  if (sotextpit > 0) {
+    bool white= false;
+    for (i=0; i<3; i++) {
+      double intpartdummy;
+      double remainder= modf(mean[i] / sotextpit, &intpartdummy);
+      if (remainder >= 0.5 || (remainder >= -0.5 && remainder < 0.0))
+       white= !white;
+    }
+    colour= white ? Output::solidwhite : Output::solidblack;
   }
-  o.drawcell(array,totalnn);
+  o.drawcell(array,totalnn,colour);
   delete[] array;
 }                          
 
index 92cc33bf9e90e2c7c2cadbfa9ce6e50d1f354f78..4b40747f6046bcd7975dd52ee3e136f840eec44e 100644 (file)
--- a/output.hh
+++ b/output.hh
@@ -9,7 +9,8 @@
 
 struct Output {
   virtual ~Output(){};
-  virtual void drawcell(const Point*, int) =0;
+  enum Colour { grid, solidblack, solidwhite };
+  virtual void drawcell(const Point *list, int n, Colour colour) =0;
   virtual void startimage(){};
   virtual void endimage(){};
 };
index 3fbe4e7585179e73e18c39bc4ad16b519d5b0a34..f27a08138160fc6e32d96d7d47a9a3135993980a 100644 (file)
@@ -29,11 +29,23 @@ PostScriptOutput::~PostScriptOutput() {
     "%%EOF\n";
 }
 
-void PostScriptOutput::drawcell(const Point* list, int n) {
-  Onscreen p[4];
-  for (int i=0; i<4; i++) p[i]= Onscreen(list[i]);
-  docell(p,n,"1 setgray fill");
-  docell(p,n,"0 setgray stroke");
+void PostScriptOutput::drawcell(const Point* list, int n, Colour colour) {
+  Onscreen p[n];
+  for (int i=0; i<n; i++) p[i]= Onscreen(list[i]);
+  switch (colour) {
+  case grid:
+    docell(p,n,"1 setgray fill");
+    docell(p,n,"0 setgray stroke");
+    break;
+  case solidwhite:
+    docell(p,n,"1 setgray fill");
+    break;
+  case solidblack:
+    docell(p,n,"0 setgray fill");
+    break;
+  default:
+    abort();
+  }
 }
 
 void PostScriptOutput::docell(const Onscreen* list, int n, const char *what) {
index d385513f1fa238b44362e9d96e0e6856d5a63d4b..e7d311ab3449c88e458188d57ba7afac013944c4 100644 (file)
@@ -9,7 +9,7 @@
 struct PostScriptOutput : Output {
   PostScriptOutput(ofstream&);
   ~PostScriptOutput();
-  void drawcell(const Point*, int);
+  void drawcell(const Point *list, int n, Colour colour);
 private:
   ofstream& file;
   void docell(const Onscreen*, int, const char* what);
diff --git a/x11.cc b/x11.cc
index 830b40786a7e9dbeef3c2a99a6c5f9bd1eeaede1..f689362d2f5bc9f3bc0c9c896769000394784c96 100644 (file)
--- a/x11.cc
+++ b/x11.cc
@@ -22,15 +22,23 @@ static unsigned long colour_pixel(Display *display, Colormap cmap,
 
 X11Output::X11Output() {
   XGCValues gcvalues;
+
   display= XOpenDisplay(0);
   window= XCreateSimpleWindow(display,
                               DefaultRootWindow(display),
                               0,0, x11size,x11size, 0,0,0);
+
   Colormap cmap= DefaultColormap(display,DefaultScreen(display));
-  gcvalues.background= colour_pixel(display,cmap,"black");
-  fabric= XCreateGC(display,window,GCBackground,&gcvalues);
-  gcvalues.foreground= gcvalues.background= colour_pixel(display,cmap,"white");
+  black= colour_pixel(display,cmap,"black");
+  white= colour_pixel(display,cmap,"white");
+
+  gcvalues.foreground= gcvalues.background= black;
+  fabric= XCreateGC(display,window,GCForeground|GCBackground,&gcvalues);
+
+  gcvalues.foreground= gcvalues.background= white;
+
   mesh= XCreateGC(display,window,GCForeground|GCBackground,&gcvalues);
+
   XSelectInput(display,window,0);
   XMapWindow(display,window);
   XFlush(display);
@@ -48,14 +56,25 @@ X11Output::~X11Output() {
   XCloseDisplay(display);
 }
 
-void X11Output::drawcell(const Point* list, int n) {
+void X11Output::drawcell(const Point* list, int n, Colour colour) {
+  GC fill;
+  bool 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)*(x11size*0.5));
     xp[i].y= (int)((-here.y+1.0)*(x11size*0.5));
   }
-  XFillPolygon(display,window,fabric,xp,n,Nonconvex,CoordModeOrigin);
-  xp[n]= xp[0];
-  XDrawLines(display,window,mesh,xp,n+1,CoordModeOrigin);
+  switch (colour) {
+  case grid:       fill= fabric; draw= true;  break;
+  case solidblack: fill= fabric; draw= false; break;
+  case solidwhite: fill= mesh;   draw= false; break;
+  default: abort();
+  }
+  XFillPolygon(display,window,fill,xp,n,Nonconvex,CoordModeOrigin);
+  if (draw) {
+    xp[n]= xp[0];
+    XDrawLines(display,window,mesh,xp,n+1,CoordModeOrigin);
+  }
 }
diff --git a/x11.hh b/x11.hh
index d7117414faac00b8c1e02e40af7b6537638c5472..5fd626e2340091e3bad4933f324010cd5b20baa9 100644 (file)
--- a/x11.hh
+++ b/x11.hh
 struct X11Output : Output {
   X11Output();
   ~X11Output();
-  void drawcell(const Point*, int);
+  void drawcell(const Point*, int, Colour);
   void startimage();
   void endimage();
 private:
   Display *display;
   Window window;
+  unsigned long black, white;
   GC fabric;
   GC mesh;
 };