/* *************************************************************** */ int plot1(struct Map_info *Map, int type, int area, struct cat_list *Clist, const struct color_rgb *color, const struct color_rgb *fcolor, int chcat, SYMBOL * Symb, int size, int id_flag, int table_colors_flag, int cats_color_flag, char *rgb_column, int default_width, char *width_column, double width_scale) { int i, ltype, nlines = 0, line, cat = -1; double *x, *y; struct line_pnts *Points, *PPoints; struct line_cats *Cats; double msize; int x0, y0; struct field_info *fi = NULL; dbDriver *driver = NULL; dbCatValArray cvarr_rgb, cvarr_width; dbCatVal *cv_rgb = NULL, *cv_width = NULL; int nrec_rgb = 0, nrec_width = 0; int open_db; int custom_rgb = FALSE; char colorstring[12]; /* RRR:GGG:BBB */ int red, grn, blu; RGBA_Color *line_color, *fill_color, *primary_color; unsigned char which; int width; line_color = G_malloc(sizeof(RGBA_Color)); fill_color = G_malloc(sizeof(RGBA_Color)); primary_color = G_malloc(sizeof(RGBA_Color)); primary_color->a = RGBA_COLOR_OPAQUE; /* change function prototype to pass RGBA_Color instead of color_rgb? */ if (color) { line_color->r = color->r; line_color->g = color->g; line_color->b = color->b; line_color->a = RGBA_COLOR_OPAQUE; } else line_color->a = RGBA_COLOR_NONE; if (fcolor) { fill_color->r = fcolor->r; fill_color->g = fcolor->g; fill_color->b = fcolor->b; fill_color->a = RGBA_COLOR_OPAQUE; } else fill_color->a = RGBA_COLOR_NONE; msize = size * (D_d_to_u_col(2.0) - D_d_to_u_col(1.0)); /* do it better */ Points = Vect_new_line_struct(); PPoints = Vect_new_line_struct(); Cats = Vect_new_cats_struct(); open_db = table_colors_flag || width_column; if (open_db) { fi = Vect_get_field(Map, (Clist->field > 0 ? Clist->field : 1)); if (fi == NULL) { G_fatal_error(_("Database connection not defined for layer %d"), (Clist->field > 0 ? Clist->field : 1)); } driver = db_start_driver_open_database(fi->driver, fi->database); if (driver == NULL) G_fatal_error(_("Unable to open database <%s> by driver <%s>"), fi->database, fi->driver); } if (table_colors_flag) { /* for reading RRR:GGG:BBB color strings from table */ if (rgb_column == NULL || *rgb_column == '\0') G_fatal_error(_("Color definition column not specified")); db_CatValArray_init(&cvarr_rgb); nrec_rgb = db_select_CatValArray(driver, fi->table, fi->key, rgb_column, NULL, &cvarr_rgb); G_debug(3, "nrec_rgb (%s) = %d", rgb_column, nrec_rgb); if (cvarr_rgb.ctype != DB_C_TYPE_STRING) G_fatal_error(_("Color definition column (%s) not a string. " "Column must be of form RRR:GGG:BBB where RGB values range 0-255."), rgb_column); if (nrec_rgb < 0) G_fatal_error(_("Cannot select data (%s) from table"), rgb_column); G_debug(2, "\n%d records selected from table", nrec_rgb); for (i = 0; i < cvarr_rgb.n_values; i++) { G_debug(4, "cat = %d %s = %s", cvarr_rgb.value[i].cat, rgb_column, db_get_string(cvarr_rgb.value[i].val.s)); } } if (width_column) { if (*width_column == '\0') G_fatal_error(_("Line width column not specified.")); db_CatValArray_init(&cvarr_width); nrec_width = db_select_CatValArray(driver, fi->table, fi->key, width_column, NULL, &cvarr_width); G_debug(3, "nrec_width (%s) = %d", width_column, nrec_width); if (cvarr_width.ctype != DB_C_TYPE_INT && cvarr_width.ctype != DB_C_TYPE_DOUBLE) G_fatal_error(_("Line width column (%s) not a number."), width_column); if (nrec_width < 0) G_fatal_error(_("Cannot select data (%s) from table"), width_column); G_debug(2, "\n%d records selected from table", nrec_width); for (i = 0; i < cvarr_width.n_values; i++) { G_debug(4, "cat = %d %s = %d", cvarr_width.value[i].cat, width_column, (cvarr_width.ctype == DB_C_TYPE_INT ? cvarr_width.value[i].val. i : (int)cvarr_width.value[i].val.d)); } } if (open_db) db_close_database_shutdown_driver(driver); Vect_rewind(Map); /* Is it necessary to reset line/label color in each loop ? */ if (color && !table_colors_flag && !cats_color_flag) D_RGB_color(color->r, color->g, color->b); if (Vect_level(Map) >= 2) nlines = Vect_get_num_lines(Map); line = 0; while (1) { if (Vect_level(Map) >= 2) { line++; if (line > nlines) return 0; if (!Vect_line_alive(Map, line)) continue; ltype = Vect_read_line(Map, Points, Cats, line); } else { ltype = Vect_read_next_line(Map, Points, Cats); switch (ltype) { case -1: fprintf(stderr, _("\nERROR: vector map - can't read\n")); return -1; case -2: /* EOF */ return 0; } } if (!(type & ltype)) continue; if (chcat) { int found = 0; if (id_flag) { /* use line id */ if (!(Vect_cat_in_cat_list(line, Clist))) continue; } else { for (i = 0; i < Cats->n_cats; i++) { if (Cats->field[i] == Clist->field && Vect_cat_in_cat_list(Cats->cat[i], Clist)) { found = 1; break; } } if (!found) continue; } } else if (Clist->field > 0) { int found = 0; for (i = 0; i < Cats->n_cats; i++) { if (Cats->field[i] == Clist->field) { found = 1; break; } } /* lines with no category will be displayed */ if (Cats->n_cats > 0 && !found) continue; } if (table_colors_flag) { /* only first category */ cat = Vect_get_line_cat(Map, line, (Clist->field > 0 ? Clist->field : (Cats->n_cats > 0 ? Cats->field[0] : 1))); if (cat >= 0) { G_debug(3, "display element %d, cat %d", line, cat); /* Read RGB colors from db for current area # */ if (db_CatValArray_get_value(&cvarr_rgb, cat, &cv_rgb) != DB_OK) { custom_rgb = FALSE; } else { sprintf(colorstring, "%s", db_get_string(cv_rgb->val.s)); if (*colorstring != '\0') { G_debug(3, "element %d: colorstring: %s", line, colorstring); if (G_str_to_color(colorstring, &red, &grn, &blu) == 1) { custom_rgb = TRUE; G_debug(3, "element:%d cat %d r:%d g:%d b:%d", line, cat, red, grn, blu); } else { custom_rgb = FALSE; G_warning(_("Error in color definition column (%s), element %d " "with cat %d: colorstring [%s]"), rgb_column, line, cat, colorstring); } } else { custom_rgb = FALSE; G_warning(_("Error in color definition column (%s), element %d with cat %d"), rgb_column, line, cat); } } } /* end if cat */ else { custom_rgb = FALSE; } } /* end if table_colors_flag */ /* random colors */ if (cats_color_flag) { custom_rgb = FALSE; if (Clist->field > 0) { cat = Vect_get_line_cat(Map, line, Clist->field); if (cat >= 0) { G_debug(3, "display element %d, cat %d", line, cat); /* fetch color number from category */ which = (cat % palette_ncolors); G_debug(3, "cat:%d which color:%d r:%d g:%d b:%d", cat, which, palette[which].R, palette[which].G, palette[which].B); custom_rgb = TRUE; red = palette[which].R; grn = palette[which].G; blu = palette[which].B; } } else if (Cats->n_cats > 0) { /* fetch color number from layer */ which = (Cats->field[0] % palette_ncolors); G_debug(3, "layer:%d which color:%d r:%d g:%d b:%d", Cats->field[0], which, palette[which].R, palette[which].G, palette[which].B); custom_rgb = TRUE; red = palette[which].R; grn = palette[which].G; blu = palette[which].B; } } if (nrec_width) { /* only first category */ cat = Vect_get_line_cat(Map, line, (Clist->field > 0 ? Clist->field : (Cats->n_cats > 0 ? Cats->field[0] : 1))); if (cat >= 0) { G_debug(3, "display element %d, cat %d", line, cat); /* Read line width from db for current area # */ if (db_CatValArray_get_value(&cvarr_width, cat, &cv_width) != DB_OK) { width = default_width; } else { width = width_scale * (cvarr_width.ctype == DB_C_TYPE_INT ? cv_width->val. i : (int)cv_width->val.d); if (width < 0) { G_warning(_("Error in line width column (%s), element %d " "with cat %d: line width [%d]"), width_column, line, cat, width); width = default_width; } } } /* end if cat */ else { width = default_width; } D_line_width(width); } /* end if nrec_width */ /* enough of the prep work, lets start plotting stuff */ x = Points->x; y = Points->y; if ((ltype & GV_POINTS) && Symb != NULL) { if (!(color || fcolor || custom_rgb)) continue; x0 = D_u_to_d_col(x[0]); y0 = D_u_to_d_row(y[0]); /* skip if the point is outside of the display window */ /* xy<0 tests make it go ever-so-slightly faster */ if (x0 < 0 || y0 < 0 || x0 > D_get_d_east() || x0 < D_get_d_west() || y0 > D_get_d_south() || y0 < D_get_d_north()) continue; /* use random or RGB column color if given, otherwise reset */ /* centroids always use default color to stand out from underlying area */ if (custom_rgb && (ltype != GV_CENTROID)) { primary_color->r = (unsigned char)red; primary_color->g = (unsigned char)grn; primary_color->b = (unsigned char)blu; D_symbol2(Symb, x0, y0, primary_color, line_color); } else D_symbol(Symb, x0, y0, line_color, fill_color); } else if (color || custom_rgb) { if (!table_colors_flag && !cats_color_flag) D_RGB_color(color->r, color->g, color->b); else { if (custom_rgb) D_RGB_color((unsigned char)red, (unsigned char)grn, (unsigned char)blu); else D_RGB_color(color->r, color->g, color->b); } /* Plot the lines */ if (Points->n_points == 1) /* line with one coor */ D_polydots_abs(x, y, Points->n_points); else /*use different user defined render methods */ D_polyline_abs(x, y, Points->n_points); } } Vect_destroy_line_struct(Points); Vect_destroy_cats_struct(Cats); return 0; /* not reached */ }
int draw_n_arrow(double east, double north, double fontsize, char *n_arrow_num, double line_width) { double x_pos, y_pos; double t, b, l, r; double tt, tb, tl, tr; /* text box*/ SYMBOL *Symb; RGBA_Color *line_color, *fill_color; int R, G, B; double x0, y0; char icon[64]; double symbol_size; /* Establish text size */ if (fontsize > 0) D_text_size(fontsize, fontsize); D_setup_unity(0); D_get_src(&t, &b, &l, &r); x_pos = east * (r - l) / 100.; y_pos = (100. - north) * (b - t) / 100.; if (line_width > 0) D_line_width(line_width); if (fontsize > 0) { /* draw the "N" */ D_get_text_box("N", &tt, &tb, &tl, &tr); D_use_color(fg_color); /* positions manually tuned */ switch (n_arrow_num[0]) { case '1': D_pos_abs(x_pos - (tr + tl) / 2, y_pos - 45); D_text("N"); break; case '3': D_pos_abs(x_pos - (tr + tl) / 2, y_pos - 60); D_text("N"); break; case '4': D_pos_abs(x_pos - (tr + tl) / 2, y_pos - 45); D_text("N"); break; case '7': D_pos_abs(x_pos - (tr + tl) / 2, y_pos - 70); D_text("N"); break; case '9': case 'f': D_pos_abs(x_pos - (tr + tl) / 2, y_pos - 55); D_text("N"); break; case 'b': D_pos_abs(x_pos - (tr + tl) / 2, y_pos - 48.5); D_text("N"); break; case '2': case '5': case '6': case '8': break; default: G_fatal_error(_("Could not parse symbol")); } } /* display the north arrow symbol */ line_color = G_malloc(sizeof(RGBA_Color)); fill_color = G_malloc(sizeof(RGBA_Color)); if (D_color_number_to_RGB(fg_color, &R, &G, &B) == 0) /* fall back to black on failure */ G_str_to_color(DEFAULT_FG_COLOR, &R, &G, &B); line_color->r = (unsigned char)R; line_color->g = (unsigned char)G; line_color->b = (unsigned char)B; line_color->a = RGBA_COLOR_OPAQUE; if (D_color_number_to_RGB(bg_color, &R, &G, &B) == 0) /* fall back to black on failure */ G_str_to_color(DEFAULT_FG_COLOR, &R, &G, &B); fill_color->r = (unsigned char)R; fill_color->g = (unsigned char)G; fill_color->b = (unsigned char)B; fill_color->a = RGBA_COLOR_OPAQUE; if (n_arrow_num[0] == '2' || n_arrow_num[0] == '9') fill_color->a = RGBA_COLOR_TRANSPARENT; /* sizes manually tuned */ switch (n_arrow_num[0]) { case '1': symbol_size = 35.; break; case '2': symbol_size = 19.; break; case '3': symbol_size = 20.; break; case '4': symbol_size = 15.; break; case '5': case '6': symbol_size = 14.; break; case '7': symbol_size = 23.; break; case '8': case '9': symbol_size = 17.; break; case 'b': symbol_size = 80.; break; case 'f': symbol_size = 100.; break; default: G_fatal_error(_("Could not parse symbol")); } x0 = D_d_to_u_col(x_pos); y0 = D_d_to_u_row(y_pos); if (n_arrow_num[0] == 'b') strcpy(icon, "n_arrows/basic_compass"); else if (n_arrow_num[0] == 'f') strcpy(icon, "n_arrows/fancy_compass"); else { strcpy(icon, "n_arrows/n_arrow"); strncat(icon, n_arrow_num, 32); } Symb = S_read(icon); if(!Symb) G_fatal_error(_("Could not read symbol \"%s\""), icon); S_stroke(Symb, symbol_size, 0.0, 0); D_symbol(Symb, x0, y0, line_color, fill_color); if (line_width > 0) D_line_width(0); G_free(Symb); G_free(line_color); G_free(fill_color); return 0; }
int do_symbol(char *buff) { double xper, yper; int size; int ix, iy; char *symb_name; SYMBOL *Symb; char *line_color_str, *fill_color_str; RGBA_Color *line_color, *fill_color; int R, G, B, ret; line_color = G_malloc(sizeof(RGBA_Color)); fill_color = G_malloc(sizeof(RGBA_Color)); symb_name = G_malloc(sizeof(char) * strlen(buff) + 1); /* well, it won't be any bigger than this */ line_color_str = G_malloc(sizeof(char) * strlen(buff) + 1); fill_color_str = G_malloc(sizeof(char) * strlen(buff) + 1); G_debug(3, "do_symbol() [%s]", buff); /* set default colors so colors are optional */ strcpy(line_color_str, DEFAULT_FG_COLOR); strcpy(fill_color_str, "grey"); if (sscanf (buff, "%*s %s %d %lf %lf %s %s", symb_name, &size, &xper, &yper, line_color_str, fill_color_str) < 4) { G_warning(_("Problem parsing command [%s]"), buff); return (-1); } if (mapunits) { ix = (int)(D_u_to_d_col(xper) + 0.5); iy = (int)(D_u_to_d_row(yper) + 0.5); /* consider size in map units too? maybe as percentage of display? perhaps use "size * D_get_u_to_d_yconv()" to convert */ } else { if (xper < 0. || yper < 0. || xper > 100. || yper > 100.) return (-1); ix = l + (int)(xper * xincr); iy = b - (int)(yper * yincr); } /* parse line color */ ret = G_str_to_color(line_color_str, &R, &G, &B); line_color->r = (unsigned char)R; line_color->g = (unsigned char)G; line_color->b = (unsigned char)B; if (ret == 1) { /* here alpha is only used as an on/off switch, otherwise unused by the display drivers */ line_color->a = RGBA_COLOR_OPAQUE; } else if (ret == 2) line_color->a = RGBA_COLOR_NONE; else { G_warning(_("[%s]: No such color"), line_color_str); return (-1); } /* parse fill color */ ret = G_str_to_color(fill_color_str, &R, &G, &B); fill_color->r = (unsigned char)R; fill_color->g = (unsigned char)G; fill_color->b = (unsigned char)B; if (ret == 1) fill_color->a = RGBA_COLOR_OPAQUE; else if (ret == 2) fill_color->a = RGBA_COLOR_NONE; else { G_warning(_("[%s]: No such color"), fill_color_str); return (-1); } Symb = S_read(symb_name); if (Symb == NULL) { G_warning(_("Cannot read symbol, cannot display points")); return (-1); } else S_stroke(Symb, size, rotation, 0); D_symbol(Symb, ix, iy, line_color, fill_color); /* restore previous d.graph draw color */ if (last_color.a == RGBA_COLOR_OPAQUE) R_RGB_color(last_color.r, last_color.g, last_color.b); else if (last_color.a == RGBA_COLOR_NONE) D_raster_use_color(D_parse_color(DEFAULT_BG_COLOR, 0)); else /* unset or bad */ R_RGB_color(line_color->r, line_color->g, line_color->b); G_free(symb_name); G_free(line_color_str); G_free(fill_color_str); G_free(line_color); G_free(fill_color); return (0); }
int draw_n_arrow(double east, double north, double rotation, char *lbl, int rot_with_text, double fontsize, char *n_arrow_num, double line_width) { double x_pos, y_pos; double t, b, l, r; double tt, tb, tl, tr; /* text box */ SYMBOL *Symb; RGBA_Color *line_color, *fill_color; int R, G, B; double x0, y0; char icon[64]; double symbol_size; /* Establish text size */ if (fontsize > 0) D_text_size(fontsize, fontsize); D_setup_unity(0); D_get_src(&t, &b, &l, &r); x_pos = l + (int)(east * (r - l) / 100.); y_pos = t + (int)((100. - north) * (b - t) / 100.); if (line_width > 0) D_line_width(line_width); if (fontsize > 0) { /* draw the label (default "N") */ if (rot_with_text) D_text_rotation(rotation * 180.0 / M_PI); D_get_text_box(lbl, &tt, &tb, &tl, &tr); D_use_color(text_color); /* positions manually tuned */ switch (n_arrow_num[0]) { case '1': D_pos_abs(x_pos - sin(rotation) * 50 - (tr + tl) / 2, y_pos - cos(rotation) * 50 - (tb + tt) / 2); D_text(lbl); break; case '3': D_pos_abs(x_pos - sin(rotation) * 60 - (tr + tl) / 2, y_pos - cos(rotation) * 60 - (tb + tt) / 2); D_text(lbl); break; case '4': D_pos_abs(x_pos - sin(rotation) * 45 - (tr + tl) / 2, y_pos - cos(rotation) * 45 - (tb + tt) / 2); D_text(lbl); break; case '7': D_pos_abs(x_pos - sin(rotation) * 70 - (tr + tl) / 2, y_pos - cos(rotation) * 70 - (tb + tt) / 2); D_text(lbl); break; case '8': D_pos_abs(x_pos - sin(rotation) * 60 - (tr + tl) / 2, y_pos - cos(rotation) * 60 - (tb + tt) / 2); D_text(lbl); break; case '9': D_pos_abs(x_pos - sin(rotation) * 55 - (tr + tl) / 2, y_pos - cos(rotation) * 55 - (tb + tt) / 2); D_text(lbl); break; case 'f': D_pos_abs(x_pos - sin(rotation) * 55 - (tr + tl) / 2, y_pos - cos(rotation) * 55 - (tb + tt) / 2); D_text(lbl); break; case 'b': D_pos_abs(x_pos - sin(rotation) * 48.5 - (tr + tl) / 2, y_pos - cos(rotation) * 48.5 - (tb + tt) / 2); D_text(lbl); break; case 'a': D_pos_abs(x_pos - sin(rotation) * 50 - (tr + tl) / 2, y_pos - cos(rotation) * 50 - (tb + tt) / 2); D_text(lbl); break; case 's': D_pos_abs(x_pos - sin(rotation) * 50 - (tr + tl) / 2, y_pos - cos(rotation) * 50 - (tb + tt) / 2); D_text(lbl); break; case '2': case '5': case '6': break; default: G_fatal_error(_("Could not parse symbol")); } } /* display the north arrow symbol */ line_color = G_malloc(sizeof(RGBA_Color)); fill_color = G_malloc(sizeof(RGBA_Color)); if (D_color_number_to_RGB(fg_color, &R, &G, &B) == 0) line_color->a = RGBA_COLOR_TRANSPARENT; else line_color->a = RGBA_COLOR_OPAQUE; line_color->r = (unsigned char)R; line_color->g = (unsigned char)G; line_color->b = (unsigned char)B; if (D_color_number_to_RGB(bg_color, &R, &G, &B) == 0) fill_color->a = RGBA_COLOR_TRANSPARENT; else fill_color->a = RGBA_COLOR_OPAQUE; fill_color->r = (unsigned char)R; fill_color->g = (unsigned char)G; fill_color->b = (unsigned char)B; /* sizes manually tuned */ switch (n_arrow_num[0]) { case '1': symbol_size = 35.; break; case '2': symbol_size = 19.; break; case '3': symbol_size = 20.; break; case '4': symbol_size = 15.; break; case '5': case '6': symbol_size = 14.; break; case '7': symbol_size = 23.; break; case '8': case '9': symbol_size = 17.; break; case 'b': symbol_size = 80.; break; case 'f': symbol_size = 100.; break; case 'a': if (n_arrow_num[5] == '2') symbol_size = 53.; else symbol_size = 70.; break; case 's': symbol_size = 80.; break; default: G_fatal_error(_("Could not parse symbol")); } x0 = D_d_to_u_col(x_pos); y0 = D_d_to_u_row(y_pos); if (n_arrow_num[0] == 'b') strcpy(icon, "n_arrows/basic_compass"); else if (n_arrow_num[0] == 'f') strcpy(icon, "n_arrows/fancy_compass"); else if (n_arrow_num[0] == 'a' && n_arrow_num[5] == '1') strcpy(icon, "basic/arrow1"); else if (n_arrow_num[0] == 'a' && n_arrow_num[5] == '2') strcpy(icon, "basic/arrow2"); else if (n_arrow_num[0] == 'a' && n_arrow_num[5] == '3') strcpy(icon, "basic/arrow3"); else if (n_arrow_num[0] == 's') strcpy(icon, "extra/4pt_star"); else { strcpy(icon, "n_arrows/n_arrow"); strncat(icon, n_arrow_num, 32); } Symb = S_read(icon); if (!Symb) G_fatal_error(_("Could not read symbol \"%s\""), icon); S_stroke(Symb, symbol_size, rotation * (180 / M_PI), 0); D_symbol(Symb, x0, y0, line_color, fill_color); if (line_width > 0) D_line_width(0); G_free(Symb); G_free(line_color); G_free(fill_color); return 0; }