#endif
}
return renderer_tiles_new(pr);
-}
+}
static void pixbuf_renderer_init(PixbufRenderer *pr)
pr->renderer2 = NULL;
gtk_widget_set_double_buffered(box, FALSE);
+ gtk_widget_set_app_paintable(box, TRUE);
g_signal_connect_after(G_OBJECT(box), "size_allocate",
G_CALLBACK(pr_size_cb), pr);
pr->func_tile_dispose = func_dispose;
pr->func_tile_data = user_data;
+ pr_stereo_temp_disable(pr, TRUE);
pr_zoom_sync(pr, zoom, PR_ZOOM_FORCE | PR_ZOOM_NEW, 0, 0);
}
static void pr_update_signal(PixbufRenderer *pr)
{
-#if 0
- log_printf("FIXME: send updated signal\n");
-#endif
DEBUG_1("%s pixbuf renderer updated - started drawing %p, img: %dx%d", get_exec_time(), pr, pr->image_width, pr->image_height);
pr->debug_updated = TRUE;
}
gint src_x, src_y;
if (!pr->width || !pr->height) return;
- /*
+ /*
* Update norm_center only if the image is bigger than the window.
* With this condition the stored center survives also a temporary display
* of the "broken image" icon.
{
gdouble old_scale;
gint old_cx, old_cy;
- gboolean clamped;
- gboolean sized;
gboolean center_point = !!(flags & PR_ZOOM_CENTER);
gboolean force = !!(flags & PR_ZOOM_FORCE);
gboolean new = !!(flags & PR_ZOOM_NEW);
PrZoomFlags clamp_flags = flags;
gdouble old_center_x = pr->norm_center_x;
gdouble old_center_y = pr->norm_center_y;
-
+
old_scale = pr->scale;
if (center_point)
{
if (force) clamp_flags |= PR_ZOOM_INVALIDATE;
if (!pr_zoom_clamp(pr, zoom, clamp_flags)) return;
- clamped = pr_size_clamp(pr);
- sized = pr_parent_window_resize(pr, pr->width, pr->height);
+ (void) pr_size_clamp(pr);
+ (void) pr_parent_window_resize(pr, pr->width, pr->height);
if (force && new)
{
}
parent = gtk_widget_get_parent(widget);
-#if GTK_CHECK_VERSION(2,20,0)
if (widget && gtk_widget_get_can_focus(parent))
-#else
- if (widget && GTK_WIDGET_CAN_FOCUS(parent))
-#endif
{
gtk_widget_grab_focus(parent);
}
return TRUE;
}
-#if GTK_CHECK_VERSION(2,20,0)
if (gdk_pointer_is_grabbed() && gtk_widget_has_grab(GTK_WIDGET(pr)))
-#else
- if (gdk_pointer_is_grabbed() && GTK_WIDGET_HAS_GRAB(pr))
-#endif
{
gtk_grab_remove(widget);
gdk_pointer_ungrab(bevent->time);
G_CALLBACK(pr_leave_notify_cb), pr);
gtk_widget_set_events(GTK_WIDGET(pr), GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK |
- GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_SCROLL_MASK |
GDK_LEAVE_NOTIFY_MASK);
g_signal_connect(G_OBJECT(pr), "drag_begin",
{ 0.456, 0.500, 0.176, -0.043, -0.088, -0.002},
{-0.040, -0.038, -0.016, 0.378, 0.734, -0.018},
{-0.015, -0.021, -0.005, -0.072, -0.113, 1.226}
- };
+ };
static void pr_create_anaglyph_dubois(GdkPixbuf *pixbuf, GdkPixbuf *right, gint x, gint y, gint w, gint h)
{
for (j = 0; j < w; j++)
{
double res[3];
- for (k = 0; k < 3; k++)
+ for (k = 0; k < 3; k++)
{
const double *m = pr_dubois_matrix[k];
res[k] = sp[0] * m[0] + sp[1] * m[1] + sp[2] * m[2] + dp[0] * m[3] + dp[1] * m[4] + dp[2] * m[5];
case EXIF_ORIENTATION_LEFT_BOTTOM:
pr->image_width = gdk_pixbuf_get_height(pr->pixbuf);
pr->image_height = gdk_pixbuf_get_width(pr->pixbuf);
- if (pr->stereo_data == STEREO_PIXBUF_SBS)
+ if (pr->stereo_data == STEREO_PIXBUF_SBS)
{
pr->image_height /= 2;
pr->stereo_pixbuf_offset_right = pr->image_height;
}
- else if (pr->stereo_data == STEREO_PIXBUF_CROSS)
+ else if (pr->stereo_data == STEREO_PIXBUF_CROSS)
{
pr->image_height /= 2;
pr->stereo_pixbuf_offset_left = pr->image_height;
default:
pr->image_width = gdk_pixbuf_get_width(pr->pixbuf);
pr->image_height = gdk_pixbuf_get_height(pr->pixbuf);
- if (pr->stereo_data == STEREO_PIXBUF_SBS)
+ if (pr->stereo_data == STEREO_PIXBUF_SBS)
{
pr->image_width /= 2;
pr->stereo_pixbuf_offset_right = pr->image_width;
}
- else if (pr->stereo_data == STEREO_PIXBUF_CROSS)
+ else if (pr->stereo_data == STEREO_PIXBUF_CROSS)
{
pr->image_width /= 2;
pr->stereo_pixbuf_offset_left = pr->image_width;
if (!pr->pixbuf)
{
- GtkWidget *box;
-
/* no pixbuf so just clear the window */
pr->image_width = 0;
pr->image_height = 0;
pr->zoom = zoom; /* don't throw away the zoom value, it is set by pixbuf_renderer_move, among others,
and used for pixbuf_renderer_zoom_get */
- box = GTK_WIDGET(pr);
-
pr->renderer->update_pixbuf(pr->renderer, flags & PR_ZOOM_LAZY);
if (pr->renderer2) pr->renderer2->update_pixbuf(pr->renderer2, flags & PR_ZOOM_LAZY);
return;
}
- if (pr->stereo_mode & PR_STEREO_TEMP_DISABLE)
+ if (pr->stereo_mode & PR_STEREO_TEMP_DISABLE)
{
gint disable = !pr->pixbuf || ! pr->stereo_data;
pr_stereo_temp_disable(pr, disable);
pr->stereo_data = stereo_data;
- if (pr->stereo_mode & PR_STEREO_TEMP_DISABLE)
+ if (pr->stereo_mode & PR_STEREO_TEMP_DISABLE)
{
gint disable = !pr->pixbuf || ! pr->stereo_data;
pr_stereo_temp_disable(pr, disable);
pr->scroll_reset = scroll_reset;
pixbuf_renderer_set_pixbuf(source, NULL, source->zoom);
-// pr_queue_clear(source);
-// pr_tile_free_all(source);
+}
+
+void pixbuf_renderer_copy(PixbufRenderer *pr, PixbufRenderer *source)
+{
+ GObject *object;
+ PixbufRendererScrollResetType scroll_reset;
+
+ g_return_if_fail(IS_PIXBUF_RENDERER(pr));
+ g_return_if_fail(IS_PIXBUF_RENDERER(source));
+
+ if (pr == source) return;
+
+ object = G_OBJECT(pr);
+
+ g_object_set(object, "zoom_min", source->zoom_min, NULL);
+ g_object_set(object, "zoom_max", source->zoom_max, NULL);
+ g_object_set(object, "loading", source->loading, NULL);
+
+ pr->complete = source->complete;
+
+ pr->x_scroll = source->x_scroll;
+ pr->y_scroll = source->y_scroll;
+ pr->x_mouse = source->x_mouse;
+ pr->y_mouse = source->y_mouse;
+
+ scroll_reset = pr->scroll_reset;
+ pr->scroll_reset = PR_SCROLL_RESET_NOCHANGE;
+
+ pr->orientation = source->orientation;
+ pr->stereo_data = source->stereo_data;
+
+ if (source->source_tiles_enabled)
+ {
+ pr->source_tiles_enabled = source->source_tiles_enabled;
+ pr->source_tiles_cache_size = source->source_tiles_cache_size;
+ pr->source_tile_width = source->source_tile_width;
+ pr->source_tile_height = source->source_tile_height;
+ pr->image_width = source->image_width;
+ pr->image_height = source->image_height;
+
+ pr->func_tile_request = source->func_tile_request;
+ pr->func_tile_dispose = source->func_tile_dispose;
+ pr->func_tile_data = source->func_tile_data;
+
+ pr->source_tiles = source->source_tiles;
+ source->source_tiles = NULL;
+
+ pr_zoom_sync(pr, source->zoom, PR_ZOOM_FORCE | PR_ZOOM_NEW, 0, 0);
+ }
+ else
+ {
+ pixbuf_renderer_set_pixbuf(pr, source->pixbuf, source->zoom);
+ }
+
+ pr->scroll_reset = scroll_reset;
}
void pixbuf_renderer_area_changed(PixbufRenderer *pr, gint x, gint y, gint w, gint h)
pr_stereo_set(pr);
- if (redraw)
+ if (redraw)
{
pr_size_sync(pr, pr->window_width, pr->window_height); /* recalculate new viewport */
pr_zoom_sync(pr, pr->zoom, PR_ZOOM_FORCE | PR_ZOOM_NEW, 0, 0);
pr_size_sync(pr, pr->window_width, pr->window_height); /* recalculate new viewport */
}
-gboolean pixbuf_renderer_get_pixel_colors(PixbufRenderer *pr, gint x_pixel, gint y_pixel,
+gboolean pixbuf_renderer_get_pixel_colors(PixbufRenderer *pr, gint x_pixel, gint y_pixel,
gint *r_mouse, gint *g_mouse, gint *b_mouse)
{
GdkPixbuf *pb = pr->pixbuf;
void pixbuf_renderer_set_size_early(PixbufRenderer *pr, guint width, guint height)
{
#if 0
- /* FIXME: this function does not consider the image orientation,
+ /* FIXME: this function does not consider the image orientation,
so it probably only breaks something */
gdouble zoom;
gint w, h;