Go to the documentation of this file.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(CELL cat,
00013 int red, int grn, int blu,
00014 struct _Color_Info_ *cp)
00015 {
00016 long nalloc;
00017 long i;
00018 long newlen, curlen, gap;
00019
00020 LIMIT(red);
00021 LIMIT(grn);
00022 LIMIT(blu);
00023
00024
00025 if (!cp->lookup.active) {
00026 cp->lookup.active = 1;
00027 cp->lookup.nalloc = 256;
00028 cp->lookup.red = umalloc(cp->lookup.nalloc);
00029 cp->lookup.grn = umalloc(cp->lookup.nalloc);
00030 cp->lookup.blu = umalloc(cp->lookup.nalloc);
00031 cp->lookup.set = umalloc(cp->lookup.nalloc);
00032 cp->max = cp->min = cat;
00033 }
00034
00035
00036 else if (cat > cp->max) {
00037 curlen = cp->max - cp->min + 1;
00038 newlen = cat - cp->min + 1;
00039 nalloc = newlen;
00040 if (nalloc != (int)nalloc)
00041 return -1;
00042
00043 if (nalloc > cp->lookup.nalloc) {
00044 while (cp->lookup.nalloc < nalloc)
00045 cp->lookup.nalloc += 256;
00046 nalloc = cp->lookup.nalloc;
00047
00048 cp->lookup.red = urealloc((char *)cp->lookup.red, nalloc);
00049 cp->lookup.grn = urealloc((char *)cp->lookup.grn, nalloc);
00050 cp->lookup.blu = urealloc((char *)cp->lookup.blu, nalloc);
00051 cp->lookup.set = urealloc((char *)cp->lookup.set, nalloc);
00052 }
00053
00054
00055 for (i = curlen; i < newlen; i++) {
00056 cp->lookup.red[i] = 255;
00057 cp->lookup.grn[i] = 255;
00058 cp->lookup.blu[i] = 255;
00059 cp->lookup.set[i] = 0;
00060 }
00061 cp->max = cat;
00062 }
00063 else if (cat < cp->min) {
00064 curlen = cp->max - cp->min + 1;
00065 newlen = cp->max - cat + 1;
00066 gap = newlen - curlen;
00067 nalloc = newlen;
00068 if (nalloc != (int)nalloc)
00069 return -1;
00070
00071 if (nalloc > cp->lookup.nalloc) {
00072 while (cp->lookup.nalloc < nalloc)
00073 cp->lookup.nalloc += 256;
00074 nalloc = cp->lookup.nalloc;
00075
00076 cp->lookup.red = urealloc((char *)cp->lookup.red, nalloc);
00077 cp->lookup.grn = urealloc((char *)cp->lookup.grn, nalloc);
00078 cp->lookup.blu = urealloc((char *)cp->lookup.blu, nalloc);
00079 cp->lookup.set = urealloc((char *)cp->lookup.set, nalloc);
00080 }
00081
00082
00083 for (i = 1; i <= curlen; i++) {
00084 cp->lookup.red[newlen - i] = cp->lookup.red[curlen - i];
00085 cp->lookup.grn[newlen - i] = cp->lookup.grn[curlen - i];
00086 cp->lookup.blu[newlen - i] = cp->lookup.blu[curlen - i];
00087 cp->lookup.set[newlen - i] = cp->lookup.set[curlen - i];
00088 }
00089
00090
00091 for (i = 1; i < gap; i++) {
00092 cp->lookup.red[i] = 255;
00093 cp->lookup.grn[i] = 255;
00094 cp->lookup.blu[i] = 255;
00095 cp->lookup.set[i] = 0;
00096 }
00097 cp->min = cat;
00098 }
00099
00100
00101 i = cat - cp->min;
00102 cp->lookup.red[i] = red;
00103 cp->lookup.grn[i] = grn;
00104 cp->lookup.blu[i] = blu;
00105 cp->lookup.set[i] = 1;
00106
00107 return 1;
00108 }