void ddisplay_set_origo(DDisplay *ddisp, coord x, coord y) { Rectangle *extents = &ddisp->diagram->data->extents; Rectangle *visible = &ddisp->visible; int width, height; g_return_if_fail (ddisp->renderer != NULL); /* updaterar origo+visible+rulers */ ddisp->origo.x = x; ddisp->origo.y = y; if (ddisp->zoom_factor<DDISPLAY_MIN_ZOOM) ddisp->zoom_factor = DDISPLAY_MIN_ZOOM; if (ddisp->zoom_factor > DDISPLAY_MAX_ZOOM) ddisp->zoom_factor = DDISPLAY_MAX_ZOOM; width = dia_renderer_get_width_pixels (ddisp->renderer); height = dia_renderer_get_height_pixels (ddisp->renderer); visible->left = ddisp->origo.x; visible->top = ddisp->origo.y; visible->right = ddisp->origo.x + ddisplay_untransform_length(ddisp, width); visible->bottom = ddisp->origo.y + ddisplay_untransform_length(ddisp, height); ddisplay_update_rulers (ddisp, extents, visible); }
void ddisplay_untransform_coords(DDisplay *ddisp, int xi, int yi, coord *x, coord *y) { Rectangle *visible = &ddisp->visible; int width = dia_renderer_get_width_pixels (ddisp->renderer); int height = dia_renderer_get_height_pixels (ddisp->renderer); *x = visible->left + xi*(visible->right - visible->left) / (real)width; *y = visible->top + yi*(visible->bottom - visible->top) / (real)height; }
void ddisplay_transform_coords_double(DDisplay *ddisp, coord x, coord y, double *xi, double *yi) { Rectangle *visible = &ddisp->visible; double width = dia_renderer_get_width_pixels (ddisp->renderer); double height = dia_renderer_get_height_pixels (ddisp->renderer); *xi = (x - visible->left) * (real)width / (visible->right - visible->left); *yi = (y - visible->top) * (real)height / (visible->bottom - visible->top); }
void ddisplay_add_display_area(DDisplay *ddisp, int left, int top, int right, int bottom) { IRectangle *r; if (!ddisp->renderer) return; /* if we don't have a renderer yet prefer ignoring over crashing */ if (left < 0) left = 0; if (top < 0) top = 0; if (right > dia_renderer_get_width_pixels (ddisp->renderer)) right = dia_renderer_get_width_pixels (ddisp->renderer); if (bottom > dia_renderer_get_height_pixels (ddisp->renderer)) bottom = dia_renderer_get_height_pixels (ddisp->renderer); /* draw some rectangles to show where updates are...*/ /* gdk_draw_rectangle(gtk_widget_get_window(ddisp->canvas), gtk_widget_get_style(ddisp->canvas)->black_gc, TRUE, left, top, right-left,bottom-top); */ /* Temporarily just do a union of all Irectangles: */ if (ddisp->display_areas==NULL) { r = g_new(IRectangle,1); r->top = top; r->bottom = bottom; r->left = left; r->right = right; ddisp->display_areas = g_slist_prepend(ddisp->display_areas, r); } else { r = (IRectangle *) ddisp->display_areas->data; r->top = MIN( r->top, top ); r->bottom = MAX( r->bottom, bottom ); r->left = MIN( r->left, left ); r->right = MAX( r->right, right ); } }
void ddisplay_transform_coords(DDisplay *ddisp, coord x, coord y, int *xi, int *yi) { Rectangle *visible = &ddisp->visible; int width = dia_renderer_get_width_pixels (ddisp->renderer); int height = dia_renderer_get_height_pixels (ddisp->renderer); *xi = ROUND ( (x - visible->left) * (real)width / (visible->right - visible->left) ); *yi = ROUND ( (y - visible->top) * (real)height / (visible->bottom - visible->top) ); }
void pagebreak_draw(DDisplay *ddisp, Rectangle *update) { DiaRenderer *renderer = ddisp->renderer; DiaInteractiveRendererInterface *irenderer; int width = dia_renderer_get_width_pixels(ddisp->renderer); int height = dia_renderer_get_height_pixels(ddisp->renderer); irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer); if (prefs.pagebreak.visible) { Diagram *dia = ddisp->diagram; real origx = 0, origy = 0, pos; real pwidth = dia->data->paper.width; real pheight = dia->data->paper.height; int x,y; DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, 0.0); if (prefs.pagebreak.solid) DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0); else DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED, ddisplay_untransform_length(ddisp, 31)); if (dia->data->paper.fitto) { origx = dia->data->extents.left; origy = dia->data->extents.top; } /* vertical lines ... */ pos = origx + ceil((update->left - origx) / pwidth) * pwidth; while (pos <= update->right) { ddisplay_transform_coords(ddisp, pos,0,&x,&y); irenderer->draw_pixel_line(renderer, x, 0, x, height, &dia->pagebreak_color); pos += pwidth; } /* Horizontal lines: */ pos = origy + ceil((update->top - origy) / pheight) * pheight; while (pos <= update->bottom) { ddisplay_transform_coords(ddisp, 0,pos,&x,&y); irenderer->draw_pixel_line(renderer, 0, y, width, y, &dia->pagebreak_color); pos += pheight; } } }
void ddisplay_show_all (DDisplay *ddisp) { Diagram *dia; real magnify_x, magnify_y; int width, height; Point middle; g_return_if_fail (ddisp != NULL); dia = ddisp->diagram; width = dia_renderer_get_width_pixels (ddisp->renderer); height = dia_renderer_get_height_pixels (ddisp->renderer); /* if there is something selected show that instead of all exisiting objects */ if (dia->data->selected) { GList *list = dia->data->selected; Rectangle extents = *dia_object_get_enclosing_box ((DiaObject*)list->data); list = g_list_next(list); while (list) { DiaObject *obj = (DiaObject *)list->data; rectangle_union(&extents, dia_object_get_enclosing_box (obj)); list = g_list_next(list); } magnify_x = (real)width / (extents.right - extents.left) / ddisp->zoom_factor; magnify_y = (real)height / (extents.bottom - extents.top) / ddisp->zoom_factor; middle.x = extents.left + (extents.right - extents.left) / 2.0; middle.y = extents.top + (extents.bottom - extents.top) / 2.0; } else { magnify_x = (real)width / (dia->data->extents.right - dia->data->extents.left) / ddisp->zoom_factor; magnify_y = (real)height / (dia->data->extents.bottom - dia->data->extents.top) / ddisp->zoom_factor; middle.x = dia->data->extents.left + (dia->data->extents.right - dia->data->extents.left) / 2.0; middle.y = dia->data->extents.top + (dia->data->extents.bottom - dia->data->extents.top) / 2.0; } ddisplay_zoom (ddisp, &middle, ((magnify_x<magnify_y)?magnify_x:magnify_y)/1.05); ddisplay_update_scrollbars(ddisp); ddisplay_add_update_all(ddisp); ddisplay_flush(ddisp); }
void ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect) { Rectangle *r; int top,bottom,left,right; Rectangle *visible; int width, height; if (!ddisp->renderer) return; /* can happen at creation time of the diagram */ width = dia_renderer_get_width_pixels (ddisp->renderer); height = dia_renderer_get_height_pixels (ddisp->renderer); if (!rectangle_intersects(rect, &ddisp->visible)) return; /* Temporarily just do a union of all rectangles: */ if (ddisp->update_areas==NULL) { r = g_new(Rectangle,1); *r = *rect; rectangle_intersection(r, &ddisp->visible); ddisp->update_areas = g_slist_prepend(ddisp->update_areas, r); } else { r = (Rectangle *) ddisp->update_areas->data; rectangle_union(r, rect); rectangle_intersection(r, &ddisp->visible); } visible = &ddisp->visible; left = floor( (r->left - visible->left) * (real)width / (visible->right - visible->left) ) - 1; top = floor( (r->top - visible->top) * (real)height / (visible->bottom - visible->top) ) - 1; right = ceil( (r->right - visible->left) * (real)width / (visible->right - visible->left) ) + 1; bottom = ceil( (r->bottom - visible->top) * (real)height / (visible->bottom - visible->top) ) + 1; ddisplay_add_display_area(ddisp, left, top, right, bottom); }
/*! * Called when the widget's window "size, position or stacking" * changes. Needs GDK_STRUCTURE_MASK set. */ static gboolean canvas_configure_event (GtkWidget *widget, GdkEventConfigure *cevent, DDisplay *ddisp) { gboolean new_size = FALSE; int width, height; g_return_val_if_fail (widget == ddisp->canvas, FALSE); if (ddisp->renderer) { width = dia_renderer_get_width_pixels (ddisp->renderer); height = dia_renderer_get_height_pixels (ddisp->renderer); } else { /* We can continue even without a renderer here because * ddisplay_resize_canvas () does the setup for us. */ width = height = 0; } /* Only do this when size is really changing */ if (width != cevent->width || height != cevent->height) { g_print ("Canvas size change...\n"); ddisplay_resize_canvas (ddisp, cevent->width, cevent->height); ddisplay_update_scrollbars(ddisp); /* on resize stop further propagation - does not help */ new_size = TRUE; } /* If the UI is not integrated, resizing should set the resized * window as active. With integrated UI, there is only one window. */ if (is_integrated_ui () == 0) display_set_active(ddisp); /* continue propagation with FALSE */ return new_size; }
void ddisplay_render_pixmap(DDisplay *ddisp, Rectangle *update) { GList *list; DiaObject *obj; int i; DiaInteractiveRendererInterface *renderer; #ifdef TRACES GTimer *timer; #endif if (ddisp->renderer==NULL) { printf("ERROR! Renderer was NULL!!\n"); return; } renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer); /* Erase background */ g_return_if_fail (renderer->fill_pixel_rect != NULL); DIA_RENDERER_GET_CLASS(ddisp->renderer)->begin_render(ddisp->renderer, update); if (update) { int x0, y0, x1, y1; ddisplay_transform_coords (ddisp, update->left, update->top, &x0, &y0); ddisplay_transform_coords (ddisp, update->right, update->bottom, &x1, &y1); renderer->fill_pixel_rect (ddisp->renderer, x0, y0, x1-x0, y1-y0, &ddisp->diagram->data->bg_color); } else renderer->fill_pixel_rect (ddisp->renderer, 0, 0, dia_renderer_get_width_pixels (ddisp->renderer), dia_renderer_get_height_pixels (ddisp->renderer), &ddisp->diagram->data->bg_color); /* Draw grid */ grid_draw(ddisp, update); pagebreak_draw(ddisp, update); #ifdef TRACES timer = g_timer_new(); #endif data_render(ddisp->diagram->data, ddisp->renderer, update, ddisplay_obj_render, (gpointer) ddisp); #ifdef TRACES g_print ("data_render(%g%%) took %g seconds\n", ddisp->zoom_factor * 5.0, g_timer_elapsed (timer, NULL)); g_timer_destroy (timer); #endif /* Draw handles for all selected objects */ list = ddisp->diagram->data->selected; while (list!=NULL) { obj = (DiaObject *) list->data; for (i=0;i<obj->num_handles;i++) { handle_draw(obj->handles[i], ddisp); } list = g_list_next(list); } DIA_RENDERER_GET_CLASS(ddisp->renderer)->end_render(ddisp->renderer); }