From df24604990174cde6413d9902b7521a5daffadaa Mon Sep 17 00:00:00 2001 From: Karryanna Date: Mon, 13 Apr 2015 21:24:13 +0200 Subject: [PATCH] Labelling: Clean-up and a lot of new mess --- labeller.c | 564 +++++++++++++++++++++++++++++++--------------------- labeller.h | 50 ++--- sym-point.c | 25 ++- 3 files changed, 384 insertions(+), 255 deletions(-) diff --git a/labeller.c b/labeller.c index d64c67a..32577bf 100644 --- a/labeller.c +++ b/labeller.c @@ -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; itext)); + 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; iedges); 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; iedges); 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; iedges); 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; iedges); 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; iedges); i++) - { - struct graph_edge *e = node->edges[i]; - - if (e->visited) continue; - - // BFS itself - for (uns i1=0; i1n1->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; i2n2->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; iedges); i++) +* { +* struct graph_edge *e = node->edges[i]; +* +* if (e->visited) continue; +* +* // BFS itself +* for (uns i1=0; i1n1->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; i2n2->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; itext) 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; itext)); + 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; iplacements); 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; iplacements); 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; jsegments); 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) diff --git a/labeller.h b/labeller.h index f17bda5..cf30b0e 100644 --- a/labeller.h +++ b/labeller.h @@ -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 diff --git a/sym-point.c b/sym-point.c index b3cb911..b738c86 100644 --- a/sym-point.c +++ b/sym-point.c @@ -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)); } -- 2.39.2