]> mj.ucw.cz Git - leo.git/blob - sym-point.c
TODO
[leo.git] / sym-point.c
1 /*
2  *      Hic Est Leo -- Point and Icon Symbolizer
3  *
4  *      (c) 2014 Martin Mares <mj@ucw.cz>
5  */
6
7 #include "leo.h"
8 #include "osm.h"
9 #include "sym.h"
10 #include "svg.h"
11
12 #include <stdio.h>
13
14 static void sym_point_draw(struct symbol *sym, struct svg *svg)
15 {
16   struct sym_point *p = (struct sym_point *) sym;
17   struct osm_object *o = sym->o;
18   struct osm_node *n = (struct osm_node *) o;
19
20   if (o->type != OSM_TYPE_NODE)
21     {
22       msg(L_ERROR, "Point symbolizer works only on nodes. It's a bug, isn't it?");
23       return;
24     }
25
26   switch (p->shape)
27     {
28     case VALUE_CIRCLE:
29       svg_push_element(svg, "circle");
30       svg_set_attr_dimen(svg, "cx", n->x);
31       svg_set_attr_dimen(svg, "cy", n->y);
32       svg_set_attr_dimen(svg, "r", p->size / 2);
33       break;
34     // FIXME: Other shapes
35     default:
36       osm_obj_warn(o, "Unknown symbol-shape %s", osm_val_decode(p->shape));
37       return;
38     }
39
40   // FIMXE: Use COLOR_NONE instead of do_stroke and do_fill
41   if (p->do_stroke)
42     {
43       svg_set_attr_color(svg, "stroke", p->stroke_color);
44       svg_set_attr_dimen(svg, "stroke-width", p->stroke_width);
45       if (p->stroke_opacity != 1)
46         svg_set_attr_float(svg, "stroke-opacity", p->stroke_opacity);
47     }
48   if (p->do_fill)
49     {
50       svg_set_attr_color(svg, "fill", p->fill_color);
51       if (p->fill_opacity != 1)
52         svg_set_attr_float(svg, "fill-opacity", p->fill_opacity);
53     }
54   else
55     svg_set_attr(svg, "fill", "none");
56   svg_pop(svg);
57 }
58
59 static void sym_point_gen(struct osm_object *o, struct style_info *si, struct svg *svg UNUSED)
60 {
61   if (o->type != OSM_TYPE_NODE)
62     return;
63
64   osm_val_t shape = style_get_ident(si, PROP_SYMBOL_SHAPE);
65   if (!shape)
66     return;
67
68   struct sym_point *sp = sym_point_new(o);
69   sp->shape = shape;
70
71   sp->size = 1;
72   style_get_number(si, PROP_SYMBOL_SIZE, &sp->size);
73
74   sp->stroke_width = 0.1;
75   sp->stroke_color = 0xffc800;
76   sp->stroke_opacity = 1;
77   if (style_get_color(si, PROP_SYMBOL_STROKE_COLOR, &sp->stroke_color) |
78       style_get_number(si, PROP_SYMBOL_STROKE_WIDTH, &sp->stroke_width))
79     {
80       sp->do_stroke = 1;
81       style_get_number(si, PROP_SYMBOL_STROKE_OPACITY, &sp->stroke_opacity);
82     }
83
84   sp->fill_color = 0x0000ff;
85   sp->fill_opacity = 1;
86   if (style_get_color(si, PROP_SYMBOL_FILL_COLOR, &sp->fill_color) || !sp->do_stroke)
87     {
88       sp->do_fill = 1;
89       style_get_number(si, PROP_SYMBOL_FILL_OPACITY, &sp->fill_opacity);
90     }
91
92   sym_plan(&sp->s, sym_zindex(o, si, 4));
93 }
94
95 struct symbolizer symbolizer_point = {
96   .name = "point",
97   .draw = sym_point_draw,
98   .gen = sym_point_gen,
99 };
100
101 struct sym_point *sym_point_new(struct osm_object *o)
102 {
103   return sym_new(SYMBOLIZER_POINT, o, sizeof(struct sym_point));
104 }
105
106 /*** Icons ***/
107
108 static void sym_icon_draw(struct symbol *sym, struct svg *svg)
109 {
110   struct sym_icon *i = (struct sym_icon *) sym;
111   svg_icon_put(svg, &i->sir);
112 }
113
114 static void sym_icon_gen(struct osm_object *o, struct style_info *si, struct svg *svg)
115 {
116   if (o->type != OSM_TYPE_NODE && o->type != OSM_TYPE_WAY && o->type != OSM_TYPE_MULTIPOLYGON)
117     return;
118
119   osm_val_t image = style_get_string(si, PROP_ICON_IMAGE);
120   if (!image)
121     return;
122
123   struct sym_icon *sic = sym_icon_new(o);
124   struct svg_icon *icon = svg_icon_load(svg, osm_val_decode(image));
125   struct svg_icon_request *sir = &sic->sir;
126   sir->icon = icon;
127
128   if (!osm_obj_center(o, &sir->x, &sir->y))
129     return;
130
131   sir->width = icon->width;
132   sir->height = icon->height;
133   style_scale(si, &sir->width, &sir->height, PROP_ICON_WIDTH, PROP_ICON_HEIGHT);
134
135   // FIXME
136   // sir->opacity = 1;
137   // style_get_number(si, PROP_ICON_OPACITY, &sir->opacity);
138
139   sym_plan(&sic->s, sym_zindex(o, si, 4));
140 }
141
142 struct symbolizer symbolizer_icon = {
143   .name = "icon",
144   .draw = sym_icon_draw,
145   .gen = sym_icon_gen,
146 };
147
148 struct sym_icon *sym_icon_new(struct osm_object *o)
149 {
150   return sym_new(SYMBOLIZER_ICON, o, sizeof(struct sym_icon));
151 }