Diff of /trunk/src/josm_elemstyles.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 21 by harbaum, Tue Dec 16 17:00:20 2008 UTC revision 22 by harbaum, Wed Dec 17 16:43:46 2008 UTC
# Line 50  inline float zoom_to_scaledn(const float Line 50  inline float zoom_to_scaledn(const float
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;
# Line 80  static gboolean parse_gint(xmlNode *a_no Line 120  static gboolean parse_gint(xmlNode *a_no
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) {
# Line 418  void josm_elemstyles_colorize_way(style_ Line 458  void josm_elemstyles_colorize_way(style_
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
# Line 459  void josm_elemstyles_colorize_way(style_ Line 499  void josm_elemstyles_colorize_way(style_
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) {
# Line 489  void josm_elemstyles_colorize_way(style_ Line 529  void josm_elemstyles_colorize_way(style_
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            }            }

Legend:
Removed from v.21  
changed lines
  Added in v.22