Index: /branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap16.c
===================================================================
--- /branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap16.c	(revision 25288)
+++ /branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap16.c	(revision 25289)
@@ -1,3 +1,4 @@
 # include "Ximage.h"
+# define OUT_TYPE unsigned short
 
 # define MY_SWAP_BYTE(W) { \
@@ -10,15 +11,21 @@
   int i, j, ii, jj;
   int i_start, i_end, j_start, j_end;
-  int dropback;
+  int I_start, J_start;
+  int dropback, inDX, inDY;
   int dx, dy, DX, DY;
   double expand, Ix, Iy;
   int expand_in, expand_out;
-  unsigned short *out_pix, *out_pix2, *data;
+  OUT_TYPE *out_pix, *out_pix2, *data;
   unsigned short *in_pix, *in_pix2;
-  unsigned short *pixel, pixvalue;
-  unsigned short back;
+  OUT_TYPE *pixel, pixvalue;
+  OUT_TYPE back;
   int swap_client, swap_server, swap_bytes;
 
-  ALLOCATE (pixel, unsigned short, graphic[0].Npixels);
+  // just skip if there is no data
+  if (matrix[0].Naxes == 0) return;
+  if (matrix[0].Naxis[0] == 0) return;
+  if (matrix[0].Naxis[1] == 0) return;
+
+  ALLOCATE (pixel, OUT_TYPE, graphic[0].Npixels);
 
 # ifdef BYTE_SWAP
@@ -38,5 +45,4 @@
   back = 0xffff & graphic[0].back;
   if (swap_bytes) MY_SWAP_BYTE (back);
-  // XXX not certain this is the correct solution...
 
   // set up expansions
@@ -60,17 +66,25 @@
   DY = matrix[0].Naxis[1];
 
-  // x, y are the closest lit screen pixel to 0,0
-  Picture_Lower (&i_start, &j_start, matrix, picture);
+  // i_start, j_start are the closest lit screen pixel to 0,0
+  // I_start, J_start are the image pixel corresponding to i_start, j_start
+  Picture_Lower (&i_start, &j_start, &I_start, &J_start, matrix, picture);
 
-  // x, y are the closest lit screen pixel to dx, dy
-  Picture_Upper (&i_end, &j_end, matrix, picture);
+  // i_end, j_end are the closest lit screen pixel to dx, dy
+  // I_end, J_end are the image pixel corresponding to i_end, j_end
+  Picture_Upper (&i_end, &j_end, i_start, j_start, matrix, picture);
 
-  // Ix,Iy are the first displayed image pixel
-  Picture_to_Image (&Ix, &Iy, i_start, j_start, picture);
+  assert (i_start <= i_end);
+  assert (j_start <= j_end);
+
+  Ix = picture[0].flipx ? I_start - 1 : I_start;
+  Iy = picture[0].flipy ? J_start - 1 : J_start;
+
+  inDX = picture[0].flipx ? -1 : +1;
+  inDY = picture[0].flipy ? -1 : +1;
 
   dropback = expand_out - (i_end - i_start) % expand_out;
   if ((i_end - i_start) % expand_out == 0) dropback = 0;
 
-  data = out_pix = (unsigned short *) picture[0].data;
+  out_pix = data = (OUT_TYPE *) picture[0].data;
   in_pix  = &image[0].pixmap[DX*(int)MAX(Iy,0) + (int)MAX(Ix,0)];
 
@@ -82,5 +96,5 @@
   }
   
