home *** CD-ROM | disk | FTP | other *** search
/ Encyclopedia of Graphics File Formats Companion / GFF_CD.ISO / software / unix / saoimage / sao1_07.tar / grpholap.c < prev    next >
C/C++ Source or Header  |  1990-04-20  |  6KB  |  209 lines

  1. #ifndef lint
  2. static char SccsId[] = "%W%  %G%";
  3. #endif
  4.  
  5. /* Module:    grpholap.c (Color Graph Overlap)
  6.  * Purpose:    Draw color graph lines where they overlap
  7.  * Subroutine:    mark_colorline_overlap()        returns: void
  8.  * Xlib calls:    XDrawSegments(), XDrawRectangles()
  9.  * Copyright:    1989 Smithsonian Astrophysical Observatory
  10.  *        You may do anything you like with this file except remove
  11.  *        this copyright.  The Smithsonian Astrophysical Observatory
  12.  *        makes no representations about the suitability of this
  13.  *        software for any purpose.  It is provided "as is" without
  14.  *        express or implied warranty.
  15.  * Modified:    {0} Michael VanHilst    initial version         11 June 1989
  16.  *        {n} <who> -- <does what> -- <when>
  17.  */
  18.  
  19. #include <stdio.h>        /* stderr, NULL, etc. */
  20. #include <X11/Xlib.h>        /* X window stuff */
  21. #include <X11/Xutil.h>        /* X window manager stuff */
  22. #include "hfiles/color.h"    /* color structs */
  23. #include "hfiles/cgraph.h"    /* color graph structs */
  24.  
  25. extern struct cgraphRec cgraph;
  26.  
  27. /*
  28.  * Subroutine:    mark_colorline_overlap
  29.  * Purpose:    Make line representing more than one color black (or white)
  30.  */
  31. void mark_colorline_overlap ( )
  32. {
  33.   int i, j;
  34.   int x, y;
  35.   int x1, y1;
  36.   XSegment line[256];
  37.   static void mark_hashmark_overlap();
  38.  
  39.   j = 0;
  40.   if( cgraph.vertical ) {
  41.     /* if vertical */
  42.     x1 = -1;
  43.     y1 = 0;    /* not really needed, but lint will complain */
  44.     for( i = 0; i < cgraph.point_cnt; i++ ) {
  45.       if( ((x = cgraph.red.line[i].x) == cgraph.green.line[i].x) ||
  46.       ((x = cgraph.green.line[i].x) == cgraph.blue.line[i].x) ||
  47.       ((x = cgraph.blue.line[i].x) == cgraph.red.line[i].x) ) {
  48.     if( x1 >= 0 ) {
  49.       /* start overlap section */
  50.       line[j].x1 = x1;
  51.       line[j].y1 = y1;
  52.       line[j].x2 = x;
  53.       line[j].y2 = cgraph.red.line[i].y;
  54.       j++;
  55.     }
  56.     x1 = x;
  57.     y1 = cgraph.red.line[i].y;
  58.       } else
  59.     x1 = -1;
  60.     }
  61.   } else {
  62.     /* if horizontal */
  63.     x1 = 0;    /* not really needed, but lint will complain */
  64.     y1 = -1;
  65.     for( i = 0; i < cgraph.point_cnt; i++ ) {
  66.       if( ((y = cgraph.red.line[i].y) == cgraph.green.line[i].y) ||
  67.       ((y = cgraph.green.line[i].y) == cgraph.blue.line[i].y) ||
  68.       ((y = cgraph.blue.line[i].y) == cgraph.red.line[i].y) ) {
  69.     if( y1 >= 0 ) {
  70.       /* start overlap section */
  71.       line[j].x1 = x1;
  72.       line[j].y1 = y1;
  73.       line[j].x2 = cgraph.red.line[i].x;
  74.       line[j].y2 = y;
  75.       j++;
  76.     }
  77.     x1 = cgraph.red.line[i].x;
  78.     y1 = y;
  79.       } else
  80.     y1 = -1;
  81.     }
  82.   }
  83.   if( j > 0 ) {
  84.     GC gc, set_gc();
  85.     gc = set_gc(cgraph.black);
  86.     XDrawSegments(cgraph.graph.display, cgraph.graph.ID, gc, line, j);
  87.     mark_hashmark_overlap();
  88.   }
  89. }
  90.       
  91. /*
  92.  * Subroutine:    mark_hashmark_overlap
  93.  * Purpose:    Make hashmarks which represent more than one color black
  94.  */
  95. static void mark_hashmark_overlap ( )
  96. {
  97.   int ri, bi, gi, j;
  98.   int red_cnt, blue_cnt, green_cnt;
  99.   int x, y;
  100.   XRectangle hash[256];
  101.  
  102.   bi = 0;
  103.   gi = 0;
  104.   j = 0;
  105.   red_cnt = cgraph.red.hash_cnt;
  106.   blue_cnt = cgraph.blue.hash_cnt;
  107.   green_cnt = cgraph.green.hash_cnt;
  108.   if( cgraph.vertical ) {
  109.     /* catch matches between red and another */
  110.     for( ri = 0; ri < red_cnt; ri++ ) {
  111.       x = cgraph.red.hash[ri].x;
  112.       y = cgraph.red.hash[ri].y;
  113.       while( (bi < blue_cnt) && (cgraph.blue.hash[bi].y > y) )
  114.     bi++;
  115.       if( (x == cgraph.blue.hash[bi].x) && (y == cgraph.blue.hash[bi].y) ) {
  116.     hash[j].x = x;
  117.     hash[j].y = y;
  118.     hash[j].width = HASH_SZ;
  119.     hash[j].height = HASH_SZ;
  120.     j++;
  121.       } else {
  122.     while( (gi < green_cnt) && (cgraph.green.hash[gi].y > y) )
  123.       gi++;
  124.     if( (x == cgraph.green.hash[gi].x) &&
  125.         (y == cgraph.green.hash[gi].y) ) {
  126.       hash[j].x = x;
  127.       hash[j].y = y;
  128.       hash[j].width = HASH_SZ;
  129.       hash[j].height = HASH_SZ;
  130.       j++;
  131.     }
  132.       }
  133.     }
  134.     gi = 0;
  135.     ri = 0;
  136.     /* catch matches between blue and green and not red */
  137.     for( bi = 0; bi < blue_cnt; bi++ ) {
  138.       x = cgraph.blue.hash[bi].x;
  139.       y = cgraph.blue.hash[bi].y;
  140.       while( (gi < green_cnt) && (cgraph.green.hash[gi].y > y) )
  141.     gi++;
  142.       if( (x == cgraph.green.hash[gi].x) &&
  143.       (y == cgraph.green.hash[gi].y) ) {
  144.     while( (ri < red_cnt) && (cgraph.red.hash[ri].y > y) )
  145.       ri++;
  146.     if( (x != cgraph.red.hash[ri].x) || (y == cgraph.red.hash[ri].y) ) {
  147.       hash[j].x = x;
  148.       hash[j].y = y;
  149.       hash[j].width = HASH_SZ;
  150.       hash[j].height = HASH_SZ;
  151.       j++;
  152.     }
  153.       }
  154.     }
  155.   } else {
  156.     /* catch matches between red and another */
  157.     for( ri = 0; ri < red_cnt; ri++ ) {
  158.       x = cgraph.red.hash[ri].x;
  159.       y = cgraph.red.hash[ri].y;
  160.       while( (bi < blue_cnt) && (cgraph.blue.hash[bi].x < x) )
  161.     bi++;
  162.       if( (x == cgraph.blue.hash[bi].x) && (y == cgraph.blue.hash[bi].y) ) {
  163.     hash[j].x = x;
  164.     hash[j].y = y;
  165.     hash[j].width = HASH_SZ;
  166.     hash[j].height = HASH_SZ;
  167.     j++;
  168.       } else {
  169.     while( (gi < green_cnt) && (cgraph.green.hash[gi].x < x) )
  170.       gi++;
  171.     if( (x == cgraph.green.hash[gi].x) &&
  172.         (y == cgraph.green.hash[gi].y) ) {
  173.       hash[j].x = x;
  174.       hash[j].y = y;
  175.       hash[j].width = HASH_SZ;
  176.       hash[j].height = HASH_SZ;
  177.       j++;
  178.     }
  179.       }
  180.     }
  181.     gi = 0;
  182.     ri = 0;
  183.     /* catch matches between blue and green and not red */
  184.     for( bi = 0; bi < blue_cnt; bi++ ) {
  185.       x = cgraph.blue.hash[bi].x;
  186.       y = cgraph.blue.hash[bi].y;
  187.       while( (gi < green_cnt) && (cgraph.green.hash[gi].x < x) )
  188.     gi++;
  189.       if( (x == cgraph.green.hash[gi].x) &&
  190.       (y == cgraph.green.hash[gi].y) ) {
  191.     while( (ri < red_cnt) && (cgraph.red.hash[ri].x < x) )
  192.       ri++;
  193.     if( (x != cgraph.red.hash[ri].x) || (y == cgraph.red.hash[ri].y) ) {
  194.       hash[j].x = x;
  195.       hash[j].y = y;
  196.       hash[j].width = HASH_SZ;
  197.       hash[j].height = HASH_SZ;
  198.       j++;
  199.     }
  200.       }
  201.     }
  202.   }
  203.   if( j > 0 ) {
  204.     GC gc, set_gc();
  205.     gc = set_gc(cgraph.black);
  206.     XDrawRectangles(cgraph.graph.display, cgraph.graph.ID, gc, hash, j);
  207.   }
  208. }
  209.