Changeset 23810 for trunk/psastro/src
- Timestamp:
- Apr 10, 2009, 3:00:23 PM (17 years ago)
- Location:
- trunk/psastro/src
- Files:
-
- 4 added
- 6 edited
- 1 moved
-
Makefile.am (modified) (3 diffs)
-
psastro.c (modified) (1 diff)
-
psastro.h (modified) (2 diffs)
-
psastroExtractGhosts.c (modified) (1 diff)
-
psastroExtractStar.c (modified) (1 diff)
-
psastroFindChip.c (moved) (moved from trunk/psastro/src/psastroExtractFindChip.c ) (4 diffs, 1 prop)
-
psastroGhostUtils.c (added)
-
psastroLoadGhosts.c (added)
-
psastroMaskMisc.c (added)
-
psastroMaskUpdates.c (modified) (11 diffs)
-
psastroMaskUtils.c (added)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psastro/src/Makefile.am
r23808 r23810 65 65 psastroExtractStars.c \ 66 66 psastroExtractGhosts.c \ 67 psastroExtractFindChip.c \68 67 psastroCleanup.c 69 68 … … 88 87 89 88 libpsastro_la_SOURCES = \ 89 psastroMaskUpdates.c \ 90 psastroMaskUtils.c \ 91 psastroLoadGhosts.c \ 92 psastroGhostUtils.c \ 90 93 psastroErrorCodes.c \ 91 94 psastroVersion.c \ 92 95 psastroDefineFiles.c \ 93 96 psastroAnalysis.c \ 94 psastroMaskUpdates.c \95 97 psastroAstromGuess.c \ 96 98 psastroLoadRefstars.c \ … … 117 119 psastroMosaicSetAstrom.c \ 118 120 psastroMosaicSetMatch.c \ 121 psastroFindChip.c \ 119 122 psastroZeroPoint.c \ 120 123 psastroDemoDump.c \ -
trunk/psastro/src/psastro.c
r23688 r23810 70 70 } 71 71 72 psFree (stats); 72 73 psLogMsg("psastro", 3, "complete psastro run: %f sec\n", psTimerMark ("complete")); 73 74 -
trunk/psastro/src/psastro.h
r23688 r23810 45 45 } pmLumFunc; 46 46 #endif 47 48 /** 49 * this structure defines the parameters to describe a ghost 50 */ 51 typedef struct { 52 psPlane *srcFP; ///< location in FPA coords of the source star 53 psPlane *FP; ///< location in FPA coords of the ghost center 54 psPlane *chip; ///< location in chip coords of the ghost center 55 double Mag; ///< instrumental magnitude of source star 56 psEllipseAxes inner; ///< inner elliptical annulus boundary 57 psEllipseAxes outer; ///< outer elliptical annulus boundary 58 } psastroGhost; 59 60 psastroGhost *psastroGhostAlloc (void); 61 bool psastroLoadGhosts (pmConfig *config); 47 62 48 63 bool psastroDataSave (pmConfig *config, psMetadata *stats); … … 131 146 bool psastroZeroPointFromRecipe (float *zeropt, float *exptime, pmFPA *fpa, psMetadata *recipe); 132 147 148 // masking functions 149 pmCell *pmCellInChip (pmChip *chip, float x, float y); 150 bool pmCellCoordsForChip (float *xCell, float *yCell, pmCell *cell, float xChip, float yChip); 151 bool pmChipCoordsForCell (float *xChip, float *yChip, pmCell *cell, float xCell, float yCell); 152 153 bool psastroMaskCircle (psImage *mask, psImageMaskType value, float x0, float y0, float dX, float dY); 154 bool psastroMaskEllipse (psImage *mask, psImageMaskType value, float x0, float y0, psEllipseAxes axes); 155 bool psastroMaskEllipticalAnnulus (psImage *mask, psImageMaskType value, float x0, float y0, psEllipseAxes eInner, psEllipseAxes eOuter); 156 157 bool psastroMaskBox (psImage *mask, psImageMaskType value, float x0, float y0, float dL, float dW, float theta); 158 void psastroMaskLine (psImage *mask, psImageMaskType value, double x1, double y1, double x2, double y2, int dW); 159 void psastroMaskLineBresen (psImage *mask, psImageMaskType value, int X1, int Y1, int X2, int Y2, int dW, int swapcoords); 160 void psastroMaskRectangle (psImage *mask, psImageMaskType value, int x0, int y0, int x1, int y1); 161 162 pmChip *psastroFindChip (double *xChip, double *yChip, pmFPA *fpa, double xFPA, double yFPA); 163 bool psastroChipBounds (pmFPA *fpa); 164 133 165 // psastroExtract functions 134 166 bool psastroExtractAnalysis (pmConfig *config); 135 167 bool psastroExtractStars (pmConfig *config); 136 168 bool psastroExtractGhosts (pmConfig *config); 137 pmChip *psastroExtractFindChip (float *xChip, float *yChip, pmFPA *fpa, float xFPA, float yFPA);138 bool psastroExtractChipBounds (pmFPA *fpa);139 169 140 psImage *psastroExtractStar (psImage *input, float x, float y, float dX, floatdY);170 psImage *psastroExtractStar (psImage *input, double x, double y, double dX, double dY); 141 171 bool psastroExtractParseCamera (pmConfig *config); 142 172 bool psastroExtractDataLoad (pmConfig *config); -
trunk/psastro/src/psastroExtractGhosts.c
r23669 r23810 89 89 90 90 // XXX can make a more clever model... 91 floatxFPA = -1*ref->FP->x;92 floatyFPA = -1*ref->FP->y;91 double xFPA = -1*ref->FP->x; 92 double yFPA = -1*ref->FP->y; 93 93 94 floatxChip, yChip;95 pmChip *ghostChip = psastro ExtractFindChip (&xChip, &yChip, fpa, xFPA, yFPA);94 double xChip, yChip; 95 pmChip *ghostChip = psastroFindChip (&xChip, &yChip, fpa, xFPA, yFPA); 96 96 if (!ghostChip) continue; 97 97 if (!ghostChip->cells) continue; -
trunk/psastro/src/psastroExtractStar.c
r23591 r23810 13 13 # include "psastroInternal.h" 14 14 15 psImage *psastroExtractStar (psImage *input, float x, float y, float dX, floatdY) {15 psImage *psastroExtractStar (psImage *input, double x, double y, double dX, double dY) { 16 16 17 17 // skip if no pixels are on the image -
trunk/psastro/src/psastroFindChip.c
-
Property svn:mergeinfo
set to (toggle deleted branches)
/branches/cnb_branch_20090215/psastro/src/psastroExtractFindChip.c 21495-22685 /branches/cnb_branches/cnb_branch_20090215/psastro/src/psastroExtractFindChip.c 22686-23240 /branches/eam_branches/eam_branch_20090312/psastro/src/psastroExtractFindChip.c 23321-23409 /branches/pap/psastro/src/psastroExtractFindChip.c 23511-23685,23690-23739
r23745 r23810 1 /** @file psastro ExtractFindChip.c1 /** @file psastroFindChip.c 2 2 * 3 3 * @brief calculate chip position for the given FPA coords … … 18 18 static psVector *chipYmax = NULL; 19 19 20 bool psastro ExtractChipBounds (pmFPA *fpa) {20 bool psastroChipBounds (pmFPA *fpa) { 21 21 22 22 chipXmin = psVectorAlloc (fpa->chips->n, PS_TYPE_F32); … … 69 69 } 70 70 71 pmChip *psastro ExtractFindChip (float *xChip, float *yChip, pmFPA *fpa, float xFPA, floatyFPA) {71 pmChip *psastroFindChip (double *xChip, double *yChip, pmFPA *fpa, double xFPA, double yFPA) { 72 72 73 73 *xChip = NAN; … … 75 75 76 76 if (!chipXmin) { 77 psastro ExtractChipBounds (fpa);77 psastroChipBounds (fpa); 78 78 } 79 79 -
Property svn:mergeinfo
set to (toggle deleted branches)
-
trunk/psastro/src/psastroMaskUpdates.c
r23665 r23810 19 19 } 20 20 21 pmCell *pmCellInChip (pmChip *chip, float x, float y);22 bool pmCellCoordsForChip (float *xCell, float *yCell, pmCell *cell, float xChip, float yChip);23 bool pmChipCoordsForCell (float *xChip, float *yChip, pmCell *cell, float xCell, float yCell);24 25 bool psastroMaskCircle (psImage *mask, psImageMaskType value, float x0, float y0, float dX, float dY);26 bool psastroMaskBox (psImage *mask, psImageMaskType value, float x0, float y0, float dL, float dW, float theta);27 void psastroMaskLine (psImage *mask, psImageMaskType value, double x1, double y1, double x2, double y2, int dW);28 void psastroMaskLineBresen (psImage *mask, psImageMaskType value, int X1, int Y1, int X2, int Y2, int dW, int swapcoords);29 void psastroMaskRectangle (psImage *mask, psImageMaskType value, int x0, int y0, int x1, int y1);30 31 21 /** 32 22 * create a mask or mask regions based on the collection of reference stars that * are in the vicinity of each chip … … 40 30 float zeropt, exptime; 41 31 42 psImageMaskType maskValue = pmConfigMaskGet("GHOST", config); // Mask value for ghost pixels 32 psImageMaskType ghostMaskValue = pmConfigMaskGet("GHOST", config); // Mask value for ghost pixels 33 psImageMaskType spikeMaskValue = pmConfigMaskGet("SPIKE", config); // Mask value for ghost pixels 34 psImageMaskType starMaskValue = pmConfigMaskGet("STARCORE", config); // Mask value for ghost pixels 43 35 44 36 // psImageMaskType maskBlank = pmConfigMaskGet("BLANK", config); // Mask value for blank pixels … … 55 47 if (!REFSTAR_MASK) return true; 56 48 49 // convert star positions to ghost positions and add to the readout->analysis data 50 if (!psastroLoadGhosts (config)) { 51 psError(PSASTRO_ERR_CONFIG, false, "Error loading ghosts"); 52 return false; 53 } 54 57 55 psLogMsg ("psastro", PS_LOG_INFO, "generating a bright-star mask"); 58 56 59 bool REFSTAR_MASK_REGIONS = psMetadataLookupBool (&status, recipe, "REFSTAR_MASK_REGIONS");60 57 bool REFSTAR_MASK_BLEED = psMetadataLookupBool (&status, recipe, "REFSTAR_MASK_BLEED"); 61 58 … … 134 131 if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) ESCAPE; 135 132 136 // text region files for testing137 FILE *f = NULL;138 if (REFSTAR_MASK_REGIONS) {139 char *filename = NULL;140 char *chipname = psMetadataLookupStr (&status, chip->concepts, "CHIP.NAME");141 psStringAppend (&filename, "refstars.mask.%s.dat", chipname);142 FILE *f = fopen (filename, "w");143 if (!f) {144 psWarning ("cannot create refstar mask file %s\n", filename);145 continue;146 }147 psFree (filename);148 }149 150 133 pmChip *refChip = pmFPAviewThisChip (view, refMask->fpa); 151 134 … … 173 156 174 157 // we mask pixels on the input mask image (chip-mosaic) 175 pmCell *cellMask = pmFPAviewThisCell(view, outMask->fpa);176 pmReadout *readoutMask = NULL;177 if (cellMask->readouts->n) {178 readoutMask = cellMask->readouts->data[0];179 }158 // pmCell *cellMask = pmFPAviewThisCell(view, outMask->fpa); 159 // pmReadout *readoutMask = NULL; 160 // if (cellMask->readouts->n) { 161 // readoutMask = cellMask->readouts->data[0]; 162 // } 180 163 181 164 // process each of the readouts … … 184 167 if (! readout->data_exists) { continue; } 185 168 169 // XXX why not do this? 170 pmReadout *readoutMask = pmFPAviewThisReadout (view, outMask->fpa); 171 if (!readoutMask) continue; 172 186 173 // select the raw objects for this readout 187 174 psArray *refstars = psMetadataLookupPtr (&status, readout->analysis, "PSASTRO.REFSTARS"); 188 if ( refstars == NULL) { continue; }175 if (!refstars) continue; 189 176 190 177 // we need to generate the following masks regions: … … 204 191 float radius = REFSTAR_MASK_SATSTAR_MAG_SLOPE * (REFSTAR_MASK_SATSTAR_MAG_MAX - ref->Mag); 205 192 206 if (REFSTAR_MASK_REGIONS) {207 fprintf (f, "CIRCLE %f %f %f %f\n", ref->chip->x, ref->chip->y, radius, radius);208 }209 210 193 // XXX for now, assume cell binning is 1x1 relative to chip 211 if (readoutMask) { 212 psastroMaskCircle (readoutMask->mask, maskValue, ref->chip->x, ref->chip->y, radius, radius); 213 } 214 215 // LINE for boundaries of the saturation spikes (scaled by magnitude) 216 float spikeLength = REFSTAR_MASK_SATSPIKE_MAG_SLOPE * (REFSTAR_MASK_SATSPIKE_MAG_MAX - ref->Mag); 217 float spikeWidth = 0.5*REFSTAR_MASK_SATSPIKE_WIDTH; 194 psastroMaskCircle (readoutMask->mask, starMaskValue, ref->chip->x, ref->chip->y, radius, radius); 218 195 219 196 for (float theta = 0.0; theta < 2*M_PI; theta += M_PI / 2.0) { 220 float x0, y0, x1, y1, dx, dy;221 197 222 198 float Theta = theta - ROTANGLE - REFSTAR_MASK_SATSTAR_POS_ZERO; 223 199 224 if (REFSTAR_MASK_REGIONS) { 225 // lower side 226 x0 = ref->chip->x + spikeWidth*sin(Theta); 227 y0 = ref->chip->y - spikeWidth*cos(Theta); 228 x1 = ref->chip->x + spikeLength*cos(Theta) + spikeWidth*sin(Theta); 229 y1 = ref->chip->y + spikeLength*sin(Theta) - spikeWidth*cos(Theta); 230 dx = x1 - x0; 231 dy = y1 - y0; 232 233 fprintf (f, "LINE %f %f %f %f\n", x0, y0, dx, dy); 234 235 // upper side 236 x0 = ref->chip->x - spikeWidth*sin(Theta); 237 y0 = ref->chip->y + spikeWidth*cos(Theta); 238 x1 = ref->chip->x + spikeLength*cos(Theta) - spikeWidth*sin(Theta); 239 y1 = ref->chip->y + spikeLength*sin(Theta) + spikeWidth*cos(Theta); 240 dx = x1 - x0; 241 dy = y1 - y0; 242 fprintf (f, "LINE %f %f %f %f\n", x0, y0, dx, dy); 243 } 244 245 if (readoutMask) { 246 psastroMaskBox (readoutMask->mask, maskValue, ref->chip->x, ref->chip->y, spikeLength, spikeWidth, Theta); 247 } 200 // LINE for boundaries of the saturation spikes (scaled by magnitude) 201 // float MAG_MAX = (theta == 0.0) || (theta == M_PI) ? REFSTAR_MASK_SATSPIKE_MAG_MAX1 : REFSTAR_MASK_SATSPIKE_MAG_MAX2; 202 203 float MAG_MAX = REFSTAR_MASK_SATSPIKE_MAG_MAX; 204 float spikeLength = REFSTAR_MASK_SATSPIKE_MAG_SLOPE * (MAG_MAX - ref->Mag); 205 float spikeWidth = 0.5*REFSTAR_MASK_SATSPIKE_WIDTH; 206 // XXX we can make the width depend on the spike as well... 207 // The length should also be a function of the image background level 208 209 psastroMaskBox (readoutMask->mask, spikeMaskValue, ref->chip->x, ref->chip->y, spikeLength, spikeWidth, Theta); 248 210 } 249 211 … … 254 216 255 217 // LINE for boundaries of the bleed lines 256 if (REFSTAR_MASK_REGIONS) { 257 fprintf (f, "LINE %f %f %f %f\n", ref->chip->x, ref->chip->y, 0.0, -100.0); 258 } 259 260 if (readoutMask && refCell) { 218 if (refCell) { 261 219 float xCell = 0.0; 262 220 float yCell = 0.0; … … 271 229 272 230 float width = REFSTAR_MASK_BLEED_MAG_SLOPE*(REFSTAR_MASK_BLEED_MAG_MAX - ref->Mag); 273 psastroMaskRectangle (readoutMask->mask, maskValue, (int) ref->chip->x-0.5*width, (int) ref->chip->y, (int) ref->chip->x+0.5*width+1, yEnd);231 psastroMaskRectangle (readoutMask->mask, spikeMaskValue, (int) ref->chip->x-0.5*width, (int) ref->chip->y, (int) ref->chip->x+0.5*width+1, yEnd); 274 232 } 275 233 } 276 234 } 235 236 // select the raw objects for this readout (loaded in psastroExtract.c) 237 psArray *ghosts = psMetadataLookupPtr (&status, readout->analysis, "PSASTRO.GHOSTS"); 238 if (ghosts == NULL) { continue; } 239 240 // identify the bright stars of interest 241 for (int i = 0; i < ghosts->n; i++) { 242 psastroGhost *ghost = ghosts->data[i]; 243 // XXX bright vs faint ghost bits? (OR with SUSPECT) 244 psastroMaskEllipticalAnnulus (readoutMask->mask, ghostMaskValue, ghost->chip->x, ghost->chip->y, ghost->inner, ghost->outer); 245 } 246 247 // select the raw objects for this readout, flag is they fall in a mask 248 psArray *rawstars = psMetadataLookupPtr (&status, readout->analysis, "PSASTRO.RAWSTARS"); 249 if (rawstars == NULL) return false; 250 251 // XXX finish this: 252 for (int i = 0; i < rawstars->n; i++) { 253 pmAstromObj *raw = rawstars->data[i]; 254 psImageMaskType value = readoutMask->mask->data.PS_TYPE_IMAGE_MASK_DATA[(int)(raw->chip->x)][(int)(raw->chip->y)]; 255 if (value) continue; 256 } 277 257 } 278 258 } 279 259 280 // output sequence for mask corresponding to this chip 260 // output sequence for mask corresponding to this chip (XXX this may not be needed...) 281 261 *viewMask = *view; 282 262 while ((cell = pmFPAviewNextCell (viewMask, outMask->fpa, 1)) != NULL) { … … 290 270 if (!pmFPAfileIOChecks (config, viewMask, PM_FPA_AFTER)) ESCAPE; 291 271 } 292 293 272 if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) ESCAPE; 294 if (REFSTAR_MASK_REGIONS) {295 fclose (f);296 }297 273 } 298 274 if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) ESCAPE; … … 306 282 } 307 283 308 // XXX this is going to be very slow...309 pmCell *pmCellInChip (pmChip *chip, float x, float y) {310 311 # if (0)312 int x0Cell = psMetadataLookupS32(NULL, cell->concepts, "CELL.X0");313 int y0Cell = psMetadataLookupS32(NULL, cell->concepts, "CELL.Y0");314 int xParityCell = psMetadataLookupS32(NULL, cell->concepts, "CELL.XPARITY");315 int yParityCell = psMetadataLookupS32(NULL, cell->concepts, "CELL.YPARITY");316 317 // XXX fix the binning : currently not selected from concepts318 // int xBin = psMetadataLookupS32(NULL, cell->concepts, "CELL.XBIN"); // Binning in x and y319 // int yBin = psMetadataLookupS32(NULL, cell->concepts, "CELL.YBIN"); // Binning in x and y320 int xBin = 1;321 int yBin = 1;322 323 // Position on the cell324 float xCell = PM_CHIP_TO_CELL(xChip, x0Cell, xParityCell, xBin);325 float yCell = PM_CHIP_TO_CELL(yChip, y0Cell, yParityCell, yBin);326 # endif327 328 for (int i = 0; i < chip->cells->n; i++) {329 330 pmCell *cell = chip->cells->data[i];331 psRegion *region = pmCellExtent (cell);332 333 if (x < region->x0) goto skip;334 if (x > region->x1) goto skip;335 if (y < region->y0) goto skip;336 if (y > region->y1) goto skip;337 338 psFree (region);339 return cell;340 341 skip:342 psFree (region);343 }344 return NULL;345 }346 347 /**348 * convert chip coords to cell coords, given known cell349 */350 bool pmCellCoordsForChip (float *xCell, float *yCell, pmCell *cell, float xChip, float yChip) {351 352 int x0Cell = psMetadataLookupS32(NULL, cell->concepts, "CELL.X0");353 int y0Cell = psMetadataLookupS32(NULL, cell->concepts, "CELL.Y0");354 int xParityCell = psMetadataLookupS32(NULL, cell->concepts, "CELL.XPARITY");355 int yParityCell = psMetadataLookupS32(NULL, cell->concepts, "CELL.YPARITY");356 357 // XXX fix the binning : currently not selected from concepts358 // int xBin = psMetadataLookupS32(NULL, cell->concepts, "CELL.XBIN"); // Binning in x and y359 // int yBin = psMetadataLookupS32(NULL, cell->concepts, "CELL.YBIN"); // Binning in x and y360 int xBin = 1;361 int yBin = 1;362 363 // Position on the cell364 // ((pos)*(binning)*(cellParity) + (cell0))365 // XXX this is probably totally wrong now....366 // ((pos) - (cell0))*(cellParity)/(binning))367 *xCell = (xChip - x0Cell)*xParityCell/xBin;368 *yCell = (yChip - y0Cell)*yParityCell/yBin;369 370 return true;371 }372 373 /**374 * convert chip coords to cell coords, given known cell375 */376 bool pmChipCoordsForCell (float *xChip, float *yChip, pmCell *cell, float xCell, float yCell) {377 378 int x0Cell = psMetadataLookupS32(NULL, cell->concepts, "CELL.X0");379 int y0Cell = psMetadataLookupS32(NULL, cell->concepts, "CELL.Y0");380 int xParityCell = psMetadataLookupS32(NULL, cell->concepts, "CELL.XPARITY");381 int yParityCell = psMetadataLookupS32(NULL, cell->concepts, "CELL.YPARITY");382 383 // XXX fix the binning : currently not selected from concepts384 // int xBin = psMetadataLookupS32(NULL, cell->concepts, "CELL.XBIN"); // Binning in x and y385 // int yBin = psMetadataLookupS32(NULL, cell->concepts, "CELL.YBIN"); // Binning in x and y386 int xBin = 1;387 int yBin = 1;388 389 // Position on the cell390 // ((pos)*(binning)*(cellParity) + (cell0))391 // XXX this is probably totally wrong now....392 // ((pos) - (cell0))*(cellParity)/(binning))393 *xChip = xCell*xBin*xParityCell + x0Cell;394 *yChip = yCell*yBin*yParityCell + y0Cell;395 396 return true;397 }398 399 // XXX should be doing an OR400 bool psastroMaskCircle (psImage *mask, psImageMaskType value, float x0, float y0, float dX, float dY) {401 402 // XXX need to worry about row0, col0403 for (int ix = -dX; ix <= +dX; ix++) {404 int jx = ix + x0;405 if (jx < 0) continue;406 if (jx >= mask->numCols) continue;407 for (int iy = -dY; iy <= +dY; iy++) {408 int jy = iy + y0;409 if (jy < 0) continue;410 if (jy >= mask->numRows) continue;411 412 double r2 = PS_SQR(ix/dX) + PS_SQR(iy/dY);413 if (r2 > 1.0) continue;414 415 mask->data.PS_TYPE_IMAGE_MASK_DATA[jy][jx] |= value;416 }417 }418 return true;419 }420 421 // XXX should be doing an OR422 bool psastroMaskBox (psImage *mask, psImageMaskType value, float x0, float y0, float dL, float dW, float theta) {423 424 // draw a series of lines (from -0.5*dW to +0.5*dW) of length dL, starting at x0, y0, angle theta425 426 float xs = x0;427 float ys = y0;428 429 float xe = xs + dL*cos(theta);430 float ye = ys + dL*sin(theta);431 432 psastroMaskLine (mask, value, xs, ys, xe, ye, (int) dW);433 return true;434 }435 436 /**437 * identify the quadrant and draw the correct line438 */439 void psastroMaskLine (psImage *mask, psImageMaskType value, double x1, double y1, double x2, double y2, int dW) {440 441 int FlipDirect, FlipCoords;442 int X1, Y1, X2, Y2, dX, dY;443 444 /* rather than draw the line from float positions, we find the closest445 integer end-points and draw the line between those pixels */446 447 X1 = ROUND(x1);448 Y1 = ROUND(y1);449 X2 = ROUND(x2);450 Y2 = ROUND(y2);451 452 dX = X2 - X1;453 dY = Y2 - Y1;454 455 FlipCoords = (abs(dX) < abs(dY));456 FlipDirect = FlipCoords ? (y1 > y2) : (x1 > x2);457 458 if (!FlipDirect && !FlipCoords) psastroMaskLineBresen (mask, value, X1, Y1, X2, Y2, dW, FALSE);459 if ( FlipDirect && !FlipCoords) psastroMaskLineBresen (mask, value, X2, Y2, X1, Y1, dW, FALSE);460 if (!FlipDirect && FlipCoords) psastroMaskLineBresen (mask, value, Y1, X1, Y2, X2, dW, TRUE);461 if ( FlipDirect && FlipCoords) psastroMaskLineBresen (mask, value, Y2, X2, Y1, X1, dW, TRUE);462 463 return;464 }465 466 /**467 * use the Bresenham line drawing technique468 * integer-only Bresenham line-draw version which is fast469 */470 void psastroMaskLineBresen (psImage *mask, psImageMaskType value, int X1, int Y1, int X2, int Y2, int dW, int swapcoords) {471 472 int X, Y, dX, dY;473 int e, e2;474 475 dX = X2 - X1;476 dY = Y2 - Y1;477 478 Y = Y1;479 e = 0;480 for (X = X1; X <= X2; X++) {481 if (X > 0) {482 if (swapcoords) {483 if (X >= mask->numRows) continue;484 for (int y = Y - dW; y <= Y + dW; y++) {485 if (y < 0) continue;486 if (y >= mask->numCols) continue;487 mask->data.PS_TYPE_IMAGE_MASK_DATA[X][y] |= value;488 }489 } else {490 if (X >= mask->numCols) continue;491 for (int y = Y - dW; y <= Y + dW; y++) {492 if (y < 0) continue;493 if (y >= mask->numRows) continue;494 mask->data.PS_TYPE_IMAGE_MASK_DATA[y][X] |= value;495 }496 }497 }498 e += dY;499 e2 = 2 * e;500 if (e2 > dX) {501 Y++;502 e -= dX;503 }504 if (e2 < -dX) {505 Y--;506 e += dX;507 }508 }509 return;510 }511 512 void psastroMaskRectangle (psImage *mask, psImageMaskType value, int x0, int y0, int x1, int y1) {513 514 int xs = PS_MAX (0, PS_MIN (mask->numCols, PS_MIN (x0, x1)));515 int xe = PS_MAX (0, PS_MIN (mask->numCols, PS_MAX (x0, x1)));516 int ys = PS_MAX (0, PS_MIN (mask->numRows, PS_MIN (y0, y1)));517 int ye = PS_MAX (0, PS_MIN (mask->numRows, PS_MAX (y0, y1)));518 519 for (int iy = ys; iy < ye; iy++) {520 for (int ix = xs; ix < xe; ix++) {521 mask->data.PS_TYPE_IMAGE_MASK_DATA[iy][ix] |= value;522 }523 }524 }525
Note:
See TracChangeset
for help on using the changeset viewer.
