int Erase_view(View * view) { R_standard_color(WHITE); R_box_abs(view->left, view->top, view->right, view->bottom); return 0; }
static int dotext(char *text, int top, int bottom, int left, int right, int background) { R_standard_color(background); R_box_abs(left + 1, top + 1, right - 1, bottom - 1); R_standard_color(BLACK); /* center the text */ left = (left + right - Text_width(text)) / 2; Text(text, top, bottom, left, right, 2); return 0; }
static int dotext(char *text, int top, int bottom, int left, int right, int centered, int color) { R_standard_color(BACKGROUND); R_box_abs(left, top, right, bottom); R_standard_color(color); 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; }
static int dobox(struct box *box, char *text, int color, int top, int left, int right, int centered) { int bottom; bottom = top + height; /* fill inside of box with color */ R_standard_color(color); R_box_abs(left + 1, top + 1, right - 1, bottom - 1); /* draw box outline and text in black */ R_standard_color(BLACK); Outline_box(top, bottom, left, right); dotext(text, top, bottom, left, right, centered); R_flush(); box->top = top; box->bottom = bottom; box->left = left; box->right = right; 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 ask_line_color(char *colors, int len1, char *xname, int position) { static int use = 1; int pick(); static Objects objects[] = { OTHER(pick, &use), {0} }; char msg[100]; int width; int len2 = 0, len; long offset; long *page_offset; int col, nlist; int line; int stat; char buf[100]; int top, bottom, left, right, center; int topx, bottomx, leftx, rightx, widthx; char name[100], mapset[100], cur_mapset[100]; int new_mapset; Menu_msg(""); sprintf(msg, "Double click on color to assign to vector layer"); /* * build a popup window at center of the screen. * 35% the height and wide enough to hold 2 columms of file names * * the window is for choosing file names and will be laid out in 2 columns * * ------------------------------------------ * | CANCEL | (MORE) | (LESS) | * ------------------------------------------ * | mapset | * ------------------------------------------ * | name1 | name2 | * ------------------------------------------ * | name3 | name4 | * ------------------------------------------ * | name5 | name6 | * | . | * | . | * | . | * ------------------------------------------ */ /* 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 */ text_size = .8 * height; size = text_size - 1; /* fudge for computing pixels width of text */ /* indent for the text */ edge = .1 * height + 1; /* this is a fudge to determine the length of the largest text */ len1 = 2 * len1; /* name in 2 columns */ len2 += strlen("mapset "); len = (len1 > len2 ? len1 : len2); /* width is for max chars plus sidecar for more/less */ width = len * size + height; widthx = strlen(msg) * size; if (widthx < width) widthx = width; /* define the window */ top = (SCREEN_TOP + SCREEN_BOTTOM - height * NLINES) / 2; bottom = top + height * NLINES; center = (SCREEN_LEFT + SCREEN_RIGHT) / 2; if (position > 0) { right = (center + SCREEN_RIGHT + width) / 2; if (right >= SCREEN_RIGHT) right = SCREEN_RIGHT - 1; left = right - width; } else if (position < 0) { left = (center + SCREEN_LEFT - width) / 2; if (left <= SCREEN_LEFT) left = SCREEN_LEFT + 1; right = left + width; } else { left = center + width / 2; right = left + width; } topx = top - 3 * height; bottomx = topx + 2 * height; leftx = (left + right - widthx) / 2; if (leftx < SCREEN_LEFT) leftx = SCREEN_LEFT; rightx = leftx + widthx; /* save what is under these areas, so they can be restored */ R_panel_save(tempfile1, top, bottom, left, right); R_panel_save(tempfile2, topx, bottomx, leftx, rightx); /* fill it top with GREY, pick area with white */ R_standard_color(WHITE); R_box_abs(left, top, right, bottom); R_standard_color(GREY); R_box_abs(leftx, topx, rightx, bottomx); R_standard_color(BLACK); Outline_box(top, bottom, left, right); right -= height; /* reduce it to exclude sidecar */ Outline_box(top, bottom, left, right); /* print messages above the files */ dotext(msg, topx, topx + height, leftx, rightx, 1); dotext("Double click here to cancel", topx + height, bottomx, leftx, rightx, 1); cancel.top = topx; cancel.bottom = bottomx; cancel.left = leftx; cancel.right = rightx; /* start the mouse in the cancel box */ Set_mouse_xy((leftx + rightx) / 2, (topx + bottomx) / 2); dobox(&less, "", WHITE, top, right, right + height, 0); dobox(&more, "", WHITE, bottom - height, right, right + height, 0); /* as we read the file of names, keep track of pages so we can * page backward */ page = 0; page_offset = (long *)G_calloc(npages = 1, sizeof(long)); *page_offset = ftell(fd); nlist = sizeof(list) / sizeof(list[0]); for (stat = -1; stat < 0;) { line = 0; count = 0; *cur_mapset = 0; col = 0; while (1) { /* offset = ftell (fd); if (fgets (buf, sizeof buf, fd) == NULL || sscanf (buf, "%s %s", name, mapset) != 2) break; if(new_mapset = (strcmp (cur_mapset,mapset) != 0)) { if(line) line++; if (col) line++; col = 0; } if (count >= nlist || line+new_mapset >= NLINES) { if (page+1 == npages) { npages++; page_offset = (long *) G_realloc (page_offset, npages * sizeof (long)); page_offset[npages-1] = offset; } break; } if (new_mapset) { struct box dummy; char label[100]; strcpy (cur_mapset, mapset); sprintf (label, "Mapset %s", mapset); dobox (&dummy, label, WHITE, top+line*height, left, right, 0); line++; } if (col) { dobox (&list[count].box, name, GREY, top+line*height, left+width/2, right, 0); line++; col = 0; } else { dobox (&list[count].box, name, GREY, top+line*height, left, left+width/2, 0); col = 1; } strcpy (list[count].name, name); strcpy (list[count].mapset, mapset); count++; } downarrow (&more, page+1 < npages ? BLACK : WHITE); uparrow (&less, page > 0 ? BLACK : WHITE); which = -1; switch(Input_pointer(objects)) { case -1: /* more or less */ break; case -2: /* cancel */ stat = 0; continue; default: /* file picked */ strcpy(xname, list[which].name); stat = 1; continue; } fseek(fd, page_offset[page], 0); R_standard_color(WHITE); R_box_abs(left + 1, top + 1, right - 1, bottom - 1); } /* all done. restore what was under the window */ right += height; /* move it back over the sidecar */ R_standard_color(WHITE); R_box_abs(left, top, right, bottom); R_panel_restore(tempfile1); R_panel_restore(tempfile2); R_panel_delete(tempfile1); R_panel_delete(tempfile2); R_flush(); G_free(page_offset); return stat; }
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; }