00001
00002
00003
00004
00005
00006 #include <grass/gis.h>
00007 #define umalloc(n) (unsigned char *) G_malloc((size_t)n)
00008 #define urealloc(s,n) (unsigned char *) G_realloc(s,(size_t)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
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
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)
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
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)
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
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
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
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