static void draw_crosshair (render_priv *priv) { GdkWindow *window = gtk_widget_get_window (gport->drawing_area); GtkStyle *style = gtk_widget_get_style (gport->drawing_area); gint x, y; static GdkGC *xor_gc; static GdkColor cross_color; if (gport->crosshair_x < 0 || ghidgui->creating || !gport->has_entered) return; if (!xor_gc) { xor_gc = gdk_gc_new (window); gdk_gc_copy (xor_gc, style->white_gc); gdk_gc_set_function (xor_gc, GDK_XOR); gdk_gc_set_clip_origin (xor_gc, 0, 0); set_clip (priv, xor_gc); /* FIXME: when CrossColor changed from config */ ghid_map_color_string (Settings.CrossColor, &cross_color); } gdk_gc_set_foreground (xor_gc, &cross_color); x = DRAW_X (gport->crosshair_x); y = DRAW_Y (gport->crosshair_y); draw_right_cross (xor_gc, x, y); if (Crosshair.shape == Union_Jack_Crosshair_Shape) draw_slanted_cross (xor_gc, x, y); if (Crosshair.shape == Dozen_Crosshair_Shape) draw_dozen_cross (xor_gc, x, y); }
bool ghid_pcb_to_event_coords (Coord pcb_x, Coord pcb_y, int *event_x, int *event_y) { *event_x = DRAW_X (pcb_x); *event_y = DRAW_Y (pcb_y); return true; }
static void show_crosshair (gboolean paint_new_location) { render_priv *priv = gport->render_priv; GdkWindow *window = gtk_widget_get_window (gport->drawing_area); GtkStyle *style = gtk_widget_get_style (gport->drawing_area); gint x, y; static gint x_prev = -1, y_prev = -1; static GdkGC *xor_gc; static GdkColor cross_color; if (gport->crosshair_x < 0 || ghidgui->creating || !gport->has_entered) return; if (!xor_gc) { xor_gc = gdk_gc_new (window); gdk_gc_copy (xor_gc, style->white_gc); gdk_gc_set_function (xor_gc, GDK_XOR); gdk_gc_set_clip_origin (xor_gc, 0, 0); set_clip (priv, xor_gc); /* FIXME: when CrossColor changed from config */ ghid_map_color_string (Settings.CrossColor, &cross_color); } x = DRAW_X (gport->crosshair_x); y = DRAW_Y (gport->crosshair_y); gdk_gc_set_foreground (xor_gc, &cross_color); if (x_prev >= 0 && !paint_new_location) draw_crosshair (xor_gc, x_prev, y_prev); if (x >= 0 && paint_new_location) { draw_crosshair (xor_gc, x, y); x_prev = x; y_prev = y; } else x_prev = y_prev = -1; }
void ghid_show_crosshair (gboolean show) { gint x, y; static gint x_prev = -1, y_prev = -1; static gboolean draw_markers, draw_markers_prev = FALSE; static GdkGC *xor_gc; static GdkColor cross_color; if (gport->x_crosshair < 0 || ghidgui->creating || !gport->has_entered) return; if (!xor_gc) { xor_gc = gdk_gc_new (ghid_port.drawing_area->window); gdk_gc_copy (xor_gc, ghid_port.drawing_area->style->white_gc); gdk_gc_set_function (xor_gc, GDK_XOR); /* FIXME: when CrossColor changed from config */ ghid_map_color_string (Settings.CrossColor, &cross_color); } x = DRAW_X (gport->x_crosshair); y = DRAW_Y (gport->y_crosshair); gdk_gc_set_foreground (xor_gc, &cross_color); if (x_prev >= 0) { draw_crosshair (xor_gc, x_prev, y_prev); if (draw_markers_prev) { gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE, 0, y_prev - VCD, VCD, VCW); gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE, gport->width - VCD, y_prev - VCD, VCD, VCW); gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE, x_prev - VCD, 0, VCW, VCD); gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE, x_prev - VCD, gport->height - VCD, VCW, VCD); } } if (x >= 0 && show) { draw_crosshair (xor_gc, x, y); draw_markers = ghidgui->auto_pan_on && have_crosshair_attachments (); if (draw_markers) { gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE, 0, y - VCD, VCD, VCW); gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE, gport->width - VCD, y - VCD, VCD, VCW); gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE, x - VCD, 0, VCW, VCD); gdk_draw_rectangle (gport->drawing_area->window, xor_gc, TRUE, x - VCD, gport->height - VCD, VCW, VCD); } x_prev = x; y_prev = y; draw_markers_prev = draw_markers; } else { x_prev = y_prev = -1; draw_markers_prev = FALSE; } }