-  for (j = j_start; j < j_end; j+= expand_out, in_pix += expand_in*DX) {
+  for (j = j_start; j < j_end; j+= expand_out, in_pix += inDY*expand_in*DX) {
     out_pix = &data[j*dx];
 
@@ -97,9 +111,9 @@
     in_pix2 = in_pix;
     if (expand_out == 1) {
-      for (i = i_start; i < i_end; i++, in_pix2+= expand_in, out_pix++) {
+      for (i = i_start; i < i_end; i++, in_pix2 += inDX*expand_in, out_pix++) {
 	*out_pix = pixel[*in_pix2];
       }
     } else {
-      for (i = i_start; i < i_end; i+= expand_out, in_pix2++, out_pix+= expand_out) { 
+      for (i = i_start; i < i_end; i+= expand_out, in_pix2 += inDX, out_pix+= expand_out) { 
 	pixvalue = pixel[*in_pix2];
 	out_pix2 = out_pix;
@@ -124,5 +138,5 @@
   /**** fill in top area ****/
   out_pix = &data[j_end*dx];
-  for (j = 0; j < (dy - j_end); j++) {
+  for (j = 0; j < dy - j_end; j++) {
     for (i = 0; i < dx; i++, out_pix++) { 
       *out_pix = back;
Index: /branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap24.c
===================================================================
--- /branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap24.c	(revision 25288)
+++ /branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap24.c	(revision 25289)
@@ -5,5 +5,6 @@
   int i, j, ii, jj;
   int i_start, i_end, j_start, j_end;
-  int dropback, extra;
+  int I_start, J_start;
+  int dropback, extra, inDX, inDY;
   int dx, dy, DX, DY;
   double expand, Ix, Iy;
@@ -53,12 +54,20 @@
   extra = 4 - (dx * 3) % 4;
 
-  // x, y are the closest lit screen pixel to 0,0
-  Picture_Lower (&i_start, &j_start, matrix, picture);
+  // i_start, j_start are the closest lit screen pixel to 0,0
+  // I_start, J_start are the image pixel corresponding to i_start, j_start
+  Picture_Lower (&i_start, &j_start, &I_start, &J_start, matrix, picture);
 
-  // x, y are the closest lit screen pixel to dx, dy
-  Picture_Upper (&i_end, &j_end, matrix, picture);
+  // i_end, j_end are the closest lit screen pixel to dx, dy
+  // I_end, J_end are the image pixel corresponding to i_end, j_end
+  Picture_Upper (&i_end, &j_end, i_start, j_start, matrix, picture);
 
-  // Ix,Iy are the first displayed image pixel
-  Picture_to_Image (&Ix, &Iy, i_start, j_start, picture);
+  assert (i_start <= i_end);
+  assert (j_start <= j_end);
+
+  Ix = picture[0].flipx ? I_start - 1 : I_start;
+  Iy = picture[0].flipy ? J_start - 1 : J_start;
+
+  inDX = picture[0].flipx ? -1 : +1;
+  inDY = picture[0].flipy ? -1 : +1;
 
   dropback = expand_out - (i_end - i_start) % expand_out;
@@ -80,5 +89,5 @@
   }
   
-  for (j = j_start; j < j_end; j+= expand_out, in_pix += expand_in*DX) {
+  for (j = j_start; j < j_end; j+= expand_out, in_pix += inDY*expand_in*DX) {
     out_pix = &data[j*(3*dx+extra)];
 
@@ -97,5 +106,5 @@
     in_pix2 = in_pix;
     if (expand_out == 1) {
-      for (i = i_start; i < i_end; i++, in_pix2+= expand_in, out_pix+=3) {
+      for (i = i_start; i < i_end; i++, in_pix2+= inDX*expand_in, out_pix+=3) {
 	out_pix[0] = pixel1[*in_pix2];
 	out_pix[1] = pixel2[*in_pix2];
@@ -103,5 +112,5 @@
       }
     } else {
-      for (i = i_start; i < i_end; i+= expand_out, in_pix2++, out_pix+= 3*expand_out) { 
+      for (i = i_start; i < i_end; i+= expand_out, in_pix2 += inDX, out_pix+= 3*expand_out) { 
 	pixvalue1 = pixel1[*in_pix2];
 	pixvalue2 = pixel2[*in_pix2];
@@ -121,5 +130,4 @@
     /**** fill in area to the right of the picture ****/
     for (jj = 0; (jj < expand_out) && (j + jj < dy); jj++) {
-      //    for (jj = 0; jj < expand_out; jj++) {
       out_pix2 = out_pix + jj*(3*dx+extra);
       for (i = i_end; i < dx; i++, out_pix2+=3) {
Index: /branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap32.c
===================================================================
--- /branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap32.c	(revision 25288)
+++ /branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap32.c	(revision 25289)
@@ -1,11 +1,12 @@
 # include "Ximage.h"
+# define OUT_TYPE unsigned int
 
 # define MY_SWAP_INT(A,B) { int tmp; tmp = A; A = B; B = tmp; }
 
-# define MY_SWAP_WORD(W) { \
-  char tmp, *X; \
-  X = (char *) &W; \
-  tmp = X[0]; X[0] = X[3]; X[3] = tmp; \
-  tmp = X[1]; X[1] = X[2]; X[2] = tmp; }
+# define MY_SWAP_WORD(W) {			\
+    char tmp, *X;				\
+    X = (char *) &W;				\
+    tmp = X[0]; X[0] = X[3]; X[3] = tmp;	\
+    tmp = X[1]; X[1] = X[2]; X[2] = tmp; }
 
 void Remap32 (Graphic *graphic, KapaImageWidget *image, Picture *picture, Matrix *matrix) {
@@ -13,15 +14,21 @@
   int i, j, ii, jj;
   int i_start, i_end, j_start, j_end;
+  int I_start, J_start;
   int dropback, inDX, inDY;
   int dx, dy, DX, DY;
   double expand, Ix, Iy;
   int expand_in, expand_out;
-  unsigned int *out_pix, *out_pix2;
+  OUT_TYPE *out_pix, *out_pix2, *data;
   unsigned short *in_pix, *in_pix2;
-  unsigned long *pixel, pixvalue;
-  unsigned long back;
+  OUT_TYPE *pixel, pixvalue;
+  OUT_TYPE back;
   int swap_client, swap_server, swap_bytes;
 
-  ALLOCATE (pixel, unsigned long, graphic[0].Npixels);
+  // just skip if there is no data
+  if (matrix[0].Naxes == 0) return;
+  if (matrix[0].Naxis[0] == 0) return;
+  if (matrix[0].Naxis[1] == 0) return;
+
+  ALLOCATE (pixel, OUT_TYPE, graphic[0].Npixels);
 
 # ifdef BYTE_SWAP
@@ -43,5 +50,5 @@
 
   // set up expansions
-  assert ((picture[0].expand >= 1) || (picture[0].expand <= -1));
+  assert ((picture[0].expand >= 1) || (picture[0].expand <= -2));
   expand = expand_in = expand_out = 1.0;
   if (picture[0].expand > 0) {
@@ -62,22 +69,17 @@
   DY = matrix[0].Naxis[1];
 
-  // x, y are the closest lit screen pixel to 0,0
-  Picture_Lower (&i_start, &j_start, matrix, picture);
+  // i_start, j_start are the closest lit screen pixel to 0,0
+  // I_start, J_start are the image pixel corresponding to i_start, j_start
+  Picture_Lower (&i_start, &j_start, &I_start, &J_start, matrix, picture);
 
-  // x, y are the closest lit screen pixel to dx, dy
-  Picture_Upper (&i_end, &j_end, matrix, picture);
+  // i_end, j_end are the closest lit screen pixel to dx, dy
+  // I_end, J_end are the image pixel corresponding to i_end, j_end
+  Picture_Upper (&i_end, &j_end, i_start, j_start, matrix, picture);
 
-  if (i_end < i_start) MY_SWAP_INT (i_start, i_end);
-  if (j_end < j_start) MY_SWAP_INT (j_start, j_end);
+  assert (i_start <= i_end);
+  assert (j_start <= j_end);
 
-  // Ix,Iy are the first displayed image pixel
-  Picture_to_Image (&Ix, &Iy, i_start, j_start, picture);
-  Ix = MIN (MAX (0, Ix), DX - 1);
-  Iy = MIN (MAX (0, Iy), DY - 1);
-  // XXX not completely consistent with the i_start, i_end range...
-
-  // we need to offset because i_start points to the bottom edge of Ix
-  // if (picture[0].flipx) Ix -= 1.0;
-  // if (picture[0].flipy) Iy -= 1.0;
+  Ix = picture[0].flipx ? I_start - 1 : I_start;
+  Iy = picture[0].flipy ? J_start - 1 : J_start;
 
   inDX = picture[0].flipx ? -1 : +1;
@@ -87,5 +89,5 @@
   if ((i_end - i_start) % expand_out == 0) dropback = 0;
 
-  out_pix = (unsigned int *) picture[0].data;
+  out_pix = data = (OUT_TYPE *) picture[0].data;
   in_pix  = &image[0].pixmap[DX*(int)MAX(Iy,0) + (int)MAX(Ix,0)];
 
@@ -97,5 +99,6 @@
   }
   
-  for (j = j_start; j < j_end; j+= expand_out, out_pix+=(expand_out-1)*dx, in_pix += inDY*expand_in*DX) {
+  for (j = j_start; j < j_end; j+= expand_out, in_pix += inDY*expand_in*DX) {
+    out_pix = &data[j*dx];
 
     /**** fill in area to the left of the picture ****/
@@ -126,9 +129,4 @@
     }
     out_pix -= dropback;
-    
-    // assert (in_pix2 - image[0].pixmap <= DX*DY);
-    // assert (in_pix2 - image[0].pixmap >= 0);
-    // assert (in_pix - image[0].pixmap <= DX*DY);
-    // assert (in_pix - image[0].pixmap >= 0);
 
     /**** fill in area to the right of the picture ****/
@@ -139,22 +137,16 @@
       }
     }
-    out_pix += (dx - i_end);
-    // assert (out_pix - (unsigned int *)picture[0].data <= dx*dy);
-    // assert (out_pix - (unsigned int *)picture[0].data >= 0);
   } 
-  
-  if ((j_end - j_start) % expand_out > 0)
-    out_pix -= expand_out - (j_end - j_start) % expand_out;
-  
-  // assert (out_pix - (unsigned int *)picture[0].data <= dx*dy);
-  // assert (out_pix - (unsigned int *)picture[0].data >= 0);
 
   /**** fill in top area ****/
-  for (j = 0; (j < dx*(dy - j_end)) && (out_pix - (unsigned int *)picture[0].data < dx*dy); j++, out_pix++) { 
-    *out_pix = back;
+  out_pix = &data[j_end*dx];
+  for (j = 0; j < dy - j_end; j++) {
+    for (i = 0; i < dx; i++, out_pix ++) {
+      *out_pix = back;
+    }
   }
 
   picture[0].pix = XCreateImage (graphic[0].display, graphic[0].visual, graphic[0].depth, ZPixmap, 0, 
-					picture[0].data, picture[0].dx, picture[0].dy, 32, 0);
+				 picture[0].data, picture[0].dx, picture[0].dy, 32, 0);
 
   free (pixel);
Index: /branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap8.c
===================================================================
--- /branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap8.c	(revision 25288)
+++ /branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap8.c	(revision 25289)
@@ -1,3 +1,4 @@
 # include "Ximage.h"
+# define OUT_TYPE unsigned char
 
 void Remap8 (Graphic *graphic, KapaImageWidget *image, Picture *picture, Matrix *matrix) {
@@ -5,14 +6,20 @@
   int i, j, ii, jj;
   int i_start, i_end, j_start, j_end;
-  int dropback;
+  int I_start, J_start;
+  int dropback, inDX, inDY;
   int dx, dy, DX, DY;
   double expand, Ix, Iy;
   int expand_in, expand_out;
-  unsigned char *out_pix, *out_pix2;
-  unsigned short *in_pix,  *in_pix2;
-  unsigned char *pixel, pixvalue;
-  unsigned char back;
+  OUT_TYPE *out_pix, *out_pix2, *data;
+  unsigned short *in_pix, *in_pix2;
+  OUT_TYPE *pixel, pixvalue;
+  OUT_TYPE back;
 
-  ALLOCATE (pixel, unsigned char, graphic[0].Npixels);
+  // just skip if there is no data
+  if (matrix[0].Naxes == 0) return;
+  if (matrix[0].Naxis[0] == 0) return;
+  if (matrix[0].Naxis[1] == 0) return;
+
+  ALLOCATE (pixel, OUT_TYPE, graphic[0].Npixels);
 
   // local array for pixel values
@@ -44,17 +51,25 @@
   DY = matrix[0].Naxis[1];
 
-  // x, y are the closest lit screen pixel to 0,0
-  Picture_Lower (&i_start, &j_start, matrix, picture);
+  // i_start, j_start are the closest lit screen pixel to 0,0
+  // I_start, J_start are the image pixel corresponding to i_start, j_start
+  Picture_Lower (&i_start, &j_start, &I_start, &J_start, matrix, picture);
 
-  // x, y are the closest lit screen pixel to dx, dy
-  Picture_Upper (&i_end, &j_end, matrix, picture);
+  // i_end, j_end are the closest lit screen pixel to dx, dy
+  // I_end, J_end are the image pixel corresponding to i_end, j_end
+  Picture_Upper (&i_end, &j_end, i_start, j_start, matrix, picture);
 
-  // Ix,Iy are the first displayed image pixel
-  Picture_to_Image (&Ix, &Iy, i_start, j_start, picture);
+  assert (i_start <= i_end);
+  assert (j_start <= j_end);
+
+  Ix = picture[0].flipx ? I_start - 1 : I_start;
+  Iy = picture[0].flipy ? J_start - 1 : J_start;
+
+  inDX = picture[0].flipx ? -1 : +1;
+  inDY = picture[0].flipy ? -1 : +1;
 
   dropback = expand_out - (i_end - i_start) % expand_out;
   if ((i_end - i_start) % expand_out == 0) dropback = 0;
 
-  out_pix = (unsigned char *) picture[0].data;
+  out_pix = data = (OUT_TYPE *) picture[0].data;
   in_pix  = &image[0].pixmap[DX*(int)MAX(Iy,0) + (int)MAX(Ix,0)];
 
@@ -66,5 +81,6 @@
   }
   
-  for (j = j_start; j < j_end; j+= expand_out, out_pix+=(expand_out-1)*dx, in_pix += expand_in*DX) {
+  for (j = j_start; j < j_end; j+= expand_out, in_pix += inDY*expand_in*DX) {
+    out_pix = &data[j*dx];
 
     /**** fill in area to the left of the picture ****/
@@ -80,12 +96,12 @@
     in_pix2 = in_pix;
     if (expand_out == 1) {
-      for (i = i_start; i < i_end; i++, in_pix2+= expand_in, out_pix++) {
+      for (i = i_start; i < i_end; i++, in_pix2 += inDX*expand_in, out_pix++) {
 	*out_pix = pixel[*in_pix2];
       }
     } else {
-      for (i = i_start; i < i_end; i+= expand_out, in_pix2++, out_pix+= expand_out) { 
+      for (i = i_start; i < i_end; i+= expand_out, in_pix2 += inDX, out_pix+= expand_out) { 
 	pixvalue = pixel[*in_pix2];
 	out_pix2 = out_pix;
-	for (jj = 0; (jj < expand_out) & (j + jj < dy); jj++, out_pix2+=(dx-expand_out)) {
+	for (jj = 0; (jj < expand_out) && (j + jj < dy); jj++, out_pix2+=(dx-expand_out)) {
 	  for (ii = 0; ii < expand_out; ii++, out_pix2++) {
 	    *out_pix2 = pixvalue;
@@ -103,14 +119,12 @@
       }
     }
-    out_pix += (dx - i_end);
-    
   } 
   
-  if ((j_end - j_start) % expand_out > 0)
-    out_pix -= expand_out - (j_end - j_start) % expand_out;
-  
   /**** fill in top area ****/
-  for (j = 0; (j < dx*(dy - j_end)) && (out_pix - (unsigned char *)picture[0].data < dx*dy); j++, out_pix++) { 
-    *out_pix = back;
+  out_pix = &data[j_end*dx];
+  for (j = 0; j < dy - j_end; j++) {
+    for (i = 0; i < dx; i++, out_pix++) {
+      *out_pix = back;
+    }
   }
   picture[0].pix = XCreateImage (graphic[0].display, graphic[0].visual, graphic[0].depth, ZPixmap, 0, 
