]> mj.ucw.cz Git - leo.git/blob - leo.c
Parametrized drawing of map scale
[leo.git] / leo.c
1 /*
2  *      Hic Est Leo -- Main Program
3  *
4  *      (c) 2014--2015 Martin Mares <mj@ucw.cz>
5  */
6
7 #include <ucw/lib.h>
8 #include <ucw/conf.h>
9 #include <ucw/opt.h>
10
11 #include <stdio.h>
12
13 #include "leo.h"
14 #include "osm.h"
15 #include "svg.h"
16 #include "style.h"
17 #include "css.h"
18 #include "sym.h"
19 #include "map.h"
20
21 uns debug_dump_source, debug_dump_after_proj, debug_dump_after_scaling;
22 uns debug_dump_multipolygons, debug_dump_css, debug_dump_styling, debug_dump_symbols;
23
24 static struct cf_section debug_cf = {
25   CF_ITEMS {
26     CF_UNS("DumpSource", &debug_dump_source),
27     CF_UNS("DumpAfterProj", &debug_dump_after_proj),
28     CF_UNS("DumpAfterScaling", &debug_dump_after_scaling),
29     CF_UNS("DumpMultipolygons", &debug_dump_multipolygons),
30     CF_UNS("DumpCSS", &debug_dump_css),
31     CF_UNS("DumpStyling", &debug_dump_styling),
32     CF_UNS("DumpSymbols", &debug_dump_symbols),
33     CF_END
34   }
35 };
36
37 static const struct opt_section options = {
38   OPT_ITEMS {
39     OPT_HELP("Hic Est Leo -- Experimental Map Renderer"),
40     OPT_HELP(""),
41     OPT_HELP("Options:"),
42     OPT_HELP_OPTION,
43     OPT_CONF_OPTIONS,
44     OPT_END
45   }
46 };
47
48 int main(int argc UNUSED, char **argv)
49 {
50   cf_def_file = "map.cf";
51   cf_declare_section("Debug", &debug_cf, 0);
52   opt_parse(&options, argv+1);
53
54   osm_init();
55   styles_init();
56   map_load_styles();
57   map_load_sources();
58   map_set_scale();
59
60   struct svg *svg = svg_open(map_svg_output);
61   if (!map_rotate)
62     {
63       svg_set_attr_dimen(svg, "width", page_width);
64       svg_set_attr_dimen(svg, "height", page_height);
65     }
66   else
67     {
68       svg_set_attr_dimen(svg, "width", page_height);
69       svg_set_attr_dimen(svg, "height", page_width);
70     }
71
72   sym_init();
73
74   map_apply_styles(svg);
75
76   if (map_clip)
77     {
78       svg_push_element(svg, "defs");
79       svg_push_element(svg, "clipPath");
80       svg_set_attr(svg, "id", "boundary");
81       svg_push_path(svg);
82       svg_path_move_to(svg, page_offset_x, page_offset_y);
83       svg_path_line_to_rel(svg, page_map_width, 0);
84       svg_path_line_to_rel(svg, 0, page_map_height);
85       svg_path_line_to_rel(svg, -page_map_width, 0);
86       svg_path_close(svg);
87       svg_path_end(svg);
88       svg_pop(svg);
89       svg_pop(svg);
90       svg_pop(svg);
91
92       svg_push_element(svg, "g");
93       svg_set_attr_format(svg, "clip-path", "url(#boundary)");
94       if (map_rotate)
95         svg_set_attr_format(svg, "transform", "translate(%.6g,0) rotate(90)", page_height * svg->scale);
96     }
97
98   sym_draw_all(svg);
99
100   if (map_clip)
101     svg_pop(svg);
102
103   if (map_draw_border)
104     {
105       svg_push_element(svg, "rect");
106       svg_set_attr_dimen(svg, "x", page_offset_x);
107       svg_set_attr_dimen(svg, "y", page_offset_y);
108       svg_set_attr_dimen(svg, "width", page_map_width);
109       svg_set_attr_dimen(svg, "height", page_map_height);
110       svg_set_attr(svg, "fill", "none");
111       svg_set_attr(svg, "stroke", "blue");
112       svg_set_attr_dimen(svg, "stroke-width", 0.2);
113       svg_pop(svg);
114     }
115
116   svg_close(svg);
117
118   msg(L_INFO, "Finished");
119   return 0;
120 }