CPPFLAGS= -I/usr/include \
- -Wall -O2 -Wmissing-prototypes -Wstrict-prototypes \
+ -Wall -O2 -g -Wmissing-prototypes -Wstrict-prototypes \
-Wno-deprecated \
$(WERROR)
WERROR=-Werror
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);
}
struct DualX11Output : Output {
DualX11Output();
~DualX11Output();
- void drawcell(const Point*, int);
+ void drawcell(const Point *list, int n, Colour colour);
void startimage();
void endimage();
private:
#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;
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;
}
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;
}
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(){};
};
"%%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) {
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);
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);
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);
+ }
}
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;
};