]> mj.ucw.cz Git - leo.git/commitdiff
Labelling: Clean-up and a lot of new mess
authorKarryanna <karry@karryanna.cz>
Mon, 13 Apr 2015 19:24:13 +0000 (21:24 +0200)
committerKarryanna <karry@karryanna.cz>
Mon, 13 Apr 2015 19:24:13 +0000 (21:24 +0200)
labeller.c
labeller.h
sym-point.c

index d64c67a0c7143a90d6d05d64e4d88e765f005d30..32577bfe8aa4431ffa26068766e3ea315100f038 100644 (file)
@@ -77,9 +77,31 @@ int move_max = 1;
 
 int num_requests = 0;
 
+void dump_graph(void);
+void bfs2(void);
+void bfs_edge(struct graph_edge *e, struct graph_node *node, struct graph_node *anode, int dir);
+void bfs_wrapper(void);
+void oldbfs(void);
+void dump_longlines(void);
+void dump_linelabel_requests(void);
+void dump_individual(struct individual *individual);
+void print_label(struct symbol *sym);
+
+void print_label(struct symbol *sym)
+{
+  switch (sym->type)
+  {
+    case SYMBOLIZER_TEXT: ;
+      struct sym_text *st = (struct sym_text *) sym;
+      printf("%s\n", osm_val_decode(st->text));
+    default:
+      // FIXME
+      ;
+  }
+}
+
 void labeller_init(void)
 {
-//  mpool_requests = mp_new(BLOCK_SIZE);
   GARY_INIT(requests_point, 0);
   GARY_INIT(requests_line, 0);
   GARY_INIT(requests_area, 0);
@@ -110,14 +132,12 @@ void make_bitmap_label(struct point_variant *v UNUSED, struct sym_text *text UNU
 
 void labeller_add_point(struct symbol *sym, struct osm_object *object, z_index_t zindex)
 {
-/* FIXME
-   What does correct check look like?
+printf("Adding point\n");
   if (object->type != OSM_TYPE_NODE)
   {
-    // FIXME
+    printf("Warning: Point label requested on non-point object\n");
     return;
   }
-*/
 
   struct request_point *r = GARY_PUSH(requests_point);
 
@@ -125,7 +145,6 @@ void labeller_add_point(struct symbol *sym, struct osm_object *object, z_index_t
   r->request.ind = num_requests++;
 
   r->sym = sym;
-  r->object = object;
   r->zindex = zindex;
 
   r->offset_x = 0;
@@ -136,6 +155,9 @@ void labeller_add_point(struct symbol *sym, struct osm_object *object, z_index_t
 
   struct point_variant *v = GARY_PUSH(r->variants);
 
+  struct osm_node *n = (struct osm_node *) object; // FIXME: Compiler warning
+  r->x = n->x;
+  r->y = n->y;
   switch (sym->type)
   {
     case SYMBOLIZER_ICON:
@@ -145,12 +167,12 @@ void labeller_add_point(struct symbol *sym, struct osm_object *object, z_index_t
       break;
     case SYMBOLIZER_POINT:
       make_bitmap_point(v, (struct sym_point *) sym);
-      struct osm_node *n = (struct osm_node *) object;
-      r->x = n->x;
-      r->y = n->y;
       break;
+    case SYMBOLIZER_TEXT: ;
+      struct sym_text *st = (struct sym_text *) sym;
+      struct osm_node *n = (struct osm_node *) object;
+      make_bitmap_label(v, st);
     default:
-      // Oops :)
       // FIXME
       return;
   }
@@ -160,6 +182,7 @@ void labeller_add_point(struct symbol *sym, struct osm_object *object, z_index_t
 
 void labeller_add_line(struct symbol *sym, z_index_t zindex)
 {
+printf("Adding line\n");
   struct buffer_line *b = GARY_PUSH(buffer_line);
   b->line = (struct sym_line *) sym;
   b->zindex = zindex;
@@ -168,26 +191,46 @@ void labeller_add_line(struct symbol *sym, z_index_t zindex)
 
 void labeller_add_linelabel(struct symbol *sym, struct osm_object *o, z_index_t zindex)
 {
+  if (o->type != OSM_TYPE_WAY)
+  {
+    // FIXME
+    return;
+  }
+
+  printf("[LAB] Labelling way %ju\n", o->id);
   struct buffer_linelabel *ll = GARY_PUSH(buffer_linelabel);
   ll->way = (struct osm_way *) o;
-  ll->text = (struct sym_text *) sym;
+  ll->label = sym;
   ll->zindex = zindex;
 }
 
-void labeller_add_arealabel(struct symbol *sym UNUSED, struct osm_object *o, z_index_t zindex)
+void labeller_add_arealabel(struct symbol *sym, struct osm_object *o, z_index_t zindex)
 {
+printf("Adding area\n");
   struct request_area *r = GARY_PUSH(requests_area);
 
-  r->request.type = REQUEST_AREALABEL;
+  r->request.type = REQUEST_AREA;
   r->request.ind = num_requests++;
 
   r->o = (struct osm_multipolygon *) o;
   r->zindex = zindex;
-  r->sym = (struct sym_text *) sym;
+  r->label = sym;
+
+  osm_obj_center(o, &(r->cx), &(r->cy));
 
-  GARY_INIT(r->text_variant, 0);
-  struct point_variant *v = GARY_PUSH(r->text_variant);
-  make_bitmap_label(v, r->sym);
+  GARY_INIT(r->variants, 0);
+  struct point_variant *v = GARY_PUSH(r->variants);
+  switch (sym->type)
+  {
+    case SYMBOLIZER_ICON:
+      make_bitmap_icon(v, (struct sym_icon *) sym);
+      break;
+    case SYMBOLIZER_TEXT:
+      make_bitmap_label(v, (struct sym_text *) sym);
+    default:
+      // FIXME
+      ;
+  }
 }
 
 void make_graph(void)
@@ -235,9 +278,9 @@ void make_graph(void)
       e->n1 = g_prev;
       e->n2 = g_node;
       e->longline = (uns) -1;
-      e->text = NULL;
-      e->sym = buffer_line[i].line;
+      e->line = buffer_line[i].line;
       e->dir = 0;
+      e->label = NULL;
 
       struct graph_edge **edge = GARY_PUSH(g_prev->edges);
       *edge = e;
@@ -267,7 +310,8 @@ void dump_graph(void)
         printf("BEWARE! BEWARE! BEWARE!\n");
 
       printf("\t\t");
-      if (node->edges[i]->text) printf(" labelled %s;", osm_val_decode(node->edges[i]->text->text));
+      if ((node->edges[i]->label)) printf("Labelled\n");
+      if ((node->edges[i]->label) && (node->edges[i]->label->type == SYMBOLIZER_TEXT)) printf(" labelled %s;", osm_val_decode(((struct sym_text *) node->edges[i]->label)->text));
       printf(" colored %d;", node->edges[i]->color);
       printf("   length %.2f", node->edges[i]->length);
       printf("\n");
@@ -281,7 +325,8 @@ void label_graph(void)
 printf("There are %u line labels requested\n", GARY_SIZE(buffer_linelabel));
   for (uns i=0; i<GARY_SIZE(buffer_linelabel); i++)
   {
-    printf("Labelling nodes of way %s\n", osm_val_decode(buffer_linelabel[i].text->text));
+    if (buffer_linelabel[i].label->type == SYMBOLIZER_TEXT)
+    printf("Labelling nodes of way %s\n", osm_val_decode(((struct sym_text *) buffer_linelabel[i].label)->text));
     CLIST_FOR_EACH(struct osm_ref *, ref, buffer_linelabel[i].way->nodes)
     {
       printf("Looking for node %ju\n", ref->o->id);
@@ -298,7 +343,7 @@ printf("There are %u line labels requested\n", GARY_SIZE(buffer_linelabel));
           if (n->edges[j]->id == buffer_linelabel[i].way->o.id)
           {
             printf("Labelling node %ju\n", n->id);
-            n->edges[j]->text = buffer_linelabel[i].text;
+            n->edges[j]->label = buffer_linelabel[i].label;
             n->edges[j]->zindex = buffer_linelabel[i].zindex;
           }
         }
@@ -307,117 +352,123 @@ printf("There are %u line labels requested\n", GARY_SIZE(buffer_linelabel));
   }
 }
 
-void join_edge(struct graph_edge *e, int dir)
-{
-  struct graph_node *other_node = NULL;
-  switch (dir)
-  {
-    case 1:
-      other_node = e->n2;
-      break;
-    case 2:
-      other_node = e->n1;
-      break;
-    // FIXME: default?
-  }
-
-  struct graph_edge *candidate = NULL;
-  for (uns i=0; i<GARY_SIZE(other_node->edges); i++)
-  {
-    struct graph_edge *other = other_node->edges[i];
-    if (! other->visited)
-    {
-    struct graph_edge **new = GARY_PUSH(bfs_queue);
-    *new = other_node->edges[i];
-    }
-
-    if ((!other->visited) && (e->text) && (other->text) && (e->text->text == other->text->text))
-    {
-      if (e->color == other_node->edges[i]->color)
-      {
-        if ((!candidate) || (candidate->length < other->length))
-        {
-          candidate = other;
-        }
-      }
-      else
-      {
-        // Beware: Name conflict here
-      }
-    }
-  }
-
-  if (candidate)
-  {
-    candidate->longline = e->longline;
-    if (dir == 1)
-    {
-      if (candidate->n2 != e->n1)
-      {
-       candidate->n1 = candidate->n2;
-       candidate->n2 = e->n1;
-      }
-      e->prev = candidate;
-      candidate->next = e;
 
-      longlines[e->longline].first = candidate;
-    }
-    else
-    {
-      if (candidate->n1 != e->n2)
-      {
-       candidate->n2 = candidate->n1;
-       candidate->n1 = e->n2;
-      }
-      e->next = candidate;
-      candidate->prev = e;
-    }
-  }
-}
 
+/***
+* void join_edge(struct graph_edge *e, int dir)
+* {
+*   struct graph_node *other_node = NULL;
+*   switch (dir)
+*   {
+*     case 1:
+*       other_node = e->n2;
+*       break;
+*     case 2:
+*       other_node = e->n1;
+*       break;
+*     // FIXME: default?
+*   }
+* 
+*   struct graph_edge *candidate = NULL;
+*   for (uns i=0; i<GARY_SIZE(other_node->edges); i++)
+*   {
+*     struct graph_edge *other = other_node->edges[i];
+*     if (! other->visited)
+*     {
+*     struct graph_edge **new = GARY_PUSH(bfs_queue);
+*     *new = other_node->edges[i];
+*     }
+* 
+*     if ((!other->visited) && (e->text) && (other->text) && (e->text->text == other->text->text))
+*     {
+*       if (e->color == other_node->edges[i]->color)
+*       {
+*         if ((!candidate) || (candidate->length < other->length))
+*         {
+*           candidate = other;
+*         }
+*       }
+*       else
+*       {
+*         // Beware: Name conflict here
+*       }
+*     }
+*   }
+* 
+*   if (candidate)
+*   {
+*     candidate->longline = e->longline;
+*     if (dir == 1)
+*     {
+*       if (candidate->n2 != e->n1)
+*       {
+*      candidate->n1 = candidate->n2;
+*      candidate->n2 = e->n1;
+*       }
+*       e->prev = candidate;
+*       candidate->next = e;
+* 
+*       longlines[e->longline].first = candidate;
+*     }
+*     else
+*     {
+*       if (candidate->n1 != e->n2)
+*       {
+*      candidate->n2 = candidate->n1;
+*      candidate->n1 = e->n2;
+*       }
+*       e->next = candidate;
+*       candidate->prev = e;
+*     }
+*   }
+* }
+* ***/
+
+/***
 void bfs2(void)
-{
-  GARY_INIT(bfs_queue, 0);
-  GARY_INIT(longlines, 0);
-
-  printf("Making longlines from %u causal lines, using %d graph edges\n", GARY_SIZE(buffer_line), num_edges_dbg);
-
-  HASH_FOR_ALL(hash, node)
-  {
-    for (uns i=0; i<GARY_SIZE(node->edges); i++)
-    {
-      struct graph_edge *e = node->edges[i];
-
-//      printf("Examining edge from [%.2f; %.2f] to [%.2f; %.2f]\n",
-//              e->n1->o->x, e->n1->o->y, e->n2->o->x, e->n2->o->y);
-
-      // if (e->visited) HASH_CONTINUE; // FIXME: Is is correct?
-      if (e->visited) continue;
-//      printf("Continuing\n");
-      if (e->longline == (uns) -1)
-      {
-        GARY_PUSH(longlines);
-        e->longline = num_longlines++;
-        longlines[e->longline].first = e;
-      }
-//      printf("Longline is %u\n", e->longline);
-
-      e->visited = 1;
-
-      if (! e->prev)
-      {
-        join_edge(e, 1);
-      }
-      if (! e->next)
-      {
-        join_edge(e, 2);
-      }
-    }
-  }
-  HASH_END_FOR;
-
-  GARY_FREE(bfs_queue);
-}
+* {
+*   GARY_INIT(bfs_queue, 0);
+*   GARY_INIT(longlines, 0);
+* 
+*   printf("Making longlines from %u causal lines, using %d graph edges\n", GARY_SIZE(buffer_line), num_edges_dbg);
+* 
+*   HASH_FOR_ALL(hash, node)
+*   {
+*     for (uns i=0; i<GARY_SIZE(node->edges); i++)
+*     {
+*       struct graph_edge *e = node->edges[i];
+* 
+* //      printf("Examining edge from [%.2f; %.2f] to [%.2f; %.2f]\n",
+* //              e->n1->o->x, e->n1->o->y, e->n2->o->x, e->n2->o->y);
+* 
+*       // if (e->visited) HASH_CONTINUE; // FIXME: Is is correct?
+*       if (e->visited) continue;
+* //      printf("Continuing\n");
+*       if (e->longline == (uns) -1)
+*       {
+*         GARY_PUSH(longlines);
+*         e->longline = num_longlines++;
+*         longlines[e->longline].first = e;
+*       }
+* //      printf("Longline is %u\n", e->longline);
+* 
+*       e->visited = 1;
+* 
+*       if (! e->prev)
+*       {
+*         join_edge(e, 1);
+*       }
+*       if (! e->next)
+*       {
+*         join_edge(e, 2);
+*       }
+*     }
+*   }
+*   HASH_END_FOR;
+* 
+*   GARY_FREE(bfs_queue);
+* }
+* ***/
 
 void bfs_edge(struct graph_edge *e, struct graph_node *node, struct graph_node *anode, int dir)
 {
@@ -445,7 +496,10 @@ if (other->num == 44) printf("Longline of 44 is %u\n", other->longline);
         continue;
 
     if (((other->n1->id == node->id) || (other->n2->id == node->id)) &&
-        (e->text) && (other->text) && (e->text->text == other->text->text))
+        (e->label) && (other->label) &&
+        (e->label->type == SYMBOLIZER_TEXT) && (other->label->type == SYMBOLIZER_TEXT) &&
+        (((struct sym_text *) e->label)->text == ((struct sym_text *) other->label)->text))
+//        (e->text) && (other->text) && (e->text->text == other->text->text))
     {
       if (! candidate || (other->length > candidate->length))
       candidate = other;
@@ -533,59 +587,61 @@ void bfs_wrapper(void)
   GARY_FREE(bfs_queue);
 }
 
-void oldbfs(void)
-{
-  printf("Starting outer BFS\n");
-  printf("There are %u buffered lines and %d eges\n", GARY_SIZE(buffer_line), num_edges_dbg);
-
-  GARY_INIT(bfs_queue, 0);
-  GARY_INIT(longlines, 0);
-
-  int dbg_bfs_continues = 0;
-
-  HASH_FOR_ALL(hash, node)
-  {
-    // FIXME: Skip if visited node
-
-    for (uns i=0; i<GARY_SIZE(node->edges); i++)
-    {
-      struct graph_edge *e = node->edges[i];
-
-      if (e->visited) continue;
-
-      // BFS itself
-      for (uns i1=0; i1<GARY_SIZE(e->n1->edges); i1++)
-      {
-        struct graph_edge *other = e->n1->edges[i1];
-        if (other->visited) { dbg_bfs_continues++; continue; }
-
-        if (((other->n1->id == e->n1->id) || (other->n2->id == e->n1->id)) &&
-            (e->text) && (other->text) && (e->text->text == other->text->text))
-        {
-//          printf("Hit\n");
-          other->visited = 1;
-        }
-      }
-      for (uns i2=0; i2<GARY_SIZE(e->n2->edges); i2++)
-      {
-        struct graph_edge *other = e->n2->edges[i2];
-        if (other->visited) {dbg_bfs_continues++; continue; }
-
-        if (((other->n1->id == e->n2->id) || (other->n2->id == e->n2->id)) &&
-            (e->text) && (other->text) && (e->text->text == other->text->text))
-        {
-//          printf("Hit\n");
-          other->visited = 1;
-        }
-      }
-    }
-  }
-
-  HASH_END_FOR;
-  printf("Total: %d hits, %d visited edges skipped\n", dbg_num_hits, dbg_bfs_continues);
-
-  GARY_FREE(bfs_queue);
-}
+/***
+* void oldbfs(void)
+* {
+*   printf("Starting outer BFS\n");
+*   printf("There are %u buffered lines and %d eges\n", GARY_SIZE(buffer_line), num_edges_dbg);
+* 
+*   GARY_INIT(bfs_queue, 0);
+*   GARY_INIT(longlines, 0);
+* 
+*   int dbg_bfs_continues = 0;
+* 
+*   HASH_FOR_ALL(hash, node)
+*   {
+*     // FIXME: Skip if visited node
+* 
+*     for (uns i=0; i<GARY_SIZE(node->edges); i++)
+*     {
+*       struct graph_edge *e = node->edges[i];
+* 
+*       if (e->visited) continue;
+* 
+*       // BFS itself
+*       for (uns i1=0; i1<GARY_SIZE(e->n1->edges); i1++)
+*       {
+*         struct graph_edge *other = e->n1->edges[i1];
+*         if (other->visited) { dbg_bfs_continues++; continue; }
+* 
+*         if (((other->n1->id == e->n1->id) || (other->n2->id == e->n1->id)) &&
+*             (e->text) && (other->text) && (e->text->text == other->text->text))
+*         {
+* //          printf("Hit\n");
+*           other->visited = 1;
+*         }
+*       }
+*       for (uns i2=0; i2<GARY_SIZE(e->n2->edges); i2++)
+*       {
+*         struct graph_edge *other = e->n2->edges[i2];
+*         if (other->visited) {dbg_bfs_continues++; continue; }
+* 
+*         if (((other->n1->id == e->n2->id) || (other->n2->id == e->n2->id)) &&
+*             (e->text) && (other->text) && (e->text->text == other->text->text))
+*         {
+* //          printf("Hit\n");
+*           other->visited = 1;
+*         }
+*       }
+*     }
+*   }
+* 
+*   HASH_END_FOR;
+*   printf("Total: %d hits, %d visited edges skipped\n", dbg_num_hits, dbg_bfs_continues);
+* 
+*   GARY_FREE(bfs_queue);
+* }
+* ***/
 
 void dump_longlines(void)
 {
@@ -594,7 +650,7 @@ void dump_longlines(void)
     struct graph_edge *e = longlines[i].first;
 
     printf("> Longline %u;", i);
-    if (longlines[i].first->text) printf(" labelled %s", osm_val_decode(longlines[i].first->text->text));
+    if (longlines[i].first->label && longlines[i].first->label->type == SYMBOLIZER_TEXT) printf(" labelled %s", osm_val_decode(((struct sym_text *) longlines[i].first->label)->text));
     printf("\n");
     while (e)
     {
@@ -602,13 +658,13 @@ void dump_longlines(void)
       switch (e->dir)
       {
       case 1:
-       printf("[%.2f; %.2f] -- #%u [%.2f; %.2f] (dir %d)\n", e->anode->o->x, e->anode->o->y, e->bnode->o->o.id, e->bnode->o->x, e->bnode->o->y, e->dir);
+       printf("[%.2f; %.2f] -- #%ju [%.2f; %.2f] (dir %d)\n", e->anode->o->x, e->anode->o->y, e->bnode->o->o.id, e->bnode->o->x, e->bnode->o->y, e->dir);
        break;
       case 2:
-       printf("[%.2f; %.2f] -- #%u [%.2f; %.2f] (dir %d)\n", e->bnode->o->x, e->bnode->o->y, e->anode->o->o.id, e->anode->o->x, e->anode->o->y, e->dir);
+       printf("[%.2f; %.2f] -- #%ju [%.2f; %.2f] (dir %d)\n", e->bnode->o->x, e->bnode->o->y, e->anode->o->o.id, e->anode->o->x, e->anode->o->y, e->dir);
        break;
       case 0:
-       printf("[%.2f; %.2f] -- #%u [%.2f; %.2f] (dir %d)\n", e->n1->o->x, e->n1->o->y, e->n2->o->o.id, e->n2->o->x, e->n2->o->y, e->dir);
+       printf("[%.2f; %.2f] -- #%ju [%.2f; %.2f] (dir %d)\n", e->n1->o->x, e->n1->o->y, e->n2->o->o.id, e->n2->o->x, e->n2->o->y, e->dir);
        break;
       default:
         printf("%d\n", e->dir);
@@ -624,12 +680,18 @@ void make_segments(void)
 printf("Analysing %u longlines\n", GARY_SIZE(longlines));
   for (uns i=0; i<GARY_SIZE(longlines); i++)
   {
-    if (! longlines[i].first->text) continue;
+    if (! longlines[i].first->label) continue;
 //    printf("Survived! %s\n", osm_val_decode(longlines[i].first->text->text));
 printf("New longline\n");
+
+if (longlines[i].first->label->type != SYMBOLIZER_TEXT)
+{
+  printf("Heh?\n");
+  exit(42);
+}
     struct request_line *request = GARY_PUSH(requests_line);
     request->request.ind = -1;
-    request->request.type = REQUEST_LINELABEL;
+    request->request.type = REQUEST_LINE;
 
     GARY_INIT(request->segments, 0);
     request->num_segments = 0;
@@ -643,7 +705,7 @@ printf("New longline\n");
     num_requests++;
     while (e)
     {
-      if (! e->text) break;
+      if (! e->label) break;
       struct request_segment *r = GARY_PUSH(request->segments);
       request->num_segments++;
 
@@ -658,17 +720,38 @@ printf("New longline\n");
       r->y2 = n->y;
       r->k = abs(r->x2 - r->x1) / (abs(r->y2 - r->y1) + 0.001); // FIXME: Hack to prevent floating point exception when y2 = y1
 
-//printf("Segment [%.2f; %.2f] -- [%.2f; %.2f]\n", r->x1, r->y1, r->x2, r->y2);
+printf("Segment [%.2f; %.2f] -- [%.2f; %.2f]\n", r->x1, r->y1, r->x2, r->y2);
 
-      r->sym = e->sym;
+      r->sym = e->line;
       r->zindex = e->zindex;
-      r->text = malloc(sizeof(struct sym_text));
-      *(r->text) = *(e->text);
-      r->text->x = r->x1;
-      r->text->y = r->y1;
-
       r->variant = malloc(sizeof(struct point_variant)); // FIXME
-      make_bitmap_label(r->variant, e->text);
+      switch (e->label->type)
+      {
+        case SYMBOLIZER_TEXT: ;
+          struct sym_text *st = malloc(sizeof(struct sym_text));
+          ((struct symbol *) st)->o = e->label->o;
+          ((struct symbol *) st)->type = SYMBOLIZER_TEXT;
+          st->x = r->x1;
+          st->y = r->y1;
+          st->text = ((struct sym_text *) e->label)->text;
+          st->text_color = ((struct sym_text *) e->label)->text_color;
+          st->font = ((struct sym_text *) e->label)->font;
+          st->opacity = ((struct sym_text *) e->label)->opacity;
+          st->halo_color = ((struct sym_text *) e->label)->halo_color;
+          st->halo_radius = ((struct sym_text *) e->label)->halo_radius;
+          st->halo_opacity = ((struct sym_text *) e->label)->halo_opacity;
+          st->tw = ((struct sym_text *) e->label)->tw;
+          st->th = ((struct sym_text *) e->label)->th;
+          st->td = ((struct sym_text *) e->label)->td;
+          r->label = (struct symbol *) st;
+          // FIXME: This shall be done in more elegant way
+          make_bitmap_label(r->variant, (struct sym_text *) e->label);
+          break;
+        default:
+          // FIXME
+          printf("Got here?\n");
+          ;
+      }
 
       e = e->next;
     }
@@ -679,12 +762,13 @@ void dump_linelabel_requests(void)
 {
   for (uns i=0; i<GARY_SIZE(requests_line); i++)
   {
-    printf("Longline of %d segments, labelled %s\n", requests_line[i].num_segments, osm_val_decode(requests_line[i].segments[0].text->text));
+    print_label(requests_line[i].segments[0].label);
   }
 }
 
 void dump_individual(struct individual *individual)
 {
+printf("(There are %d requests)\n", num_requests);
   for (uns i=0; i<GARY_SIZE(individual->placements); i++)
   {
     struct placement *p = &(individual->placements[i]);
@@ -694,13 +778,20 @@ void dump_individual(struct individual *individual)
       case REQUEST_POINT:
         printf("Point at [%.2f; %.2f]\n", p->x, p->y);
         break;
-      case REQUEST_LINELABEL: ;
+      case REQUEST_LINE: ;
         struct request_line *rl = (struct request_line *) p->request;
-        printf("%d-segment longline %s\n", rl->num_segments, osm_val_decode(rl->segments[0].text->text));
+        print_label(rl->segments[0].label);
         break;
-      case REQUEST_AREALABEL: ;
+      case REQUEST_SEGMENT: ;
+        break;
+      case REQUEST_AREA: ;
         struct request_area *ra = (struct request_area *) p->request;
-        printf("Area label %s at [%.2f; %.2f]\n", osm_val_decode(ra->sym->text), p->x, p->y);
+        printf("Area label ");
+        print_label(ra->label);
+        printf(" at [%.2f; %.2f]\n", p->x, p->y);
+        break;
+      default:
+        ASSERT(p->request->type != 0);
     }
   }
   printf("\nTotal penalty: %d\n", individual->penalty);
@@ -740,6 +831,7 @@ printf("Having %u point requests, %u line requests and %u area requests\n", GARY
 
   for (uns i=0; i<GARY_SIZE(population1[0]->placements); i++)
   {
+printf("Coping with %d\n", population1[0]->placements[i].request->type);
     switch (population1[0]->placements[i].request->type)
     {
       case REQUEST_POINT: ;
@@ -747,45 +839,56 @@ printf("Having %u point requests, %u line requests and %u area requests\n", GARY
         switch (rp->sym->type)
         {
           case SYMBOLIZER_POINT: ;
-//          printf("Moving point to final destination\n");
+          printf("Moving point to final destination\n");
            struct sym_point *sp = (struct sym_point *) rp->sym;
            sp->x = population1[0]->placements[i].x;
            sp->y = population1[0]->placements[i].y;
             sym_plan((struct symbol *) sp, rp->zindex);
            break;
          case SYMBOLIZER_ICON: ;
-//          printf("Moving icon to final destination\n");
+          printf("Moving icon to final destination\n");
            struct sym_icon *si = (struct sym_icon *) rp->sym;
            si->sir.x = population1[0]->placements[i].x;
            si->sir.y = population1[0]->placements[i].y;
             sym_plan((struct symbol *) si, rp->zindex);
            break;
          default:
+           printf("Haúúú 1\n");
            ;
         }
         break;
-      case REQUEST_AREALABEL: ;
+      case REQUEST_AREA: ;
         struct request_area *ra = (struct request_area *) population1[0]->placements[i].request;
-        sym_plan((struct symbol *) ra->sym, ra->zindex);
+        if (ra->label->type == SYMBOLIZER_INVALID) printf("Haúúú 2\n");
+        sym_plan((struct symbol *) ra->label, ra->zindex);
         break;
 
-      case REQUEST_LINELABEL: ;
+      case REQUEST_LINE: ;
         struct request_line *rl = (struct request_line *) population1[0]->placements[i].request;
         for (uns j=0; j<GARY_SIZE(rl->segments); j++)
         {
-//          printf("Planning text %s to [%.2f; %.2f]\n", osm_val_decode(rl->segments[j].text->text), rl->segments[j].text->x, rl->segments[j].text->y);
-          rl->segments[j].text->next_duplicate = NULL;
-          rl->segments[j].text->next_in_tile = NULL;
-          rl->segments[j].text->x = population1[0]->placements[i].x;
-          rl->segments[j].text->y = population1[0]->placements[i].y;
-          sym_plan((struct symbol *) rl->segments[j].text, rl->segments[j].zindex); // FIXME: z-index
+          switch (rl->segments[j].label->type)
+          {
+            case SYMBOLIZER_TEXT:
+              ((struct sym_text *) rl->segments[j].label)->next_duplicate = NULL;
+              ((struct sym_text *) rl->segments[j].label)->next_in_tile = NULL;
+              printf("Planning text ");
+              print_label(rl->segments[j].label);
+            default:
+              printf("Haúúú 3\n");
+              // FIXME
+              ;
+          }
+          sym_plan((struct symbol *) rl->segments[j].label, rl->segments[j].zindex); // FIXME: z-index
         }
         break;
-/*
+
       case REQUEST_SEGMENT: ;
-        struct request_segment *rs = (struct request_segment *) population1[0]->placements[i].request;
+        //struct request_segment *rs = (struct request_segment *) population1[0]->placements[i].request;
         printf("Segment!\n");
-*/
+
+    default:
+      ASSERT(population1[0]->placements[i].request->type != REQUEST_INVALID);
     }
   }
 
@@ -997,6 +1100,12 @@ void gen_coords(struct placement *p)
   {
     case REQUEST_POINT:
       gen_coords_point(p);
+    case REQUEST_LINE:
+    case REQUEST_SEGMENT:
+    case REQUEST_AREA:
+      printf("Not yet implemented\n");
+    default:
+      ASSERT(p->request->type != REQUEST_INVALID);
   }
 }
 
@@ -1078,6 +1187,12 @@ void move_symbol(struct placement *p)
   {
     case REQUEST_POINT:
       move_symbol_point(p);
+    case REQUEST_LINE:
+    case REQUEST_SEGMENT:
+    case REQUEST_AREA:
+      printf("Not yet implemented\n");
+    default:
+      ASSERT(p->request->type != REQUEST_INVALID);
   }
 }
 
@@ -1099,17 +1214,22 @@ void init_placement(struct placement *p, struct request *r)
       p->x = rp->x;
       p->y = rp->y;
       break;
+    case REQUEST_LINE: ;
+      break;
     case REQUEST_SEGMENT: ;
       struct request_segment *rs = (struct request_segment *) r;
       p->x = rs->x2;
       p->y = rs->y2;
       break;
-    case REQUEST_AREALABEL: ;
+    case REQUEST_AREA: ;
       struct request_area *ra = (struct request_area *) r;
-      struct sym_text *st = ra->sym;
-      p->x = st->x;
-      p->y = st->y;
+      p->x = ra->cx;
+      p->y = ra->cy;
+    default:
+      ASSERT(p->request->type != REQUEST_INVALID);
   }
+
+  printf("Inited placement to [%.2f; %.2f]\n", p->x, p->y);
 }
 
 void init_individual(struct individual *i)
index f17bda5b406b8a754242f88602f0aecad794aa64..cf30b0ee54fbddaa821c344067053d6db3475aaf 100644 (file)
@@ -1,18 +1,12 @@
 #ifndef _LEO_LABELLER_H
 #define _LEO_LABELLER_H
 
-enum label_type
-{
-  LABEL_POINT,
-  LABEL_LINE,
-  LABEL_AREA,
-};
-
 enum request_type
 {
+  REQUEST_INVALID,
   REQUEST_POINT,
-  REQUEST_AREALABEL,
-  REQUEST_LINELABEL,
+  REQUEST_AREA,
+  REQUEST_LINE,
   REQUEST_SEGMENT,
 };
 
@@ -23,20 +17,6 @@ enum term_cond
   TERM_COND_ITERATIONS,
 };
 
-struct sym_placement
-{
-  double x;
-  double y;
-  int variant;
-  struct request *request;
-};
-
-struct request
-{
-  enum request_type type;
-  int ind;
-};
-
 struct point_variant
 {
   double width;
@@ -49,11 +29,16 @@ struct line_variant
   bool *masks;
 };
 
+struct request
+{
+  enum request_type type;
+  int ind;
+};
+
 struct request_point
 {
   struct request request;
   struct symbol *sym;
-  struct osm_object *object; // FIXME: Linked also by sym
   z_index_t zindex;
   double x;
   double y;
@@ -72,15 +57,15 @@ struct request_segment
   double y2;
   double k;
   struct sym_line *sym;
+  struct symbol *label;
   struct point_variant *variant;
-  struct sym_text *text;
   z_index_t zindex;
 };
 
 struct request_line
 {
   struct request request;
-  struct symbol *sym;
+  struct symbol *line;
   int num_variants;
   int num_segments;
   struct line_variant *variants;
@@ -91,9 +76,10 @@ struct request_area
 {
   struct request request;
   struct osm_multipolygon *o;
-  struct sym_text *sym;
-  struct point_variant *text_variant;
+  struct symbol *label;
+  struct point_variant *variants;
   z_index_t zindex;
+  double cx, cy;
 };
 
 struct buffer_line
@@ -105,7 +91,7 @@ struct buffer_line
 struct buffer_linelabel
 {
   struct osm_way *way;
-  struct sym_text *text;
+  struct symbol *label;
   z_index_t zindex;
 };
 
@@ -128,8 +114,8 @@ struct graph_edge
   struct graph_node *n1;
   struct graph_node *n2;
   uns longline;
-  struct sym_text *text;
-  struct sym_line *sym;
+  struct symbol *label;
+  struct sym_line *line;
   z_index_t zindex;
   int dir;
   struct graph_node *anode;
@@ -145,11 +131,11 @@ struct longline
 
 struct placement
 {
+  struct request *request;
   double x;
   double y;
   int variant_used;
   bool processed;
-  struct request *request;
 };
 
 struct map_part
index b3cb91119d407ed17086ae71d1c8cb5e3cc9d59d..b738c8662d910a50f40b0653217b0ee3afc6217e 100644 (file)
@@ -134,6 +134,8 @@ static void sym_icon_gen(struct osm_object *o, struct style_info *si, struct svg
   if (!osm_obj_center(o, &sir->x, &sir->y))
     return;
 
+  printf("Right now, coords are [%.2f; %.2f]\n", sir->x, sir->y);
+
   sir->width = icon->width;
   sir->height = icon->height;
   style_scale(si, &sir->width, &sir->height, PROP_ICON_WIDTH, PROP_ICON_HEIGHT);
@@ -142,7 +144,28 @@ static void sym_icon_gen(struct osm_object *o, struct style_info *si, struct svg
   // sir->opacity = 1;
   // style_get_number(si, PROP_ICON_OPACITY, &sir->opacity);
 
-  labeller_add_point(&sic->s, o, sym_zindex(o, si, 4));
+  printf("Planning icon to [%.2f; %.2f]\n", sir->x, sir->y);
+  switch (o->type)
+  {
+    case OSM_TYPE_NODE:
+    printf("it's node\n");
+      labeller_add_point(&sic->s, o, sym_zindex(o, si, 4));
+      break;
+    case OSM_TYPE_WAY:
+      if (!osm_way_cyclic_p((struct osm_way *) o))
+      {
+    printf("it's way\n");
+      // CHECK ME
+      printf("[SP] Labelling way %ju with something\n", o->id);
+      labeller_add_linelabel(&sic->s, o, sym_zindex(o, si, 4));
+      break;
+      }
+    case OSM_TYPE_MULTIPOLYGON:
+    printf("it's multipolygon\n");
+      labeller_add_arealabel(&sic->s, o, sym_zindex(o, si, 4));
+      break;
+  }
+  //labeller_add_point(&sic->s, o, sym_zindex(o, si, 4));
   //sym_plan(&sic->s, sym_zindex(o, si, 4));
 }