]> mj.ucw.cz Git - leo.git/blobdiff - map.c
Parametrized drawing of map scale
[leo.git] / map.c
diff --git a/map.c b/map.c
index 8f318e23e9427bafa5a65a7baf5417a2d1ed68ad..af586c46b15bf8e86bc3de5914c96bed2d5b344e 100644 (file)
--- a/map.c
+++ b/map.c
@@ -1,7 +1,7 @@
 /*
  *     Hic Est Leo -- Global Map Operations
  *
- *     (c) 2014 Martin Mares <mj@ucw.cz>
+ *     (c) 2014--2015 Martin Mares <mj@ucw.cz>
  */
 
 #include <ucw/lib.h>
@@ -15,6 +15,7 @@
 
 #include "leo.h"
 #include "osm.h"
+#include "shp.h"
 #include "map.h"
 #include "css.h"
 #include "sym.h"
@@ -44,6 +45,7 @@ static const char * const map_formats[] = {
   "invalid",
   "osmxml",
   "fixed",
+  "shape",
 };
 
 static struct cf_section map_source_cf = {
@@ -53,6 +55,7 @@ static struct cf_section map_source_cf = {
     CF_STRING("File", P(file)),
     CF_LOOKUP("Format", P(format), map_formats),
     CF_LIST("StyleSheet", P(styles), &map_style_cf),
+    CF_INT("InlineStyles", P(inline_styles)),
     CF_END
   }
 #undef P
@@ -111,6 +114,8 @@ void map_set_scale(void)
   double rmin_y = INFINITY, rmax_y = -INFINITY;
   CLIST_FOR_EACH(struct data_source *, ds, map_sources)
     {
+      if (ds->format == DATA_SOURCE_FIXED)
+       continue;
       CLIST_FOR_EACH(struct osm_node *, n, ds->osm->obj_list[OSM_TYPE_NODE])
        {
          pmin_x = MIN(pmin_x, n->x);
@@ -234,12 +239,22 @@ static void map_load_source(struct data_source *ds)
       break;
     case DATA_SOURCE_FIXED:
       msg(L_INFO, "Adding fixed objects");
+      if (!ds->file)
+       ds->file = "fixed";
       fixed_add();
       break;
+    case DATA_SOURCE_SHAPE:
+      msg(L_INFO, "Parsing %s as shape file", ds->file);
+      if (!ds->file)
+       die("Shape data sources must have a file name");
+      shp_parse(ds->file);
+      need_proj = 1;
+      break;
     default:
       die("Invalid data source format");
     }
 
+  osm_stats();
   if (debug_dump_source)
     {
       puts("=== Source data ===");
@@ -266,6 +281,43 @@ void map_load_sources(void)
     map_load_source(ds);
 }
 
+static void map_apply_inline_styles(struct osm_object *o, struct style_results *r)
+{
+  char *name = NULL;
+
+  CLIST_FOR_EACH(struct osm_tag *, t, o->tags)
+    {
+      const char *key = osm_key_decode(t->key);
+      if (!strncmp(key, "style:", 6))
+       {
+         key += 6;
+         layer_t layer = STYLE_LAYER_DEFAULT;
+         char *sep = strstr(key, "::");
+         if (sep)
+           {
+             if (sep[2])
+               {
+                 // XXX: Only layers defined in the main stylesheet can be modified
+                 layer = style_layer_encode_if_exists(sep+2);
+                 if (!layer)
+                   goto skip;
+               }
+             int keylen = sep - key;
+             char *t = mp_alloc(r->pool, keylen+1);
+             memcpy(t, key, keylen);
+             t[keylen] = 0;
+             key = t;
+           }
+
+         if (!name)
+           name = mp_printf(r->pool, "inline style of object #%ju", (uintmax_t) o->id);
+         struct style_prop *p= css_parse_prop(r->pool, name, key, osm_val_decode(t->val));
+         style_set_by_layer(r, layer, p);
+skip: ;
+       }
+    }
+}
+
 void map_apply_styles(struct svg *svg)
 {
   struct style_results r;
@@ -291,6 +343,8 @@ void map_apply_styles(struct svg *svg)
            style_begin(&r, o);
            CLIST_FOR_EACH(struct data_source_style *, ss, ds->styles)
              css_apply(ss->css, &r);
+           if (ds->inline_styles)
+             map_apply_inline_styles(o, &r);
            if (debug_dump_styling)
              style_dump(&r);
            sym_from_style(o, &r, svg);
@@ -298,5 +352,5 @@ void map_apply_styles(struct svg *svg)
          }
     }
 
-  // FIXME: Ought to destroy the style_results
+  style_cleanup(&r);
 }