color_insrt.c

Go to the documentation of this file.
00001 /* This routine is public only because source is in different files.
00002  * It should NEVER be called directly.
00003  * It is used by G_add_color_rule() and G__read_old_colors().
00004  * These routines know when it is approriate to call this routine.
00005  */
00006 #include "gis.h"
00007 #define umalloc(n) (unsigned char *) G_malloc((int)n)
00008 #define urealloc(s,n) (unsigned char *) G_realloc(s,(int)n)
00009 
00010 #define LIMIT(x) if (x < 0) x = 0; else if (x > 255) x = 255;
00011 
00012 int G__insert_color_into_lookup (
00013     CELL cat,
00014     int red,int grn,int blu,
00015     struct _Color_Info_ *cp)
00016 {
00017     long nalloc;
00018     long i;
00019     long newlen, curlen, gap;
00020 
00021     LIMIT(red);
00022     LIMIT(grn);
00023     LIMIT(blu);
00024 
00025 /* first color? */
00026     if (!cp->lookup.active)
00027     {
00028         cp->lookup.active = 1;
00029         cp->lookup.nalloc = 256;
00030         cp->lookup.red = umalloc(cp->lookup.nalloc);
00031         cp->lookup.grn = umalloc(cp->lookup.nalloc);
00032         cp->lookup.blu = umalloc(cp->lookup.nalloc);
00033         cp->lookup.set = umalloc(cp->lookup.nalloc);
00034         cp->max = cp->min = cat;
00035     }
00036 
00037 /* extend the color table? */
00038     else if (cat > cp->max)
00039     {
00040         curlen = cp->max - cp->min + 1;
00041         newlen = cat - cp->min + 1;
00042         nalloc = newlen;
00043         if (nalloc != (int) nalloc)        /* check for int overflow */
00044             return -1;
00045 
00046         if (nalloc > cp->lookup.nalloc)
00047         {
00048             while (cp->lookup.nalloc < nalloc)
00049                 cp->lookup.nalloc += 256;
00050             nalloc = cp->lookup.nalloc;
00051 
00052             cp->lookup.red = urealloc ((char *) cp->lookup.red, nalloc);
00053             cp->lookup.grn = urealloc ((char *) cp->lookup.grn, nalloc);
00054             cp->lookup.blu = urealloc ((char *) cp->lookup.blu, nalloc);
00055             cp->lookup.set = urealloc ((char *) cp->lookup.set, nalloc);
00056         }
00057 
00058         /* fill in gap with white */
00059         for (i = curlen; i < newlen; i++)
00060         {
00061             cp->lookup.red[i] = 255;
00062             cp->lookup.grn[i] = 255;
00063             cp->lookup.blu[i] = 255;
00064             cp->lookup.set[i] = 0;
00065         }
00066         cp->max = cat;
00067     }
00068     else if (cat < cp->min)
00069     {
00070         curlen = cp->max - cp->min + 1;
00071         newlen = cp->max - cat + 1;
00072         gap    = newlen - curlen;
00073         nalloc = newlen;
00074         if (nalloc != (int) nalloc)        /* check for int overflow */
00075             return -1;
00076 
00077         if (nalloc > cp->lookup.nalloc)
00078         {
00079             while (cp->lookup.nalloc < nalloc)
00080                 cp->lookup.nalloc += 256;
00081             nalloc = cp->lookup.nalloc;
00082 
00083             cp->lookup.red = urealloc ((char *) cp->lookup.red, nalloc);
00084             cp->lookup.grn = urealloc ((char *) cp->lookup.grn, nalloc);
00085             cp->lookup.blu = urealloc ((char *) cp->lookup.blu, nalloc);
00086             cp->lookup.set = urealloc ((char *) cp->lookup.set, nalloc);
00087         }
00088 
00089     /* shift the table to make room in front */
00090         for (i = 1; i <= curlen; i++)
00091         {
00092             cp->lookup.red[newlen-i] = cp->lookup.red[curlen-i];
00093             cp->lookup.grn[newlen-i] = cp->lookup.grn[curlen-i];
00094             cp->lookup.blu[newlen-i] = cp->lookup.blu[curlen-i];
00095             cp->lookup.set[newlen-i] = cp->lookup.set[curlen-i];
00096         }
00097 
00098     /* fill in gap with white */
00099         for (i=1; i < gap; i++)
00100         {
00101             cp->lookup.red[i] = 255 ;
00102             cp->lookup.grn[i] = 255 ;
00103             cp->lookup.blu[i] = 255 ;
00104             cp->lookup.set[i] = 0 ;
00105         }
00106         cp->min = cat;
00107     }
00108 
00109 /* set the color! */
00110     i = cat - cp->min;
00111     cp->lookup.red[i] = red;
00112     cp->lookup.grn[i] = grn;
00113     cp->lookup.blu[i] = blu;
00114     cp->lookup.set[i] = 1;
00115 
00116     return 1;
00117 }
00118 

Generated on Mon Jan 1 19:49:25 2007 for GRASS by  doxygen 1.5.1