Index: trunk/Ohana/src/kapa2/src/DrawFrame.c
===================================================================
--- trunk/Ohana/src/kapa2/src/DrawFrame.c	(revision 40015)
+++ trunk/Ohana/src/kapa2/src/DrawFrame.c	(revision 40018)
@@ -5,5 +5,5 @@
 int DrawFrame (KapaGraphWidget *graph) {
   
-  int i, j, Nticks, P, doffset;
+  int i, j, Nticks, Px, Py, doffset;
   double fx, fy, dfx, dfy, dx = 0, dy = 0, lweight;
   Graphic *graphic;
@@ -13,5 +13,9 @@
   graphic = GetGraphic();
 
-  P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
+  // P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
+  // P ~ 1.25*(x-axis length)
+  Px = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
+  Py = 0.5 * (1 + 0.25*graph[0].axis[1].lweight) * (hypot (graph[0].axis[1].dfx, graph[0].axis[1].dfy) + hypot (graph[0].axis[1].dfx, graph[0].axis[1].dfy));
+  int P = MIN (Px, Py);
 
   /* each axis is drawn independently, but ticks and labels are placed according to perpendicular distance. */
@@ -92,5 +96,5 @@
   double x, y, dx, dy;
   int pos, dir, fontsize;
-  double size, n, pad;
+  double size, pad;
   char string[64];
 
@@ -108,24 +112,24 @@
 
   if (tick->IsMajor) { 
-    size = MAX (0.02, 7.0 / P); 
+    size = MIN (0.50*P, MAX (0.030 * P, 10.0)); 
   } else {
-    size = MAX (0.01, 4.0 / P); 
-  }
-  
-  n = P / hypot(dfx, dfy);
+    size = MIN (0.25*P, MAX (0.015 * P, 5.0)); 
+  }
+  dir = ((naxis == 0) || (naxis == 3)) ? -1 : +1;
+
   x = fx + (value-min)*dfx/(max - min);
   y = fy + (value-min)*dfy/(max - min);
 
   if ((naxis == 0) || (naxis == 2)) {
-    x = MIN(MAX(x, fx),fx+dfx);
+    dx = 0;
+    dy = dir*size;
+    x  = MIN(MAX(x,    fx), fx+dfx);
   }
   if ((naxis == 1) || (naxis == 3)) {
-    y = MAX(MIN(y, fy),fy+dfy);
-  }
-
-  dir = ((naxis == 0) || (naxis == 1)) ? -1 : +1;
-  dx = dir*size*dfy*n;	
-  dy = dir*size*dfx*n;
-  
+    dx = dir*size;
+    dy = 0;
+    y  = MAX(MIN(y,    fy), fy+dfy);
+  }
+
   DrawLine (x, y, dx, dy);
 
@@ -153,4 +157,106 @@
   }
 }
