diff options
Diffstat (limited to 'src/display/sp-canvas.cpp')
| -rw-r--r-- | src/display/sp-canvas.cpp | 291 |
1 files changed, 1 insertions, 290 deletions
diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index 61602e880..f27038593 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -33,11 +33,6 @@ #include "display/sp-canvas-group.h" #include "display/rendermode.h" #include "display/cairo-utils.h" -#include "display/cairo-templates.h" -#include "display/drawing-context.h" -#include "display/drawing-item.h" -#include "display/nr-filter-colormatrix.h" -#include "display/canvas-arena.h" #include "preferences.h" #include "inkscape.h" #include "sodipodi-ctrlrect.h" @@ -45,8 +40,6 @@ #include "debug/gdk-event-latency-tracker.h" #include "desktop.h" #include "color.h" -#include <iomanip> -#include <glibmm/i18n.h> #if GTK_CHECK_VERSION(3,20,0) # include <gdkmm/seat.h> @@ -1924,19 +1917,6 @@ SPCanvasGroup *SPCanvas::getRoot() return SP_CANVAS_GROUP(_root); } -gdouble grayscale_value_matrix[20] = { - 0.21, 0.72, 0.072, 0, 0, - 0.21, 0.72, 0.072, 0, 0, - 0.21, 0.72, 0.072, 0, 0, - 0 , 0 , 0 , 1, 0 - }; -cairo_surface_t *surface_rotated; -cairo_surface_t *surface_origin; -cairo_surface_t *surface_measure; -double start_angle = 0; -bool started = false; -bool rotated = false; - /** * Scroll screen to point 'c'. 'c' is measured in screen pixels. */ @@ -1965,14 +1945,10 @@ void SPCanvas::scrollTo( Geom::Point const &c, unsigned int clear, bool is_scrol cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); // Paint the background cairo_translate(cr, -ix, -iy); - if (rotated) { - cairo_translate(cr, dx, dy); - rotated = false; - } cairo_set_source(cr, _background); cairo_paint(cr); + // Copy the old backing store contents - cairo_set_source_surface(cr, _backing_store, _x0, _y0); cairo_rectangle(cr, _x0, _y0, allocation.width, allocation.height); cairo_clip(cr); @@ -2009,271 +1985,6 @@ void SPCanvas::scrollTo( Geom::Point const &c, unsigned int clear, bool is_scrol addIdle(); } -void SPCanvas::startRotateTo(double angle) -{ - if (!_backing_store || started) { - return; - } - start_angle = angle; - started = true; - GtkAllocation allocation; - gtk_widget_get_allocation(&_widget, &allocation); - int half_w = allocation.width/2; - int half_h = allocation.height/2; - int half_min = std::min(half_w,half_h); - - cairo_surface_t *new_backing_store = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, allocation.width, allocation.height); - cairo_t *cr = cairo_create(new_backing_store); - cairo_arc(cr, half_w, half_h, half_min-15, 0, 2*M_PI); - cairo_fill(cr); - cairo_set_operator(cr, CAIRO_OPERATOR_IN); - cairo_set_source_surface(cr, _backing_store, 0, 0); - cairo_paint(cr); - cairo_set_operator(cr, CAIRO_OPERATOR_OVER); - cairo_arc(cr, half_w, half_h, half_min-16, 0, 2*M_PI); - cairo_set_source_rgba (cr, 1, 1, 1, 0.5); - cairo_stroke(cr); - cairo_destroy(cr); - surface_rotated = new_backing_store; - - cairo_surface_t *new_backing_store_measure = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, allocation.width, allocation.height); - cr = cairo_create(new_backing_store_measure); - cairo_arc(cr, half_w, half_h, half_min-15, 0, 2*M_PI); - cairo_set_source_rgba (cr, 1, 1, 1, 0.2); - cairo_fill(cr); - cairo_translate(cr, half_w, half_h); - cairo_select_font_face(cr, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size(cr, 10.0); - for (gint x = 0; x < 360 ; x++){ - gint ang = 360 - x ;//+ 90; - if (ang > 180) { - ang -= 360; - } - double rot = (-180.0 + x)*(M_PI/180.); - double dist = half_min-9; - gint inverse = 1; - if((x) < 91 || (x) > 270) { - inverse = -1; - } - if(x%10 == 0) { - cairo_rotate(cr, -rot); - cairo_text_extents_t extents; - std::string s = std::to_string(ang) + "º"; - cairo_text_extents(cr, s.c_str(), &extents); - //std::cout << extents.width/2 << "extents.x_bearing\n"; - cairo_translate(cr, (extents.width/2) * inverse * -1, (dist + ((extents.height/2)* inverse))); - if((x) < 91 || (x) > 270) { - cairo_rotate(cr, 180*(M_PI/180.0)); - } - cairo_text_path(cr, s.c_str()); - if((x) < 91 || (x) > 270) { - cairo_rotate(cr, -180*(M_PI/180.0)); - } - cairo_translate(cr, (extents.width/2) * inverse , (dist + ((extents.height/2)* inverse)) * -1); - cairo_set_source_rgba (cr, 1, 1, 1, 1); - cairo_fill(cr); - cairo_rotate(cr, rot); - } - cairo_rotate(cr, x*(M_PI/180.)); - if(x%5 == 0) { - cairo_move_to(cr, 0, half_min-30); - cairo_line_to(cr, 0, half_min-17); - } else { - cairo_move_to(cr, 0, half_min-20); - cairo_line_to(cr, 0, half_min-15); - } - cairo_line_to(cr, 0, half_min-15); - cairo_set_source_rgba (cr, 0, 0, 0, 0.4); - cairo_set_line_width (cr,1); - cairo_stroke(cr); - cairo_rotate(cr, -x*(M_PI/180.)); - } - cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR); - cairo_translate(cr, -half_w, -half_h); - cairo_arc(cr, half_w, half_h, half_min-30, 0, 2*M_PI); - cairo_set_source_rgba (cr, 1, 1, 1, 1); - cairo_fill(cr); - cairo_translate(cr, half_w, half_h); - cairo_set_operator(cr, CAIRO_OPERATOR_OVER); - cairo_rotate(cr, start_angle*(M_PI/180.)); - cairo_move_to(cr, 0, 0); - cairo_line_to(cr, 0, (half_min-17) * -1); - cairo_set_source_rgba (cr, 1, 1, 1, 0.25); - cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); - cairo_set_line_width (cr,5); - cairo_stroke(cr); - cairo_move_to(cr, 0, 0); - cairo_line_to(cr, 0, (half_min-17) * -1); - cairo_set_source_rgba (cr, 1, 0, 0, 0.9); - cairo_set_line_width (cr,1); - cairo_stroke(cr); - cairo_rotate(cr, -start_angle*(M_PI/180.)); - cairo_destroy(cr); - surface_measure = new_backing_store_measure; - - cairo_surface_t *new_backing_store_grey = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, allocation.width, allocation.height); - cr = cairo_create(new_backing_store_grey); - cairo_set_operator(cr, CAIRO_OPERATOR_OVER); - cairo_set_source_surface(cr, _backing_store, 0, 0); - cairo_paint(cr); - Inkscape::Filters::FilterColorMatrix::ColorMatrixMatrix _grayscale_colormatrix = std::vector<gdouble> (grayscale_value_matrix, grayscale_value_matrix + 20); - cairo_surface_t *out = ink_cairo_surface_create_identical(new_backing_store_grey); - ink_cairo_surface_filter(new_backing_store_grey, out, _grayscale_colormatrix); - cairo_set_source_surface(cr, out, 0, 0); - cairo_surface_destroy(out); - cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); - cairo_paint(cr); - cairo_destroy(cr); - surface_origin = new_backing_store_grey; -} - -bool SPCanvas::endRotateTo() -{ - if (!_backing_store || !started) { - return false; - } - started = false; - surface_rotated = NULL; - surface_origin = NULL; - gtk_widget_queue_draw(GTK_WIDGET(this)); - dirtyAll(); - addIdle(); - rotated = true; - return true; -} - -void SPCanvas::clearRotateTo() -{ - if (!started) { - return; - } - gtk_widget_queue_draw(GTK_WIDGET(this)); - dirtyAll(); - addIdle(); -} - -void SPCanvas::rotateTo(double angle) -{ - if (!_backing_store || !started) { - return; - } - GtkAllocation allocation; - gtk_widget_get_allocation(&_widget, &allocation); - int half_w = allocation.width/2; - int half_h = allocation.height/2; - int half_min = std::min(half_w,half_h); - cairo_surface_t *new_backing_store = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, allocation.width, allocation.height); - cairo_t *cr = cairo_create(new_backing_store); - cairo_set_source_surface(cr, surface_origin, 0, 0); - cairo_paint(cr); - cairo_set_source_rgba (cr, 0, 0, 0, 0.5); - cairo_paint(cr); - cairo_pattern_t *source_pattern; - cairo_matrix_t matrix; - source_pattern = cairo_pattern_create_for_surface (surface_rotated); - cairo_matrix_init_identity (&matrix); - cairo_matrix_translate (&matrix, allocation.width/2.0, allocation.height/2.0); - cairo_matrix_rotate (&matrix, Geom::rad_from_deg(angle - start_angle) * -1); - cairo_matrix_translate (&matrix, -allocation.width/2.0, -allocation.height/2.0); - cairo_pattern_set_matrix (source_pattern, &matrix); - cairo_set_source(cr, source_pattern); - cairo_paint(cr); - cairo_set_source_surface(cr, surface_measure, 0, 0); - cairo_paint(cr); - cairo_translate(cr, half_w, half_h); - cairo_rotate(cr, angle*(M_PI/180.)); - cairo_move_to(cr, 0, 0); - cairo_line_to(cr, 0, (half_min-17) * -1); - cairo_set_source_rgba (cr, 1, 1, 1, 0.25); - cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); - cairo_set_line_width (cr,5); - cairo_stroke(cr); - cairo_move_to(cr, 0, 0); - cairo_line_to(cr, 0, (half_min-17) * -1); - cairo_set_source_rgba (cr, 1, 1, 1, 0.9); - cairo_set_line_width (cr,1); - cairo_stroke(cr); - cairo_move_to(cr, 0, 0); - cairo_line_to(cr, 0, (half_min-17) * -1); - cairo_set_source_rgba (cr, 1, 0, 0, 0.9); - const double dashed[] = {6.0, 3.0}; - int len = sizeof(dashed) / sizeof(dashed[0]); - cairo_set_dash(cr, dashed, len, 1); - cairo_stroke(cr); - cairo_translate(cr, -half_w, -half_h); - cairo_set_source_rgba (cr, 1, 1, 1, 0.25); - cairo_arc(cr, half_w, half_h, 7, 0, 2*M_PI); - cairo_fill(cr); - cairo_set_source_rgba (cr, 1, 0, 0, 0.7); - cairo_arc(cr, half_w, half_h, 5, 0, 2*M_PI); - cairo_fill(cr); - cairo_translate(cr, half_w, half_h); - cairo_rotate(cr, -angle*(M_PI/180.)); - cairo_select_font_face(cr, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size(cr, 15.0); - cairo_text_extents_t extents; - std::ostringstream s; - s << _("Original angle ") << std::fixed << std::setprecision(2) << start_angle << "º"; - cairo_text_extents(cr, s.str().c_str(), &extents); - cairo_translate(cr, half_w - extents.width -15 ,-half_h + 25); - cairo_set_source_rgba (cr, 1, 1, 1, 1); - cairo_text_path(cr, s.str().c_str()); - cairo_fill(cr); - cairo_translate(cr, (half_w - extents.width -15) *-1 ,(-half_h + 25) *-1); - s.str(""); - s << _("New angle ") << std::fixed << std::setprecision(2) << angle << "º"; - cairo_text_extents(cr, s.str().c_str(), &extents); - cairo_translate(cr, half_w - extents.width -15 ,-half_h + 45); - cairo_text_path(cr, s.str().c_str()); - cairo_fill(cr); - cairo_translate(cr, (half_w - extents.width -15) *-1 ,(-half_h + 45) *-1); - s.str(""); - s << _("Gap ") << std::fixed << std::setprecision(2) << std::abs(start_angle-angle) << "º"; - cairo_text_extents(cr, s.str().c_str(), &extents); - cairo_translate(cr, half_w - extents.width -15 ,-half_h + 65); - cairo_text_path(cr, s.str().c_str()); - cairo_fill(cr); - cairo_translate(cr, (half_w - extents.width -15) *-1 ,(-half_h + 65) *-1); - cairo_translate(cr, -half_w + 10 ,-half_h + 25); - s.str(""); - cairo_set_font_size(cr, 12.0); - s << _("Normal mode, 1º round step"); - cairo_text_path(cr, s.str().c_str()); - cairo_fill(cr); - cairo_translate(cr, (-half_w +10) * -1 ,(-half_h + 25) * -1); - cairo_translate(cr, -half_w + 10 ,-half_h + 40); - s.str(""); - s << _("+ALT, Fractional degrees"); - cairo_text_path(cr, s.str().c_str()); - cairo_fill(cr); - cairo_translate(cr, (-half_w + 10) * -1 ,(-half_h + 40) * -1); - cairo_translate(cr, -half_w + 10 ,-half_h + 55); - s.str(""); - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - s << _("+CTRL, ") << 180.0/prefs->getInt("/options/rotationsnapsperpi/value", 12) << _("º round step"); - cairo_text_path(cr, s.str().c_str()); - cairo_fill(cr); - cairo_translate(cr, (-half_w + 10) * -1 ,(-half_h + 55) * -1); - cairo_translate(cr, -half_w + 10 ,-half_h + 70); - s.str(""); - s << _("+SHIFT, Reset"); - cairo_text_path(cr, s.str().c_str()); - cairo_fill(cr); - cairo_translate(cr, (-half_w + 10) * -1 ,(-half_h + 70) * -1); - cairo_translate(cr, -half_w + 10 ,-half_h + 85); - s.str(""); - s << _("+CTRL+SHIFT, 0º"); - cairo_text_path(cr, s.str().c_str()); - cairo_fill(cr); - //cairo_translate(cr, (-half_w + 10) * -1 ,(-half_h + 60) * -1); - cairo_destroy(cr); - cairo_surface_destroy(_backing_store); - _backing_store = new_backing_store; - cairo_pattern_destroy (source_pattern); - gtk_widget_queue_draw(GTK_WIDGET(this)); - addIdle(); -} - void SPCanvas::updateNow() { if (_need_update) { |
