IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Oct 5, 2005, 4:41:07 PM (21 years ago)
Author:
drobbin
Message:

Created ImageMaskOps file. started ImageGrowMask fxn.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/imageops/psImagePixelManip.c

    r5224 r5227  
    1010 *  @author Ross Harman, MHPCC
    1111 *
    12  *  @version $Revision: 1.13 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2005-10-05 03:51:43 $
     12 *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2005-10-06 02:41:07 $
    1414 *
    1515 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    396396}
    397397
    398 // mask the area contained by the region
    399 // the region is defined wrt the parent image
    400 void psImageMaskRegion(psImage *image,
    401                        psRegion region,
    402                        const char *op,
    403                        psMaskType maskValue)
    404 {
    405     for (int j = 0; j < image->numRows; j++) {
    406         for (int i = 0; i < image->numCols; i++) {
    407             if ( (j + image->row0) >= region.y0 &&
    408                     (j + image->row0) <= region.y1 &&
    409                     (i + image->col0) >= region.x0 &&
    410                     (i + image->col0) <= region.x1 ) {
    411                 if ( !strncmp(op, "&", 2) || !strncmp(op, "AND", 5) ) {
    412                     image->data.PS_TYPE_MASK_DATA[j][i] &= maskValue;
    413                 } else if ( !strncmp(op, "|", 2) || !strncmp(op, "OR", 5) ) {
    414                     image->data.PS_TYPE_MASK_DATA[j][i] |= maskValue;
    415                 } else if ( !strncmp(op, "=", 2) || !strncmp(op, "EQUAL", 5) ) {
    416                     image->data.PS_TYPE_MASK_DATA[j][i] = maskValue;
    417                 } else if ( !strncmp(op, "^", 2) || !strncmp(op, "XOR", 5) ) {
    418                     image->data.PS_TYPE_MASK_DATA[j][i] ^= maskValue;
    419                 } else {
    420                     psError(PS_ERR_BAD_PARAMETER_VALUE,true,
    421                             "The logical operation specified is incorrect\n");
    422                     return;
    423                 }
    424             }
    425         }
    426     }
    427     /*
    428         for (int iy = 0; iy < image->numRows; iy++) {
    429             for (int ix = 0; ix < image->numCols; ix++) {
    430                 if (ix + image->col0 >=  region.x0)
    431                     continue;
    432                 if (ix + image->col0 <= region.x1)
    433                     continue;
    434                 if (iy + image->row0 >=  region.y0)
    435                     continue;
    436                 if (iy + image->row0 <= region.y1)
    437                     continue;
    438                 if ( !strncmp(op, "&", 2) || !strncmp(op, "AND", 5) ) {
    439                     image->data.PS_TYPE_MASK_DATA[iy][ix] &= maskValue;
    440                 } else if ( !strncmp(op, "|", 2) || !strncmp(op, "OR", 5) ) {
    441                     image->data.PS_TYPE_MASK_DATA[iy][ix] |= maskValue;
    442                 } else if ( !strncmp(op, "=", 2) || !strncmp(op, "EQUAL", 5) ) {
    443                     image->data.PS_TYPE_MASK_DATA[iy][ix] = maskValue;
    444                 } else if ( !strncmp(op, "^", 2) || !strncmp(op, "XOR", 5) ) {
    445                     image->data.PS_TYPE_MASK_DATA[iy][ix] ^= maskValue;
    446                 }
    447             }
    448         }
    449     */
    450 }
    451 
    452 // mask the area not contained by the region
    453 // the region is defined wrt the parent image
    454 void psImageKeepRegion(psImage *image,
    455                        psRegion region,
    456                        const char *op,
    457                        psMaskType maskValue)
    458 {
    459     for (int j = 0; j < image->numRows; j++) {
    460         for (int i = 0; i < image->numCols; i++) {
    461             if ( (j + image->row0) < region.y0 ||
    462                     (j + image->row0) > region.y1 ||
    463                     (i + image->col0) < region.x0 ||
    464                     (i + image->col0) > region.x1 ) {
    465                 if ( !strncmp(op, "&", 2) || !strncmp(op, "AND", 5) ) {
    466                     image->data.PS_TYPE_MASK_DATA[j][i] &= maskValue;
    467                 } else if ( !strncmp(op, "|", 2) || !strncmp(op, "OR", 5) ) {
    468                     image->data.PS_TYPE_MASK_DATA[j][i] |= maskValue;
    469                 } else if ( !strncmp(op, "=", 2) || !strncmp(op, "EQUAL", 5) ) {
    470                     image->data.PS_TYPE_MASK_DATA[j][i] = maskValue;
    471                 } else if ( !strncmp(op, "^", 2) || !strncmp(op, "XOR", 5) ) {
    472                     image->data.PS_TYPE_MASK_DATA[j][i] ^= maskValue;
    473                 } else {
    474                     psError(PS_ERR_BAD_PARAMETER_VALUE,true,
    475                             "The logical operation specified is incorrect\n");
    476                     return;
    477                 }
    478             }
    479         }
    480     }
    481     /*
    482         for (int iy = 0; iy < image->numRows; iy++) {
    483             for (int ix = 0; ix < image->numCols; ix++) {
    484                 if (ix + image->col0 <  region.x0)
    485                     goto maskit;
    486                 if (ix + image->col0 > region.x1)
    487                     goto maskit;
    488                 if (iy + image->row0 <  region.y0)
    489                     goto maskit;
    490                 if (iy + image->row0 > region.y1)
    491                     goto maskit;
    492                 continue;
    493     maskit:
    494                 if ( !strncmp(op, "&", 2) || !strncmp(op, "AND", 5) ) {
    495                     image->data.PS_TYPE_MASK_DATA[iy][ix] &= maskValue;
    496                 } else if ( !strncmp(op, "|", 2) || !strncmp(op, "OR", 5) ) {
    497                     image->data.PS_TYPE_MASK_DATA[iy][ix] |= maskValue;
    498                 } else if ( !strncmp(op, "=", 2) || !strncmp(op, "EQUAL", 5) ) {
    499                     image->data.PS_TYPE_MASK_DATA[iy][ix] = maskValue;
    500                 } else if ( !strncmp(op, "^", 2) || !strncmp(op, "XOR", 5) ) {
    501                     image->data.PS_TYPE_MASK_DATA[iy][ix] ^= maskValue;
    502                 }
    503             }
    504         }
    505     */
    506 }
    507 
    508 // mask the area contained by the region
    509 // the region is defined wrt the parent image
    510 void psImageMaskCircle(psImage *image,
    511                        double x,
    512                        double y,
    513                        double radius,
    514                        const char *op,
    515                        psMaskType maskValue)
    516 {
    517     if (image == NULL) {
    518         psError(PS_ERR_BAD_PARAMETER_NULL, true,
    519                 "Invalid image input.  Image is NULL.\n");
    520         return;
    521     }
    522 
    523 
    524     double dx, dy, r2, R2;
    525 
    526     R2 = PS_SQR(radius);
    527 
    528     for (int iy = 0; iy < image->numRows; iy++) {
    529         for (int ix = 0; ix < image->numCols; ix++) {
    530             dx = ix + image->col0 - x;
    531             dy = iy + image->row0 - y;
    532             r2 = PS_SQR(dx) + PS_SQR(dy);
    533             if (r2 <= R2) {
    534                 if ( !strncmp(op, "&", 2) || !strncmp(op, "AND", 5) ) {
    535                     image->data.PS_TYPE_MASK_DATA[iy][ix] &= maskValue;
    536                 } else if ( !strncmp(op, "|", 2) || !strncmp(op, "OR", 5) ) {
    537                     image->data.PS_TYPE_MASK_DATA[iy][ix] |= maskValue;
    538                 } else if ( !strncmp(op, "=", 2) || !strncmp(op, "EQUAL", 5) ) {
    539                     image->data.PS_TYPE_MASK_DATA[iy][ix] = maskValue;
    540                 } else if ( !strncmp(op, "^", 2) || !strncmp(op, "XOR", 5) ) {
    541                     image->data.PS_TYPE_MASK_DATA[iy][ix] ^= maskValue;
    542                 } else {
    543                     psError(PS_ERR_BAD_PARAMETER_VALUE,true,
    544                             "The logical operation specified is incorrect\n");
    545                     return;
    546                 }
    547             }
    548         }
    549     }
    550 }
    551 
    552 // mask the area contained by the region
    553 // the region is defined wrt the parent image
    554 void psImageKeepCircle(psImage *image,
    555                        double x,
    556                        double y,
    557                        double radius,
    558                        const char *op,
    559                        psMaskType maskValue)
    560 {
    561 
    562     double dx, dy, r2, R2;
    563 
    564     R2 = PS_SQR(radius);
    565 
    566     for (int iy = 0; iy < image->numRows; iy++) {
    567         for (int ix = 0; ix < image->numCols; ix++) {
    568             dx = ix + image->col0 - x;
    569             dy = iy + image->row0 - y;
    570             r2 = PS_SQR(dx) + PS_SQR(dy);
    571             if (r2 > R2) {
    572                 if ( !strncmp(op, "&", 2) || !strncmp(op, "AND", 5) ) {
    573                     image->data.PS_TYPE_MASK_DATA[iy][ix] &= maskValue;
    574                 } else if ( !strncmp(op, "|", 2) || !strncmp(op, "OR", 5) ) {
    575                     image->data.PS_TYPE_MASK_DATA[iy][ix] |= maskValue;
    576                 } else if ( !strncmp(op, "=", 2) || !strncmp(op, "EQUAL", 5) ) {
    577                     image->data.PS_TYPE_MASK_DATA[iy][ix] = maskValue;
    578                 } else if ( !strncmp(op, "^", 2) || !strncmp(op, "XOR", 5) ) {
    579                     image->data.PS_TYPE_MASK_DATA[iy][ix] ^= maskValue;
    580                 } else {
    581                     psError(PS_ERR_BAD_PARAMETER_VALUE,true,
    582                             "The logical operation specified is incorrect\n");
    583                     return;
    584                 }
    585             }
    586         }
    587     }
    588 }
    589 
Note: See TracChangeset for help on using the changeset viewer.