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