IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 25289


Ignore:
Timestamp:
Sep 8, 2009, 4:23:10 PM (17 years ago)
Author:
eugene
Message:

fix calculation of start and stop pixels to display all pixels consistently between zoom factors

Location:
branches/eam_branches/20090715/Ohana/src/kapa2/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap16.c

    r18324 r25289  
    11# include "Ximage.h"
     2# define OUT_TYPE unsigned short
    23
    34# define MY_SWAP_BYTE(W) { \
     
    1011  int i, j, ii, jj;
    1112  int i_start, i_end, j_start, j_end;
    12   int dropback;
     13  int I_start, J_start;
     14  int dropback, inDX, inDY;
    1315  int dx, dy, DX, DY;
    1416  double expand, Ix, Iy;
    1517  int expand_in, expand_out;
    16   unsigned short *out_pix, *out_pix2, *data;
     18  OUT_TYPE *out_pix, *out_pix2, *data;
    1719  unsigned short *in_pix, *in_pix2;
    18   unsigned short *pixel, pixvalue;
    19   unsigned short back;
     20  OUT_TYPE *pixel, pixvalue;
     21  OUT_TYPE back;
    2022  int swap_client, swap_server, swap_bytes;
    2123
    22   ALLOCATE (pixel, unsigned short, graphic[0].Npixels);
     24  // just skip if there is no data
     25  if (matrix[0].Naxes == 0) return;
     26  if (matrix[0].Naxis[0] == 0) return;
     27  if (matrix[0].Naxis[1] == 0) return;
     28
     29  ALLOCATE (pixel, OUT_TYPE, graphic[0].Npixels);
    2330
    2431# ifdef BYTE_SWAP
     
    3845  back = 0xffff & graphic[0].back;
    3946  if (swap_bytes) MY_SWAP_BYTE (back);
    40   // XXX not certain this is the correct solution...
    4147
    4248  // set up expansions
     
    6066  DY = matrix[0].Naxis[1];
    6167
    62   // x, y are the closest lit screen pixel to 0,0
    63   Picture_Lower (&i_start, &j_start, matrix, picture);
     68  // i_start, j_start are the closest lit screen pixel to 0,0
     69  // I_start, J_start are the image pixel corresponding to i_start, j_start
     70  Picture_Lower (&i_start, &j_start, &I_start, &J_start, matrix, picture);
    6471
    65   // x, y are the closest lit screen pixel to dx, dy
    66   Picture_Upper (&i_end, &j_end, matrix, picture);
     72  // i_end, j_end are the closest lit screen pixel to dx, dy
     73  // I_end, J_end are the image pixel corresponding to i_end, j_end
     74  Picture_Upper (&i_end, &j_end, i_start, j_start, matrix, picture);
    6775
    68   // Ix,Iy are the first displayed image pixel
    69   Picture_to_Image (&Ix, &Iy, i_start, j_start, picture);
     76  assert (i_start <= i_end);
     77  assert (j_start <= j_end);
     78
     79  Ix = picture[0].flipx ? I_start - 1 : I_start;
     80  Iy = picture[0].flipy ? J_start - 1 : J_start;
     81
     82  inDX = picture[0].flipx ? -1 : +1;
     83  inDY = picture[0].flipy ? -1 : +1;
    7084
    7185  dropback = expand_out - (i_end - i_start) % expand_out;
    7286  if ((i_end - i_start) % expand_out == 0) dropback = 0;
    7387
    74   data = out_pix = (unsigned short *) picture[0].data;
     88  out_pix = data = (OUT_TYPE *) picture[0].data;
    7589  in_pix  = &image[0].pixmap[DX*(int)MAX(Iy,0) + (int)MAX(Ix,0)];
    7690
     
    8296  }
    8397 
    84   for (j = j_start; j < j_end; j+= expand_out, in_pix += expand_in*DX) {
     98  for (j = j_start; j < j_end; j+= expand_out, in_pix += inDY*expand_in*DX) {
    8599    out_pix = &data[j*dx];
    86100
     
    97111    in_pix2 = in_pix;
    98112    if (expand_out == 1) {
    99       for (i = i_start; i < i_end; i++, in_pix2+= expand_in, out_pix++) {
     113      for (i = i_start; i < i_end; i++, in_pix2 += inDX*expand_in, out_pix++) {
    100114        *out_pix = pixel[*in_pix2];
    101115      }
    102116    } else {
    103       for (i = i_start; i < i_end; i+= expand_out, in_pix2++, out_pix+= expand_out) {
     117      for (i = i_start; i < i_end; i+= expand_out, in_pix2 += inDX, out_pix+= expand_out) {
    104118        pixvalue = pixel[*in_pix2];
    105119        out_pix2 = out_pix;
     
    124138  /**** fill in top area ****/
    125139  out_pix = &data[j_end*dx];
    126   for (j = 0; j < (dy - j_end); j++) {
     140  for (j = 0; j < dy - j_end; j++) {
    127141    for (i = 0; i < dx; i++, out_pix++) {
    128142      *out_pix = back;
  • branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap24.c

    r18324 r25289  
    55  int i, j, ii, jj;
    66  int i_start, i_end, j_start, j_end;
    7   int dropback, extra;
     7  int I_start, J_start;
     8  int dropback, extra, inDX, inDY;
    89  int dx, dy, DX, DY;
    910  double expand, Ix, Iy;
     
    5354  extra = 4 - (dx * 3) % 4;
    5455
    55   // x, y are the closest lit screen pixel to 0,0
    56   Picture_Lower (&i_start, &j_start, matrix, picture);
     56  // i_start, j_start are the closest lit screen pixel to 0,0
     57  // I_start, J_start are the image pixel corresponding to i_start, j_start
     58  Picture_Lower (&i_start, &j_start, &I_start, &J_start, matrix, picture);
    5759
    58   // x, y are the closest lit screen pixel to dx, dy
    59   Picture_Upper (&i_end, &j_end, matrix, picture);
     60  // i_end, j_end are the closest lit screen pixel to dx, dy
     61  // I_end, J_end are the image pixel corresponding to i_end, j_end
     62  Picture_Upper (&i_end, &j_end, i_start, j_start, matrix, picture);
    6063
    61   // Ix,Iy are the first displayed image pixel
    62   Picture_to_Image (&Ix, &Iy, i_start, j_start, picture);
     64  assert (i_start <= i_end);
     65  assert (j_start <= j_end);
     66
     67  Ix = picture[0].flipx ? I_start - 1 : I_start;
     68  Iy = picture[0].flipy ? J_start - 1 : J_start;
     69
     70  inDX = picture[0].flipx ? -1 : +1;
     71  inDY = picture[0].flipy ? -1 : +1;
    6372
    6473  dropback = expand_out - (i_end - i_start) % expand_out;
     
    8089  }
    8190 
    82   for (j = j_start; j < j_end; j+= expand_out, in_pix += expand_in*DX) {
     91  for (j = j_start; j < j_end; j+= expand_out, in_pix += inDY*expand_in*DX) {
    8392    out_pix = &data[j*(3*dx+extra)];
    8493
     
    97106    in_pix2 = in_pix;
    98107    if (expand_out == 1) {
    99       for (i = i_start; i < i_end; i++, in_pix2+= expand_in, out_pix+=3) {
     108      for (i = i_start; i < i_end; i++, in_pix2+= inDX*expand_in, out_pix+=3) {
    100109        out_pix[0] = pixel1[*in_pix2];
    101110        out_pix[1] = pixel2[*in_pix2];
     
    103112      }
    104113    } else {
    105       for (i = i_start; i < i_end; i+= expand_out, in_pix2++, out_pix+= 3*expand_out) {
     114      for (i = i_start; i < i_end; i+= expand_out, in_pix2 += inDX, out_pix+= 3*expand_out) {
    106115        pixvalue1 = pixel1[*in_pix2];
    107116        pixvalue2 = pixel2[*in_pix2];
     
    121130    /**** fill in area to the right of the picture ****/
    122131    for (jj = 0; (jj < expand_out) && (j + jj < dy); jj++) {
    123       //    for (jj = 0; jj < expand_out; jj++) {
    124132      out_pix2 = out_pix + jj*(3*dx+extra);
    125133      for (i = i_end; i < dx; i++, out_pix2+=3) {
  • branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap32.c

    r18324 r25289  
    11# include "Ximage.h"
     2# define OUT_TYPE unsigned int
    23
    34# define MY_SWAP_INT(A,B) { int tmp; tmp = A; A = B; B = tmp; }
    45
    5 # define MY_SWAP_WORD(W) { \
    6   char tmp, *X; \
    7   X = (char *) &W; \
    8   tmp = X[0]; X[0] = X[3]; X[3] = tmp; \
    9   tmp = X[1]; X[1] = X[2]; X[2] = tmp; }
     6# define MY_SWAP_WORD(W) {                      \
     7    char tmp, *X;                               \
     8    X = (char *) &W;                            \
     9    tmp = X[0]; X[0] = X[3]; X[3] = tmp;        \
     10    tmp = X[1]; X[1] = X[2]; X[2] = tmp; }
    1011
    1112void Remap32 (Graphic *graphic, KapaImageWidget *image, Picture *picture, Matrix *matrix) {
     
    1314  int i, j, ii, jj;
    1415  int i_start, i_end, j_start, j_end;
     16  int I_start, J_start;
    1517  int dropback, inDX, inDY;
    1618  int dx, dy, DX, DY;
    1719  double expand, Ix, Iy;
    1820  int expand_in, expand_out;
    19   unsigned int *out_pix, *out_pix2;
     21  OUT_TYPE *out_pix, *out_pix2, *data;
    2022  unsigned short *in_pix, *in_pix2;
    21   unsigned long *pixel, pixvalue;
    22   unsigned long back;
     23  OUT_TYPE *pixel, pixvalue;
     24  OUT_TYPE back;
    2325  int swap_client, swap_server, swap_bytes;
    2426
    25   ALLOCATE (pixel, unsigned long, graphic[0].Npixels);
     27  // just skip if there is no data
     28  if (matrix[0].Naxes == 0) return;
     29  if (matrix[0].Naxis[0] == 0) return;
     30  if (matrix[0].Naxis[1] == 0) return;
     31
     32  ALLOCATE (pixel, OUT_TYPE, graphic[0].Npixels);
    2633
    2734# ifdef BYTE_SWAP
     
    4350
    4451  // set up expansions
    45   assert ((picture[0].expand >= 1) || (picture[0].expand <= -1));
     52  assert ((picture[0].expand >= 1) || (picture[0].expand <= -2));
    4653  expand = expand_in = expand_out = 1.0;
    4754  if (picture[0].expand > 0) {
     
    6269  DY = matrix[0].Naxis[1];
    6370
    64   // x, y are the closest lit screen pixel to 0,0
    65   Picture_Lower (&i_start, &j_start, matrix, picture);
     71  // i_start, j_start are the closest lit screen pixel to 0,0
     72  // I_start, J_start are the image pixel corresponding to i_start, j_start
     73  Picture_Lower (&i_start, &j_start, &I_start, &J_start, matrix, picture);
    6674
    67   // x, y are the closest lit screen pixel to dx, dy
    68   Picture_Upper (&i_end, &j_end, matrix, picture);
     75  // i_end, j_end are the closest lit screen pixel to dx, dy
     76  // I_end, J_end are the image pixel corresponding to i_end, j_end
     77  Picture_Upper (&i_end, &j_end, i_start, j_start, matrix, picture);
    6978
    70   if (i_end < i_start) MY_SWAP_INT (i_start, i_end);
    71   if (j_end < j_start) MY_SWAP_INT (j_start, j_end);
     79  assert (i_start <= i_end);
     80  assert (j_start <= j_end);
    7281
    73   // Ix,Iy are the first displayed image pixel
    74   Picture_to_Image (&Ix, &Iy, i_start, j_start, picture);
    75   Ix = MIN (MAX (0, Ix), DX - 1);
    76   Iy = MIN (MAX (0, Iy), DY - 1);
    77   // XXX not completely consistent with the i_start, i_end range...
    78 
    79   // we need to offset because i_start points to the bottom edge of Ix
    80   // if (picture[0].flipx) Ix -= 1.0;
    81   // if (picture[0].flipy) Iy -= 1.0;
     82  Ix = picture[0].flipx ? I_start - 1 : I_start;
     83  Iy = picture[0].flipy ? J_start - 1 : J_start;
    8284
    8385  inDX = picture[0].flipx ? -1 : +1;
     
    8789  if ((i_end - i_start) % expand_out == 0) dropback = 0;
    8890
    89   out_pix = (unsigned int *) picture[0].data;
     91  out_pix = data = (OUT_TYPE *) picture[0].data;
    9092  in_pix  = &image[0].pixmap[DX*(int)MAX(Iy,0) + (int)MAX(Ix,0)];
    9193
     
    9799  }
    98100 
    99   for (j = j_start; j < j_end; j+= expand_out, out_pix+=(expand_out-1)*dx, in_pix += inDY*expand_in*DX) {
     101  for (j = j_start; j < j_end; j+= expand_out, in_pix += inDY*expand_in*DX) {
     102    out_pix = &data[j*dx];
    100103
    101104    /**** fill in area to the left of the picture ****/
     
    126129    }
    127130    out_pix -= dropback;
    128    
    129     // assert (in_pix2 - image[0].pixmap <= DX*DY);
    130     // assert (in_pix2 - image[0].pixmap >= 0);
    131     // assert (in_pix - image[0].pixmap <= DX*DY);
    132     // assert (in_pix - image[0].pixmap >= 0);
    133131
    134132    /**** fill in area to the right of the picture ****/
     
    139137      }
    140138    }
    141     out_pix += (dx - i_end);
    142     // assert (out_pix - (unsigned int *)picture[0].data <= dx*dy);
    143     // assert (out_pix - (unsigned int *)picture[0].data >= 0);
    144139  }
    145  
    146   if ((j_end - j_start) % expand_out > 0)
    147     out_pix -= expand_out - (j_end - j_start) % expand_out;
    148  
    149   // assert (out_pix - (unsigned int *)picture[0].data <= dx*dy);
    150   // assert (out_pix - (unsigned int *)picture[0].data >= 0);
    151140
    152141  /**** fill in top area ****/
    153   for (j = 0; (j < dx*(dy - j_end)) && (out_pix - (unsigned int *)picture[0].data < dx*dy); j++, out_pix++) {
    154     *out_pix = back;
     142  out_pix = &data[j_end*dx];
     143  for (j = 0; j < dy - j_end; j++) {
     144    for (i = 0; i < dx; i++, out_pix ++) {
     145      *out_pix = back;
     146    }
    155147  }
    156148
    157149  picture[0].pix = XCreateImage (graphic[0].display, graphic[0].visual, graphic[0].depth, ZPixmap, 0,
    158                                         picture[0].data, picture[0].dx, picture[0].dy, 32, 0);
     150                                 picture[0].data, picture[0].dx, picture[0].dy, 32, 0);
    159151
    160152  free (pixel);
  • branches/eam_branches/20090715/Ohana/src/kapa2/src/Remap8.c

    r18324 r25289  
    11# include "Ximage.h"
     2# define OUT_TYPE unsigned char
    23
    34void Remap8 (Graphic *graphic, KapaImageWidget *image, Picture *picture, Matrix *matrix) {
     
    56  int i, j, ii, jj;
    67  int i_start, i_end, j_start, j_end;
    7   int dropback;
     8  int I_start, J_start;
     9  int dropback, inDX, inDY;
    810  int dx, dy, DX, DY;
    911  double expand, Ix, Iy;
    1012  int expand_in, expand_out;
    11   unsigned char *out_pix, *out_pix2;
    12   unsigned short *in_pix,  *in_pix2;
    13   unsigned char *pixel, pixvalue;
    14   unsigned char back;
     13  OUT_TYPE *out_pix, *out_pix2, *data;
     14  unsigned short *in_pix, *in_pix2;
     15  OUT_TYPE *pixel, pixvalue;
     16  OUT_TYPE back;
    1517
    16   ALLOCATE (pixel, unsigned char, graphic[0].Npixels);
     18  // just skip if there is no data
     19  if (matrix[0].Naxes == 0) return;
     20  if (matrix[0].Naxis[0] == 0) return;
     21  if (matrix[0].Naxis[1] == 0) return;
     22
     23  ALLOCATE (pixel, OUT_TYPE, graphic[0].Npixels);
    1724
    1825  // local array for pixel values
     
    4451  DY = matrix[0].Naxis[1];
    4552
    46   // x, y are the closest lit screen pixel to 0,0
    47   Picture_Lower (&i_start, &j_start, matrix, picture);
     53  // i_start, j_start are the closest lit screen pixel to 0,0
     54  // I_start, J_start are the image pixel corresponding to i_start, j_start
     55  Picture_Lower (&i_start, &j_start, &I_start, &J_start, matrix, picture);
    4856
    49   // x, y are the closest lit screen pixel to dx, dy
    50   Picture_Upper (&i_end, &j_end, matrix, picture);
     57  // i_end, j_end are the closest lit screen pixel to dx, dy
     58  // I_end, J_end are the image pixel corresponding to i_end, j_end
     59  Picture_Upper (&i_end, &j_end, i_start, j_start, matrix, picture);
    5160
    52   // Ix,Iy are the first displayed image pixel
    53   Picture_to_Image (&Ix, &Iy, i_start, j_start, picture);
     61  assert (i_start <= i_end);
     62  assert (j_start <= j_end);
     63
     64  Ix = picture[0].flipx ? I_start - 1 : I_start;
     65  Iy = picture[0].flipy ? J_start - 1 : J_start;
     66
     67  inDX = picture[0].flipx ? -1 : +1;
     68  inDY = picture[0].flipy ? -1 : +1;
    5469
    5570  dropback = expand_out - (i_end - i_start) % expand_out;
    5671  if ((i_end - i_start) % expand_out == 0) dropback = 0;
    5772
    58   out_pix = (unsigned char *) picture[0].data;
     73  out_pix = data = (OUT_TYPE *) picture[0].data;
    5974  in_pix  = &image[0].pixmap[DX*(int)MAX(Iy,0) + (int)MAX(Ix,0)];
    6075
     
    6681  }
    6782 
    68   for (j = j_start; j < j_end; j+= expand_out, out_pix+=(expand_out-1)*dx, in_pix += expand_in*DX) {
     83  for (j = j_start; j < j_end; j+= expand_out, in_pix += inDY*expand_in*DX) {
     84    out_pix = &data[j*dx];
    6985
    7086    /**** fill in area to the left of the picture ****/
     
    8096    in_pix2 = in_pix;
    8197    if (expand_out == 1) {
    82       for (i = i_start; i < i_end; i++, in_pix2+= expand_in, out_pix++) {
     98      for (i = i_start; i < i_end; i++, in_pix2 += inDX*expand_in, out_pix++) {
    8399        *out_pix = pixel[*in_pix2];
    84100      }
    85101    } else {
    86       for (i = i_start; i < i_end; i+= expand_out, in_pix2++, out_pix+= expand_out) {
     102      for (i = i_start; i < i_end; i+= expand_out, in_pix2 += inDX, out_pix+= expand_out) {
    87103        pixvalue = pixel[*in_pix2];
    88104        out_pix2 = out_pix;
    89         for (jj = 0; (jj < expand_out) & (j + jj < dy); jj++, out_pix2+=(dx-expand_out)) {
     105        for (jj = 0; (jj < expand_out) && (j + jj < dy); jj++, out_pix2+=(dx-expand_out)) {
    90106          for (ii = 0; ii < expand_out; ii++, out_pix2++) {
    91107            *out_pix2 = pixvalue;
     
    103119      }
    104120    }
    105     out_pix += (dx - i_end);
    106    
    107121  }
    108122 
    109   if ((j_end - j_start) % expand_out > 0)
    110     out_pix -= expand_out - (j_end - j_start) % expand_out;
    111  
    112123  /**** fill in top area ****/
    113   for (j = 0; (j < dx*(dy - j_end)) && (out_pix - (unsigned char *)picture[0].data < dx*dy); j++, out_pix++) {
    114     *out_pix = back;
     124  out_pix = &data[j_end*dx];
     125  for (j = 0; j < dy - j_end; j++) {
     126    for (i = 0; i < dx; i++, out_pix++) {
     127      *out_pix = back;
     128    }
    115129  }
    116130  picture[0].pix = XCreateImage (graphic[0].display, graphic[0].visual, graphic[0].depth, ZPixmap, 0,
Note: See TracChangeset for help on using the changeset viewer.