static void rt_hierarchy_changed_cb(GtkWidget *widget, GtkWidget *previous_toplevel, gpointer data);
static gint rt_queue_draw_idle_cb(gpointer data);
-static void renderer_redraw(void *renderer, gint x, gint y, gint w, gint h,
- gint clamp, ImageRenderType render, gboolean new_data, gboolean only_existing);
#define GET_RIGHT_PIXBUF_OFFSET(rt) \
(( (rt->stereo_mode & PR_STEREO_RIGHT) && !(rt->stereo_mode & PR_STEREO_SWAP)) || \
cairo_rectangle (cr, rx - px, ry - py, rw, rh);
cairo_fill (cr);
cairo_destroy (cr);
-
-#if 0
-
-
-#if GTK_CHECK_VERSION(2,20,0)
- gdk_draw_drawable(rt->overlay_buffer, box->style->fg_gc[gtk_widget_get_state(box)],
-#else
- gdk_draw_drawable(rt->overlay_buffer, box->style->fg_gc[GTK_WIDGET_STATE(box)],
-#endif
- it->pixmap,
- rx - (pr->x_offset + (it->x - rt->x_scroll)),
- ry - (pr->y_offset + (it->y - rt->y_scroll)),
- 0, 0, rw, rh);
- gdk_draw_pixbuf(rt->overlay_buffer,
-#if GTK_CHECK_VERSION(2,20,0)
- box->style->fg_gc[gtk_widget_get_state(box)],
-#else
- box->style->fg_gc[GTK_WIDGET_STATE(box)],
-#endif
- od->pixbuf,
- rx - px, ry - py,
- 0, 0, rw, rh,
- pr->dither_quality, rx, ry);
-#if GTK_CHECK_VERSION(2,20,0)
- gdk_draw_drawable(od->window, box->style->fg_gc[gtk_widget_get_state(box)],
-#else
- gdk_draw_drawable(od->window, box->style->fg_gc[GTK_WIDGET_STATE(box)],
-#endif
- rt->overlay_buffer,
- 0, 0,
- rx - px, ry - py, rw, rh);
-#endif
}
else
{
cairo_rectangle (cr, sx - px, sy - py, sw, sh);
cairo_fill(cr);
cairo_destroy(cr);
-
-#if 0
- gdk_draw_rectangle(rt->overlay_buffer,
-#if GTK_CHECK_VERSION(2,20,0)
- box->style->bg_gc[gtk_widget_get_state(box)], TRUE,
-#else
- box->style->bg_gc[GTK_WIDGET_STATE(box)], TRUE,
-#endif
- 0, 0, sw, sh);
- gdk_draw_pixbuf(rt->overlay_buffer,
-#if GTK_CHECK_VERSION(2,20,0)
- box->style->fg_gc[gtk_widget_get_state(box)],
-#else
- box->style->fg_gc[GTK_WIDGET_STATE(box)],
-#endif
- od->pixbuf,
- sx - px, sy - py,
- 0, 0, sw, sh,
- pr->dither_quality, sx, sy);
-#if GTK_CHECK_VERSION(2,20,0)
- gdk_draw_drawable(od->window, box->style->fg_gc[gtk_widget_get_state(box)],
-#else
- gdk_draw_drawable(od->window, box->style->fg_gc[GTK_WIDGET_STATE(box)],
-#endif
- rt->overlay_buffer,
- 0, 0,
- sx - px, sy - py, sw, sh);
-#endif
}
}
}
}
-gint renderer_tiles_overlay_add(RendererTiles *rt, GdkPixbuf *pixbuf, gint x, gint y,
+gint renderer_tiles_overlay_add(void *renderer, GdkPixbuf *pixbuf, gint x, gint y,
OverlayRendererFlags flags)
{
+ RendererTiles *rt = (RendererTiles *) renderer;
PixbufRenderer *pr = rt->pr;
OverlayData *od;
gint id;
}
}
-void renderer_tiles_overlay_set(RendererTiles *rt, gint id, GdkPixbuf *pixbuf, gint x, gint y)
+void renderer_tiles_overlay_set(void *renderer, gint id, GdkPixbuf *pixbuf, gint x, gint y)
{
+ RendererTiles *rt = (RendererTiles *) renderer;
PixbufRenderer *pr = rt->pr;
OverlayData *od;
}
}
-gboolean renderer_tiles_overlay_get(RendererTiles *rt, gint id, GdkPixbuf **pixbuf, gint *x, gint *y)
+gboolean renderer_tiles_overlay_get(void *renderer, gint id, GdkPixbuf **pixbuf, gint *x, gint *y)
{
+ RendererTiles *rt = (RendererTiles *) renderer;
PixbufRenderer *pr = rt->pr;
OverlayData *od;
{
cairo_t *cr;
cr = cairo_create(it->surface);
- cairo_rectangle (cr, rx - st->x, ry - st->y, rw, rh);
+ cairo_rectangle (cr, rx - it->x, ry - it->y, rw, rh);
if (st->blank)
{
cairo_set_source_rgb(cr, 0, 0, 0);
-#if 0
- gdk_draw_rectangle(it->pixmap, box->style->black_gc, TRUE,
- rx - st->x, ry - st->y, rw, rh);
-#endif
}
else /* (pr->zoom == 1.0 || pr->scale == 1.0) */
{
- gdk_cairo_set_source_pixbuf(cr, st->pixbuf, it->x + st->x, it->y + st->y);
-#if 0
- gdk_draw_pixbuf(it->pixmap,
-#if GTK_CHECK_VERSION(2,20,0)
- box->style->fg_gc[gtk_widget_get_state(box)],
-#else
- box->style->fg_gc[GTK_WIDGET_STATE(box)],
-#endif
- st->pixbuf,
- rx - st->x, ry - st->y,
- rx - it->x, ry - it->y,
- rw, rh,
- pr->dither_quality, rx, ry);
-#endif
+ gdk_cairo_set_source_pixbuf(cr, st->pixbuf, -it->x + st->x, -it->y + st->y);
}
cairo_fill (cr);
cairo_destroy (cr);
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_fill (cr);
cairo_destroy (cr);
-#if 0
- gdk_draw_rectangle(it->pixmap, box->style->black_gc, TRUE,
- rx - st->x, ry - st->y, rw, rh);
-#endif
}
else
{
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_fill (cr);
cairo_destroy (cr);
-#if 0
- gdk_draw_rectangle(it->pixmap, box->style->black_gc, TRUE,
- 0, 0, it->w, it->h);
-#endif
}
else if (pr->source_tiles_enabled)
{
gdk_cairo_set_source_pixbuf(cr, pr->pixbuf, -it->x - GET_RIGHT_PIXBUF_OFFSET(rt), -it->y);
cairo_fill (cr);
cairo_destroy (cr);
-
-#if 0
- gdk_draw_pixbuf(it->pixmap,
-#if GTK_CHECK_VERSION(2,20,0)
- box->style->fg_gc[gtk_widget_get_state(box)],
-#else
- box->style->fg_gc[GTK_WIDGET_STATE(box)],
-#endif
- pr->pixbuf,
- it->x + x + GET_RIGHT_PIXBUF_OFFSET(rt), it->y + y,
- x, y,
- w, h,
- pr->dither_quality, it->x + x, it->y + y);
-#endif
}
else
{
gdk_cairo_set_source_pixbuf(cr, it->pixbuf, 0, 0);
cairo_fill (cr);
cairo_destroy (cr);
-#if 0
- gdk_draw_pixbuf(it->pixmap,
-#if GTK_CHECK_VERSION(2,20,0)
- box->style->fg_gc[gtk_widget_get_state(box)],
-#else
- box->style->fg_gc[GTK_WIDGET_STATE(box)],
-#endif
- it->pixbuf,
- x, y,
- x, y,
- w, h,
- pr->dither_quality, it->x + x, it->y + y);
-#endif
}
-
-#if 0
- /* enable this line for debugging the edges of tiles */
- gdk_draw_rectangle(it->pixmap, box->style->white_gc,
- FALSE, 0, 0, it->w, it->h);
- gdk_draw_rectangle(it->pixmap, box->style->white_gc,
- FALSE, x, y, w, h);
-#endif
}
cairo_fill (cr);
cairo_destroy (cr);
-#if 0
-#if GTK_CHECK_VERSION(2,20,0)
- gdk_draw_drawable(window, box->style->fg_gc[gtk_widget_get_state(box)],
-#else
- gdk_draw_drawable(window, box->style->fg_gc[GTK_WIDGET_STATE(box)],
-#endif
- it->pixmap, x, y,
- pr->x_offset + (it->x - rt->x_scroll) + x + rt->stereo_off_x, pr->y_offset + (it->y - rt->y_scroll) + y + rt->stereo_off_y, w, h);
-#endif
-
if (rt->overlay_list)
{
rt_overlay_draw(rt, pr->x_offset + (it->x - rt->x_scroll) + x,
fast = FALSE;
}
-#if GTK_CHECK_VERSION(2,20,0)
- if (gtk_widget_get_realized(pr))
-#else
- if (GTK_WIDGET_REALIZED(pr))
-#endif
+ if (gtk_widget_get_realized(GTK_WIDGET(pr)))
{
if (rt_tile_is_visible(rt, qd->it))
{
}
}
-static void rt_scroll(RendererTiles *rt, gint x_off, gint y_off)
+static void rt_scroll(void *renderer, gint x_off, gint y_off)
{
+ RendererTiles *rt = (RendererTiles *) renderer;
PixbufRenderer *pr = rt->pr;
rt_sync_scroll(rt);
gint x2, y2;
GtkWidget *box;
GdkWindow *window;
-// GdkGC *gc;
- GdkEvent *event;
cairo_t *cr;
cairo_surface_t *surface;
cairo_pop_group_to_source(cr);
cairo_paint(cr);
cairo_destroy(cr);
-#if 0
- gc = gdk_gc_new(window);
- gdk_gc_set_exposures(gc, TRUE);
- gdk_draw_drawable(window, gc,
- window,
- x2 + pr->x_offset + rt->stereo_off_x, y2 + pr->y_offset + rt->stereo_off_y,
- x1 + pr->x_offset + rt->stereo_off_x, y1 + pr->y_offset + rt->stereo_off_y, w, h);
- g_object_unref(gc);
-#endif
rt_overlay_queue_all(rt, x2, y2, x1, y1);
rt->x_scroll, y_off > 0 ? rt->y_scroll + (pr->vis_height - h) : rt->y_scroll,
pr->vis_width, h, TRUE, TILE_RENDER_ALL, FALSE, FALSE);
}
-
- /* process exposures here, "expose_event" seems to miss a few with obstructed windows */
-#if ! GTK_CHECK_VERSION(2,18,0)
- while ((event = gdk_event_get_graphics_expose(window)) != NULL)
- {
- renderer_redraw((void *) rt, event->expose.area.x, event->expose.area.y, event->expose.area.width, event->expose.area.height,
- FALSE, TILE_RENDER_ALL, FALSE, FALSE);
-
- if (event->expose.count == 0)
- {
- gdk_event_free(event);
- break;
- }
- gdk_event_free(event);
- }
-#endif
}
}
rt_queue(rt, x1, y1, x2 - x1, y2 - y1, FALSE, TILE_RENDER_AREA, TRUE, TRUE);
}
-static void renderer_redraw(void *renderer, gint x, gint y, gint w, gint h,
+static void renderer_redraw(RendererTiles *rt, gint x, gint y, gint w, gint h,
gint clamp, ImageRenderType render, gboolean new_data, gboolean only_existing)
{
- RendererTiles *rt = (RendererTiles *)renderer;
PixbufRenderer *pr = rt->pr;
x -= rt->stereo_off_x;
clamp, render, new_data, only_existing);
}
-static void renderer_queue_clear(void *renderer)
+static void renderer_update_pixbuf(void *renderer, gboolean lazy)
{
rt_queue_clear((RendererTiles *)renderer);
}
-static void renderer_border_clear(void *renderer)
+static void renderer_update_zoom(void *renderer, gboolean lazy)
{
- rt_border_clear((RendererTiles *)renderer);
-}
-
+ RendererTiles *rt = (RendererTiles *)renderer;
+ PixbufRenderer *pr = rt->pr;
-static void renderer_invalidate_all(void *renderer)
-{
rt_tile_invalidate_all((RendererTiles *)renderer);
+ if (!lazy)
+ {
+ renderer_redraw(renderer, 0, 0, pr->width, pr->height, TRUE, TILE_RENDER_ALL, TRUE, FALSE);
+ }
+ rt_border_clear(rt);
}
static void renderer_invalidate_region(void *renderer, gint x, gint y, gint w, gint h)
rt_tile_invalidate_region((RendererTiles *)renderer, x, y, w, h);
}
-static void renderer_overlay_draw(void *renderer, gint x, gint y, gint w, gint h)
-{
- rt_overlay_draw((RendererTiles *)renderer, x, y, w, h, NULL);
-}
-
-static void renderer_update_sizes(void *renderer)
+static void renderer_update_viewport(void *renderer)
{
RendererTiles *rt = (RendererTiles *)renderer;
DEBUG_1("update size: %p %d %d %d %d", rt, rt->stereo_off_x, rt->stereo_off_y, rt->pr->viewport_width, rt->pr->viewport_height);
rt_sync_scroll(rt);
rt_overlay_update_sizes(rt);
+ rt_border_clear(rt);
}
static void renderer_stereo_set(void *renderer, gint stereo_mode)
g_free(rt);
}
+#if GTK_CHECK_VERSION(3,0,0)
+
+static gboolean rt_draw_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
+{
+ RendererTiles *rt = (RendererTiles *)data;
+ if (gtk_widget_is_drawable(widget))
+ {
+ if (gtk_widget_get_has_window(widget))
+ {
+ GdkRectangle area;
+ if (gdk_cairo_get_clip_rectangle(cr, &area))
+ {
+ renderer_redraw(rt, area.x, area.y, area.width, area.height,
+ FALSE, TILE_RENDER_ALL, FALSE, FALSE);
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+#else
+static gboolean rt_expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
+{
+ RendererTiles *rt = (RendererTiles *)data;
+ if (gtk_widget_is_drawable(widget))
+ {
+ if (gtk_widget_get_has_window(widget))
+ {
+ if (event->window != gtk_widget_get_window(widget))
+ {
+ GdkRectangle area;
+
+ gdk_window_get_position(event->window, &area.x, &area.y);
+ area.x += event->area.x;
+ area.y += event->area.y;
+ area.width = event->area.width;
+ area.height = event->area.height;
+ renderer_redraw(rt, area.x, area.y, area.width, area.height,
+ FALSE, TILE_RENDER_ALL, FALSE, FALSE);
+
+ }
+ else
+ {
+ renderer_redraw(rt, event->area.x, event->area.y, event->area.width, event->area.height,
+ FALSE, TILE_RENDER_ALL, FALSE, FALSE);
+ }
+ }
+ }
+
+ return FALSE;
+}
+#endif
+
+
RendererFuncs *renderer_tiles_new(PixbufRenderer *pr)
{
RendererTiles *rt = g_new0(RendererTiles, 1);
rt->pr = pr;
- rt->f.redraw = renderer_redraw;
rt->f.area_changed = renderer_area_changed;
- rt->f.queue_clear = renderer_queue_clear;
- rt->f.border_clear = renderer_border_clear;
+ rt->f.update_pixbuf = renderer_update_pixbuf;
rt->f.free = renderer_free;
- rt->f.invalidate_all = renderer_invalidate_all;
+ rt->f.update_zoom = renderer_update_zoom;
rt->f.invalidate_region = renderer_invalidate_region;
rt->f.scroll = rt_scroll;
- rt->f.update_sizes = renderer_update_sizes;
+ rt->f.update_viewport = renderer_update_viewport;
rt->f.overlay_add = renderer_tiles_overlay_add;
rt->f.overlay_set = renderer_tiles_overlay_set;
rt->f.overlay_get = renderer_tiles_overlay_get;
- rt->f.overlay_draw = renderer_overlay_draw;
rt->f.stereo_set = renderer_stereo_set;
g_signal_connect(G_OBJECT(pr), "hierarchy-changed",
G_CALLBACK(rt_hierarchy_changed_cb), rt);
+#if GTK_CHECK_VERSION(3,0,0)
+ g_signal_connect(G_OBJECT(pr), "draw",
+ G_CALLBACK(rt_draw_cb), rt);
+#else
+ g_signal_connect(G_OBJECT(pr), "expose_event",
+ G_CALLBACK(rt_expose_cb), rt);
+#endif
return (RendererFuncs *) rt;
}