+
+# if (0)
+void DrawTick (Graphic *graphic, Axis *axis, int P, TickMarkData *tick, int naxis) {
+  
+  double x, y, dx, dy;
+  int pos, dir, fontsize;
+  double size, n, pad;
+  char string[64];
+
+  double fx  = axis->fx;
+  double fy  = axis->fy;
+  double dfx = axis->dfx;
+  double dfy = axis->dfy;
+
+  double min = axis->min;
+  double max = axis->max;
+
+  double value = tick->value;
+
+  pos = size = 0;
+
+  // size = 4 / P
+  // n = P / dfx
+  // dy = (4/P)*(P/dfx)*dfx = (0.01 * P) or 4
+
+  // size = 0.01
+  // n = P / dfx
+  // dy - 0.01 * (P / dfx) * dfx = 0.01*P
+
+  // n ~ 1.25 * x-axis / current-axis
+  // n = P / hypot(dfx, dfy);
+  n = P / hypot(dfx, dfy);
+
+  if (tick->IsMajor) { 
+    // size = MAX (0.02, 7.0 / P); 
+    size = MIN (0.50*P, MAX (0.030 * P, 10.0)); 
+  } else {
+    // size = MAX (0.01, 4.0 / P); 
+    size = MIN (0.25*P, MAX (0.015 * P, 5.0)); 
+  }
+  
+  dir = ((naxis == 0) || (naxis == 3)) ? -1 : +1;
+
+  // fdir ~ 1.25 * (4,7) / current-axis
+
+  x = fx + (value-min)*dfx/(max - min);
+  y = fy + (value-min)*dfy/(max - min);
+
+  double xs, xe, ys, ye;
+  if ((naxis == 0) || (naxis == 2)) {
+    dx = 0;
+    dy = dir*size;
+    xs = MIN(MAX(x,    fx), fx+dfx);
+    xe = xs;
+    ys = y;
+    ye = y+dy;
+  }
+  if ((naxis == 1) || (naxis == 3)) {
+    dx = dir*size;
+    dy = 0;
+    xs = x;
+    xe = x+dx;
+    ys = MAX(MIN(y,    fy), fy+dfy);
+    ye = ys;
+  }
+
+  double dxs = xe - xs;
+  double dys = ye - ys;
+  
+  // dx ~ (4,7)*x-axis 
+  // dx = dir*size*dfy*n;	
+  // dy = dir*size*dfx*n;
+
+  fprintf (stderr, "axis: %d %f : %f %d %f : %f %f : %f %f : %f %f\n",
+	   naxis, value, n, P, size, dfx, dfy, dx, dy, dxs, dys);
+
+  DrawLine (xs, ys, dxs, dys);
+
+  if (tick->IsLabel) {
+    int xt, yt;
+
+    // char *fontname is returned by GetRotFont, but not used here
+    GetRotFont (&fontsize);
+    
+    pad = !isnan(axis->ticktextPad) ? axis->ticktextPad*fontsize : fontsize + 4.0;
+    // pad = !isnan(axis->ticktextPad) ? axis->ticktextPad*fontsize : 0.8*fontsize + 1.0;
+    
+    /* temporarily assume rectilinear axes */
+    if (naxis == 0) { dx = 0; dy = +1.0*pad; pos = 1; } // center, down justified
+    if (naxis == 2) { dx = 0; dy = -1.0*pad; pos = 7; } // center, up justified
+
+    if (naxis == 1) { dy = 0; dx = -0.5*pad; pos = 3; } // left, center justified
+    if (naxis == 3) { dy = 0; dx = +0.5*pad; pos = 5; } // right, center justified
+
+    xt = fx + (value-min)*dfx/(max - min) + dx;
+    yt = fy + (value-min)*dfy/(max - min) + dy;
+
+    PrintTick (string, value, min, max, tick->nsignif);
+    DrawRotText (xt, yt, string, pos, 0.0);
+  }
+}
+# endif
 
 // do I really want this?  allow an override?
Index: trunk/Ohana/src/kapa2/src/DrawObjects.c
===================================================================
--- trunk/Ohana/src/kapa2/src/DrawObjects.c	(revision 40015)
+++ trunk/Ohana/src/kapa2/src/DrawObjects.c	(revision 40018)
@@ -6,9 +6,10 @@
 // # define FillRectangle(X1,Y1,X2,Y2) ;
 # define DrawCircle(X,Y,R) (XDrawArc (graphic->display, graphic->window, graphic->gc, (int)(X-R), (int)(Y-R), abs(2*R), abs(2*R), 0, 23040))
-# define FillCircle(X,Y,R) (XFillArc (graphic->display, graphic->window, graphic->gc, (int)(X-R), (int)(Y-R), abs(2*R+1), abs(2*R+1), 0, 23040))
+# define FillCircle(X,Y,R) (XFillArc (graphic->display, graphic->window, graphic->gc, (int)(X-R), (int)(Y-R), abs(2*R), abs(2*R), 0, 23040))
 
 # define XCENTER 0.0
 # define YCENTER 0.0
-# define CAPSTYLE CapButt
+/* # define CAPSTYLE CapButt */
+# define CAPSTYLE CapNotLast
 # define JOINSTYLE JoinMiter
 
@@ -637,6 +638,6 @@
 	  }
 	  D = scaleSize ? dz*z[i] : ds;
+	  DrawCircle (sx, sy, D);
 	  FillCircle (sx, sy, D);
