Index: trunk/src/Makefile.dep =================================================================== --- trunk/src/Makefile.dep (revision 6376) +++ trunk/src/Makefile.dep (revision 6377) @@ -1273,7 +1273,7 @@ conf.h ../src_plugins/lib_gtk_common/ui_zoompan.h \ ../src_plugins/hid_gtk/win_place.h buffer.h plug_footprint.h vtlibrary.h \ compat_nls.h ../src_plugins/lib_gtk_common/wt_preview.h obj_elem.h \ - ../src_plugins/hid_gtk/gui-library-window.h + layer.h ../src_plugins/hid_gtk/gui-library-window.h ../src_plugins/hid_gtk/gui-log-window.o: \ ../src_plugins/hid_gtk/gui-log-window.c ../config.h conf_core.h conf.h \ global_typedefs.h pcb_bool.h unit.h pcb-printf.h \ @@ -1426,7 +1426,7 @@ ../src_plugins/hid_gtk/colors.h ../src_plugins/hid_gtk/hid_gtk_conf.h \ conf.h ../src_plugins/lib_gtk_common/ui_zoompan.h \ ../src_plugins/hid_gtk/win_place.h copy.h draw.h move.h rotate.h \ - ../src_plugins/lib_gtk_common/wt_preview.h obj_elem.h + ../src_plugins/lib_gtk_common/wt_preview.h obj_elem.h layer.h ../src_plugins/hid_gtk/gui-top-window.o: \ ../src_plugins/hid_gtk/gui-top-window.c ../config.h conf_core.h conf.h \ global_typedefs.h pcb_bool.h unit.h pcb-printf.h \ @@ -2356,9 +2356,9 @@ obj_pad_list.h obj_pad.h obj_pinvia_list.h obj_pinvia.h obj_text.h hid.h \ error.h drc.h layer.h obj_all_list.h obj_elem_list.h obj_elem.h \ ht_element.h ../src_3rd/liblihata/genht/ht.h obj_poly_list.h obj_poly.h \ - polyarea.h obj_text_list.h obj_rat_list.h obj_rat.h layer_grp.h copy.h \ - data.h crosshair.h vtonpoint.h hid.h buffer.h draw.h move.h rotate.h \ - obj_all.h macro.h + polyarea.h obj_text_list.h obj_rat_list.h obj_rat.h layer_grp.h layer.h \ + copy.h data.h crosshair.h vtonpoint.h hid.h buffer.h draw.h move.h \ + rotate.h obj_all.h macro.h ../src_plugins/lib_legacy_func/lib_legacy_func.o: \ ../src_plugins/lib_legacy_func/lib_legacy_func.c \ ../src_3rd/genvector/gds_char.h ../src_3rd/genvector/genvector_impl.h \ Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 6376) +++ trunk/src/draw.c (revision 6377) @@ -650,7 +650,7 @@ return old_gui; } -static void *expose_end(pcb_hid_t *old_gui) +static void expose_end(pcb_hid_t *old_gui) { pcb_gui->destroy_gc(Output.fgGC); pcb_gui->destroy_gc(Output.bgGC); @@ -658,22 +658,35 @@ pcb_gui = old_gui; } -void pcb_hid_expose_all(pcb_hid_t * hid, void *region) +void pcb_hid_expose_all(pcb_hid_t * hid, const pcb_hid_expose_ctx_t *ctx) { if (!pcb_draw_inhibit) { pcb_hid_t *old_gui = expose_begin(hid); - DrawEverything((pcb_box_t *)region); + DrawEverything(&ctx->view); expose_end(old_gui); } } -void pcb_hid_expose_pinout(pcb_hid_t * hid, void *element) +void pcb_hid_expose_pinout(pcb_hid_t * hid, const pcb_hid_expose_ctx_t *ctx) { pcb_hid_t *old_gui = expose_begin(hid); pcb_draw_doing_pinout = pcb_true; - draw_element((pcb_element_t *)element); + draw_element(ctx->content.elem); pcb_draw_doing_pinout = pcb_false; expose_end(old_gui); } + +void pcb_hid_expose_layer(pcb_hid_t *hid, const pcb_hid_expose_ctx_t *e) +{ + pcb_hid_t *old_gui = expose_begin(hid); + + pcb_draw_doing_pinout = pcb_true; + pcb_draw_layer(e->content.layer_id, &e->view); + pcb_draw_doing_pinout = pcb_false; + + expose_end(old_gui); +} + + Index: trunk/src/hid.h =================================================================== --- trunk/src/hid.h (revision 6376) +++ trunk/src/hid.h (revision 6377) @@ -546,16 +546,28 @@ Do *not* assume that the hid that is passed is the GUI hid. This callback is also used for printing and exporting. */ -typedef void (*pcb_hid_expose_t)(pcb_hid_t *hid, void *region); -/* Normal expose: draw all layers with all flags region is (pcb_box_t *) */ -void pcb_hid_expose_all(pcb_hid_t *hid, void *region); +typedef struct pcb_hid_expose_layer_s { + pcb_box_t view; + union { + pcb_layer_id_t layer_id; + pcb_element_t *elem; + } content; +} pcb_hid_expose_ctx_t; -/* Pinout preview expose: draw an element; element is (pcb_element_t *) */ -void pcb_hid_expose_pinout(pcb_hid_t *hid, void *element); +typedef void (*pcb_hid_expose_t)(pcb_hid_t *hid, const pcb_hid_expose_ctx_t *ctx); +/* Normal expose: draw all layers with all flags (no .content is used) */ +void pcb_hid_expose_all(pcb_hid_t *hid, const pcb_hid_expose_ctx_t *region); +/* Pinout preview expose: draw an element; content.elem is used */ +void pcb_hid_expose_pinout(pcb_hid_t *hid, const pcb_hid_expose_ctx_t *element); + +/* Layer preview expose: draw a single layer; content.layer_id is used */ +void pcb_hid_expose_layer(pcb_hid_t *hid, const pcb_hid_expose_ctx_t *ly); + + /* This is initially set to a "no-gui" gui, and later reset by main. hid_expose_callback also temporarily set it for drawing. */ extern pcb_hid_t *pcb_gui; Index: trunk/src_plugins/export_dxf/dxf.c =================================================================== --- trunk/src_plugins/export_dxf/dxf.c (revision 6376) +++ trunk/src_plugins/export_dxf/dxf.c (revision 6377) @@ -4226,7 +4226,7 @@ const char *dxf_fnbase; int i; static int saved_layer_stack[PCB_MAX_LAYER]; - pcb_box_t region; + pcb_hid_expose_ctx_t ctx; int save_ons[PCB_MAX_LAYER + 2]; #if DEBUG @@ -4299,19 +4299,19 @@ lastcap = -1; lastgroup = -1; lastcolor = -1; - region.X1 = 0; - region.Y1 = 0; - region.X2 = PCB->MaxWidth; - region.Y2 = PCB->MaxHeight; + ctx.view.X1 = 0; + ctx.view.Y1 = 0; + ctx.view.X2 = PCB->MaxWidth; + ctx.view.Y2 = PCB->MaxHeight; pagecount = 1; /* dxf_init_apertures ();*/ lastgroup = -1; c_layerapps = 0; dxf_finding_apertures = 1; - pcb_hid_expose_all(&dxf_hid, ®ion); + pcb_hid_expose_all(&dxf_hid, &ctx); c_layerapps = 0; dxf_finding_apertures = 0; - pcb_hid_expose_all(&dxf_hid, ®ion); + pcb_hid_expose_all(&dxf_hid, &ctx); memcpy(pcb_layer_stack, saved_layer_stack, sizeof(pcb_layer_stack)); dxf_maybe_close_file(); pcb_hid_restore_layer_ons(save_ons); Index: trunk/src_plugins/export_gcode/gcode.c =================================================================== --- trunk/src_plugins/export_gcode/gcode.c (revision 6376) +++ trunk/src_plugins/export_gcode/gcode.c (revision 6377) @@ -335,18 +335,18 @@ void gcode_start_png_export() { - pcb_box_t region; + pcb_hid_expose_ctx_t ctx; - region.X1 = 0; - region.Y1 = 0; - region.X2 = PCB->MaxWidth; - region.Y2 = PCB->MaxHeight; + ctx.view.X1 = 0; + ctx.view.Y1 = 0; + ctx.view.X2 = PCB->MaxWidth; + ctx.view.Y2 = PCB->MaxHeight; linewidth = -1; lastbrush = (gdImagePtr) ((void *) -1); lastcolor = -1; - pcb_hid_expose_all(&gcode_hid, ®ion); + pcb_hid_expose_all(&gcode_hid, &ctx); } static void gcode_do_export(pcb_hid_attr_val_t * options) Index: trunk/src_plugins/export_gerber/gerber.c =================================================================== --- trunk/src_plugins/export_gerber/gerber.c (revision 6376) +++ trunk/src_plugins/export_gerber/gerber.c (revision 6377) @@ -524,6 +524,7 @@ int i; static int saved_layer_stack[PCB_MAX_LAYER]; int save_ons[PCB_MAX_LAYER + 2]; + pcb_hid_expose_ctx_t ctx; conf_force_set_bool(conf_core.editor.thin_draw, 0); conf_force_set_bool(conf_core.editor.thin_draw_poly, 0); @@ -568,10 +569,10 @@ lastgroup = -1; lastcolor = -1; - region.X1 = 0; - region.Y1 = 0; - region.X2 = PCB->MaxWidth; - region.Y2 = PCB->MaxHeight; + ctx.view.X1 = 0; + ctx.view.Y1 = 0; + ctx.view.X2 = PCB->MaxWidth; + ctx.view.Y2 = PCB->MaxHeight; pagecount = 1; resetApertures(); @@ -579,11 +580,11 @@ lastgroup = -1; layer_list_idx = 0; finding_apertures = 1; - pcb_hid_expose_all(&gerber_hid, ®ion); + pcb_hid_expose_all(&gerber_hid, &ctx); layer_list_idx = 0; finding_apertures = 0; - pcb_hid_expose_all(&gerber_hid, ®ion); + pcb_hid_expose_all(&gerber_hid, &ctx); memcpy(pcb_layer_stack, saved_layer_stack, sizeof(pcb_layer_stack)); Index: trunk/src_plugins/export_nelma/nelma.c =================================================================== --- trunk/src_plugins/export_nelma/nelma.c (revision 6376) +++ trunk/src_plugins/export_nelma/nelma.c (revision 6377) @@ -564,18 +564,18 @@ void nelma_start_png_export() { - pcb_box_t region; + pcb_hid_expose_ctx_t ctx; - region.X1 = 0; - region.Y1 = 0; - region.X2 = PCB->MaxWidth; - region.Y2 = PCB->MaxHeight; + ctx.view.X1 = 0; + ctx.view.Y1 = 0; + ctx.view.X2 = PCB->MaxWidth; + ctx.view.Y2 = PCB->MaxHeight; linewidth = -1; lastbrush = (gdImagePtr) ((void *) -1); lastcolor = -1; - pcb_hid_expose_all(&nelma_hid, ®ion); + pcb_hid_expose_all(&nelma_hid, &ctx); } static void nelma_do_export(pcb_hid_attr_val_t * options) Index: trunk/src_plugins/export_openscad/scad.c =================================================================== --- trunk/src_plugins/export_openscad/scad.c (revision 6376) +++ trunk/src_plugins/export_openscad/scad.c (revision 6377) @@ -501,7 +501,7 @@ int i; int inner_layers; float layer_spacing, layer_offset, cut_offset = 0.; - pcb_box_t region; + pcb_hid_expose_ctx_t ctx; pcb_layer_t *layer; pcb_layergrp_id_t gbottom, gtop; @@ -574,14 +574,14 @@ } } - region.X1 = 0; - region.Y1 = 0; - region.X2 = PCB->MaxWidth; - region.Y2 = PCB->MaxHeight; + ctx.view.X1 = 0; + ctx.view.Y1 = 0; + ctx.view.X2 = PCB->MaxWidth; + ctx.view.Y2 = PCB->MaxHeight; layer_open = 0; - pcb_hid_expose_all(&scad_hid, ®ion); + pcb_hid_expose_all(&scad_hid, &ctx); /* And now .... Board outlines */ Index: trunk/src_plugins/export_png/png.c =================================================================== --- trunk/src_plugins/export_png/png.c (revision 6376) +++ trunk/src_plugins/export_png/png.c (revision 6377) @@ -445,6 +445,7 @@ { static int saved_layer_stack[PCB_MAX_LAYER]; pcb_box_t tmp, region; + pcb_hid_expose_ctx_t ctx; f = the_file; @@ -526,7 +527,8 @@ } } - pcb_hid_expose_all(&png_hid, bounds); + ctx.view = *bounds; + pcb_hid_expose_all(&png_hid, &ctx); memcpy(pcb_layer_stack, saved_layer_stack, sizeof(pcb_layer_stack)); conf_update(NULL); /* restore forced sets */ Index: trunk/src_plugins/export_ps/eps.c =================================================================== --- trunk/src_plugins/export_ps/eps.c (revision 6376) +++ trunk/src_plugins/export_ps/eps.c (revision 6377) @@ -184,6 +184,7 @@ int i; static int saved_layer_stack[PCB_MAX_LAYER]; pcb_box_t tmp, region; + pcb_hid_expose_ctx_t ctx; conf_force_set_bool(conf_core.editor.thin_draw, 0); conf_force_set_bool(conf_core.editor.thin_draw_poly, 0); @@ -297,7 +298,8 @@ fprintf(f, "/cc { 0 360 arc nclip } bind def\n"); fprintf(f, "/a { gsave setlinewidth translate scale 0 0 1 5 3 roll arc stroke grestore} bind def\n"); - pcb_hid_expose_all(&eps_hid, bounds); + ctx.view = *bounds; + pcb_hid_expose_all(&eps_hid, &ctx); fprintf(f, "showpage\n"); Index: trunk/src_plugins/export_ps/ps.c =================================================================== --- trunk/src_plugins/export_ps/ps.c (revision 6376) +++ trunk/src_plugins/export_ps/ps.c (revision 6377) @@ -402,7 +402,7 @@ double scale_factor; - pcb_box_t region; + pcb_hid_expose_ctx_t exps; pcb_hid_attr_val_t ps_values[NUM_OPTIONS]; @@ -657,10 +657,10 @@ ps_set_layer_group(-1, -1, 0, -1); use_gc(NULL); - global.region.X1 = 0; - global.region.Y1 = 0; - global.region.X2 = PCB->MaxWidth; - global.region.Y2 = PCB->MaxHeight; + global.exps.view.X1 = 0; + global.exps.view.Y1 = 0; + global.exps.view.X2 = PCB->MaxWidth; + global.exps.view.Y2 = PCB->MaxHeight; if (!global.multi_file) { /* %%Page DSC requires both a label and an ordinal */ @@ -672,13 +672,13 @@ global.doing_toc = 1; global.pagecount = 1; /* 'pagecount' is modified by pcb_hid_expose_all() call */ - pcb_hid_expose_all(&ps_hid, &global.region); + pcb_hid_expose_all(&ps_hid, &global.exps); } global.pagecount = 1; /* Reset 'pagecount' if single file */ global.doing_toc = 0; ps_set_layer_group(-1, -1, 0, -1); /* reset static vars */ - pcb_hid_expose_all(&ps_hid, &global.region); + pcb_hid_expose_all(&ps_hid, &global.exps); if (the_file) fprintf(the_file, "showpage\n"); @@ -956,7 +956,7 @@ global.outline_layer != NULL && global.outline_layer != pcb_get_layer(layer) && !(flags & PCB_LYT_OUTLINE)) { - pcb_draw_layer(global.outline_layer, &global.region); + pcb_draw_layer(global.outline_layer, &global.exps.view); } return 1; Index: trunk/src_plugins/export_svg/svg.c =================================================================== --- trunk/src_plugins/export_svg/svg.c (revision 6376) +++ trunk/src_plugins/export_svg/svg.c (revision 6377) @@ -194,12 +194,12 @@ void svg_hid_export_to_file(FILE * the_file, pcb_hid_attr_val_t * options) { static int saved_layer_stack[PCB_MAX_LAYER]; - pcb_box_t region; + pcb_hid_expose_ctx_t ctx; - region.X1 = 0; - region.Y1 = 0; - region.X2 = PCB->MaxWidth; - region.Y2 = PCB->MaxHeight; + ctx.view.X1 = 0; + ctx.view.Y1 = 0; + ctx.view.X2 = PCB->MaxWidth; + ctx.view.Y2 = PCB->MaxHeight; f = the_file; @@ -237,7 +237,7 @@ gds_init(&sbright); gds_init(&sdark); gds_init(&snormal); - pcb_hid_expose_all(&svg_hid, ®ion); + pcb_hid_expose_all(&svg_hid, &ctx); conf_update(NULL); /* restore forced sets */ } Index: trunk/src_plugins/gpmi/pcb-gpmi/gpmi_plugin/gpmi_pkg/hid/hid_callbacks.c =================================================================== --- trunk/src_plugins/gpmi/pcb-gpmi/gpmi_plugin/gpmi_pkg/hid/hid_callbacks.c (revision 6376) +++ trunk/src_plugins/gpmi/pcb-gpmi/gpmi_plugin/gpmi_pkg/hid/hid_callbacks.c (revision 6377) @@ -53,8 +53,8 @@ void gpmi_hid_do_export(pcb_hid_attr_val_t * options) { gpmi_hid_t *h = hid_gpmi_data_get(pcb_exporter); - int save_ons[PCB_MAX_LAYER + 2]; - pcb_box_t region; + int save_ons[PCB_MAX_LAYER + 2]; + pcb_hid_expose_ctx_t ctx; h->result = options; gpmi_event(h->module, HIDE_do_export_start, h); @@ -61,12 +61,12 @@ pcb_hid_save_and_show_layer_ons(save_ons); - region.X1 = 0; - region.Y1 = 0; - region.X2 = PCB->MaxWidth; - region.Y2 = PCB->MaxHeight; + ctx.view.X1 = 0; + ctx.view.Y1 = 0; + ctx.view.X2 = PCB->MaxWidth; + ctx.view.Y2 = PCB->MaxHeight; - pcb_hid_expose_all(h->hid, ®ion); + pcb_hid_expose_all(h->hid, &ctx.view); pcb_hid_restore_layer_ons(save_ons); gpmi_event(h->module, HIDE_do_export_finish, h); h->result = NULL; Index: trunk/src_plugins/hid_gtk/gtkhid-gdk.c =================================================================== --- trunk/src_plugins/hid_gtk/gtkhid-gdk.c (revision 6376) +++ trunk/src_plugins/hid_gtk/gtkhid-gdk.c (revision 6377) @@ -757,7 +757,7 @@ static void redraw_region(GdkRectangle * rect) { int eleft, eright, etop, ebottom; - pcb_box_t region; + pcb_hid_expose_ctx_t ctx; render_priv *priv = gport->render_priv; if (!gport->pixmap) @@ -780,15 +780,15 @@ set_clip(priv, priv->mask_gc); set_clip(priv, priv->grid_gc); - region.X1 = MIN(Px(priv->clip_rect.x), Px(priv->clip_rect.x + priv->clip_rect.width + 1)); - region.Y1 = MIN(Py(priv->clip_rect.y), Py(priv->clip_rect.y + priv->clip_rect.height + 1)); - region.X2 = MAX(Px(priv->clip_rect.x), Px(priv->clip_rect.x + priv->clip_rect.width + 1)); - region.Y2 = MAX(Py(priv->clip_rect.y), Py(priv->clip_rect.y + priv->clip_rect.height + 1)); + ctx.view.X1 = MIN(Px(priv->clip_rect.x), Px(priv->clip_rect.x + priv->clip_rect.width + 1)); + ctx.view.Y1 = MIN(Py(priv->clip_rect.y), Py(priv->clip_rect.y + priv->clip_rect.height + 1)); + ctx.view.X2 = MAX(Px(priv->clip_rect.x), Px(priv->clip_rect.x + priv->clip_rect.width + 1)); + ctx.view.Y2 = MAX(Py(priv->clip_rect.y), Py(priv->clip_rect.y + priv->clip_rect.height + 1)); - region.X1 = MAX(0, MIN(PCB->MaxWidth, region.X1)); - region.X2 = MAX(0, MIN(PCB->MaxWidth, region.X2)); - region.Y1 = MAX(0, MIN(PCB->MaxHeight, region.Y1)); - region.Y2 = MAX(0, MIN(PCB->MaxHeight, region.Y2)); + ctx.view.X1 = MAX(0, MIN(PCB->MaxWidth, ctx.view.X1)); + ctx.view.X2 = MAX(0, MIN(PCB->MaxWidth, ctx.view.X2)); + ctx.view.Y1 = MAX(0, MIN(PCB->MaxHeight, ctx.view.Y1)); + ctx.view.Y2 = MAX(0, MIN(PCB->MaxHeight, ctx.view.Y2)); eleft = Vx(0); eright = Vx(PCB->MaxWidth); @@ -826,7 +826,7 @@ ghid_draw_bg_image(); - pcb_hid_expose_all(&ghid_hid, ®ion); + pcb_hid_expose_all(&ghid_hid, &ctx.view); ghid_draw_grid(); /* In some cases we are called with the crosshair still off */ @@ -1143,7 +1143,7 @@ { } -gboolean ghid_preview_expose(GtkWidget * widget, GdkEventExpose * ev, pcb_hid_expose_t expcall, void *expdata, const pcb_box_t *view) +gboolean ghid_preview_expose(GtkWidget * widget, GdkEventExpose * ev, pcb_hid_expose_t expcall, const pcb_hid_expose_ctx_t *ctx) { GdkWindow *window = gtk_widget_get_window(widget); GdkDrawable *save_drawable; @@ -1153,8 +1153,8 @@ double xz, yz, vw, vh; render_priv *priv = gport->render_priv; - vw = view->X2 - view->X1; - vh = view->Y2 - view->Y1; + vw = ctx->view.X2 - ctx->view.X1; + vh = ctx->view.Y2 - ctx->view.Y1; /* Setup drawable and zoom factor for drawing routines */ @@ -1176,14 +1176,14 @@ gport->view.canvas_height = allocation.height; gport->view.width = allocation.width * gport->view.coord_per_px; gport->view.height = allocation.height * gport->view.coord_per_px; - gport->view.x0 = (vw - gport->view.width) / 2 + view->X1; - gport->view.y0 = (vh - gport->view.height) / 2 + view->Y1; + gport->view.x0 = (vw - gport->view.width) / 2 + ctx->view.X1; + gport->view.y0 = (vh - gport->view.height) / 2 + ctx->view.Y1; /* clear background */ gdk_draw_rectangle(window, priv->bg_gc, TRUE, 0, 0, allocation.width, allocation.height); /* call the drawing routine */ - expcall(&ghid_hid, expdata); + expcall(&ghid_hid, ctx); gport->drawable = save_drawable; gport->view = save_view; Index: trunk/src_plugins/hid_gtk/gtkhid-gl.c =================================================================== --- trunk/src_plugins/hid_gtk/gtkhid-gl.c (revision 6376) +++ trunk/src_plugins/hid_gtk/gtkhid-gl.c (revision 6377) @@ -789,7 +789,7 @@ { render_priv *priv = port->render_priv; GtkAllocation allocation; - pcb_box_t region; + pcb_hid_expose_ctx_t ctx; gtk_widget_get_allocation(widget, &allocation); @@ -837,15 +837,15 @@ glStencilMask(0); glStencilFunc(GL_ALWAYS, 0, 0); - region.X1 = MIN(Px(ev->area.x), Px(ev->area.x + ev->area.width + 1)); - region.X2 = MAX(Px(ev->area.x), Px(ev->area.x + ev->area.width + 1)); - region.Y1 = MIN(Py(ev->area.y), Py(ev->area.y + ev->area.height + 1)); - region.Y2 = MAX(Py(ev->area.y), Py(ev->area.y + ev->area.height + 1)); + ctx.view.X1 = MIN(Px(ev->area.x), Px(ev->area.x + ev->area.width + 1)); + ctx.view.X2 = MAX(Px(ev->area.x), Px(ev->area.x + ev->area.width + 1)); + ctx.view.Y1 = MIN(Py(ev->area.y), Py(ev->area.y + ev->area.height + 1)); + ctx.view.Y2 = MAX(Py(ev->area.y), Py(ev->area.y + ev->area.height + 1)); - region.X1 = MAX(0, MIN(PCB->MaxWidth, region.X1)); - region.X2 = MAX(0, MIN(PCB->MaxWidth, region.X2)); - region.Y1 = MAX(0, MIN(PCB->MaxHeight, region.Y1)); - region.Y2 = MAX(0, MIN(PCB->MaxHeight, region.Y2)); + ctx.view.X1 = MAX(0, MIN(PCB->MaxWidth, ctx.view.X1)); + ctx.view.X2 = MAX(0, MIN(PCB->MaxWidth, ctx.view.X2)); + ctx.view.Y1 = MAX(0, MIN(PCB->MaxHeight, ctx.view.Y1)); + ctx.view.Y2 = MAX(0, MIN(PCB->MaxHeight, ctx.view.Y2)); glColor3f(port->bg_color.red / 65535., port->bg_color.green / 65535., port->bg_color.blue / 65535.); @@ -860,10 +860,10 @@ hidgl_init_triangle_array(&buffer); ghid_invalidate_current_gc(); - pcb_hid_expose_all(&ghid_hid, ®ion); + pcb_hid_expose_all(&ghid_hid, &ctx.view); hidgl_flush_triangles(&buffer); - ghid_draw_grid(®ion); + ghid_draw_grid(&ctx.view); ghid_invalidate_current_gc(); @@ -899,7 +899,7 @@ return; } -gboolean ghid_preview_expose(GtkWidget * widget, GdkEventExpose * ev, pcb_hid_expose_t expcall, void *expdata, const pcb_box_t *view) +gboolean ghid_preview_expose(GtkWidget * widget, GdkEventExpose * ev, pcb_hid_expose_t expcall, const pcb_hid_expose_ctx_t *ctx) { GdkGLContext *pGlContext = gtk_widget_get_gl_context(widget); GdkGLDrawable *pGlDrawable = gtk_widget_get_gl_drawable(widget); @@ -908,8 +908,8 @@ int save_width, save_height; double xz, yz, vw, vh; - vw = view->X2 - view->X1; - vh = view->Y2 - view->Y1; + vw = ctx->view.X2 - ctx->view.X1; + vh = ctx->view.Y2 - ctx->view.Y1; save_view = gport->view; save_width = gport->view.canvas_width; @@ -930,8 +930,8 @@ gport->view.canvas_height = allocation.height; gport->view.width = allocation.width * gport->view.coord_per_px; gport->view.height = allocation.height * gport->view.coord_per_px; - gport->view.x0 = (vw - gport->view.width) / 2 + view->X1; - gport->view.y0 = (vh - gport->view.height) / 2 + view->Y1; + gport->view.x0 = (vw - gport->view.width) / 2 + ctx->view.X1; + gport->view.y0 = (vh - gport->view.height) / 2 + ctx->view.Y1; /* make GL-context "current" */ if (!gdk_gl_drawable_gl_begin(pGlDrawable, pGlContext)) { @@ -970,7 +970,7 @@ glTranslatef(conf_core.editor.view.flip_x ? gport->view.x0 - PCB->MaxWidth : -gport->view.x0, conf_core.editor.view.flip_y ? gport->view.y0 - PCB->MaxHeight : -gport->view.y0, 0); - expcall(&ghid_hid, expdata); + expcall(&ghid_hid, ctx); hidgl_flush_triangles(&buffer); glPopMatrix(); @@ -1001,7 +1001,7 @@ GdkGLDrawable *gldrawable; pcb_gtk_view_t save_view; int save_width, save_height; - pcb_box_t region; + pcb_hid_expose_ctx_t ctx; save_view = gport->view; save_width = gport->view.canvas_width; @@ -1065,17 +1065,17 @@ glTranslatef(gport->view.flip_x ? gport->view.x0 - PCB->MaxWidth : -gport->view.x0, gport->view.flip_y ? gport->view.y0 - PCB->MaxHeight : -gport->view.y0, 0); - region.X1 = MIN(Px(0), Px(gport->view.canvas_width + 1)); - region.Y1 = MIN(Py(0), Py(gport->view.canvas_height + 1)); - region.X2 = MAX(Px(0), Px(gport->view.canvas_width + 1)); - region.Y2 = MAX(Py(0), Py(gport->view.canvas_height + 1)); + ctx.view.X1 = MIN(Px(0), Px(gport->view.canvas_width + 1)); + ctx.view.Y1 = MIN(Py(0), Py(gport->view.canvas_height + 1)); + ctx.view.X2 = MAX(Px(0), Px(gport->view.canvas_width + 1)); + ctx.view.Y2 = MAX(Py(0), Py(gport->view.canvas_height + 1)); - region.X1 = MAX(0, MIN(PCB->MaxWidth, region.X1)); - region.X2 = MAX(0, MIN(PCB->MaxWidth, region.X2)); - region.Y1 = MAX(0, MIN(PCB->MaxHeight, region.Y1)); - region.Y2 = MAX(0, MIN(PCB->MaxHeight, region.Y2)); + ctx.view.X1 = MAX(0, MIN(PCB->MaxWidth, ctx.view.X1)); + ctx.view.X2 = MAX(0, MIN(PCB->MaxWidth, ctx.view.X2)); + ctx.view.Y1 = MAX(0, MIN(PCB->MaxHeight, ctx.view.Y1)); + ctx.view.Y2 = MAX(0, MIN(PCB->MaxHeight, ctx.view.Y2)); - pcb_hid_expose_all(&ghid_hid, ®ion); + pcb_hid_expose_all(&ghid_hid, &ctx.view); hidgl_flush_triangles(&buffer); glPopMatrix(); Index: trunk/src_plugins/hid_gtk/gui.h =================================================================== --- trunk/src_plugins/hid_gtk/gui.h (revision 6376) +++ trunk/src_plugins/hid_gtk/gui.h (revision 6377) @@ -392,7 +392,7 @@ void ghid_screen_update(void); gboolean ghid_drawing_area_expose_cb(GtkWidget *, GdkEventExpose *, GHidPort *); void ghid_port_drawing_realize_cb(GtkWidget *, gpointer); -gboolean ghid_preview_expose(GtkWidget * widget, GdkEventExpose * ev, pcb_hid_expose_t expcall, void *expdata, const pcb_box_t *view); +gboolean ghid_preview_expose(GtkWidget * widget, GdkEventExpose * ev, pcb_hid_expose_t expcall, const pcb_hid_expose_ctx_t *ctx); GdkPixmap *ghid_render_pixmap(int cx, int cy, double zoom, int width, int height, int depth); pcb_hid_t *ghid_request_debug_draw(void); void ghid_flush_debug_draw(void); Index: trunk/src_plugins/hid_lesstif/main.c =================================================================== --- trunk/src_plugins/hid_lesstif/main.c (revision 6376) +++ trunk/src_plugins/hid_lesstif/main.c (revision 6377) @@ -751,16 +751,17 @@ { int i = 0; time_t start, end; - pcb_box_t region; + pcb_hid_expose_ctx_t ctx; Drawable save_main; + save_main = main_pixmap; main_pixmap = window; - region.X1 = 0; - region.Y1 = 0; - region.X2 = PCB->MaxWidth; - region.Y2 = PCB->MaxHeight; + ctx.view.X1 = 0; + ctx.view.Y1 = 0; + ctx.view.X2 = PCB->MaxWidth; + ctx.view.Y2 = PCB->MaxHeight; pixmap = window; XSync(display, 0); @@ -767,7 +768,7 @@ time(&start); do { XFillRectangle(display, pixmap, bg_gc, 0, 0, view_width, view_height); - pcb_hid_expose_all(&lesstif_hid, ®ion); + pcb_hid_expose_all(&lesstif_hid, &ctx); XSync(display, 0); time(&end); i++; @@ -2274,29 +2275,30 @@ { if (need_redraw) { int mx, my; - pcb_box_t region; + pcb_hid_expose_ctx_t ctx; + lesstif_use_mask(0); pixmap = main_pixmap; mx = view_width; my = view_height; - region.X1 = Px(0); - region.Y1 = Py(0); - region.X2 = Px(view_width); - region.Y2 = Py(view_height); + ctx.view.X1 = Px(0); + ctx.view.Y1 = Py(0); + ctx.view.X2 = Px(view_width); + ctx.view.Y2 = Py(view_height); if (conf_core.editor.view.flip_x) { - pcb_coord_t tmp = region.X1; - region.X1 = region.X2; - region.X2 = tmp; + pcb_coord_t tmp = ctx.view.X1; + ctx.view.X1 = ctx.view.X2; + ctx.view.X2 = tmp; } if (conf_core.editor.view.flip_y) { - pcb_coord_t tmp = region.Y1; - region.Y1 = region.Y2; - region.Y2 = tmp; + pcb_coord_t tmp = ctx.view.Y1; + ctx.view.Y1 = ctx.view.Y2; + ctx.view.Y2 = tmp; } XSetForeground(display, bg_gc, bgcolor); XFillRectangle(display, main_pixmap, bg_gc, 0, 0, mx, my); - if (region.X1 < 0 || region.Y1 < 0 || region.X2 > PCB->MaxWidth || region.Y2 > PCB->MaxHeight) { + if (ctx.view.X1 < 0 || ctx.view.Y1 < 0 || ctx.view.X2 > PCB->MaxWidth || ctx.view.Y2 > PCB->MaxHeight) { int leftmost, rightmost, topmost, bottommost; leftmost = Vx(0); @@ -2343,7 +2345,7 @@ } } DrawBackgroundImage(); - pcb_hid_expose_all(&lesstif_hid, ®ion); + pcb_hid_expose_all(&lesstif_hid, &ctx); draw_grid(); lesstif_use_mask(0); show_crosshair(0); /* To keep the drawn / not drawn info correct */ @@ -3389,7 +3391,6 @@ static void pinout_callback(Widget da, PinoutData * pd, XmDrawingAreaCallbackStruct * cbs) { -/* pcb_box_t region;*/ int save_vx, save_vy, save_vw, save_vh; int save_fx, save_fy; double save_vz; Index: trunk/src_plugins/hid_remote/remote.c =================================================================== --- trunk/src_plugins/hid_remote/remote.c (revision 6376) +++ trunk/src_plugins/hid_remote/remote.c (revision 6377) @@ -100,12 +100,13 @@ static int remote_stay; static void remote_do_export(pcb_hid_attr_val_t * options) { - pcb_box_t region; - region.X1 = 0; - region.Y1 = 0; - region.X2 = PCB->MaxWidth; - region.Y2 = PCB->MaxHeight; + pcb_hid_expose_ctx_t ctx; + ctx.view.X1 = 0; + ctx.view.Y1 = 0; + ctx.view.X2 = PCB->MaxWidth; + ctx.view.Y2 = PCB->MaxHeight; + #warning TODO: wait for a connection? remote_proto_send_ver(); remote_proto_send_unit(); @@ -114,7 +115,7 @@ if (remote_proto_send_ready() != 0) exit(1); - pcb_hid_expose_all(&remote_hid, ®ion); + pcb_hid_expose_all(&remote_hid, &ctx); /* main loop, parser */ if (remote_proto_parse_all() != 0) Index: trunk/src_plugins/lib_gtk_common/wt_preview.c =================================================================== --- trunk/src_plugins/lib_gtk_common/wt_preview.c (revision 6376) +++ trunk/src_plugins/lib_gtk_common/wt_preview.c (revision 6377) @@ -48,11 +48,14 @@ static void pinout_set_view(pcb_gtk_preview_t * pinout) { float scale = SENSIBLE_VIEW_SCALE; + pcb_element_t *elem = &pinout->element; - pinout->x_max = pinout->element.BoundingBox.X2 + conf_core.appearance.pinout.offset_x; - pinout->y_max = pinout->element.BoundingBox.Y2 + conf_core.appearance.pinout.offset_y; - pinout->w_pixels = scale * (pinout->element.BoundingBox.X2 - pinout->element.BoundingBox.X1); - pinout->h_pixels = scale * (pinout->element.BoundingBox.Y2 - pinout->element.BoundingBox.Y1); +#warning switch for .kind here and do a zoom-to-extend on layer + + pinout->x_max = elem->BoundingBox.X2 + conf_core.appearance.pinout.offset_x; + pinout->y_max = elem->BoundingBox.Y2 + conf_core.appearance.pinout.offset_y; + pinout->w_pixels = scale * (elem->BoundingBox.X2 - elem->BoundingBox.X1); + pinout->h_pixels = scale * (elem->BoundingBox.Y2 - elem->BoundingBox.Y1); } @@ -116,7 +119,7 @@ PROP_INIT_WIDGET = 3, PROP_EXPOSE = 4, PROP_KIND = 5, - PROP_LAYER =6, + PROP_LAYER = 6, }; @@ -180,7 +183,9 @@ switch (property_id) { case PROP_ELEMENT_DATA: + pinout->kind = PCB_GTK_PREVIEW_PINOUT; pinout_set_data(pinout, (pcb_element_t *) g_value_get_pointer(value)); + pinout->expose_data.content.elem = &pinout->element; if (window != NULL) gdk_window_invalidate_rect(window, NULL, FALSE); break; @@ -197,7 +202,10 @@ pinout->kind = g_value_get_int(value); break; case PROP_LAYER: - pinout->layer = g_value_get_long(value); + pinout->kind = PCB_GTK_PREVIEW_LAYER; + pinout->expose_data.content.layer_id = g_value_get_long(value); + if (window != NULL) + gdk_window_invalidate_rect(window, NULL, FALSE); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); @@ -232,13 +240,16 @@ { pcb_gtk_preview_t *pinout = GHID_PINOUT_PREVIEW(widget); - if (pinout->kind == PCB_GTK_PREVIEW_PINOUT) { - pcb_box_t view; - view.X1 = view.Y1 = 0; - view.X2 = pinout->x_max; - view.Y2 = pinout->y_max; + switch(pinout->kind) { + case PCB_GTK_PREVIEW_PINOUT: + pinout->expose_data.view.X1 = 0; + pinout->expose_data.view.Y1 = 0; + pinout->expose_data.view.X2 = pinout->x_max; + pinout->expose_data.view.Y2 = pinout->y_max; + return pinout->expose(widget, ev, pcb_hid_expose_pinout, &pinout->expose_data); - return pinout->expose(widget, ev, pcb_hid_expose_pinout, &pinout->element, &view); + case PCB_GTK_PREVIEW_LAYER: + return pinout->expose(widget, ev, pcb_hid_expose_layer, &pinout->expose_data); } Index: trunk/src_plugins/lib_gtk_common/wt_preview.h =================================================================== --- trunk/src_plugins/lib_gtk_common/wt_preview.h (revision 6376) +++ trunk/src_plugins/lib_gtk_common/wt_preview.h (revision 6377) @@ -52,7 +52,7 @@ }; typedef void (*pcb_gtk_init_drawing_widget_t)(GtkWidget * widget, void *port); -typedef gboolean (*pcb_gtk_preview_expose_t)(GtkWidget * widget, GdkEventExpose * ev, pcb_hid_expose_t expcall, void *expdata, const pcb_box_t *view); +typedef gboolean (*pcb_gtk_preview_expose_t)(GtkWidget * widget, GdkEventExpose * ev, pcb_hid_expose_t expcall, const pcb_hid_expose_ctx_t *ctx); typedef enum pcb_gtk_preview_kind_e { PCB_GTK_PREVIEW_PINOUT, /* render a single element */ @@ -62,8 +62,7 @@ struct pcb_gtk_preview_s { GtkDrawingArea parent_instance; - pcb_element_t element; /* element data to display, if .kind is PCB_GTK_PREVIEW_PINOUT */ - pcb_layer_id_t layer; /* layer to display, if .kind is PCB_GTK_PREVIEW_LAYER */ + pcb_hid_expose_ctx_t expose_data; gint x_max, y_max; gint w_pixels, h_pixels; /* natural size of element preview */ @@ -72,6 +71,9 @@ pcb_gtk_init_drawing_widget_t init_drawing_widget; pcb_gtk_preview_expose_t expose; pcb_gtk_preview_kind_t kind; + + + pcb_element_t element; };