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)) || \
{
PixbufRenderer *pr = rt->pr;
- rt->x_scroll = (rt->stereo_mode & PR_STEREO_MIRROR) ?
- pr->width - pr->vis_width - pr->x_scroll
+ rt->x_scroll = (rt->stereo_mode & PR_STEREO_MIRROR) ?
+ pr->width - pr->vis_width - pr->x_scroll
: pr->x_scroll;
- rt->y_scroll = (rt->stereo_mode & PR_STEREO_FLIP) ?
- pr->height - pr->vis_height - pr->y_scroll
+ rt->y_scroll = (rt->stereo_mode & PR_STEREO_FLIP) ?
+ pr->height - pr->vis_height - pr->y_scroll
: pr->y_scroll;
}
ImageTile *it)
{
PixbufRenderer *pr = rt->pr;
- GtkWidget *box;
GList *work;
- box = GTK_WIDGET(pr);
-
work = rt->overlay_list;
while (work)
{
gint srs, drs;
guchar *s_pix, *d_pix;
guchar *sp, *dp;
- guchar *spi, *dpi;
+ guchar *dpi;
gint i, j;
gint tw = rt->tile_width;
gint th = rt->tile_height;
srs = gdk_pixbuf_get_rowstride(src);
s_pix = gdk_pixbuf_get_pixels(src);
- spi = s_pix + (x * COLOR_BYTES);
dest = rt_get_spare_tile(rt);
drs = gdk_pixbuf_get_rowstride(dest);
gboolean new_data, gboolean fast)
{
PixbufRenderer *pr = rt->pr;
- GtkWidget *box;
GList *list;
GList *work;
gboolean draw = FALSE;
- box = GTK_WIDGET(pr);
-
if (pr->zoom == 1.0 || pr->scale == 1.0)
{
list = pr_source_tile_compute_region(pr, it->x + x, it->y + y, w, h, TRUE);
return draw;
}
-static void rt_tile_get_region(gboolean has_alpha,
+static void rt_tile_get_region(gboolean has_alpha,
const GdkPixbuf *src, GdkPixbuf *dest,
int pb_x, int pb_y, int pb_w, int pb_h,
double offset_x, double offset_y, double scale_x, double scale_y,
pb_w, pb_h,
dest,
pb_x, pb_y);
- }
+ }
else
{
- gdk_pixbuf_scale(src, dest,
+ gdk_pixbuf_scale(src, dest,
pb_x, pb_y, pb_w, pb_h,
offset_x,
offset_y,
}
else
{
- gdk_pixbuf_composite_color(src, dest,
+ gdk_pixbuf_composite_color(src, dest,
pb_x, pb_y, pb_w, pb_h,
offset_x,
offset_y,
gboolean new_data, gboolean fast)
{
PixbufRenderer *pr = rt->pr;
- GtkWidget *box;
gboolean has_alpha;
gboolean draw = FALSE;
gint orientation = rt_get_orientation(rt);
rt_tile_prepare(rt, it);
has_alpha = (pr->pixbuf && gdk_pixbuf_get_has_alpha(pr->pixbuf));
- box = GTK_WIDGET(pr);
-
/* FIXME checker colors for alpha should be configurable,
* also should be drawn for blank = TRUE
*/
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)
{
else if ((pr->zoom == 1.0 || pr->scale == 1.0) &&
pr->aspect_ratio == 1.0 &&
!has_alpha &&
- orientation == EXIF_ORIENTATION_TOP_LEFT &&
+ orientation == EXIF_ORIENTATION_TOP_LEFT &&
!(pr->func_post_process && !(pr->post_process_slow && fast)) &&
!(rt->stereo_mode & PR_STEREO_ANAGLYPH))
{
scale_x, scale_y,
(fast) ? GDK_INTERP_NEAREST : pr->zoom_quality,
it->x + pb_x, it->y + pb_y);
- if (rt->stereo_mode & PR_STEREO_ANAGLYPH &&
+ if (rt->stereo_mode & PR_STEREO_ANAGLYPH &&
(pr->stereo_pixbuf_offset_right > 0 || pr->stereo_pixbuf_offset_left > 0))
{
GdkPixbuf *right_pb = rt_get_spare_tile(rt);
}
if (it->x + x + w > rt->x_scroll + pr->vis_width)
{
- w = rt->x_scroll + pr->vis_width - it->x - x;
+ w = rt->x_scroll + pr->vis_width - it->x - x;
}
if (w < 1) return;
if (it->y + y < rt->y_scroll)
}
if (it->y + y + h > rt->y_scroll + pr->vis_height)
{
- h = rt->y_scroll + pr->vis_height - it->y - y;
+ h = rt->y_scroll + pr->vis_height - it->y - y;
}
if (h < 1) return;
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,
{
gint area = 0;
- while (work)
+ while (work)
{
QueueData *qd = work->data;
area += qd->w * qd->h;
if (!pr->loading)
{
- /* 2pass prio */
+ /* 2pass prio */
DEBUG_2("redraw priority: 2pass");
rt->draw_idle_id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, rt_queue_draw_idle_cb, rt, NULL);
return FALSE;
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))
{
rt_sync_scroll(rt);
if (rt->stereo_mode & PR_STEREO_MIRROR) x_off = -x_off;
- if (rt->stereo_mode & PR_STEREO_FLIP) y_off = -y_off;
+ if (rt->stereo_mode & PR_STEREO_FLIP) y_off = -y_off;
gint w = pr->vis_width - abs(x_off);
gint h = pr->vis_height - abs(y_off);
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;
rt->stereo_off_x = 0;
rt->stereo_off_y = 0;
- if (rt->stereo_mode & PR_STEREO_RIGHT)
+ if (rt->stereo_mode & PR_STEREO_RIGHT)
{
- if (rt->stereo_mode & PR_STEREO_HORIZ)
+ if (rt->stereo_mode & PR_STEREO_HORIZ)
{
rt->stereo_off_x = rt->pr->viewport_width;
}
- else if (rt->stereo_mode & PR_STEREO_VERT)
+ else if (rt->stereo_mode & PR_STEREO_VERT)
{
rt->stereo_off_y = rt->pr->viewport_height;
}
- else if (rt->stereo_mode & PR_STEREO_FIXED)
+ else if (rt->stereo_mode & PR_STEREO_FIXED)
{
rt->stereo_off_x = rt->pr->stereo_fixed_x_right;
rt->stereo_off_y = rt->pr->stereo_fixed_y_right;
}
else
{
- if (rt->stereo_mode & PR_STEREO_FIXED)
+ if (rt->stereo_mode & PR_STEREO_FIXED)
{
rt->stereo_off_x = rt->pr->stereo_fixed_x_left;
rt->stereo_off_y = rt->pr->stereo_fixed_y_left;
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;
}