-	  DrawCircle (sx, sy, D);
 	}
       }
Index: trunk/Ohana/src/kapa2/src/MakeGC.c
===================================================================
--- trunk/Ohana/src/kapa2/src/MakeGC.c	(revision 40015)
+++ trunk/Ohana/src/kapa2/src/MakeGC.c	(revision 40018)
@@ -8,6 +8,9 @@
   gcvalues.foreground = graphic->fore;
   gcvalues.background = graphic->back;
+  gcvalues.arc_mode   = ArcPieSlice; // ArcChord;
+
+
   graphic->gc = XCreateGC (graphic->display, graphic->window, 
-			     GCForeground | GCBackground, &gcvalues);
+			     GCForeground | GCBackground | GCArcMode, &gcvalues);
   if (graphic->gc == 0)
     QuitX (graphic->display, "Error in creating a Graphics Context");
Index: trunk/Ohana/src/kapa2/src/PSFrame.c
===================================================================
--- trunk/Ohana/src/kapa2/src/PSFrame.c	(revision 40015)
+++ trunk/Ohana/src/kapa2/src/PSFrame.c	(revision 40018)
@@ -54,4 +54,80 @@
 }
 
+void PSTick (Graphic *graphic, Axis *axis, int P, TickMarkData *tick, int naxis, FILE *f) {
+  
+  double x, y, dx, dy;
+  int pos, dir, fontsize;
+  double size, pad;
+  char string[64];
+
+  double fx  = axis->fx;
+  double fy  = graphic->dy - axis->fy;
+  double dfx = axis->dfx;
+  double dfy = -axis->dfy;
+
+  double min = axis->min;
+  double max = axis->max;
+
+  double value = tick->value;
+
+  pos = size = 0;
+
+  if (tick->IsMajor) { 
+    size = MIN (0.50*P, MAX (0.030 * P, 10.0)); 
+  } else {
+    size = MIN (0.25*P, MAX (0.015 * P, 5.0)); 
+  }
+  dir = ((naxis == 2) || (naxis == 3)) ? -1 : +1;
+
+  x = fx + (value-min)*dfx/(max - min);
+  y = fy + (value-min)*dfy/(max - min);
+
+  if ((naxis == 0) || (naxis == 2)) {
+    dx = 0;
+    dy = dir*size;
+    x = MIN(MAX(x, fx),fx+dfx);
+  }
+  if ((naxis == 1) || (naxis == 3)) {
+    dx = dir*size;
+    dy = 0;
+    y = MIN(MAX(y, fy),fy+dfy);
+  }
+  
+  DrawLine (x, y, dx, dy);
+
+  if (tick->IsLabel) {
+    int xt, yt;
+
+    // char *fontname is returned by not needed
+    GetRotFont (&fontsize);
+
+    pad = !isnan(axis->ticktextPad) ? axis->ticktextPad*fontsize : 0.8*fontsize + 1.0;
+    
+    /* temporarily assume rectilinear axes */
+    if (naxis == 0) { dx = 0; dy = -pad; pos = 1; }
+    if (naxis == 2) { dx = 0; dy = +pad; pos = 7; }
+
+    if (naxis == 1) { dy = 0; dx = -pad; pos = 3; }
+    if (naxis == 3) { dy = 0; dx = +pad; pos = 5; }
+
+    xt = fx + (value-min)*dfx/(max - min) + dx;
+    yt = fy + (value-min)*dfy/(max - min) + dy;
+
+    PrintTick (string, value, min, max, tick->nsignif);
+    PSRotText (f, xt, yt, string, pos, 0.0);
+  }
+}
+
+  /* 
+  dx = size*dfy*n;	
+  dy = size*dfx*n;
+  DrawLine (x, y, dx, dy);
+  
+  dx = -size*dfy*n;	
+  dy = -size*dfx*n;
+  DrawLine (x, y, dx, dy);
+  */
+  
+# if (0)
 void PSTick (Graphic *graphic, Axis *axis, int P, TickMarkData *tick, int naxis, FILE *f) {
   
@@ -118,13 +194,4 @@
   }
 }
