Index: configure.ac =================================================================== RCS file: /cvs/cairo/roadster/configure.ac,v retrieving revision 1.9 diff -u -p -r1.9 configure.ac --- configure.ac 2 Mar 2005 21:28:54 -0000 1.9 +++ configure.ac 3 Mar 2005 05:54:30 -0000 @@ -37,7 +37,7 @@ AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package.]) dnl ========= check for gnome libraries ======================================== -PKG_CHECK_MODULES(GNOME, libgnomeui-2.0 gtk+-2.0 libglade-2.0,,exit) +PKG_CHECK_MODULES(GNOME, libgnomeui-2.0 gtk+-2.0 libglade-2.0 libxml-2.0,,exit) AC_SUBST(GNOME_LIBS) AC_SUBST(GNOME_CFLAGS) Index: data/Makefile.am =================================================================== RCS file: /cvs/cairo/roadster/data/Makefile.am,v retrieving revision 1.1 diff -u -p -r1.1 Makefile.am --- data/Makefile.am 23 Feb 2005 18:29:58 -0000 1.1 +++ data/Makefile.am 3 Mar 2005 05:54:30 -0000 @@ -3,9 +3,7 @@ NULL = gladedir = $(pkgdatadir) -glade_DATA = \ - roadster.glade \ - $(NULL) +glade_DATA = roadster.glade DESKTOP_IN_FILES= roadster.desktop.in DESKTOP_FILES= $(DESKTOP_IN_FILES:.desktop.in=.desktop) @@ -13,10 +11,14 @@ DESKTOP_FILES= $(DESKTOP_IN_FILES:.deskt desktopdir = $(datadir)/applications desktop_DATA = $(DESKTOP_FILES) +styledir = $(pkgdatadir) +style_DATA = layers.xml + install-data-local: EXTRA_DIST = \ $(glade_DATA) \ + $(style_DATA) \ $(DESKTOP_IN_FILES) \ $(NULL) Index: data/layers.xml =================================================================== RCS file: data/layers.xml diff -N data/layers.xml --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ data/layers.xml 3 Mar 2005 05:54:30 -0000 @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: src/layers.c =================================================================== RCS file: /cvs/cairo/roadster/src/layers.c,v retrieving revision 1.7 diff -u -p -r1.7 layers.c --- src/layers.c 1 Mar 2005 19:48:21 -0000 1.7 +++ src/layers.c 3 Mar 2005 05:54:30 -0000 @@ -21,9 +21,15 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include + #include +#include +#include #include "layers.h" +layer_t * g_aLayers[NUM_LAYERS+1]; + gdouble pDash_Solid[] = {10}; gdouble pDash_10_10[] = {1, 14}; @@ -32,6 +38,303 @@ dashstyle_t g_aDashStyles[NUM_DASH_STYLE {pDash_10_10, 2}, }; +static void layers_parse_layers(xmlDocPtr doc, xmlNodePtr node); +static void layers_parse_layer(xmlDocPtr doc, xmlNodePtr node); +static void layers_parse_sublayer(xmlDocPtr doc, sublayerstyle_t *sublayer, xmlNodePtr node); +static void layers_parse_sublayer_property(xmlDocPtr doc, sublayerstyle_t *sublayer, xmlNodePtr node); +static void layers_parse_label(xmlDocPtr doc, textlabelstyle_t *label_style, xmlNodePtr node); +static void layers_parse_label_property(xmlDocPtr doc, textlabelstyle_t *label_style, xmlNodePtr node); +static void layers_parse_color(color_t *color, gchar *value); + +static void layers_print_layer(layer_t *layer); +static void layers_print_sublayer(sublayerstyle_t *sublayer); +static void layers_print_color(color_t *color); + +static void +layers_parse_layers(xmlDocPtr doc, xmlNodePtr node) +{ + xmlNodePtr cur_node = NULL; + + if (node->type == XML_ELEMENT_NODE && strcmp(node->name, "roadster-layers") == 0) { + for (cur_node = node->children; cur_node; cur_node = cur_node->next) { + if (cur_node->type == XML_ELEMENT_NODE && strcmp(cur_node->name, "layer") == 0) { + layers_parse_layer(doc, cur_node); + } + } + } +} + +static void +layers_parse_layer(xmlDocPtr doc, xmlNodePtr node) +{ + xmlNodePtr cur_node = NULL; + xmlAttrPtr cur_attr = NULL; + gchar *layer_name; + layer_t *layer = NULL; + gint i; + + for (cur_attr = node->properties; cur_attr; cur_attr = cur_attr->next) { + if (!strcmp(cur_attr->name, "name")) { + layer_name = xmlNodeListGetString(doc, cur_attr->xmlChildrenNode, 1); + printf("parsing layer: %s\n", layer_name); + for (i = 0; i <= NUM_LAYERS; i++) { + if (!strcmp(g_aLayers[i]->m_pszName, layer_name)) + layer = g_aLayers[i]; + } + } + } + + if (layer) { + i = 0; + for (cur_node = node->children; cur_node; cur_node = cur_node->next) { + if (cur_node->type == XML_ELEMENT_NODE && strcmp(cur_node->name, "sublayer") == 0) { + if (i < 2) + layers_parse_sublayer(doc, &(layer->m_Style.m_aSubLayers[i]), cur_node); + i++; + } else if (cur_node->type == XML_ELEMENT_NODE && strcmp(cur_node->name, "label") == 0) { + layers_parse_label(doc, &(layer->m_TextLabelStyle), cur_node); + } + } + } +} + +static void +layers_parse_sublayer(xmlDocPtr doc, sublayerstyle_t *sublayer, xmlNodePtr node) +{ + xmlNodePtr cur_node = NULL; + + for (cur_node = node->children; cur_node; cur_node = cur_node->next) { + if (cur_node->type == XML_ELEMENT_NODE && strcmp(cur_node->name, "property") == 0) { + layers_parse_sublayer_property(doc, sublayer, cur_node); + } + } +} + +static void +layers_parse_sublayer_property(xmlDocPtr doc, sublayerstyle_t *sublayer, xmlNodePtr node) +{ + xmlAttrPtr cur_attr = NULL; + gchar *name = NULL; + gchar *levelstr = NULL; + gchar *value = NULL; + + for (cur_attr = node->properties; cur_attr; cur_attr = cur_attr->next) { + if (!strcmp(cur_attr->name, "name")) + name = xmlNodeListGetString(doc, cur_attr->xmlChildrenNode, 1); + else if (!strcmp(cur_attr->name, "level")) + levelstr = xmlNodeListGetString(doc, cur_attr->xmlChildrenNode, 1); + else if (!strcmp(cur_attr->name, "value")) + value = xmlNodeListGetString(doc, cur_attr->xmlChildrenNode, 1); + } + + if (name && value) { + gdouble width; + gint i, level; + + level = (levelstr? atoi(levelstr): 0); + + if (!strcmp(name, "width")) { + for (i = level-1; i < MAX_ZOOMLEVEL; i++) + sublayer->m_afLineWidths[i] = (gdouble)atof(value); + + } else if (!strcmp(name, "color")) { + layers_parse_color(&(sublayer->m_clrColor), value); + + } else if (!strcmp(name, "join-style")) { + if (!strcmp(value, "mitre")) + sublayer->m_nJoinStyle = CAIRO_LINE_JOIN_MITER; + else if (!strcmp(value, "round")) + sublayer->m_nJoinStyle = CAIRO_LINE_JOIN_ROUND; + + } else if (!strcmp(name, "cap-style")) { + if (!strcmp(value, "butt")) + sublayer->m_nCapStyle = CAIRO_LINE_CAP_BUTT; + else if (!strcmp(value, "round")) + sublayer->m_nCapStyle = CAIRO_LINE_CAP_ROUND; + + } + } +} + +static void +layers_parse_label(xmlDocPtr doc, textlabelstyle_t *label_style, xmlNodePtr node) +{ + xmlNodePtr cur_node = NULL; + + for (cur_node = node->children; cur_node; cur_node = cur_node->next) { + if (cur_node->type == XML_ELEMENT_NODE && strcmp(cur_node->name, "property") == 0) { + layers_parse_label_property(doc, label_style, cur_node); + } + } +} + +static void +layers_parse_label_property(xmlDocPtr doc, textlabelstyle_t *label_style, xmlNodePtr node) +{ + xmlAttrPtr cur_attr = NULL; + gchar *name = NULL; + gchar *levelstr = NULL; + gchar *value = NULL; + + for (cur_attr = node->properties; cur_attr; cur_attr = cur_attr->next) { + if (!strcmp(cur_attr->name, "name")) + name = xmlNodeListGetString(doc, cur_attr->xmlChildrenNode, 1); + else if (!strcmp(cur_attr->name, "level")) + levelstr = xmlNodeListGetString(doc, cur_attr->xmlChildrenNode, 1); + else if (!strcmp(cur_attr->name, "value")) + value = xmlNodeListGetString(doc, cur_attr->xmlChildrenNode, 1); + } + + if (name && value) { + gdouble fontsize ; + gint i, level; + + level = (levelstr? atoi(levelstr): 0); + + if (!strcmp(name, "fontsize")) { + for (i = level-1; i < MAX_ZOOMLEVEL; i++) + label_style->m_afFontSizeAtZoomLevel[i] = (gdouble)atof(value); + + } else if (!strcmp(name, "bold")) { + for (i = level-1; i < MAX_ZOOMLEVEL; i++) + label_style->m_abBoldAtZoomLevel[i] = (strcmp(value, "yes")? 0: 1); + + } else if (!strcmp(name, "halo")) { + for (i = level-1; i < MAX_ZOOMLEVEL; i++) + label_style->m_afHaloAtZoomLevel[i] = (gdouble)atof(value); + + } else if (!strcmp(name, "color")) { + layers_parse_color(&(label_style->m_clrColor), value); + + } + } +} + +static void +layers_parse_color(color_t *color, gchar *value) +{ + gchar *ptr; + + ptr = value; + if (*ptr = '#') ptr++; + ptr += 6; + color->m_fAlpha = (gfloat)strtol(ptr, NULL, 16)/255.0; + *ptr = '\0'; + ptr -= 2; + color->m_fBlue = (gfloat)strtol(ptr, NULL, 16)/255.0; + *ptr = '\0'; + ptr -= 2; + color->m_fGreen = (gfloat)strtol(ptr, NULL, 16)/255.0; + *ptr = '\0'; + ptr -= 2; + color->m_fRed = (gfloat)strtol(ptr, NULL, 16)/255.0; +} + + + +static void +layers_print_layer(layer_t *layer) +{ + printf("---------------\nlayer: %s (%d)\n", layer->m_pszName, layer->nLayerIndex); + layers_print_sublayer(&(layer->m_Style.m_aSubLayers[0])); + layers_print_sublayer(&(layer->m_Style.m_aSubLayers[1])); + //layers_print_labelstyle(&(layer->m_TextLabelStyle)); +} + +static void +layers_print_sublayer(sublayerstyle_t *sublayer) +{ + int i; + + printf("line widths: "); + for(i = MIN_ZOOMLEVEL; i <= MAX_ZOOMLEVEL; i++) printf(" %2.2f", sublayer->m_afLineWidths[i]); + printf("\n"); + + layers_print_color(&(sublayer->m_clrColor)); + + printf("join style: %d\n", sublayer->m_nJoinStyle); + printf("cap style: %d\n", sublayer->m_nCapStyle); +} + +static void +layers_print_color(color_t *color) +{ + printf("color: %3.2f, %3.2f, %3.2f, %3.2f\n", color->m_fRed, color->m_fGreen, color->m_fBlue, color->m_fAlpha); +} + +//-------------------------- +static void +layers_load_style(const gchar * file) +{ + xmlDocPtr doc = NULL; + xmlNodePtr root_element = NULL; + //int i; + + // Load style definition file + doc = xmlReadFile(PACKAGE_DATA_DIR"/data/layers.xml", NULL, 0); + if(doc == NULL) { + // try source directory if user hasn't done a 'make install' (good for development, too!) + doc = xmlReadFile(PACKAGE_SOURCE_DIR"/data/layers.xml", NULL, 0); + + if(doc == NULL) { + g_message("cannot load file layers.xml\n"); + gtk_exit(0); + } + } + + root_element = xmlDocGetRootElement(doc); + + layers_parse_layers(doc, root_element); + + //for (i = 1; i <= MAX_ZOOMLEVEL; i++) + // layers_print_layer(g_aLayers[i]); + + xmlFreeDoc(doc); +} + +static layer_t* +layers_new(gint index, gchar *name) +{ + layer_t *layer; + + layer = g_new0(layer_t, 1); + layer->nLayerIndex = index; + layer->m_pszName = name; + + return layer; +} + +void layers_init(void) +{ + g_aLayers[LAYER_NONE] = layers_new(LAYER_NONE, "unused"); + g_aLayers[LAYER_MINORSTREET] = layers_new(LAYER_MINORSTREET, "minor-roads"); + g_aLayers[LAYER_MAJORSTREET] = layers_new(LAYER_MAJORSTREET, "major-roads"); + g_aLayers[LAYER_MINORHIGHWAY] = layers_new(LAYER_MINORHIGHWAY, "minor-highways"); + g_aLayers[LAYER_MINORHIGHWAY_RAMP] = layers_new(LAYER_MINORHIGHWAY_RAMP, "minor-highway-ramps"); + g_aLayers[LAYER_MAJORHIGHWAY] = layers_new(LAYER_MAJORHIGHWAY, "major-highways"); + g_aLayers[LAYER_MAJORHIGHWAY_RAMP] = layers_new(LAYER_MAJORHIGHWAY_RAMP, "major-highway-ramps"); + g_aLayers[LAYER_RAILROAD] = layers_new(LAYER_RAILROAD, "railroad"); + g_aLayers[LAYER_PARK] = layers_new(LAYER_PARK, "parks"); + g_aLayers[LAYER_RIVER] = layers_new(LAYER_RIVER, "rivers"); + g_aLayers[LAYER_LAKE] = layers_new(LAYER_LAKE, "lakes"); + g_aLayers[LAYER_MISC_AREA] = layers_new(LAYER_MISC_AREA, "misc-area"); + + /* init libxml */ + LIBXML_TEST_VERSION + + layers_load_style(PACKAGE_SOURCE_DIR"/data/styles/road.xml"); + + xmlCleanupParser(); + //exit(1); +} + +void layers_deinit(void) +{ + +} + +#if 0 + layer_t g_aLayers[NUM_LAYERS + 1] = { /* 0 */ {0, "UNUSED LAYER", {{ @@ -179,3 +482,6 @@ layer_t g_aLayers[NUM_LAYERS + 1] = { {0.25,0.25,0.25,1.0}} }, }; + +#endif + Index: src/layers.h =================================================================== RCS file: /cvs/cairo/roadster/src/layers.h,v retrieving revision 1.3 diff -u -p -r1.3 layers.h --- src/layers.h 1 Mar 2005 19:48:21 -0000 1.3 +++ src/layers.h 3 Mar 2005 05:54:30 -0000 @@ -95,7 +95,10 @@ typedef struct layer { textlabelstyle_t m_TextLabelStyle; } layer_t; -extern layer_t g_aLayers[NUM_LAYERS+1]; +extern layer_t * g_aLayers[NUM_LAYERS+1]; + +void layers_init(void); +void layers_deinit(void); #ifdef __cplusplus } Index: src/main.c =================================================================== RCS file: /cvs/cairo/roadster/src/main.c,v retrieving revision 1.8 diff -u -p -r1.8 main.c --- src/main.c 1 Mar 2005 19:48:21 -0000 1.8 +++ src/main.c 3 Mar 2005 05:54:30 -0000 @@ -83,6 +83,8 @@ gboolean main_init(void) pointstring_init(); g_print("initializing tracks\n"); track_init(); + g_print("initializing layers\n"); + layers_init(); g_print("initializing glyphs\n"); glyph_init(); g_print("initializing map\n"); Index: src/map.c =================================================================== RCS file: /cvs/cairo/roadster/src/map.c,v retrieving revision 1.13 diff -u -p -r1.13 map.c --- src/map.c 2 Mar 2005 06:25:48 -0000 1.13 +++ src/map.c 3 Mar 2005 05:54:31 -0000 @@ -807,8 +807,8 @@ void map_draw(map_t* pMap, cairo_t *pCai layerdraworder[i].pFunc(pMap, pCairo, pRenderMetrics, /* geometry */ pMap->m_apLayerData[nLayer]->m_pPointStringsArray, - /* style */ &g_aLayers[nLayer].m_Style.m_aSubLayers[nSubLayer], - &g_aLayers[nLayer].m_TextLabelStyle + /* style */ &(g_aLayers[nLayer]->m_Style.m_aSubLayers[nSubLayer]), + &(g_aLayers[nLayer]->m_TextLabelStyle) ); } TIMER_END(maptimer, "END RENDER MAP"); @@ -1125,8 +1125,8 @@ static gboolean map_data_load(map_t* pMa gint nActiveLayerCount = 0; gint i; for(i=LAYER_FIRST ; i <= LAYER_LAST ;i++) { - if(g_aLayers[i].m_Style.m_aSubLayers[0].m_afLineWidths[nZoomLevel-1] != 0.0 || - g_aLayers[i].m_Style.m_aSubLayers[1].m_afLineWidths[nZoomLevel-1] != 0.0) + if(g_aLayers[i]->m_Style.m_aSubLayers[0].m_afLineWidths[nZoomLevel-1] != 0.0 || + g_aLayers[i]->m_Style.m_aSubLayers[1].m_afLineWidths[nZoomLevel-1] != 0.0) { gchar azLayerNumber[10];