]> mj.ucw.cz Git - leo.git/blobdiff - map.c
TODO
[leo.git] / map.c
diff --git a/map.c b/map.c
index bbcd7463b1f33de9864a3becb632b2b8c2c3f50e..41bf483eeeddb7f2149f761c719470c4287b2c32 100644 (file)
--- a/map.c
+++ b/map.c
@@ -1,18 +1,9 @@
 /*
  *     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>
-#include <ucw/conf.h>
-#include <ucw/gary.h>
-#include <ucw/mempool.h>
-#include <ucw/simple-lists.h>
-
-#include <stdio.h>
-#include <math.h>
-
 #include "leo.h"
 #include "osm.h"
 #include "shp.h"
 #include "sym.h"
 #include "fixed.h"
 
+#include <ucw/conf.h>
+#include <ucw/gary.h>
+#include <ucw/mempool.h>
+#include <ucw/simple-lists.h>
+
+#include <stdio.h>
+#include <math.h>
+
 double map_min_x, map_min_y;
 double map_max_x, map_max_y;
 double page_width, page_height;
@@ -55,6 +54,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
@@ -113,6 +113,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);
@@ -278,6 +280,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;
@@ -303,6 +342,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);
@@ -310,5 +351,5 @@ void map_apply_styles(struct svg *svg)
          }
     }
 
-  // FIXME: Ought to destroy the style_results
+  style_cleanup(&r);
 }