@@ -97,6 +97,9 @@ struct _EomScrollViewPrivate {
97
97
GdkPixbuf * pixbuf ;
98
98
cairo_surface_t * surface ;
99
99
100
+ /* scale factor */
101
+ gint scale ;
102
+
100
103
/* zoom mode, either ZOOM_MODE_FIT or ZOOM_MODE_FREE */
101
104
ZoomMode zoom_mode ;
102
105
@@ -173,16 +176,10 @@ static cairo_surface_t *
173
176
create_surface_from_pixbuf (EomScrollView * view , GdkPixbuf * pixbuf )
174
177
{
175
178
cairo_surface_t * surface ;
176
- cairo_t * cr ;
177
179
178
- surface = gdk_window_create_similar_surface (gtk_widget_get_window (view -> priv -> display ),
179
- CAIRO_CONTENT_COLOR | CAIRO_CONTENT_ALPHA ,
180
- gdk_pixbuf_get_width (pixbuf ),
181
- gdk_pixbuf_get_height (pixbuf ));
182
- cr = cairo_create (surface );
183
- gdk_cairo_set_source_pixbuf (cr , pixbuf , 0 , 0 );
184
- cairo_paint (cr );
185
- cairo_destroy (cr );
180
+ surface = gdk_cairo_surface_create_from_pixbuf (pixbuf ,
181
+ view -> priv -> scale ,
182
+ gtk_widget_get_window (view -> priv -> display ));
186
183
187
184
return surface ;
188
185
}
@@ -230,8 +227,8 @@ compute_scaled_size (EomScrollView *view, double zoom, int *width, int *height)
230
227
priv = view -> priv ;
231
228
232
229
if (priv -> pixbuf ) {
233
- * width = floor (gdk_pixbuf_get_width (priv -> pixbuf ) * zoom + 0.5 );
234
- * height = floor (gdk_pixbuf_get_height (priv -> pixbuf ) * zoom + 0.5 );
230
+ * width = floor (gdk_pixbuf_get_width (priv -> pixbuf ) / priv -> scale * zoom + 0.5 );
231
+ * height = floor (gdk_pixbuf_get_height (priv -> pixbuf ) / priv -> scale * zoom + 0.5 );
235
232
} else
236
233
* width = * height = 0 ;
237
234
}
@@ -689,8 +686,8 @@ set_minimum_zoom_factor (EomScrollView *view)
689
686
{
690
687
g_return_if_fail (EOM_IS_SCROLL_VIEW (view ));
691
688
692
- view -> priv -> min_zoom = MAX (1.0 / gdk_pixbuf_get_width (view -> priv -> pixbuf ),
693
- MAX (1.0 / gdk_pixbuf_get_height (view -> priv -> pixbuf ),
689
+ view -> priv -> min_zoom = MAX (1.0 / gdk_pixbuf_get_width (view -> priv -> pixbuf ) / view -> priv -> scale ,
690
+ MAX (1.0 / gdk_pixbuf_get_height (view -> priv -> pixbuf ) / view -> priv -> scale ,
694
691
MIN_ZOOM_FACTOR ) );
695
692
return ;
696
693
}
@@ -794,8 +791,8 @@ set_zoom_fit (EomScrollView *view)
794
791
gtk_widget_get_allocation (GTK_WIDGET (priv -> display ), & allocation );
795
792
796
793
new_zoom = zoom_fit_scale (allocation .width , allocation .height ,
797
- gdk_pixbuf_get_width (priv -> pixbuf ),
798
- gdk_pixbuf_get_height (priv -> pixbuf ),
794
+ gdk_pixbuf_get_width (priv -> pixbuf ) / priv -> scale ,
795
+ gdk_pixbuf_get_height (priv -> pixbuf ) / priv -> scale ,
799
796
priv -> upscale );
800
797
801
798
if (new_zoom > MAX_ZOOM_FACTOR )
@@ -1276,17 +1273,17 @@ display_draw (GtkWidget *widget, cairo_t *cr, gpointer data)
1276
1273
switch (eom_transform_get_transform_type (transform )) {
1277
1274
case EOM_TRANSFORM_ROT_90 :
1278
1275
case EOM_TRANSFORM_FLIP_HORIZONTAL :
1279
- image_offset_x = (double ) gdk_pixbuf_get_width (priv -> pixbuf );
1276
+ image_offset_x = (double ) gdk_pixbuf_get_width (priv -> pixbuf ) / priv -> scale ;
1280
1277
break ;
1281
1278
case EOM_TRANSFORM_ROT_270 :
1282
1279
case EOM_TRANSFORM_FLIP_VERTICAL :
1283
- image_offset_y = (double ) gdk_pixbuf_get_height (priv -> pixbuf );
1280
+ image_offset_y = (double ) gdk_pixbuf_get_height (priv -> pixbuf ) / priv -> scale ;
1284
1281
break ;
1285
1282
case EOM_TRANSFORM_ROT_180 :
1286
1283
case EOM_TRANSFORM_TRANSPOSE :
1287
1284
case EOM_TRANSFORM_TRANSVERSE :
1288
- image_offset_x = (double ) gdk_pixbuf_get_width (priv -> pixbuf );
1289
- image_offset_y = (double ) gdk_pixbuf_get_height (priv -> pixbuf );
1285
+ image_offset_x = (double ) gdk_pixbuf_get_width (priv -> pixbuf ) / priv -> scale ;
1286
+ image_offset_y = (double ) gdk_pixbuf_get_height (priv -> pixbuf ) / priv -> scale ;
1290
1287
break ;
1291
1288
case EOM_TRANSFORM_NONE :
1292
1289
default :
@@ -1767,6 +1764,7 @@ eom_scroll_view_init (EomScrollView *view)
1767
1764
priv -> display = g_object_new (GTK_TYPE_DRAWING_AREA ,
1768
1765
"can-focus" , TRUE,
1769
1766
NULL );
1767
+ priv -> scale = gtk_widget_get_scale_factor (GTK_WIDGET (priv -> display ));
1770
1768
1771
1769
gtk_widget_add_events (GTK_WIDGET (priv -> display ),
1772
1770
GDK_EXPOSURE_MASK
@@ -2088,8 +2086,8 @@ view_on_drag_begin_cb (GtkWidget *widget,
2088
2086
thumbnail = eom_image_get_thumbnail (image );
2089
2087
2090
2088
if (thumbnail ) {
2091
- width = gdk_pixbuf_get_width (thumbnail );
2092
- height = gdk_pixbuf_get_height (thumbnail );
2089
+ width = gdk_pixbuf_get_width (thumbnail ) / view -> priv -> scale ;
2090
+ height = gdk_pixbuf_get_height (thumbnail ) / view -> priv -> scale ;
2093
2091
gtk_drag_set_icon_pixbuf (context , thumbnail , width /2 , height /2 );
2094
2092
g_object_unref (thumbnail );
2095
2093
}
0 commit comments