X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=labeller.c;h=0089fc4c0bc934a6e8b52babadd186f2c1293647;hb=570ed05bd065baa7020d445b6c71c2faba72a863;hp=fe062caec0fe029f7329a847d2f60500264b696a;hpb=a096a8bffdd09a04ab665619357b9ce4cb513ac8;p=leo.git diff --git a/labeller.c b/labeller.c index fe062ca..0089fc4 100644 --- a/labeller.c +++ b/labeller.c @@ -48,6 +48,7 @@ int dbg_graph = 0; int dbg_bfs = 0; int dbg_map_parts = 0; int dbg_movement = 0; +int dbg_init = 0; int page_width_int; int page_height_int; @@ -115,10 +116,10 @@ void elite(void); void rank_population(void); void plan_individual(struct individual *individual); -void make_bitmap(struct point_variant *v, struct symbol *sym); -void make_bitmap_icon(struct point_variant *v, struct sym_icon *si); -void make_bitmap_point(struct point_variant *v, struct sym_point *sp); -void make_bitmap_label(struct point_variant *v, struct sym_text *text); +void make_bitmap(struct variant *v, struct symbol *sym); +void make_bitmap_icon(struct variant *v, struct sym_icon *si); +void make_bitmap_point(struct variant *v, struct sym_point *sp); +void make_bitmap_label(struct variant *v, struct sym_text *text); void cut_edge(struct graph_edge *e, double dist); struct request_line *make_new_line(void); @@ -231,7 +232,7 @@ void labeller_init(void) num_map_parts = num_map_parts_row * num_map_parts_col; } -void make_bitmap(struct point_variant *v, struct symbol *sym) +void make_bitmap(struct variant *v, struct symbol *sym) { switch (sym->type) { @@ -249,23 +250,23 @@ void make_bitmap(struct point_variant *v, struct symbol *sym) } } -void make_bitmap_icon(struct point_variant *v, struct sym_icon *si) +void make_bitmap_icon(struct variant *v, struct sym_icon *si) { - v->width = si->sir.icon->width; - v->height = si->sir.icon->height; - v->bitmap = malloc((int) ceil(v->width * v->height * sizeof(bool))); + v->width = si->sir.width + 1; + v->height = si->sir.height + 1; + v->bitmap = malloc(v->width * v->height * sizeof(bool)); for (int i=0; iwidth*v->height; i++) v->bitmap[i] = 1; } -void make_bitmap_point(struct point_variant *v, struct sym_point *sp) +void make_bitmap_point(struct variant *v, struct sym_point *sp) { - v->width = v->height = sp->size; - v->bitmap = malloc(sp->size*sp->size * sizeof(bool)); + v->width = v->height = sp->size + 1; + v->bitmap = malloc(v->width * v->height * sizeof(bool)); // FIXME: Okay, memset would be much nicer here for (int i=0; isize*sp->size; i++) v->bitmap[i] = 1; } -void make_bitmap_label(struct point_variant *v, struct sym_text *text) +void make_bitmap_label(struct variant *v, struct sym_text *text) { v->width = ceil(text->tw); v->height = ceil(text->th); @@ -279,7 +280,8 @@ void make_bitmap_label(struct point_variant *v, struct sym_text *text) void labeller_add_point(struct symbol *sym, struct osm_object *object, z_index_t zindex) { -printf("Adding point\n"); + if (dbg_requests) + printf("Adding point\n"); if (object->type != OSM_TYPE_NODE) { printf("Warning: Point label requested on non-point object\n"); @@ -298,9 +300,9 @@ printf("Adding point\n"); r->offset_y = 0; r->num_variants = 1; - GARY_INIT(r->variants, 0); + GARY_INIT(r->request.variants, 0); - struct point_variant *v = GARY_PUSH(r->variants); + struct variant *v = GARY_PUSH(r->request.variants); struct osm_node *n = (struct osm_node *) object; // FIXME: Compiler warning r->x = n->x; @@ -345,7 +347,8 @@ void labeller_add_linelabel(struct symbol *sym, struct osm_object *o, z_index_t return; } - printf("[LAB] Labelling way %ju on %u\n", o->id, zindex); + if (dbg_requests) + printf("[LAB] Labelling way %ju on %u\n", o->id, zindex); struct buffer_linelabel *ll = GARY_PUSH(buffer_linelabel); ll->way = (struct osm_way *) o; ll->label = sym; @@ -354,7 +357,8 @@ void labeller_add_linelabel(struct symbol *sym, struct osm_object *o, z_index_t void labeller_add_arealabel(struct symbol *sym, struct osm_object *o, z_index_t zindex) { -printf("Adding area on %u\n", zindex); + if (dbg_requests) + printf("Adding area on %u\n", zindex); struct request_area *r = GARY_PUSH(requests_area); r->request.type = REQUEST_AREA; @@ -366,16 +370,18 @@ printf("Adding area on %u\n", zindex); osm_obj_center(o, &(r->cx), &(r->cy)); - GARY_INIT(r->variants, 0); - struct point_variant *v = GARY_PUSH(r->variants); + GARY_INIT(r->request.variants, 0); + struct variant *v = GARY_PUSH(r->request.variants); switch (sym->type) { case SYMBOLIZER_ICON: - printf("DEBUG: Icon label\n"); + if (dbg_requests) + printf("DEBUG: Icon label\n"); make_bitmap_icon(v, (struct sym_icon *) sym); break; case SYMBOLIZER_TEXT: - printf("DEBUG: Text label\n"); + if (dbg_requests) + printf("DEBUG: Text label\n"); make_bitmap_label(v, (struct sym_text *) sym); default: // FIXME @@ -703,9 +709,9 @@ struct request_segment *make_new_segment(struct request_section *rls, struct sym rs->request.ind = num_requests++; rs->request.type = REQUEST_SEGMENT; - struct point_variant *v = malloc(sizeof(struct point_variant)); + struct variant *v = malloc(sizeof(struct variant)); make_bitmap(v, sym); - rs->variant = v; + rs->request.variants = v; return rs; } @@ -719,6 +725,8 @@ void cut_edge(struct graph_edge *e, double dist) *new = *e; e->next = new; + // FIXME? Create new label for new edge, don't only copy pointer? + struct osm_node *n1 = e->n1->o; struct osm_node *n2 = e->n2->o; @@ -871,39 +879,27 @@ void dump_bitmaps(struct individual *individual) for (uns i=0; iplacements); i++) { -fprintf(stderr, "%d-th placement\n", i); + if (individual->placements[i].variant_used == -1) continue; + struct placement *p = &(individual->placements[i]); - struct point_variant *v = NULL; + struct variant *v = NULL; switch (p->request->type) { case REQUEST_SEGMENT: ; - struct request_segment *rs = (struct request_segment *) p->request; - v = rs->variant; - break; case REQUEST_POINT: ; - struct request_point *rp = (struct request_point *) p->request; - v = &(rp->variants[p->variant_used]); - break; case REQUEST_AREA: ; - struct request_area *ra = (struct request_area *) p->request; - printf("Using %d-th of %d variants\n", p->variant_used, GARY_SIZE(ra->variants)); - v = &(ra->variants[p->variant_used]); + v = &(p->request->variants[p->variant_used]); break; default: - printf("Testing request type (dump_bitmaps): %d\n", p->request->type); ASSERT(p->request->type != REQUEST_INVALID); continue; } - printf("Got after with %d-th placement of request type %d\n", i, p->request->type); - - printf("Rendering %d-th label %d x %d (w x h)\n", i, v->width, v->height); for (int row = max2(p->y, 0); row < min2(p->y + v->height, page_height_int); row++) { for (int col = max2(p->x, 0); col < min2(p->x + v->width, page_width_int); col++) { - printf("Writing to %d\n", row*page_width_int + col); bitmap[row * page_width_int + col] = 1; } } @@ -1070,7 +1066,8 @@ void make_population(void) { for (int i=0; irequest->ind, p->x, p->y); - struct point_variant v; + struct variant v; switch (p->request->type) { case REQUEST_POINT: - v = ((struct request_point *) p->request)->variants[p->variant_used]; - break; case REQUEST_SEGMENT: - v = ((struct request_segment *) p->request)->variant[p->variant_used]; - break; case REQUEST_AREA: - v = ((struct request_area *) p->request)->variants[p->variant_used]; + v = p->request->variants[p->variant_used]; break; default: return NULL; @@ -1396,7 +1389,8 @@ void gen_coords_area(struct placement *p) p->x = p->x + gen_movement(); p->y = p->y + gen_movement(); - printf("Moved label to [%.2f; %.2f] from [%.2f; %.2f]\n", p->x, p->y, ra->cx, ra->cy); + if (dbg_movement) + printf("Moved label to [%.2f; %.2f] from [%.2f; %.2f]\n", p->x, p->y, ra->cx, ra->cy); } struct map_part **get_parts(struct placement *symbol, struct individual *individual) @@ -1554,7 +1548,8 @@ void init_placement(struct placement *p, struct individual *individual, struct r } gen_coords(p); -// printf("Inited placement to [%.2f; %.2f]\n", p->x, p->y); + if (dbg_init) + printf("Inited placement to [%.2f; %.2f]\n", p->x, p->y); } void init_individual(struct individual *i) @@ -1571,6 +1566,9 @@ void init_individual(struct individual *i) mp->next = mp->prev = NULL; } i->penalty = 0; // FIXME + + if (dbg_init) + printf("Individual inited, has %u map parts\n", GARY_SIZE(i->map)); } struct placement **get_overlapping(struct placement *p UNUSED)