@@ -148,6 +148,10 @@ struct _EomScrollViewPrivate {
148
148
GdkRGBA * override_bg_color ;
149
149
150
150
cairo_surface_t * background_surface ;
151
+
152
+ /* Two-pass filtering */
153
+ GSource * hq_redraw_timeout_source ;
154
+ gboolean force_unfiltered ;
151
155
};
152
156
153
157
static void scroll_by (EomScrollView * view , int xofs , int yofs );
@@ -1183,6 +1187,45 @@ eom_scroll_view_focus_out_event (GtkWidget *widget,
1183
1187
return FALSE;
1184
1188
}
1185
1189
1190
+ static gboolean _hq_redraw_cb (gpointer user_data )
1191
+ {
1192
+ EomScrollViewPrivate * priv = EOM_SCROLL_VIEW (user_data )-> priv ;
1193
+
1194
+ priv -> force_unfiltered = FALSE;
1195
+ gtk_widget_queue_draw (GTK_WIDGET (priv -> display ));
1196
+
1197
+ priv -> hq_redraw_timeout_source = NULL ;
1198
+ return G_SOURCE_REMOVE ;
1199
+ }
1200
+
1201
+ static void
1202
+ _clear_hq_redraw_timeout (EomScrollView * view )
1203
+ {
1204
+ EomScrollViewPrivate * priv = view -> priv ;
1205
+
1206
+ if (priv -> hq_redraw_timeout_source != NULL ) {
1207
+ g_source_unref (priv -> hq_redraw_timeout_source );
1208
+ g_source_destroy (priv -> hq_redraw_timeout_source );
1209
+ }
1210
+
1211
+ priv -> hq_redraw_timeout_source = NULL ;
1212
+ }
1213
+
1214
+ static void
1215
+ _set_hq_redraw_timeout (EomScrollView * view )
1216
+ {
1217
+ GSource * source ;
1218
+
1219
+ _clear_hq_redraw_timeout (view );
1220
+
1221
+ source = g_timeout_source_new (200 );
1222
+ g_source_set_callback (source , & _hq_redraw_cb , view , NULL );
1223
+
1224
+ g_source_attach (source , NULL );
1225
+
1226
+ view -> priv -> hq_redraw_timeout_source = source ;
1227
+ }
1228
+
1186
1229
static gboolean
1187
1230
display_draw (GtkWidget * widget , cairo_t * cr , gpointer data )
1188
1231
{
@@ -1308,13 +1351,29 @@ display_draw (GtkWidget *widget, cairo_t *cr, gpointer data)
1308
1351
} else
1309
1352
#endif /* HAVE_RSVG */
1310
1353
{
1354
+ cairo_filter_t interp_type ;
1355
+
1356
+ if (!DOUBLE_EQUAL (priv -> zoom , 1.0 ) && priv -> force_unfiltered )
1357
+ {
1358
+ interp_type = CAIRO_FILTER_NEAREST ;
1359
+ _set_hq_redraw_timeout (view );
1360
+ }
1361
+ else
1362
+ {
1363
+ if (is_zoomed_in (view ))
1364
+ interp_type = priv -> interp_type_in ;
1365
+ else
1366
+ interp_type = priv -> interp_type_out ;
1367
+
1368
+ _clear_hq_redraw_timeout (view );
1369
+ priv -> force_unfiltered = TRUE;
1370
+ }
1311
1371
cairo_scale (cr , priv -> zoom , priv -> zoom );
1312
1372
cairo_set_source_surface (cr , priv -> surface , xofs /priv -> zoom , yofs /priv -> zoom );
1313
1373
cairo_pattern_set_extend (cairo_get_source (cr ), CAIRO_EXTEND_PAD );
1314
- if (is_zoomed_in (view ))
1315
- cairo_pattern_set_filter (cairo_get_source (cr ), priv -> interp_type_in );
1316
- else if (is_zoomed_out (view ))
1317
- cairo_pattern_set_filter (cairo_get_source (cr ), priv -> interp_type_out );
1374
+ if (is_zoomed_in (view ) || is_zoomed_out (view ))
1375
+ cairo_pattern_set_filter (cairo_get_source (cr ), interp_type );
1376
+
1318
1377
cairo_paint (cr );
1319
1378
}
1320
1379
@@ -1880,6 +1939,8 @@ eom_scroll_view_dispose (GObject *object)
1880
1939
view = EOM_SCROLL_VIEW (object );
1881
1940
priv = view -> priv ;
1882
1941
1942
+ _clear_hq_redraw_timeout (view );
1943
+
1883
1944
if (priv -> idle_id != 0 ) {
1884
1945
g_source_remove (priv -> idle_id );
1885
1946
priv -> idle_id = 0 ;
0 commit comments