+
+ if (request->sections[0].num_segments == 0)
+ {
+ // FIXME
+ printf("WARNING: 0 segment section\n");
+ GARY_POP(requests_line);
+ num_requests -= 2;
+ }
+ }
+}
+
+void dump_linelabel_requests(void)
+{
+ for (uns i=0; i<GARY_SIZE(requests_line); i++)
+ {
+ if (requests_line[i].sections[0].num_segments == 0)
+ {
+ printf("HEY!\n");
+ continue;
+ }
+ printf("Request for linelabel, %d sections\n", GARY_SIZE(requests_line[i].sections));
+ print_label(requests_line[i].sections[0].segments[0].label);
+ for (uns j=0; j<GARY_SIZE(requests_line[i].sections); j++)
+ {
+ printf("%d section, %d segments\n", j, GARY_SIZE(requests_line[i].sections[j].segments));
+ for (uns k=0; k<GARY_SIZE(requests_line[i].sections[j].segments); k++)
+ {
+ struct request_segment *rs = &requests_line[i].sections[j].segments[k];
+ printf("[%.2f; %.2f] -- [%.2f; %.2f]\n", rs->x1, rs->y1, rs->x2, rs->y2);
+ }
+ }
+ printf("\n");
+ }
+}
+
+void dump_bitmaps(struct individual *individual)
+{
+ bool *bitmap = malloc(page_width_int * page_height_int * sizeof(bool));
+ printf("Bitmap size is %d\n", page_width_int * page_height_int);
+ for (int i=0; i<page_height_int; i++)
+ for (int j=0; j<page_width_int; j++)
+ bitmap[i*page_width_int + j] = 0;
+
+ for (uns i=0; i<GARY_SIZE(individual->placements); i++)
+ {
+ if (individual->placements[i].variant_used == -1) continue;
+
+ struct placement *p = &(individual->placements[i]);
+ struct variant *v = NULL;
+
+ switch (p->request->type)
+ {
+ case REQUEST_SEGMENT: ;
+ case REQUEST_POINT: ;
+ case REQUEST_AREA: ;
+ v = &(p->request->variants[p->variant_used]);
+ break;
+ default:
+ ASSERT(p->request->type != REQUEST_INVALID);
+ continue;
+ }
+
+ 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++)
+ {
+ bitmap[row * page_width_int + col] = 1;
+ }
+ }
+ }
+
+ errno = 0;
+ FILE *fd_dump = fopen("dump.pbm", "w");
+ fprintf(fd_dump, "P1\n");
+ fprintf(fd_dump, "%d %d\n", page_width_int, page_height_int);
+ for (int i=0; i<page_height_int; i++)
+ {
+ for (int j=0; j<page_width_int; j++)
+ {
+ fprintf(fd_dump, "%d", bitmap[(int) (i*page_width_int + j)] ? 1 : 0);
+ }
+ fprintf(fd_dump, "\n");
+ }
+ fclose(fd_dump);
+}
+
+void dump_individual(struct individual *individual)
+{
+printf("*** Dumping INDIVIDUAL ***\n");
+printf("(There are %d requests)\n", num_requests);
+ for (uns i=0; i<GARY_SIZE(individual->placements); i++)
+ {
+ struct placement *p = &(individual->placements[i]);
+
+ switch (p->request->type)
+ {
+ case REQUEST_POINT:
+ printf("Point at [%.2f; %.2f] on %u\n", p->x, p->y, ((struct request_point *) p->request)->zindex);
+ break;
+ case REQUEST_LINE: ;
+ struct request_line *rl = (struct request_line *) p->request;
+ printf("Line: ");
+ print_label(rl->sections[0].segments[0].label);
+ break;
+ case REQUEST_SECTION: ;
+ printf("*");
+ break;
+ case REQUEST_SEGMENT: ;
+ if (p->variant_used >= 0)
+ printf("Segment placed at [%.2f; %.2f] on %u\n", p->x, p->y, ((struct request_segment *) p->request)->zindex);
+ else
+ printf("Segment not placed\n");
+ break;
+ case REQUEST_AREA: ;
+ struct request_area *ra = (struct request_area *) p->request;
+ printf("Area label ");
+ print_label(ra->label);
+ printf(" at [%.2f; %.2f] on %u\n", p->x, p->y, ((struct request_area *) p->request)->zindex);
+ break;
+ default:
+ printf("Testing request type (dump_individual)\n");
+ ASSERT(p->request->type != 0);
+ }
+ }
+ printf("\nTotal penalty: %d\n", individual->penalty);
+}
+
+void plan_individual(struct individual *individual)
+{
+ for (uns i=0; i<GARY_SIZE(individual->placements); i++)
+ {
+ struct symbol *s = NULL;
+ z_index_t zindex = 0;
+ if (individual->placements[i].variant_used < 0) continue;
+ switch (individual->placements[i].request->type)
+ {
+ case REQUEST_POINT: ;
+ struct request_point *rp = (struct request_point *) individual->placements[i].request;
+ s = rp->sym;
+ zindex = rp->zindex;
+ break;
+ case REQUEST_SEGMENT: ;
+ struct request_segment *rs = (struct request_segment *) individual->placements[i].request;
+ s = rs->label;
+ zindex = rs->zindex;
+ break;
+ case REQUEST_LINE: ;
+ break;
+ case REQUEST_AREA: ;
+ struct request_area *ra = (struct request_area *) individual->placements[i].request;
+ s = ra->label;
+ zindex = ra->zindex;
+ break;
+ default:
+ ASSERT(individual->placements[i].request != REQUEST_INVALID);
+ continue;
+ }
+
+if (dbg_plan)
+ printf("Will plan symbol at [%.2f; %.2f] on %u\n", individual->placements[i].x, individual->placements[i].y, zindex);
+
+ if (s) switch (s->type)
+ {
+ case SYMBOLIZER_POINT: ;
+ struct sym_point *sp = (struct sym_point *) s;
+ sp->x = individual->placements[i].x;
+ sp->y = individual->placements[i].y;
+ sym_plan((struct symbol *) sp, zindex);
+ break;
+ case SYMBOLIZER_ICON: ;
+ struct sym_icon *si = (struct sym_icon *) s;
+ si->sir.x = individual->placements[i].x;
+ si->sir.y = individual->placements[i].y;
+ sym_plan((struct symbol *) si, zindex);
+ break;
+ case SYMBOLIZER_TEXT: ;
+ struct sym_text *st = (struct sym_text *) s;
+ st->x = individual->placements[i].x;
+ st->y = individual->placements[i].y;
+ st->next_duplicate = NULL;
+ if (dbg_plan) printf("Planning text %s at [%.2f; %.2f] on %u, with rotation %.2f\n", osm_val_decode(st->text), st->x, st->y, zindex, st->rotate);
+ sym_plan((struct symbol *) st, zindex);
+ break;
+ default:
+ ASSERT(s->type != SYMBOLIZER_INVALID);
+ }
+ }
+}
+
+void dump_penalties(struct individual **population)
+{
+ for (int i=0; i<conf_pop_size; i++)
+ {
+ printf("Individual %d has penalty %d\n", i, population[i]->penalty);