+# endif
 
-  /* 
-  dx = size*dfy*n;	
-  dy = size*dfx*n;
-  DrawLine (x, y, dx, dy);
-  
-  dx = -size*dfy*n;	
-  dy = -size*dfx*n;
-  DrawLine (x, y, dx, dy);
-  */
-  
Index: trunk/Ohana/src/kapa2/src/bDrawFrame.c
===================================================================
--- trunk/Ohana/src/kapa2/src/bDrawFrame.c	(revision 40015)
+++ trunk/Ohana/src/kapa2/src/bDrawFrame.c	(revision 40018)
@@ -4,5 +4,5 @@
 int bDrawFrame (bDrawBuffer *buffer, KapaGraphWidget *graph) {
   
-  int i, j, Nticks, P, doffset;
+  int i, j, Nticks, doffset;
   double fx, fy, dfx, dfy, lweight, dx = 0, dy = 0;
   // Graphic graphic; is not needed
@@ -12,5 +12,8 @@
   // don't need graphic, unlink DrawFrame
 
-  P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
+  // P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
+  int Px = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
+  int Py = 0.5 * (1 + 0.25*graph[0].axis[1].lweight) * (hypot (graph[0].axis[1].dfx, graph[0].axis[1].dfy) + hypot (graph[0].axis[1].dfx, graph[0].axis[1].dfy));
+  int P = MIN (Px, Py);
 
   /* each axis is drawn independently */
@@ -58,4 +61,70 @@
 }
 
+void bDrawTick (bDrawBuffer *buffer, Axis *axis, int P, TickMarkData *tick, int naxis) {
+  
+  double x, y, dx, dy;
+  int pos, dir, fontsize;
+  double size, pad;
+  char string[64];
+
+  double fx  = axis->fx;
+  double fy  = axis->fy;
+  double dfx = axis->dfx;
+  double dfy = axis->dfy;
+
+  double min = axis->min;
+  double max = axis->max;
+
+  double value = tick->value;
+
+  pos = size = 0;
+
+  if (tick->IsMajor) { 
+    size = MIN (0.50*P, MAX (0.030 * P, 10.0)); 
+  } else {
+    size = MIN (0.25*P, MAX (0.015 * P, 5.0)); 
+  }
+  dir = ((naxis == 0) || (naxis == 3)) ? -1 : +1;
+  
+  x = fx + (value-min)*dfx/(max - min);
+  y = fy + (value-min)*dfy/(max - min);
+
+  if ((naxis == 0) || (naxis == 2)) {
+    dx = 0;
+    dy = dir*size;
+    x = MIN(MAX(x, fx),fx+dfx);
+  }
+  if ((naxis == 1) || (naxis == 3)) {
+    dx = dir*size;
+    dy = 0;
+    y = MAX(MIN(y, fy),fy+dfy);
+  }
+  
+  bDrawLine (buffer, x, y, x+dx, y+dy);
+
+  if (tick->IsLabel) {
+    int xt, yt;
+
+    // char *fontname is returned but ignored
+    GetRotFont (&fontsize);
+
+    pad = !isnan(axis->ticktextPad) ? axis->ticktextPad*fontsize : 0.8*fontsize + 1.0;
+    
+    /* temporarily assume rectilinear axes */
+    if (naxis == 0) { dx = 0; dy = +pad; pos = 1; }
+    if (naxis == 2) { dx = 0; dy = -pad; pos = 7; }
+
+    if (naxis == 1) { dy = 0; dx = -pad; pos = 3; }
+    if (naxis == 3) { dy = 0; dx = +pad; pos = 5; }
+
+    xt = fx + (value-min)*dfx/(max - min) + dx;
+    yt = fy + (value-min)*dfy/(max - min) + dy;
+
+    PrintTick (string, value, min, max, tick->nsignif);
+    bDrawRotText (buffer, xt, yt, string, pos, 0.0);
+  }
+}
+
+# if (0)
 void bDrawTick (bDrawBuffer *buffer, Axis *axis, int P, TickMarkData *tick, int naxis) {
   
@@ -122,2 +191,4 @@
   }
 }
+
+# endif
