Verified Commit ea21bcab authored by Zander's avatar Zander 💥

Port the navigator

parent fd5d5924
......@@ -26,7 +26,7 @@
#include "diagram.h"
#include "display.h"
#include "diagdkrenderer.h"
#include "renderer/diacairo.h"
#include "navigation.h"
......@@ -48,7 +48,6 @@ struct _NavigationWindow
/*miniframe*/
int frame_w;
int frame_h;
GdkGC * gc;
GdkCursor * cursor;
/*factors to translate thumbnail coordinates to adjustement values*/
......@@ -56,7 +55,7 @@ struct _NavigationWindow
gdouble vadj_coef;
/*diagram thumbnail's buffer*/
GdkPixmap * buffer;
cairo_surface_t *surface;
/*display to navigate*/
DDisplay * ddisp;
......@@ -150,7 +149,7 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp)
Rectangle rect;/*diagram's extents*/
real zoom;/*zoom factor for thumbnail rendering*/
GtkStyle *style;
DiaCairoRenderer *renderer;
memset (nav, 0, sizeof(NavigationWindow));
/*--Retrieve the diagram's data*/
......@@ -234,12 +233,6 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp)
gtk_widget_show (frame);
gtk_widget_show (popup_window);
/*miniframe style*/
nav->gc = gdk_gc_new (gtk_widget_get_window (drawing_area));
gdk_gc_set_line_attributes (nav->gc,
FRAME_THICKNESS,
GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER);
/*cursor*/
if (MIN(nav->frame_h, nav->frame_w) > STD_CURSOR_MIN) {
nav->cursor = gdk_cursor_new (GDK_FLEUR);
......@@ -261,34 +254,18 @@ on_button_navigation_popup_pressed (GtkButton * button, gpointer _ddisp)
nav->cursor,
GDK_CURRENT_TIME);
/*buffer to draw the thumbnail on*/
nav->buffer = gdk_pixmap_new (gtk_widget_get_window (drawing_area),
nav->width, nav->height, -1);
style = gtk_widget_get_style (drawing_area);
gdk_draw_rectangle (nav->buffer,
style->black_gc, TRUE,
0, 0, nav->width, nav->height);
{/*--Render the thumbnail*/
DiaGdkRenderer *renderer;
GdkColor color;
renderer = g_object_new (DIA_TYPE_GDK_RENDERER, NULL);
renderer->transform = dia_transform_new (&rect, &zoom);
renderer->pixmap = nav->buffer;/*render on the thumbnail buffer*/
renderer->gc = gdk_gc_new (nav->buffer);
/*Background color*/
color_convert (&data->bg_color, &color);
gdk_gc_set_foreground (renderer->gc, &color);
gdk_draw_rectangle (renderer->pixmap, renderer->gc, 1, 0, 0, nav->width, nav->height);
/*render the data*/
data_render (data, DIA_RENDERER (renderer), NULL, NULL, NULL);
g_object_ref (renderer->pixmap);
g_object_unref (renderer);
}
/* surface to draw the thumbnail on */
nav->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
nav->width, nav->height);
renderer = g_object_new (g_type_from_name ("DiaCairoRenderer"), NULL);
renderer->scale = zoom;
renderer->surface = cairo_surface_reference (nav->surface);
/*render the data*/
data_render (data, DIA_RENDERER (renderer), NULL, NULL, NULL);
g_object_unref (renderer);
nav->is_first_expose = TRUE;/*set to request to draw the miniframe*/
}
......@@ -313,38 +290,35 @@ reset_sc_adj (GtkAdjustment * adj, gdouble lower, gdouble upper, gdouble page)
static gboolean
on_da_expose_event (GtkWidget * widget, GdkEventExpose * event, gpointer unused)
{
GtkStyle *style = gtk_widget_get_style (widget);
/*refresh the part outdated by the event*/
gdk_draw_drawable (gtk_widget_get_window (widget),
#if GTK_CHECK_VERSION(2,18,0)
style->fg_gc[gtk_widget_get_state (widget)],
#else
style->fg_gc[GTK_WIDGET_STATE (widget)],
#endif
GDK_PIXMAP(nav->buffer),
event->area.x, event->area.y,
event->area.x, event->area.y,
event->area.width, event->area.height);
/*the first time, display the current display's state*/
if(nav->is_first_expose){
GtkAdjustment * adj;
int x, y;
cairo_t *ctx;
GtkAdjustment * adj;
int x, y;
ctx = gdk_cairo_create (gtk_widget_get_window (widget));
cairo_set_line_width (ctx, FRAME_THICKNESS);
cairo_set_line_cap (ctx, CAIRO_LINE_CAP_BUTT);
cairo_set_line_join (ctx, CAIRO_LINE_JOIN_MITER);
adj = nav->ddisp->hsbdata;
x = (adj->value - adj->lower) / (adj->upper - adj->lower) * (nav->width) +1;
/*refresh the part outdated by the event*/
cairo_set_source_surface (ctx, nav->surface,
event->area.x, event->area.y);
cairo_rectangle (ctx, event->area.x, event->area.y,
event->area.width, event->area.height);
cairo_fill (ctx);
adj = nav->ddisp->vsbdata;
y = (adj->value - adj->lower) / (adj->upper - adj->lower) * (nav->height) +1;
adj = nav->ddisp->hsbdata;
x = (adj->value - adj->lower) / (adj->upper - adj->lower) * (nav->width) +1;
/*draw directly on the window, do not buffer the miniframe*/
gdk_draw_rectangle (gtk_widget_get_window (widget),
nav->gc, FALSE,
x, y, nav->frame_w, nav->frame_h);
adj = nav->ddisp->vsbdata;
y = (adj->value - adj->lower) / (adj->upper - adj->lower) * (nav->height) +1;
nav->is_first_expose = FALSE;
}
/*draw directly on the window, do not buffer the miniframe*/
cairo_set_source_rgb (ctx, 0, 0, 0);
cairo_rectangle (ctx, x, y, nav->frame_w, nav->frame_h);
cairo_stroke (ctx);
nav->is_first_expose = FALSE;
return FALSE;
}
......@@ -354,7 +328,6 @@ on_da_motion_notify_event (GtkWidget * drawing_area, GdkEventMotion * event, gpo
{
GtkAdjustment * adj;
gboolean value_changed;
GtkStyle *style;
int w = nav->frame_w;
int h = nav->frame_h;
......@@ -399,22 +372,9 @@ on_da_motion_notify_event (GtkWidget * drawing_area, GdkEventMotion * event, gpo
}
if (value_changed) gtk_adjustment_value_changed(adj);
/* Trigger redraw */
gdk_window_invalidate_rect (gtk_widget_get_window (drawing_area), NULL, TRUE);
/*--Draw the miniframe*/
/*refresh from the buffer*/
style = gtk_widget_get_style (drawing_area);
gdk_draw_drawable (gtk_widget_get_window (drawing_area),
#if GTK_CHECK_VERSION(2,18,0)
style->fg_gc[gtk_widget_get_state (drawing_area)],
#else
style->fg_gc[GTK_WIDGET_STATE (drawing_area)],
#endif
GDK_PIXMAP(nav->buffer),
0, 0, 0, 0, nav->width, nav->height);
/*draw directly on the window, do not buffer the miniframe*/
gdk_draw_rectangle (gtk_widget_get_window (drawing_area),
nav->gc, FALSE,
x, y, w, h);
return FALSE;
}
......@@ -425,14 +385,6 @@ on_da_button_release_event (GtkWidget * widget, GdkEventButton * event, gpointer
/* Apparently there are circumstances where this is run twice for one popup
* Protected calls to avoid crashing on second pass.
*/
if (nav->buffer)
g_object_unref (nav->buffer);
nav->buffer = NULL;
if (nav->gc)
g_object_unref (nav->gc);
nav->gc = NULL;
if (nav->cursor)
gdk_cursor_unref (nav->cursor);
nav->cursor = NULL;
......
......@@ -31,15 +31,6 @@
#include "object.h"
#include "textline.h"
/* There is a variant prepared for GTK+3
* but it seems to be sligly slower than the original version.
*/
#if GTK_CHECK_VERSION(3,0,0)
#define DIA_CAIRO_WITH_PIXMAP 0
#else
#define DIA_CAIRO_WITH_PIXMAP 1
#endif
#define DIA_TYPE_CAIRO_INTERACTIVE_RENDERER (dia_cairo_interactive_renderer_get_type ())
#define DIA_CAIRO_INTERACTIVE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, DiaCairoInteractiveRenderer))
#define DIA_CAIRO_INTERACTIVE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, DiaCairoInteractiveRendererClass))
......@@ -59,12 +50,7 @@ struct _DiaCairoInteractiveRenderer
Rectangle *visible;
real *zoom_factor;
#if DIA_CAIRO_WITH_PIXMAP
GdkPixmap *pixmap; /* The pixmap shown in this display */
GdkGC *gc;
#else
cairo_surface_t *pixmap; /* The pixmap shown in this display */
#endif
guint32 width; /* The width of the pixmap in pixels */
guint32 height; /* The height of the pixmap in pixels */
GdkRegion *clip_region;
......@@ -153,18 +139,14 @@ cairo_interactive_renderer_init (DiaCairoInteractiveRenderer *object, void *p)
static void
cairo_interactive_renderer_finalize (GObject *object)
{
#if !DIA_CAIRO_WITH_PIXMAP
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
#endif
DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (object);
if (base_renderer->cr)
cairo_destroy (base_renderer->cr);
base_renderer->cr = NULL;
#if !DIA_CAIRO_WITH_PIXMAP
if (renderer->pixmap)
cairo_surface_destroy (renderer->pixmap);
#endif
G_OBJECT_CLASS (parent_class)->finalize (object);
}
......@@ -342,11 +324,7 @@ begin_render(DiaRenderer *self, const Rectangle *update)
DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (self);
g_return_if_fail (base_renderer->cr == NULL);
#if DIA_CAIRO_WITH_PIXMAP
base_renderer->cr = gdk_cairo_create(renderer->pixmap);
#else
base_renderer->cr = cairo_create(renderer->pixmap);
#endif
/* Setup clipping for this sequence of render operations */
/* Must be done before the scaling because the clip is in pixel coords */
......@@ -367,14 +345,12 @@ begin_render(DiaRenderer *self, const Rectangle *update)
cairo_set_fill_rule (base_renderer->cr, CAIRO_FILL_RULE_EVEN_ODD);
#if !DIA_CAIRO_WITH_PIXMAP
/* should we set the background color? Or do nothing at all? */
/* if this is drawn you can see 'clipping in action', outside of the clip it gets yellow ;) */
cairo_set_source_rgba (base_renderer->cr, 1.0, 1.0, .8, 1.0);
cairo_set_operator (base_renderer->cr, CAIRO_OPERATOR_OVER);
cairo_rectangle (base_renderer->cr, 0, 0, renderer->width, renderer->height);
cairo_fill (base_renderer->cr);
#endif
}
static void
......@@ -477,38 +453,12 @@ set_size(DiaRenderer *object, gpointer window,
renderer->width = width;
renderer->height = height;
#if DIA_CAIRO_WITH_PIXMAP
if (renderer->pixmap != NULL)
g_object_unref(renderer->pixmap);
/* TODO: we can probably get rid of this extra pixmap and just draw directly
* to what gdk_cairo_create() gives us for the window
*/
renderer->pixmap = gdk_pixmap_new(GDK_WINDOW(window), width, height, -1);
#else
# if GTK_CHECK_VERSION(2,22,0)
renderer->pixmap = gdk_window_create_similar_surface (GDK_WINDOW (window),
CAIRO_CONTENT_COLOR,
width, height);
# else
{
cairo_rectangle_t extents;
extents.x = 0;
extents.y = 0;
extents.width = width;
extents.height = height;
renderer->pixmap = cairo_recording_surface_create(CAIRO_CONTENT_COLOR_ALPHA, &extents);
}
# endif
#endif
CAIRO_CONTENT_COLOR,
width, height);
if (base_renderer->surface != NULL)
cairo_surface_destroy(base_renderer->surface);
#if DIA_CAIRO_WITH_PIXMAP
if (renderer->gc == NULL)
renderer->gc = gdk_gc_new(renderer->pixmap);
#endif
}
static void
......@@ -516,19 +466,6 @@ copy_to_window (DiaRenderer *object, gpointer window,
int x, int y, int width, int height)
{
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
#if DIA_CAIRO_WITH_PIXMAP
static GdkGC *copy_gc = NULL;
if (!copy_gc)
copy_gc = gdk_gc_new(window);
gdk_draw_drawable (GDK_WINDOW(window),
copy_gc,
renderer->pixmap,
x, y,
x, y,
width > 0 ? width : -width, height > 0 ? height : -height);
#else
cairo_t *cr;
cr = gdk_cairo_create (GDK_WINDOW(window));
......@@ -537,7 +474,6 @@ copy_to_window (DiaRenderer *object, gpointer window,
cairo_clip (cr);
cairo_paint (cr);
cairo_destroy (cr);
#endif
}
static void
......@@ -549,9 +485,6 @@ clip_region_clear(DiaRenderer *object)
gdk_region_destroy(renderer->clip_region);
renderer->clip_region = gdk_region_new();
#if DIA_CAIRO_WITH_PIXMAP
gdk_gc_set_clip_region(renderer->gc, renderer->clip_region);
#endif
}
static void
......@@ -576,9 +509,6 @@ clip_region_add_rect(DiaRenderer *object,
clip_rect.height = y2 - y1 + 1;
gdk_region_union_with_rect(renderer->clip_region, &clip_rect);
#if DIA_CAIRO_WITH_PIXMAP
gdk_gc_set_clip_region(renderer->gc, renderer->clip_region);
#endif
}
static void
......@@ -632,18 +562,6 @@ fill_pixel_rect(DiaRenderer *object,
int width, int height,
Color *color)
{
#if DIA_CAIRO_WITH_PIXMAP
/* if we do it with cairo there is something wrong with the clipping? */
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
GdkGC *gc = renderer->gc;
GdkColor gdkcolor;
color_convert(color, &gdkcolor);
gdk_gc_set_foreground(gc, &gdkcolor);
gdk_draw_rectangle (renderer->pixmap, gc, TRUE,
x, y, width, height);
#else
DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object);
double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5;
double lw[2];
......@@ -658,7 +576,6 @@ fill_pixel_rect(DiaRenderer *object,
cairo_set_source_rgba (renderer->cr, color->red, color->green, color->blue, color->alpha);
cairo_rectangle (renderer->cr, x1u, y1u, x2u - x1u, y2u - y1u);
cairo_fill (renderer->cr);
#endif
}
DiaRenderer *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment