]> mj.ucw.cz Git - leo.git/blobdiff - leo.c
Parametrized drawing of map scale
[leo.git] / leo.c
diff --git a/leo.c b/leo.c
index 10092d657cfb6d4bbd95d943c589550897583113..f8859e688c27999d8283b9880392c52e7fe0fa38 100644 (file)
--- a/leo.c
+++ b/leo.c
@@ -1,7 +1,7 @@
 /*
  *     Hic Est Leo -- Main Program
  *
- *     (c) 2014 Martin Mares <mj@ucw.cz>
+ *     (c) 2014--2015 Martin Mares <mj@ucw.cz>
  */
 
 #include <ucw/lib.h>
@@ -18,8 +18,6 @@
 #include "sym.h"
 #include "map.h"
 
-#undef ROTATE
-
 uns debug_dump_source, debug_dump_after_proj, debug_dump_after_scaling;
 uns debug_dump_multipolygons, debug_dump_css, debug_dump_styling, debug_dump_symbols;
 
@@ -47,71 +45,6 @@ static const struct opt_section options = {
   }
 };
 
-// FIXME: Make generic
-static void draw_scale(struct svg *svg)
-{
-  double dist = 1000;
-  double width = dist * map_scale;
-  double x = page_width - 10 - width;
-  double y = 50;
-
-  svg_push_element(svg, "g");
-  svg_set_attr(svg, "id", "scale");
-  svg_set_attr_format(svg, "transform", "translate(%.6g,%.6g)", x * svg->scale, y * svg->scale);
-
-  for (int outline=1; outline>=0; outline--)
-    {
-      svg_push_element(svg, "g");
-      svg_set_attr(svg, "stroke-linecap", "square");
-      if (outline)
-       {
-         svg_set_attr_dimen(svg, "stroke-width", 1.5);
-         svg_set_attr_color(svg, "stroke", 0xffffff);
-       }
-      else
-       {
-         svg_set_attr_dimen(svg, "stroke-width", 0.5);
-         svg_set_attr_color(svg, "stroke", 0);
-       }
-
-      svg_push_element(svg, "line");
-      svg_set_attr_dimen(svg, "x1", 0);
-      svg_set_attr_dimen(svg, "y1", 0);
-      svg_set_attr_dimen(svg, "x2", width);
-      svg_set_attr_dimen(svg, "y2", 0);
-      svg_pop(svg);
-
-      for (int i=0; i<=10; i++)
-       {
-         double tick;
-         switch (i)
-           {
-           case 0:
-           case 10:
-             tick = 3;
-             break;
-           case 5:
-             tick = 2;
-             break;
-           default:
-             tick = 1;
-           }
-         svg_push_element(svg, "line");
-         svg_set_attr_dimen(svg, "x1", width * i/10);
-         svg_set_attr_dimen(svg, "y1", 0);
-         svg_set_attr_dimen(svg, "x2", width * i/10);
-         svg_set_attr_dimen(svg, "y1", -tick);
-         svg_pop(svg);
-       }
-
-      svg_pop(svg);
-    }
-
-  scale_text(svg, 0, 5, osm_val_encode("0"));
-  scale_text(svg, width, 5, osm_val_encode("1 km"));
-  svg_pop(svg);
-}
-
 int main(int argc UNUSED, char **argv)
 {
   cf_def_file = "map.cf";
@@ -120,73 +53,25 @@ int main(int argc UNUSED, char **argv)
 
   osm_init();
   styles_init();
-
-  msg(L_INFO, "Parsing OSM");
-  osm_xml_parse(map_xml_input);
-  if (debug_dump_source)
-    {
-      puts("=== Source data ===");
-      osm_dump();
-    }
-  osm_make_multipolygons();
-
-  msg(L_INFO, "Projecting");
-  osm_project(map_projection);
-  if (debug_dump_after_proj)
-    {
-      puts("=== Map after projection ===");
-      osm_dump();
-    }
-
+  map_load_styles();
+  map_load_sources();
   map_set_scale();
-  if (debug_dump_after_scaling)
+
+  struct svg *svg = svg_open(map_svg_output);
+  if (!map_rotate)
     {
-      puts("=== Map after scaling ===");
-      osm_dump();
+      svg_set_attr_dimen(svg, "width", page_width);
+      svg_set_attr_dimen(svg, "height", page_height);
     }
-
-  struct css_sheet *ss = css_load(map_style_sheet);
-  if (debug_dump_css)
+  else
     {
-      puts("=== Stylesheet ===");
-      css_dump(ss);
+      svg_set_attr_dimen(svg, "width", page_height);
+      svg_set_attr_dimen(svg, "height", page_width);
     }
 
-  struct svg *svg = svg_open(map_svg_output);
-#ifndef ROTATE
-  svg_set_attr_dimen(svg, "width", page_width);
-  svg_set_attr_dimen(svg, "height", page_height);
-#else
-  svg_set_attr_dimen(svg, "width", page_height);
-  svg_set_attr_dimen(svg, "height", page_width);
-#endif
-
-  struct style_results r;
-  style_init(&r);
   sym_init();
 
-  msg(L_INFO, "Applying stylesheet");
-  for (uns i = OSM_TYPE_NODE; i <= OSM_TYPE_MULTIPOLYGON; i++)
-    CLIST_FOR_EACH(struct osm_object *, o, osm_obj_list[i])
-      {
-       if (debug_dump_styling)
-         {
-           puts("===============================");
-           osm_obj_dump(o);
-         }
-       if (!map_object_visible_p(o))
-         {
-           if (debug_dump_styling)
-             printf("--> invisible\n");
-           continue;
-         }
-       style_begin(&r, o);
-       css_apply(ss, &r);
-       if (debug_dump_styling)
-         style_dump(&r);
-       sym_from_style(o, &r, svg);
-       style_end(&r);
-      }
+  map_apply_styles(svg);
 
   if (map_clip)
     {
@@ -206,30 +91,12 @@ int main(int argc UNUSED, char **argv)
 
       svg_push_element(svg, "g");
       svg_set_attr_format(svg, "clip-path", "url(#boundary)");
-#ifdef ROTATE
-      svg_set_attr_format(svg, "transform", "translate(%.6g,0) rotate(90)", page_height * svg->scale);
-#endif
+      if (map_rotate)
+       svg_set_attr_format(svg, "transform", "translate(%.6g,0) rotate(90)", page_height * svg->scale);
     }
 
-  // FIXME: Replace by generic logo drawing facility
-  struct svg_icon *logo = svg_icon_load(svg, "../logo/kocka-s-okrajem.svg");
-
   sym_draw_all(svg);
 
-  // Draw logo
-  double logo_width = 36.12;
-  double logo_height = 36.12 / logo->width * logo->height;
-  struct svg_icon_request sir = {
-    .icon = logo,
-    .x = page_width - 12 - logo_width / 2,
-    .y = 10 + logo_height / 2,
-    .width = logo_width,
-    .height = logo_height,
-  };
-  svg_icon_put(svg, &sir);
-
-  draw_scale(svg);
-
   if (map_clip)
     svg_pop(svg);