return string_cmpf(k, b);
}
-static inkpot_status_t inkpot_set_value( inkpot_t *inkpot, IDX_VALUES value_idx)
+static inkpot_status_t inkpot_set_value_idx( inkpot_t *inkpot, IDX_VALUES value_idx)
{
if (inkpot->value_idx != value_idx) {
inkpot->value_idx = value_idx;
inkpot->cache[i].next_recently_used_idx = inkpot->most_recently_used_idx;
inkpot->most_recently_used_idx = i;
}
- return inkpot_set_value(inkpot, TAB_NAMES[cache_name_idx].value_idx);
+ return inkpot_set_value_idx(inkpot, TAB_NAMES[cache_name_idx].value_idx);
}
return ((inkpot->status = INKPOT_COLOR_UNKNOWN));
}
return ((inkpot->status = INKPOT_COLOR_UNKNOWN));
if (inkpot->scheme_bits & name->scheme_bits) {
- rc = inkpot_set_value(inkpot, name->value_idx);
+ rc = inkpot_set_value_idx(inkpot, name->value_idx);
assert(rc == INKPOT_SUCCESS);
return inkpot_cache_put(inkpot, (name - TAB_NAMES) );
}
if (value_idx >= SZT_VALUES)
assert(value_idx < SZT_VALUES + SZT_NONAME_VALUES);
- return inkpot_set_value(inkpot, value_idx);
+ return inkpot_set_value_idx(inkpot, value_idx);
}
-static int inkpot_rgba_cmpf ( const void *key, const void *base)
+#if 0
+static int inkpot_value_cmpf ( const void *key, const void *base)
{
- RGBA rgba_key = *(RGBA*)key;
- RGBA rgba_base = *(RGBA*)base;
+ VALUE value_key = *(VALUE*)key;
+ VALUE value_base = *(VALUE*)base;
- if (rgba_key > rgba_base) return 1;
- if (rgba_key < rgba_base) return -1;
+ if (value_key > value_base) return 1;
+ if (value_key < value_base) return -1;
return 0;
}
+#endif
-static inkpot_status_t inkpot_set_RGBA ( inkpot_t *inkpot, RGBA *rgba )
+static inkpot_status_t inkpot_set_value ( inkpot_t *inkpot, VALUE value )
{
+
+ inkpot->no_palette_value = value;
+ inkpot->value_idx = SZT_VALUES + SZT_NONAME_VALUES; /* indicate presence of no_palette_value */
+
+
+#if 0
inkpot_value_t *value;
inkpot_noname_value_t *noname_value;
*/
value = (inkpot_value_t *) bsearch(
- (void*)(rgba), (void*)TAB_VALUES,
+ (void*)(value), (void*)TAB_VALUES,
SZT_VALUES, sizeof(inkpot_value_t),
- inkpot_rgba_cmpf);
+ inkpot_value_cmpf);
if (value)
- return inkpot_set_value(inkpot, (value - TAB_VALUES));
+ return inkpot_set_value_idx(inkpot, (value - TAB_VALUES));
noname_value = (inkpot_noname_value_t *) bsearch(
- (void*)(rgba), (void*)TAB_NONAME_VALUES,
+ (void*)(value), (void*)TAB_NONAME_VALUES,
SZT_NONAME_VALUES, sizeof(inkpot_noname_value_t),
- inkpot_rgba_cmpf);
+ inkpot_value_cmpf);
if (noname_value)
- return inkpot_set_value(inkpot, ((noname_value - TAB_NONAME_VALUES) + SZT_VALUES));
+ return inkpot_set_value_idx(inkpot, ((noname_value - TAB_NONAME_VALUES) + SZT_VALUES));
return ((inkpot->status = INKPOT_COLOR_NONAME));
-#if 0
- /* need some sort of btree here so that we can insert rgba
+ /* need some sort of btree here so that we can insert value
* values and keep sorted */
noname_value = (inkpot_noname_value_t *) bsearch(
- (void*)(rgba), (void*)TAB_DYNAMIC_VALUES,
+ (void*)(value), (void*)TAB_DYNAMIC_VALUES,
SZT_DYNAMIC_VALUES, sizeof(inkpot_noname_value_t),
- inkpot_rgba_cmpf);
+ inkpot_value_cmpf);
/* insert value and keep sorted */
- return INKPOT_SUCCESS;
-
#endif
+ return ((inkpot->status = INKPOT_SUCCESS));
}
inkpot_status_t inkpot_set_rgba ( inkpot_t *inkpot, double rgba[4] )
{
- unsigned int myrgba = 0, v;
+ VALUE value = 0, v;
int i;
for (i = 0; i < 4; i++) {
- myrgba <<= SZB_RED;
+ value <<= SZB_RED;
v = rgba[i];
v = (v < 0.0) ? 0.0 : v;
v = (v > 1.0) ? 1.0 : v;
- myrgba |= (int)(v * MAX_RED);
+ value |= (int)(v * MAX_RED);
}
- return inkpot_set_RGBA ( inkpot, &myrgba );
+ return inkpot_set_value ( inkpot, value );
}
inkpot_status_t inkpot_set_hsva ( inkpot_t *inkpot, double hsva[4] )
return inkpot_set_rgba ( inkpot, rgba );
}
-inkpot_status_t inkpot_set( inkpot_t *inkpot, const char *color )
+inkpot_status_t inkpot_set ( inkpot_t *inkpot, const char *color )
{
char *q;
const char *p;
- int len, index;
- unsigned int rgba, c;
+ int c, len, index;
+ unsigned int r, g, b, a;
+ VALUE value;
double hsva[4];
inkpot_status_t rc = INKPOT_COLOR_UNKNOWN;
*q = '\0';
if (*inkpot->canon == '#') {
- if (sscanf(inkpot->canon, "#%8x", &rgba))
- rc = inkpot_set_RGBA(inkpot, &rgba);
-
- if (rc != INKPOT_SUCCESS) {
- if (sscanf(inkpot->canon, "#%6x", &rgba)) {
- rgba = (rgba << SZB_RED) | MAX_RED;
- rc = inkpot_set_RGBA(inkpot, &rgba);
- }
- }
+ a = 65535;
+ if ((len = sscanf(inkpot->canon, "#%4x%4x%4x%4x", &r, &g, &b, &a)) >= 3) {
+ r *= MAX_RED/65535; g *= MAX_RED/65535; b *= MAX_RED/65535; a *= MAX_RED/65535;
+ }
+ if (len < 3) {
+ a = 255;
+ if ((len = sscanf(inkpot->canon, "#%2x%2x%2x%2x", &r, &g, &b, &a)) >= 3) {
+ r *= MAX_RED/255; g *= MAX_RED/255; b *= MAX_RED/255; a *= MAX_RED/255;
+ }
+ }
+ if (len >= 3) {
+ value = (((((((VALUE)r) << SZB_RED) | (VALUE)g) << SZB_RED) | (VALUE)b) << SZB_RED) | (VALUE)a;
+ rc = inkpot_set_value(inkpot, value);
+ }
}
- if ((rc != INKPOT_SUCCESS) || ((c = *inkpot->canon) == '.') || isdigit(c)) {
+ if ((rc != INKPOT_SUCCESS) && (((c = *inkpot->canon) == '.') || isdigit(c))) {
hsva[3] = 1.0;
if (sscanf(inkpot->canon, "%lf%lf%lf%lf", &hsva[0], &hsva[1], &hsva[2], &hsva[3]) >= 3)
rc = inkpot_set_hsva(inkpot, hsva);
*color = NULL;
return ((inkpot->status = INKPOT_COLOR_NONAME));
}
+ if (value_idx == SZT_NONAME_VALUES) {
+ *color = NULL;
+ return ((inkpot->status = INKPOT_COLOR_NOPALETTE));
+ }
assert(0); /* support for dynamic values to go here */
}
return ((inkpot->status = INKPOT_COLOR_NONAME));
}
-static inkpot_status_t inkpot_get_RGBA ( inkpot_t *inkpot, RGBA *rgba )
+static inkpot_status_t inkpot_get_value ( inkpot_t *inkpot, VALUE *value )
{
IDX_VALUES value_idx = inkpot->value_idx;
if (value_idx < SZT_VALUES)
- *rgba = TAB_VALUES[value_idx].rgba;
- else {
- assert (value_idx < SZT_VALUES + SZT_NONAME_VALUES);
- *rgba = TAB_NONAME_VALUES[value_idx - SZT_VALUES].rgba;
- }
+ *value = TAB_VALUES[value_idx].value;
+ else if (value_idx - SZT_VALUES < SZT_NONAME_VALUES)
+ *value = TAB_NONAME_VALUES[value_idx - SZT_VALUES].value;
+ else if (value_idx == SZT_VALUES + SZT_NONAME_VALUES)
+ *value = inkpot->no_palette_value;
+ else
+ assert(0);
return ((inkpot->status = INKPOT_SUCCESS));
}
-inkpot_status_t inkpot_get_rgba_i ( inkpot_t *inkpot, unsigned int rgba[4] )
+inkpot_status_t inkpot_get_rgba_i ( inkpot_t *inkpot, unsigned short rgba[4] )
{
inkpot_status_t rc;
- RGBA myrgba;
+ VALUE value;
+ int i;
- rc = inkpot_get_RGBA( inkpot, &myrgba );
+ rc = inkpot_get_value( inkpot, &value );
if (rc == INKPOT_SUCCESS) {
- rgba[3] = myrgba & MSK_RED; myrgba >>= SZB_RED;
- rgba[2] = myrgba & MSK_RED; myrgba >>= SZB_RED;
- rgba[1] = myrgba & MSK_RED; myrgba >>= SZB_RED;
- rgba[0] = myrgba & MSK_RED;
+ for (i = 3; i >= 0; i--) {
+ rgba[i] = (value & MSK_RED);
+ value >>= SZB_RED;
+ }
}
return rc;
}
inkpot_status_t inkpot_get_rgba ( inkpot_t *inkpot, double rgba[4] )
{
inkpot_status_t rc;
- RGBA myrgba;
+ VALUE value;
int i;
- rc = inkpot_get_RGBA( inkpot, &myrgba );
+ rc = inkpot_get_value( inkpot, &value );
if (rc == INKPOT_SUCCESS) {
for (i = 3; i >= 0; i--) {
- rgba[i] = (myrgba & MSK_RED) / (double)MAX_RED;
- myrgba >>= SZB_RED;
+ rgba[i] = (value & MSK_RED) / (double)MAX_RED;
+ value >>= SZB_RED;
}
}
return rc;
return INKPOT_SUCCESS;
}
-static void inkpot_debug_rgba( inkpot_t *inkpot, RGBA rgba )
+static void inkpot_debug_rgba( inkpot_t *inkpot, VALUE value )
{
- char buf[20];
- unsigned int r, g, b, a;
-
- a = rgba & MSK_RED; rgba >>= SZB_RED;
- b = rgba & MSK_RED; rgba >>= SZB_RED;
- g = rgba & MSK_RED; rgba >>= SZB_RED;
- r = rgba & MSK_RED;
+ char buf[22];
+ unsigned short rgba[4];
+ int i;
- sprintf(buf, "%d,%d,%d,%d", r, g, b, a);
+ for (i = 3; i >= 0; i--) {
+ rgba[i] = (value & MSK_RED);
+ value >>= SZB_RED;
+ }
+ sprintf(buf, "#%04x%04x%04x%04x", rgba[0], rgba[1], rgba[2], rgba[3]);
errputs(inkpot, buf);
}
errputs(inkpot, &TAB_STRINGS[TAB_NAMES[i].string_idx]);
inkpot_debug_scheme_names(inkpot, scheme_bits);
errputs(inkpot, " ");
- inkpot_debug_rgba(inkpot, TAB_VALUES[name->value_idx].rgba);
+ inkpot_debug_rgba(inkpot, TAB_VALUES[name->value_idx].value);
errputs(inkpot, "\n");
}
}
errputs(inkpot, &TAB_STRINGS[scheme_index->string_idx]);
errputs(inkpot, ") ");
if (v < SZT_VALUES)
- inkpot_debug_rgba(inkpot, TAB_VALUES[v].rgba);
+ inkpot_debug_rgba(inkpot, TAB_VALUES[v].value);
else
- inkpot_debug_rgba(inkpot, TAB_NONAME_VALUES[v - SZT_VALUES].rgba);
+ inkpot_debug_rgba(inkpot, TAB_NONAME_VALUES[v - SZT_VALUES].value);
errputs(inkpot, "\n");
}
}
if (found++)
errputs(inkpot, " ");
else
- inkpot_debug_rgba(inkpot, TAB_VALUES[i].rgba);
+ inkpot_debug_rgba(inkpot, TAB_VALUES[i].value);
errputs(inkpot, " ");
errputs(inkpot, &TAB_STRINGS[name->string_idx]);
inkpot_debug_scheme_names(inkpot, scheme_bits);
{
inkpot_status_t rc;
const char *color;
- IDX_VALUES value_idx;
- RGBA rgba;
- char buf[10];
+ char buf[20];
+ int len;
+ unsigned short rgba[4];
rc = inkpot_get(inkpot, &color);
if (rc == INKPOT_SUCCESS)
inkpot->disc.out_writer(inkpot->out_closure, color, strlen(color));
- if (rc == INKPOT_COLOR_NONAME) {
- value_idx = inkpot->value_idx;
- if (value_idx < SZT_VALUES)
- rgba = TAB_VALUES[value_idx].rgba;
- else {
- assert (value_idx < SZT_VALUES + SZT_NONAME_VALUES);
- rgba = TAB_NONAME_VALUES[value_idx - SZT_VALUES].rgba;
- }
-
- sprintf(buf, "#%08x", rgba);
- inkpot->disc.out_writer(inkpot->out_closure, buf, sizeof(buf));
+ if (rc == INKPOT_COLOR_NONAME || rc == INKPOT_COLOR_NOPALETTE) {
+ rc = inkpot_get_rgba_i(inkpot, rgba);
+ len = sprintf(buf, "#%04x%04x%04x%04x", rgba[0], rgba[1], rgba[2], rgba[3]);
+ assert(len > 0);
+ inkpot->disc.out_writer(inkpot->out_closure, buf, len);
}
return rc;
}
m = "\nINKPOT_COLOR_UNKNOWN\n"; break;
case INKPOT_COLOR_NONAME:
m = "\nINKPOT_COLOR_NONAME\n"; break;
+ case INKPOT_COLOR_NOPALETTE:
+ m = "\nINKPOT_COLOR_PALETTE\n"; break;
case INKPOT_SCHEME_UNKNOWN:
m = "\nINKPOT_SCHEME_UNKNOWN\n"; break;
}
typedef unsigned int IDX_VALUES;
typedef unsigned int IDX_IXVALUES;
-typedef unsigned int RGBA;
-#define SZB_RED 8
-#define MSK_RED 255
-#define MAX_RED 255
+typedef unsigned long VALUE;
+#define SZB_RED 16
+#define MSK_RED 65535
+#define MAX_RED 65535
typedef unsigned int IDX_MRU_CACHE;
#define SZT_MRU_CACHE 4
#define SZT_NAME_ALTS (sizeof(TAB_NAME_ALTS)/sizeof(TAB_NAME_ALTS[0]))
inkpot_value_t TAB_VALUES[] = { /* Must be sort'ed */
- { 0x000000ff, 0 }, /* black */
- { 0x0000ffff, 1 }, /* bleu, blue */
- { 0x00ff00ff, 3 }, /* green, vert */
- { 0xff0000ff, 5 }, /* red, rouge */
- { 0xffcf00ff, 7 }, /* yellow (svg) */
- { 0xffff00ff, 8 }, /* yellow (x11), jaune */
- { 0xffffffff, 10}, /* white */
+ { 0x000000000000ffff, 0 }, /* black */
+ { 0x00000000ffffffff, 1 }, /* bleu, blue */
+ { 0x0000ffff0000ffff, 3 }, /* green, vert */
+ { 0xffff00000000ffff, 5 }, /* red, rouge */
+ { 0xffffcf000000ffff, 7 }, /* yellow (svg) */
+ { 0xffffffff0000ffff, 8 }, /* yellow (x11), jaune */
+ { 0xffffffffffffffff, 10}, /* white */
};
#define SZT_VALUES (sizeof(TAB_VALUES)/sizeof(TAB_VALUES[0]))
inkpot_noname_value_t TAB_NONAME_VALUES[] = { /* Must be sort'ed */
- { 0x000080ff },
- { 0x0000a4ff },
- { 0x0000c8ff },
- { 0x0000eaff },
+ { 0x000000008000ffff, },
+ { 0x00000000a400ffff, },
+ { 0x00000000c800ffff, },
+ { 0x00000000ea00ffff, },
};
#define SZT_NONAME_VALUES (sizeof(TAB_NONAME_VALUES)/sizeof(TAB_NONAME_VALUES[0]))