From 8bd50152d04f7e0041d8bd871555ef9c3a05bc78 Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Sun, 27 Oct 2019 13:36:35 +0100 Subject: Fix XRay memory problem by no end iddle --- src/display/sp-canvas.cpp | 18 ++++++++++++++---- src/display/sp-canvas.h | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index 216c8437f..8bc0daaa3 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -1003,6 +1003,7 @@ static void sp_canvas_init(SPCanvas *canvas) canvas->_spliter_right = Geom::OptIntRect(); canvas->_spliter_control_pos = Geom::Point(); canvas->_spliter_in_control_pos = Geom::Point(); + canvas->_xray_rect = Geom::OptIntRect(); canvas->_split_value = 0.5; canvas->_split_vertical = true; canvas->_split_inverse = false; @@ -1760,10 +1761,18 @@ int SPCanvas::handle_motion(GtkWidget *widget, GdkEventMotion *event) } canvas->_xray = true; if (canvas->_xray_orig[Geom::X] != Geom::infinity()) { + if (canvas->_xray_rect) { + canvas->dirtyRect(*canvas->_xray_rect); + canvas->_xray_rect = Geom::OptIntRect(); + } canvas->addIdle(); } status = 1; } else { + if (canvas->_xray_rect) { + canvas->dirtyRect(*canvas->_xray_rect); + canvas->_xray_rect = Geom::OptIntRect(); + } canvas->_xray = false; } canvas->_state = event->state; @@ -1928,7 +1937,7 @@ void SPCanvas::paintXRayBuffer(Geom::IntRect const &paint_rect, Geom::IntRect co cairo_set_operator(buf.ct, CAIRO_OPERATOR_SOURCE); cairo_paint(buf.ct); cairo_translate(buf.ct, paint_rect.left(), paint_rect.top()); - // cairo_surface_write_to_png( copy_backing, "debug1.png" ); + // cairo_surface_write_to_png( copy_backing, "debug1.png" ); @@ -1948,15 +1957,16 @@ void SPCanvas::paintXRayBuffer(Geom::IntRect const &paint_rect, Geom::IntRect co cairo_set_source_surface(result, copy_backing, paint_rect.left(), paint_rect.top()); cairo_set_operator(buf.ct, CAIRO_OPERATOR_IN); cairo_paint(result); - cairo_destroy(buf.ct); - cairo_surface_destroy(copy_backing); + cairo_destroy(buf.ct); + cairo_destroy(result); + // cairo_surface_write_to_png( _backing_store, "debug3.png" ); cairo_surface_mark_dirty(_backing_store); // Mark the painted rectangle un-clean to remove old x-ray when mouse change position + _xray_rect = paint_rect; gtk_widget_queue_draw_area(GTK_WIDGET(this), paint_rect.left() - _x0, paint_rect.top() - _y0, paint_rect.width(), paint_rect.height()); - dirtyRect(paint_rect); } void SPCanvas::paintSpliter() diff --git a/src/display/sp-canvas.h b/src/display/sp-canvas.h index 48a404b43..2d64534db 100644 --- a/src/display/sp-canvas.h +++ b/src/display/sp-canvas.h @@ -186,6 +186,7 @@ public: Geom::OptIntRect _spliter_bottom; Geom::OptIntRect _spliter_left; Geom::OptIntRect _spliter_right; + Geom::OptIntRect _xray_rect; Geom::Point _spliter_control_pos; Geom::Point _spliter_in_control_pos; Geom::Point _xray_orig; -- cgit v1.2.3