static void read_display(char *file, void (*f)(char)) { char txt; char *tmp; int fd; int i; fd = open(file, O_RDONLY); while (read(fd, &txt, 1)) { display_add(); f(txt); g_add++; if (g_total_size - g_add < 16 && g_add % 16 == 0) file_error(); } g_end--; if (g_end == 0) { tmp = ft_convert_base(g_add, BASE, HEX); ft_putchar('\n'); i = g_n - ft_strlen(tmp); while (i--) ft_putchar('0'); ft_putstr(tmp); ft_putchar('\n'); } }
void poly_draw_segment(struct container *co, struct segment *seg, int disp, unsigned char **p, int limit) { struct poly_hdr poly_hdr; struct coord *coord; unsigned int j,k,o; struct point pnt; struct param_list param[100]; int max=20000; struct point xpoints[max]; seg->data[0]=*p; poly_get_hdr(p, &poly_hdr); if (poly_hdr.order < limit && is_visible(co->trans, poly_hdr.c)) { transform(co->trans,&poly_hdr.c[2],&pnt); for (k = 0 ; k < poly_hdr.polys ; k++) { assert(poly_hdr.count[k] < max); for (j = 0 ; j < poly_hdr.count[k] ; j++) { transform(co->trans, coord_get(p), &xpoints[j]); } if (poly_hdr.type < 0x80) { o=0; if (poly_hdr.type == 0x1e) o=1; else if (poly_hdr.type == 0x2d) o=2; else if (poly_hdr.type == 0x32) o=3; display_add(&co->disp[disp+o], 0, 0, poly_hdr.name, poly_hdr.count[k], xpoints, NULL, seg, sizeof(*seg)); } else { display_add(&co->disp[disp], 1, 0, poly_hdr.name, poly_hdr.count[k], xpoints, NULL, seg, sizeof(*seg)); } if (co->data_window[data_window_type_poly]) data_window_add(co->data_window[data_window_type_poly], param, poly_get_param(seg, param, 100)); } } else (*p)+=poly_hdr.count_sum*sizeof(*coord); }
USER_OBJECT_ RS_GGOBI(createDisplay)(USER_OBJECT_ stype, USER_OBJECT_ svars, USER_OBJECT_ datasetId, USER_OBJECT_ useWindow) { GGobiData *d; ggobid *gg; displayd *display = NULL; GType type; GGobiExtendedDisplayClass *klass; gboolean use_window = asCLogical(useWindow); d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; type = g_type_from_name(asCString(stype)); klass = GGOBI_EXTENDED_DISPLAY_CLASS(g_type_class_peek(type)); if(!klass) { PROBLEM "Unrecognized display type" ERROR; } if(klass->createWithVars && GET_LENGTH(svars)) { gint nvars, *vars, i; nvars = GET_LENGTH(svars); vars = g_malloc(sizeof(gint)*nvars); for(i = 0; i < nvars; i++) vars[i] = INTEGER_DATA(svars)[i]; display = klass->createWithVars(use_window, false, nvars, vars, d, gg); } else if(klass->create) display = klass->create(use_window, false, NULL, d, gg); if(!display) { PROBLEM "Couldn't create the display" ERROR; } display_add(display, gg); gdk_flush(); return(RS_displayInstance(display)); }
static void street_draw_segment(struct container *co, struct segment *seg, unsigned char **pos, unsigned char *end, struct coord *ref, int bytes, int include, int disp) { int j,flags,limit; struct coord f; struct coord l[2]; struct street_str *str=seg->data[0]; char *label; struct street_name name; struct param_list param[100]; struct route_path_segment *route; struct display_list **displ=co->disp; int max=10000; struct point xpoints[max]; flags=0; j=0; while (! flags && *pos < end) { flags=street_get_coord(pos, bytes, ref, &f); if (! j) { l[0]=f; l[1]=f; } else { if (include || !flags) { if (f.x < l[0].x) l[0].x=f.x; if (f.x > l[1].x) l[1].x=f.x; if (f.y > l[0].y) l[0].y=f.y; if (f.y < l[1].y) l[1].y=f.y; } } transform(co->trans, &f, &xpoints[j]); if (! j) flags=0; j++; assert(j < max); } if (! include) j--; if (is_visible(co->trans, l) && str->type) { label=NULL; if (str->nameid) { street_name_get_by_id(&name, seg->blk_inf.mdata, str->nameid); if (name.name2[0]) label=name.name2; else label=name.name1; } #if 0 if (str->nameid && name.townassoc < 0 ) { char buffer[128]; sprintf(buffer,"-0x%x", -name.townassoc); label=g_strdup(buffer); } #endif limit=0; if (str->limit == 0x30) limit=1; if (str->limit == 0x03) limit=-1; if (str->type & 0x40) limit=-limit; display_add(&displ[disp], 2, limit, label, j, xpoints, NULL, seg, sizeof(*seg)); if (co->route && (route=route_path_get(co->route, str->segid))) { if (! route->offset) display_add(&displ[display_street_route], 2, 0, label, j, xpoints, NULL, NULL, 0); else if (route->offset > 0) display_add(&displ[display_street_route], 2, 0, label, route->offset, xpoints, NULL, NULL, 0); else display_add(&displ[display_street_route], 2, 0, label, j+route->offset, xpoints-route->offset, NULL, NULL, 0); } if (co->data_window[data_window_type_street]) data_window_add(co->data_window[data_window_type_street], param, street_get_param(seg, param, 100, 0)); } *pos-=2*bytes; }