50 |
|
|
51 |
/* --------------------- elemstyles.xml parsing ----------------------- */ |
/* --------------------- elemstyles.xml parsing ----------------------- */ |
52 |
|
|
53 |
|
static int get_hex_digit(char c) { |
54 |
|
if((c >= '0')&&(c <= '9')) return c-'0'; |
55 |
|
if((c >= 'a')&&(c <= 'f')) return c-'a'+10; |
56 |
|
if((c >= 'A')&&(c <= 'F')) return c-'A'+10; |
57 |
|
return -1; |
58 |
|
} |
59 |
|
|
60 |
|
static int get_hex_byte(char *str) { |
61 |
|
int d0 = get_hex_digit(str[0]); |
62 |
|
int d1 = get_hex_digit(str[1]); |
63 |
|
|
64 |
|
if((d0 < 0) || (d1 < 0)) return -1; |
65 |
|
|
66 |
|
return 16*d0+d1; |
67 |
|
} |
68 |
|
|
69 |
gboolean parse_color(xmlNode *a_node, char *name, |
gboolean parse_color(xmlNode *a_node, char *name, |
70 |
elemstyle_color_t *color) { |
elemstyle_color_t *color) { |
71 |
char *color_str = (char*)xmlGetProp(a_node, BAD_CAST name); |
char *color_str = (char*)xmlGetProp(a_node, BAD_CAST name); |
72 |
if(color_str) { |
if(color_str) { |
73 |
|
/* if the color name contains a # it's a hex representation */ |
74 |
|
/* we parse this directly since gdk_color_parse doesn't cope */ |
75 |
|
/* with the alpha channel that may be present */ |
76 |
|
if(strchr(color_str, '#')) { |
77 |
|
char *begin = strchr(color_str, '#')+1; |
78 |
|
|
79 |
|
g_assert(strlen(begin) >= 6); |
80 |
|
int r = get_hex_byte(begin+0); |
81 |
|
int g = get_hex_byte(begin+2); |
82 |
|
int b = get_hex_byte(begin+4); |
83 |
|
|
84 |
|
/* get alpha channel if present, 0xff otherwise */ |
85 |
|
int a = 0xff; |
86 |
|
if(strlen(begin) >= 8) { |
87 |
|
a = get_hex_byte(begin+6); |
88 |
|
if(a < 0) a = 0xff; |
89 |
|
} |
90 |
|
|
91 |
|
*color = (r<<24) + (g<<16) + (b<<8) + a; |
92 |
|
xmlFree(color_str); |
93 |
|
return TRUE; |
94 |
|
} |
95 |
|
|
96 |
GdkColor gdk_color; |
GdkColor gdk_color; |
97 |
if(gdk_color_parse(color_str, &gdk_color)) { |
if(gdk_color_parse(color_str, &gdk_color)) { |
98 |
*color = |
*color = |
99 |
((gdk_color.red << 8) & 0xff0000) | |
((gdk_color.red << 16) & 0xff000000) | |
100 |
((gdk_color.green ) & 0xff00) | |
((gdk_color.green << 8) & 0xff0000) | |
101 |
((gdk_color.blue >> 8) & 0xff); |
((gdk_color.blue ) & 0xff00) | |
102 |
|
(0xff); |
103 |
|
|
104 |
xmlFree(color_str); |
xmlFree(color_str); |
105 |
return TRUE; |
return TRUE; |
120 |
} |
} |
121 |
|
|
122 |
static gboolean parse_scale_max(xmlNode *a_node, float *val) { |
static gboolean parse_scale_max(xmlNode *a_node, float *val) { |
123 |
xmlChar *val_str = xmlNodeGetContent(a_node); |
xmlChar *val_str = xmlNodeGetContent(a_node); |
124 |
if (val_str) { |
if (val_str) { |
125 |
*val = scaledn_to_zoom(strtod((char *)val_str, NULL)); |
*val = scaledn_to_zoom(strtod((char *)val_str, NULL)); |
126 |
xmlFree(val_str); |
xmlFree(val_str); |
127 |
return TRUE; |
return TRUE; |
128 |
} |
} |
129 |
return FALSE; |
return FALSE; |
130 |
} |
} |
131 |
|
|
132 |
static gboolean parse_gboolean(xmlNode *a_node, char *name, gboolean *val) { |
static gboolean parse_gboolean(xmlNode *a_node, char *name, gboolean *val) { |
458 |
elemstyle_t *elemstyle = style->elemstyles; |
elemstyle_t *elemstyle = style->elemstyles; |
459 |
|
|
460 |
/* use dark grey/no stroke/not filled for everything unknown */ |
/* use dark grey/no stroke/not filled for everything unknown */ |
461 |
way->draw.color = RGB2CANVAS(style->way.color); |
way->draw.color = style->way.color; |
462 |
way->draw.width = style->way.width; |
way->draw.width = style->way.width; |
463 |
way->draw.flags = 0; |
way->draw.flags = 0; |
464 |
way->draw.zoom_max = 0; // draw at all zoom levels |
way->draw.zoom_max = 0; // draw at all zoom levels |
499 |
|
|
500 |
case ES_TYPE_LINE: |
case ES_TYPE_LINE: |
501 |
if(!way_processed) { |
if(!way_processed) { |
502 |
way->draw.color = (elemstyle->line->color << 8) | 0xff; |
way->draw.color = elemstyle->line->color; |
503 |
way->draw.width = WIDTH_SCALE * elemstyle->line->width; |
way->draw.width = WIDTH_SCALE * elemstyle->line->width; |
504 |
if(elemstyle->line->bg.valid) { |
if(elemstyle->line->bg.valid) { |
505 |
way->draw.flags |= OSM_DRAW_FLAG_BG; |
way->draw.flags |= OSM_DRAW_FLAG_BG; |
506 |
way->draw.bg.color = (elemstyle->line->bg.color << 8) | 0xff; |
way->draw.bg.color = elemstyle->line->bg.color; |
507 |
way->draw.bg.width = WIDTH_SCALE * elemstyle->line->bg.width; |
way->draw.bg.width = WIDTH_SCALE * elemstyle->line->bg.width; |
508 |
} |
} |
509 |
if (elemstyle->line->zoom_max > 0) { |
if (elemstyle->line->zoom_max > 0) { |
529 |
/* (potlatch style) */ |
/* (potlatch style) */ |
530 |
|
|
531 |
if(style->area.has_border_color) |
if(style->area.has_border_color) |
532 |
way->draw.color = (style->area.border_color << 8) | 0xff; |
way->draw.color = style->area.border_color; |
533 |
else |
else |
534 |
way->draw.color = (elemstyle->area->color << 8) | 0xff; |
way->draw.color = elemstyle->area->color; |
535 |
|
|
536 |
way->draw.width = WIDTH_SCALE * style->area.border_width; |
way->draw.width = WIDTH_SCALE * style->area.border_width; |
537 |
way->draw.area.color = (elemstyle->area->color << 8) | |
/* apply area alpha */ |
538 |
style->area.opaque; |
way->draw.area.color = |
539 |
|
RGBA_COMBINE(elemstyle->area->color, style->area.color); |
540 |
if (elemstyle->area->zoom_max > 0) { |
if (elemstyle->area->zoom_max > 0) { |
541 |
way->draw.zoom_max = elemstyle->area->zoom_max; |
way->draw.zoom_max = elemstyle->area->zoom_max; |
542 |
} |
} |