int do_size(char *buff) { float xper, yper; int ret; ret = sscanf(buff, "%*s %f %f", &xper, &yper); if (ret != 2 && ret != 1) { G_warning(_("Problem parsing command [%s]"), buff); return (-1); } /* if only one size is given assume same value in both axes */ if (ret == 1) yper = xper; if (xper < 0. || yper < 0. || xper > 100. || yper > 100.) return (-1); R_text_size((int)(xper * xincr), (int)(yper * yincr)); G_debug(3, "text size set to [%d,%d] pixels", (int)(xper * xincr), (int)(yper * yincr)); return (0); }
int set_text_size(void) { if (hsize >= 0. && vsize >= 0. && hsize <= 100. && vsize <= 100.) { R_text_size((int)(hsize * xincr), (int)(vsize * yincr)); G_debug(3, "text size initialized to [%d,%d] pixels", (int)(hsize * xincr), (int)(vsize * yincr)); } return (0); }
static int dotext(char *text, int top, int bottom, int left, int right, int centered) { R_text_size(text_size, text_size); R_move_abs(left + 1 + edge, bottom - 1 - edge); if (centered) R_move_rel((right - left - strlen(text) * size) / 2, 0); R_set_window(top, bottom, left, right); /* for text clipping */ R_text(text); R_set_window(SCREEN_TOP, SCREEN_BOTTOM, SCREEN_LEFT, SCREEN_RIGHT); return 0; }
int display_title(View * view) { View *title; char left[100], center[100]; int size; *left = 0; *center = 0; if (view->cell.configured) { sprintf(center, "%s (mag %.1f)", view->cell.name, magnification(view)); } if (view == VIEW_MAP1) { sprintf(left, "%s", G_location()); title = VIEW_TITLE1; } else if (view == VIEW_MAP1_ZOOM) { title = VIEW_TITLE1_ZOOM; } if (view == VIEW_MAP2) { sprintf(left, "%s", G_location()); title = VIEW_TITLE2; } else if (view == VIEW_MAP2_ZOOM) { title = VIEW_TITLE2_ZOOM; } Erase_view(title); R_standard_color(WHITE); size = title->nrows - 4; R_text_size(size, size); Text(left, title->top, title->bottom, title->left, title->right, 2); if (*center) { R_standard_color(YELLOW); Text(center, title->top, title->bottom, (title->left + title->right - Text_width(center)) / 2, title->right, 2); } return 0; }
int Menu_msg(char *msg) { int size, edge; size = VIEW_MENU->nrows - 4; edge = 2; Erase_view(VIEW_MENU); if (*msg) { R_text_size(size, size); R_standard_color(BLACK); Text(msg, VIEW_MENU->top, VIEW_MENU->bottom, VIEW_MENU->left, VIEW_MENU->right, edge); } R_flush(); replot = 1; return 0; }
int Init_graphics(void) { R_font("romans"); R_text_size(3 * NORMAL_TEXT_SIZE / 4, NORMAL_TEXT_SIZE); D_full_screen(); SCREEN_TOP = R_screen_top(); SCREEN_BOTTOM = R_screen_bot(); SCREEN_LEFT = R_screen_left(); SCREEN_RIGHT = R_screen_rite(); BLACK = D_translate_color("black"); BLUE = D_translate_color("blue"); BROWN = D_translate_color("brown"); GREEN = D_translate_color("green"); GREY = D_translate_color("grey"); ORANGE = D_translate_color("orange"); PURPLE = D_translate_color("purple"); RED = D_translate_color("red"); WHITE = D_translate_color("white"); YELLOW = D_translate_color("yellow"); R_standard_color(BLACK); VIEW_TITLE1 = makeview(97.5, 100.0, 50.0, 100.0); VIEW_MAP1 = makeview(51.0, 97.5, 50.0, 100.0); VIEW_TITLE1_ZOOM = makeview(48.5, 51.0, 50.0, 100.0); VIEW_MAP1_ZOOM = makeview(2.5, 48.5, 50.0, 100.0); VIEW_MASK1 = makeview(51.0, 97.5, 50.0, 100.0); /*same as map1 */ VIEW_MENU = makeview(0.0, 2.5, 0.0, 100.0); VIEW_HISTO = makeview(2.5, 100.0, 0.0, 50.0); return 0; }
int ask_magnification(int *magnification) { static int use = 1; int x, y; int height; int stat; int width; int top, bottom, left, right; static Objects objects[] = { OTHER(incr, &use), {0} }; Menu_msg(""); mag = *magnification; if (mag < 1) mag = 1; height = VIEW_MENU->nrows; R_text_size(height - 4, height - 4); Get_mouse_xy(&x, &y); top = y - height / 2; if (top < SCREEN_TOP) top = SCREEN_TOP; bottom = top + 4 * height; if (bottom >= VIEW_MENU->top) { top -= bottom - (VIEW_MENU->top - 1); bottom = VIEW_MENU->top - 1; } width = Text_width("MAGNIFICATION") + 4; left = x - width / 2; if (left < SCREEN_LEFT) left = SCREEN_LEFT; right = left + width; if (right > SCREEN_RIGHT) { left -= right - SCREEN_RIGHT; right = SCREEN_RIGHT; } R_panel_save(tempfile1, top, bottom, left, right); R_standard_color(WHITE); R_box_abs(left, top, right, bottom); R_standard_color(BLACK); Outline_box(top, bottom, left, right); plus.top = top + height; plus.bottom = plus.top + height; plus.left = left; plus.right = plus.left + Text_width("++") + 4; Outline_box(plus.top, plus.bottom, plus.left, plus.right); minus.top = top + height; minus.bottom = minus.top + height; minus.right = right; minus.left = minus.right - Text_width("--") - 4; Outline_box(minus.top, minus.bottom, minus.left, minus.right); value.top = top + height; value.bottom = value.top + height; value.left = plus.right; value.right = minus.left; Outline_box(value.top, value.bottom, value.left, value.right); accept.top = value.bottom; accept.bottom = accept.top + height; accept.left = left; accept.right = right; Outline_box(accept.top, accept.bottom, accept.left, accept.right); cancel.top = accept.bottom; cancel.bottom = cancel.top + height; cancel.left = left; cancel.right = right; Outline_box(cancel.top, cancel.bottom, cancel.left, cancel.right); dotext("MAGNIFICATION", top, top + height, left, right, WHITE); dotext("+", plus.top, plus.bottom, plus.left, plus.right, GREY); dotext("-", minus.top, minus.bottom, minus.left, minus.right, GREY); dotext("ACCEPT", accept.top, accept.bottom, accept.left, accept.right, GREY); dotext("CANCEL", cancel.top, cancel.bottom, cancel.left, cancel.right, GREY); draw_mag(); stat = Input_pointer(objects); /* to respond to user */ R_standard_color(WHITE); R_box_abs(left, top, right, bottom); R_flush(); R_panel_restore(tempfile1); R_panel_delete(tempfile1); *magnification = mag; return stat > 0; }
int analyze(void) { static int use = 1; static Objects objects[] = { MENU("DONE", done, &use), MENU("PRINT", to_printer, &use), MENU("FILE", to_file, &use), MENU("OVERLAY", do_warp, &use), MENU(delete_msg, delete_mark, &use), INFO("Transform->", &use), MENU(order_msg, get_order, &use), INFO(pick_msg, &use), OTHER(pick, &use), {0} }; int color; int tsize; int cury; int len; int line; int top, bottom, left, right, width, middle, nums; /* to give user a response of some sort */ Menu_msg("Preparing analysis ..."); /* * build a popup window at center of the screen. * 35% the height and wide enough to hold the report * */ /* height of 1 line, based on NLINES taking up 35% vertical space */ height = (.35 * (SCREEN_BOTTOM - SCREEN_TOP)) / NLINES + 1; /* size of text, 80% of line height */ tsize = .8 * height; size = tsize - 2; /* fudge for computing pixels width of text */ /* indent for the text */ edge = .1 * height + 1; /* determine the length, in chars, of printed line */ FMT0(buf, 0); nums = strlen(buf) * size; FMT1(buf, 0.0, 0.0, 0.0); len = strlen(buf); middle = len * size; FMT2(buf, 0.0, 0.0, 0.0, 0.0); len += strlen(buf); /* width is for max chars plus sidecar for more/less */ width = len * size + nums + 2 * height; if ((SCREEN_RIGHT - SCREEN_LEFT) < width) width = SCREEN_RIGHT - SCREEN_LEFT; /* define the window */ bottom = VIEW_MENU->top - 1; top = bottom - height * NLINES; left = SCREEN_LEFT; right = left + width; middle += left + nums; nums += left; /* save what is under this area, so it can be restored */ R_panel_save(tempfile1, top, bottom + 1, left, right + 1); /* fill it with white */ R_standard_color(BACKGROUND); R_box_abs(left, top, right, bottom); right -= 2 * height; /* reduce it to exclude sidecar */ /* print messages in message area */ R_text_size(tsize, tsize); /* setup the more/less boxes in the sidecar */ R_standard_color(BLACK); less.top = top; less.bottom = top + 2 * height; less.left = right; less.right = right + 2 * height; Outline_box(less.top, less.bottom, less.left, less.right); more.top = bottom - 2 * height; more.bottom = bottom; more.left = right; more.right = right + 2 * height; Outline_box(more.top, more.bottom, more.left, more.right); /* * top two lines are for column labels * last two line is for overall rms error. */ nlines = NLINES - 3; first_point = 0; /* allocate predicted values */ xres = (double *)G_calloc(group.points.count, sizeof(double)); yres = (double *)G_calloc(group.points.count, sizeof(double)); gnd = (double *)G_calloc(group.points.count, sizeof(double)); /* compute transformation for the first time */ compute_transformation(); /* put head on the report */ cury = top; dotext(LHEAD1, cury, cury + height, left, middle, 0, BLACK); dotext(RHEAD1, cury, cury + height, middle, right - 1, 0, BLACK); cury += height; dotext(LHEAD2, cury, cury + height, left, middle, 0, BLACK); dotext(RHEAD2, cury, cury + height, middle, right - 1, 0, BLACK); cury += height; R_move_abs(left, cury - 1); R_cont_abs(right, cury - 1); /* isolate the sidecar */ R_move_abs(right, top); R_cont_abs(right, bottom); /* define report box */ report.top = cury; report.left = left; report.right = right; /* lets do it */ pager = 1; while (1) { R_text_size(tsize, tsize); line = 0; curp = first_point; cury = top + 2 * height; while (1) { if (line >= nlines || curp >= group.points.count) break; line++; if (!delete_mode) color = BLACK; else color = BLUE; if (group.equation_stat > 0 && group.points.status[curp] > 0) { /* color = BLACK; */ FMT1(buf, xres[curp], yres[curp], gnd[curp]); if (curp == xmax || curp == ymax || curp == gmax) color = RED; dotext(buf, cury, cury + height, nums, middle, 0, color); } else if (group.points.status[curp] > 0) dotext("?", cury, cury + height, nums, middle, 1, color); else dotext("not used", cury, cury + height, nums, middle, 1, color); if (pager) { FMT0(buf, curp + 1); dotext(buf, cury, cury + height, left, nums, 0, color); FMT2(buf, group.points.e1[curp], group.points.n1[curp], group.points.e2[curp], group.points.n2[curp]); dotext(buf, cury, cury + height, middle, right - 1, 0, color); } cury += height; curp++; } report.bottom = cury; downarrow(&more, curp < group.points.count ? color : BACKGROUND); uparrow(&less, first_point > 0 ? color : BACKGROUND); R_standard_color(BACKGROUND); R_box_abs(left, cury, right - 1, bottom); if (group.equation_stat < 0) { if (group.equation_stat == -1) { color = RED; strcpy(buf, "Poorly placed control points"); } else { if (group.equation_stat == -2) G_fatal_error("NOT ENOUGH MEMORY"); else G_fatal_error("PARAMETER ERROR"); } } else if (group.equation_stat == 0) { color = RED; strcpy(buf, "No active control points"); } else { color = BLACK; sprintf(buf, "Overall rms error: %.2f", rms); } dotext(buf, bottom - height, bottom, left, right - 1, 0, color); R_standard_color(BLACK); R_move_abs(left, bottom - height); R_cont_abs(right - 1, bottom - height); pager = 0; which = -1; if (Input_pointer(objects) < 0) break; display_points(1); } /* all done. restore what was under the window */ right += 2 * height; /* move it back over the sidecar */ R_standard_color(BACKGROUND); R_box_abs(left, top, right, bottom); R_panel_restore(tempfile1); R_panel_delete(tempfile1); R_flush(); G_free(xres); G_free(yres); G_free(gnd); I_put_control_points(group.name, &group.points); display_points(1); return 0; /* return but don't QUIT */ }
int draw_scale(char *save, int toptext, int size) { double meters; double line_len; int incr; int x_pos, y_pos; int t, b, l, r; int pt, pb, pl, pr; int i; int xarr[5], yarr[5]; double seg_len; const struct scale *scales = all_scales[use_feet]; /* Establish text size */ D_get_screen_window(&t, &b, &l, &r); R_set_window(t, b, l, r); R_text_size(size, size); x_pos = (int)(east * (r - l) / 100.); y_pos = (int)(north * (b - t) / 100.); if (draw == 1) { int w, h; w = 30; h = 17 + 2 * w; pl = x_pos; pt = y_pos; pr = x_pos + w + 2; /* 1 pixel margin for both sides */ pb = y_pos + h + 2; /* 1 pixel margin for both sides */ if (save) R_panel_save(save, pt, pb, pl, pr); if (do_background) { D_raster_use_color(color1); R_box_abs(pl, pt, pr, pb); } /* Draw legend */ D_raster_use_color(color2); R_move_abs(pl + w / 2 + 1, pt + 17 + 1); xarr[0] = 0; yarr[0] = 0; xarr[1] = -w / 2; yarr[1] = 2 * w; xarr[2] = w / 2; yarr[2] = -w / 2; xarr[3] = 0; yarr[3] = -1.5 * w; R_polyline_rel(xarr, yarr, 4); xarr[1] = -xarr[1]; xarr[2] = -xarr[2]; R_polygon_rel(xarr, yarr, 4); /* actual text width is 81% of size? from d.legend */ R_move_abs((int)(pl + w / 2 - 7 * .81), pt + 14); R_text("N"); R_stabilize(); return 0; } meters = D_get_u_east() - D_get_u_west(); meters *= G_database_units_to_meters_factor(); /* find the right scale */ for (incr = 0; incr < NUMSCALES; incr++) { if (meters <= scales[incr].limit) break; } if (!incr) return (-1); /* beyond the maximum just make the longest scale narrower */ if (incr >= NUMSCALES) incr = NUMSCALES - 1; line_len = D_get_u_to_d_xconv() * scales[incr].size / G_database_units_to_meters_factor(); seg_len = line_len / scales[incr].seg; /* work around round off */ line_len = ((int)seg_len) * scales[incr].seg; /* Blank out area with background color */ if (toptext) { pr = x_pos + 35 + (int)line_len; pt = y_pos - 15; if (pt < t) pt = t; } else { pr = x_pos + 35 + (int)line_len + size * strlen(scales[incr].name); pt = y_pos + 0; if (pt < t) pt = t; } pb = y_pos + 30; if (pb > b) pb = b; pl = x_pos + 0; if (pl < l) pl = l; pr = pr; if (pr > r) pr = r; if (save) R_panel_save(save, pt, pb, pl, pr); if (do_background) { D_raster_use_color(color1); R_box_abs(pl, pt, pr, pb); } /* Draw legend */ D_raster_use_color(color2); if (draw != 2) { R_move_abs(x_pos + 5, y_pos + 20); R_cont_rel(0, -10); R_cont_rel(10, 10); R_cont_rel(0, -10); R_move_rel(-5, 14); R_cont_rel(0, -17); R_cont_rel(-2, -0); R_cont_rel(2, -2); R_cont_rel(2, 2); R_cont_rel(-2, -0); } if (draw == 2) { R_move_abs(x_pos + 25 - draw * 10, y_pos + 17); /* actual width is line_len-1+1=line_len and height is 7+1=8 */ R_cont_rel((int)line_len - 1, 0); R_cont_rel(0, -7); R_cont_rel((int)(line_len * -1 + 1), 0); R_cont_rel(0, 7); R_move_rel(0, 1 - 4); for (i = 1; i <= scales[incr].seg; i++) { xarr[0] = 0; yarr[0] = 0; xarr[1] = (int)seg_len; yarr[1] = 0; xarr[2] = 0; yarr[2] = (i % 2 ? -4 : 4); xarr[3] = (int)-seg_len; yarr[3] = 0; xarr[4] = 0; yarr[4] = (i % 2 ? 4 : -4); /* width is seg_len and height is 4 */ R_polygon_rel(xarr, yarr, 4); R_move_rel((int)seg_len, 0); } } else if (do_bar) { R_move_abs(x_pos + 25, y_pos + 17); /* actual width is line_len-1+1=line_len and height is 4+1=5 */ R_cont_rel((int)line_len - 1, 0); R_cont_rel(0, -4); R_cont_rel((int)(line_len * -1 + 1), 0); R_cont_rel(0, 4); R_move_rel(0, 1); for (i = 1; i <= scales[incr].seg; i += 2) { /* width is seg_len and height is 5 */ R_box_rel((int)seg_len, -5); R_move_rel((int)(seg_len * 2), 0); } } else { /* draw simple line scale */ R_move_abs(x_pos + 25, y_pos + 5); R_cont_abs(x_pos + 25, y_pos + 25); R_move_abs(x_pos + 25, y_pos + 15); R_cont_abs(x_pos + 25 + (int)line_len, y_pos + 15); R_move_abs(x_pos + 25 + (int)line_len, y_pos + 5); R_cont_abs(x_pos + 25 + (int)line_len, y_pos + 25); } if (toptext) { R_move_abs(x_pos + 25 - draw * 10 + (int)(line_len / 2. - strlen(scales[incr].name) * size * 0.81 / 2), y_pos); R_text(scales[incr].name); } else { R_move_abs(x_pos + 35 - draw * 10 + (int)line_len, y_pos + 20); R_text(scales[incr].name); } R_stabilize(); return (0); }
static int draw_objects(Objects * objects) { Objects *obj; int top, bottom, left, right; int size, edge; /* erase the menu window */ Erase_view(VIEW_MENU); R_flush(); /* determine sizes and text indentation */ size = VIEW_MENU->nrows - 4; edge = 2; R_text_size(size, size); left = VIEW_MENU->left; top = VIEW_MENU->top; bottom = VIEW_MENU->bottom; /* put the (boxed) text on the menu view */ for (obj = objects; obj->type; obj++) { if (!visible(obj)) continue; switch (obj->type) { case OPTION_OBJECT: case MENU_OBJECT: right = left + 2 * edge + Text_width(obj->label); obj->left = left; obj->right = right; obj->top = top; obj->bottom = bottom; R_standard_color(FILL_COLOR); R_box_abs(left, top, right, bottom); R_standard_color(TEXT_COLOR); Text(obj->label, top, bottom, left, right, edge); R_standard_color(OUTLINE_COLOR); Outline_box(top, bottom, left, right); left = right; break; case INFO_OBJECT: if (*obj->label == 0) break; if (*obj->status < 0) break; right = left + 2 * edge + Text_width(obj->label); R_standard_color(BLACK); Text(obj->label, top, bottom, left, right, edge); left = right; break; } } draw_option_boxes(objects); R_flush(); return 0; }