]> mj.ucw.cz Git - leo.git/blobdiff - labeller.h
Labelling: Bugfixes in get_closure
[leo.git] / labeller.h
index c16c43dd11518a40c37b82733c2f08e4d4aa74a9..3bd13e5f1e7204e2ac52fd9932d6a3b0d887c6b2 100644 (file)
@@ -1,14 +1,18 @@
 #ifndef _LEO_LABELLER_H
 #define _LEO_LABELLER_H
 
-enum edge_dir
-{
-  DIR_INVALID,
-  DIR_UNSET,
-  DIR_CENTER,
-  DIR_FWD,
-  DIR_BWD,
-};
+#include "lab-utils.h"
+
+/*
+* Requests for point refer directly to point symbols that should be placed.
+* Line and area requests are in fact requests for labels (either symbols or
+* textual labels) of such objects.
+* Area requests are taken quite as-is,
+* line requests are broken into section and segment requests -- each line
+* is broken into sections of maximal length and each section is made of segments
+* which correspond to OSM ways.
+* For each line, exactly one segment of each section is labelled in the output.
+*/
 
 enum request_type
 {
@@ -20,72 +24,54 @@ enum request_type
   REQUEST_SEGMENT,
 };
 
-enum term_cond
-{
-  TERM_COND_PENALTY,
-  TERM_COND_STAGNATION,
-  TERM_COND_ITERATIONS,
-};
-
-struct point_variant
+struct variant
 {
   int width;
   int height;
-  bool *bitmap;
-};
-
-struct line_variant
-{
-  bool *masks;
+  int offset_x;                // Desired offset of top-left corner with respect to
+  int offset_y;                // actual coordinates of corresponding object
+  bool *bitmap;                // Mask having 1s where the variant is not blank; used for overlap check
 };
 
 struct request
 {
   enum request_type type;
-  int ind;
+  int ind;                     // Index used whenever request indexing is needed
+  struct variant *variants;    // Growing array of all variants usable for this request
 };
 
 struct request_point
 {
   struct request request;
   struct symbol *sym;
-  z_index_t zindex;
+  z_index_t zindex;            // Needed when planning symbol
   double x;
   double y;
-  double offset_x;
-  double offset_y;
-  int num_variants;
-  struct point_variant *variants;
 };
 
 struct request_segment
 {
   struct request request;
-  struct request_line *rl;
-  double x1;
+  struct symbol *label;
+  double x1;                   // Start and end of segment
   double y1;
   double x2;
   double y2;
-  double angle;
-  struct symbol *label;
-  struct point_variant *variant;
-  z_index_t zindex;
+  double slope;                        // Used to calculate label rotation
+  z_index_t zindex;            // Needed when planning symbol
 };
 
 struct request_section
 {
   struct request request;
-  int num_segments;
-  struct request_segment *segments;
+  struct request_segment *segments;    // Growing array
 };
 
 struct request_line
 {
   struct request request;
   struct symbol *line;
-  int num_variants;
-  struct line_variant *variants;
-  struct request_section *sections;
+  struct request_section *sections;    // Growing array
 };
 
 struct request_area
@@ -93,17 +79,19 @@ struct request_area
   struct request request;
   struct osm_multipolygon *o;
   struct symbol *label;
-  struct point_variant *variants;
   z_index_t zindex;
-  double cx, cy;
+  double cx, cy;               // Area center (coordinates average), used as reference coordinates
 };
 
+// Buffer for lines (osm_ways) added via labeller_notify_line,
+// used to make graph and join lines which should be labelled as one object
 struct buffer_line
 {
   struct sym_line *line;
-  z_index_t zindex;
 };
 
+// Buffer for line labes,
+// used to label graph -- join logical lines with their labels
 struct buffer_linelabel
 {
   struct osm_way *way;
@@ -111,65 +99,80 @@ struct buffer_linelabel
   z_index_t zindex;
 };
 
-struct graph_node
-{
-  osm_id_t id;
-  struct osm_node *o;
-  struct graph_edge **edges;
-  int num;
-};
-
-struct graph_edge
-{
-  osm_id_t id;
-  double length;
-  color_t color;
-  int visited;
-  struct graph_edge *prev;
-  struct graph_edge *next;
-  struct graph_node *n1;
-  struct graph_node *n2;
-  uns longline;
-  struct symbol *label;
-  struct sym_line *line;
-  z_index_t zindex;
-  enum edge_dir dir;
-  struct graph_node *anode;
-  struct graph_node *bnode; // DEBUG PRINT
-  int num; // DEBUG
-};
-
-struct longline
-{
-  uns id;
-  struct graph_edge *first;
-};
-
 struct placement
 {
   struct request *request;
-  double x;
+  struct individual *individual;// FIXME: Is it needed?
+  double x;                    // Coordinates of variant top-left corner placement
   double y;
-  int variant_used;
-  bool processed;
+  int variant_used;            // Variant chosen for request in this placement
+  int ind;                     // Index used whenever placement indexing is needed
+  bool processed;              // FIXME: Is it needed?
+  // FIXME: Replace with clist?
+  struct map_placement *map_links;
 };
 
-struct map_part
+struct map_placement
 {
+  struct placement *placement;
+  struct map_part *part;
+  struct map_placement *next_in_map;
+  struct map_placement *prev_in_map;
+  struct map_placement *next_in_placement;
+  struct map_placement *prev_in_placement;
 };
 
-struct individual
+struct map_part
 {
-  struct placement *placements;
-  struct map_part **map;
-  int penalty;
+  // FIXME: Replace with clist?
+  struct map_placement *placement;
+  int ind;
 };
 
+void labeller_conf(void);
 void labeller_init(void);
-void labeller_add_point(struct symbol *sym, struct osm_object *object, z_index_t zindex);
-void labeller_add_line(struct symbol *sym, z_index_t zindex);
+void labeller_cleanup(void);
+
 void labeller_label(void);
-void labeller_add_linelabel(struct symbol *sym, struct osm_object *o, z_index_t zindex);
-void labeller_add_arealabel(struct symbol *sym, struct osm_object *o, z_index_t zindex);
+
+void labeller_add_point(struct symbol *sym, struct osm_object *object, z_index_t zindex);
+void labeller_notify_line(struct symbol *sym, z_index_t zindex);
+void labeller_add_label(struct symbol *sym, struct osm_object *o, z_index_t zindex);
+
+extern struct request_point *requests_point;
+extern struct request_line *requests_line;
+extern struct request_area *requests_area;
+
+extern struct longline *longlines;
+extern struct buffer_line *buffer_line;
+extern struct buffer_linelabel *buffer_linelabel;
+
+extern int dbg_segments;
+extern int dbg_plan;
+extern int dbg_requests;
+extern int dbg_graph;
+extern int dbg_bfs;
+extern int dbg_map_parts;
+extern int dbg_movement;
+extern int dbg_init;
+extern int dbg_overlaps;
+extern int dbg_rank;
+extern int dbg_evolution;
+extern int dbg_mutation;
+extern int dbg_breeding;
+
+extern int page_width_int;
+extern int page_height_int;
+
+extern int num_requests;
+extern int num_placements;
+
+extern int conf_map_part_width;
+extern int conf_map_part_height;
+
+extern uns num_map_parts_row;
+extern uns num_map_parts_col;
+extern uns num_map_parts;
+
 
 #endif