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];