summaryrefslogtreecommitdiffstats
path: root/src/display/sp-canvas.cpp
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2019-07-27 23:01:20 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2019-07-28 08:55:03 +0000
commitc95148c6586247aecc863d1e7847d4a75d676189 (patch)
tree64256051494df2298b94273f7a69b9466175261d /src/display/sp-canvas.cpp
parentMerge branch 'master' of gitlab.com:asiersarasua/inkscape (diff)
downloadinkscape-c95148c6586247aecc863d1e7847d4a75d676189.tar.gz
inkscape-c95148c6586247aecc863d1e7847d4a75d676189.zip
Add verbs update checkbuttons in menu. Also do improvements requested in https://gitlab.com/inkscape/inkscape/issues/323 and improve XRay rendering
Diffstat (limited to 'src/display/sp-canvas.cpp')
-rw-r--r--src/display/sp-canvas.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp
index f77e6f31d..64fca5926 100644
--- a/src/display/sp-canvas.cpp
+++ b/src/display/sp-canvas.cpp
@@ -1743,17 +1743,14 @@ int SPCanvas::handle_motion(GtkWidget *widget, GdkEventMotion *event)
status = 1;
} else {
if (desktop && desktop->event_context && desktop->xrayMode()) {
- if (!canvas->_xray) {
+ if (canvas->_xray) {
sp_reset_spliter(canvas);
}
Geom::Point prev_orig = canvas->_xray_orig;
- canvas->_xray_orig = desktop->point();
+ canvas->_xray_orig = desktop->point(true);
canvas->_xray_orig *= desktop->current_zoom();
canvas->_xray = true;
- if (!Geom::are_near(prev_orig, canvas->_xray_orig)) { //to avoid redraw when outside
- canvas->dirtyAll();
- canvas->addIdle();
- }
+ canvas->addIdle();
status = 1;
} else {
canvas->_xray = false;
@@ -1888,6 +1885,9 @@ void SPCanvas::paintXRayBuffer(Geom::IntRect const &paint_rect, Geom::IntRect co
// initialized.
if (_backing_store == nullptr)
return;
+ if (!canvas_rect.contains(paint_rect) && !canvas_rect.intersects(paint_rect)) {
+ return;
+ }
Geom::IntRect rect_moved = Geom::IntRect::from_xywh(_x0, _y0, _x0 + paint_rect.width(), _y0 + paint_rect.height());
SPCanvasBuf buf;
buf.buf = nullptr;
@@ -1943,6 +1943,7 @@ void SPCanvas::paintXRayBuffer(Geom::IntRect const &paint_rect, Geom::IntRect co
// Mark the painted rectangle un-clean to remove old x-ray when mouse change position
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()
@@ -2424,6 +2425,7 @@ int SPCanvas::paint()
cairo_region_get_rectangle(to_draw, i, &crect);
if (!paintRect(crect.x, crect.y, crect.x + crect.width, crect.y + crect.height)) {
// Aborted
+ cairo_region_subtract_rectangle(_clean_region, &crect);
cairo_region_destroy(to_draw);
cairo_region_destroy(to_draw_outline);
return FALSE;
@@ -2442,6 +2444,7 @@ int SPCanvas::paint()
// Aborted
arena->drawing.setExact(exact);
arena->drawing.setRenderMode(rm);
+ cairo_region_subtract_rectangle(_clean_region, &crect);
cairo_region_destroy(to_draw);
cairo_region_destroy(to_draw_outline);
return FALSE;
@@ -2459,7 +2462,7 @@ int SPCanvas::paint()
arena->drawing.setExact(false);
Geom::IntRect canvas_rect = Geom::IntRect::from_xywh(_x0, _y0, allocation.width, allocation.height);
Geom::IntRect _xray_rect = Geom::IntRect::from_xywh(_xray_orig[0] - _xray_radius, _xray_orig[1] - _xray_radius,
- (_xray_radius * 2), (_xray_radius * 2));
+ (_xray_radius * 2), (_xray_radius * 2));
paintXRayBuffer(_xray_rect, canvas_rect);
arena->drawing.setExact(exact);
arena->drawing.setRenderMode(rm);