X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fdropper-context.cpp;h=5415fdc80fb050af4193d3c11cab77911811b5b9;hb=5192adf272fe17670fa94f6aa15f348b132f98e3;hp=0be132340f9bfcf6c50f7edf0ee50f3298b4950d;hpb=119da008bf14ff423a4f808d2c7ed8a9b7a89262;p=inkscape.git diff --git a/src/dropper-context.cpp b/src/dropper-context.cpp index 0be132340..5415fdc80 100644 --- a/src/dropper-context.cpp +++ b/src/dropper-context.cpp @@ -22,7 +22,6 @@ #include #include -#include "libnr/n-art-bpath.h" #include "macros.h" #include "display/canvas-bpath.h" #include "display/canvas-arena.h" @@ -31,7 +30,7 @@ #include "color.h" #include "color-rgba.h" #include "desktop-style.h" -#include "prefs-utils.h" +#include "preferences.h" #include "sp-namedview.h" #include "desktop.h" #include "desktop-handles.h" @@ -42,18 +41,7 @@ #include "dropper-context.h" #include "message-context.h" -#include "libnr/nr-scale-translate-ops.h" - -#define C1 0.552 -static NArtBpath const spdc_circle[] = { - { NR_MOVETO, 0, 0, 0, 0, -1, 0 }, - { NR_CURVETO, -1, C1, -C1, 1, 0, 1 }, - { NR_CURVETO, C1, 1, 1, C1, 1, 0 }, - { NR_CURVETO, 1, -C1, C1, -1, 0, -1 }, - { NR_CURVETO, -C1, -1, -1, -C1, -1, 0 }, - { NR_END, 0, 0, 0, 0, 0, 0 } -}; -#undef C1 +//#include "libnr/nr-scale-translate-ops.h" static void sp_dropper_context_class_init(SPDropperContextClass *klass); static void sp_dropper_context_init(SPDropperContext *dc); @@ -126,11 +114,12 @@ static void sp_dropper_context_setup(SPEventContext *ec) sp_canvas_bpath_set_stroke(SP_CANVAS_BPATH(dc->area), 0x0000007f, 1.0, SP_STROKE_LINEJOIN_MITER, SP_STROKE_LINECAP_BUTT); sp_canvas_item_hide(dc->area); - if (prefs_get_int_attribute("tools.dropper", "selcue", 0) != 0) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + if (prefs->getBool("/tools/dropper/selcue")) { ec->enableSelectionCue(); } - if (prefs_get_int_attribute("tools.dropper", "gradientdrag", 0) != 0) { + if (prefs->getBool("/tools/dropper/gradientdrag")) { ec->enableGrDrag(); } } @@ -140,6 +129,11 @@ static void sp_dropper_context_finish(SPEventContext *ec) SPDropperContext *dc = SP_DROPPER_CONTEXT(ec); ec->enableGrDrag(false); + + if (dc->grabbed) { + sp_canvas_item_ungrab(dc->grabbed, GDK_CURRENT_TIME); + dc->grabbed = NULL; + } if (dc->area) { gtk_object_destroy(GTK_OBJECT(dc->area)); @@ -148,17 +142,28 @@ static void sp_dropper_context_finish(SPEventContext *ec) } +/** + * Returns the current dropper context icc-color. + */ +SPColor* sp_dropper_context_get_icc_color(SPEventContext */*ec*/) +{ + //TODO: implement-me! + + return 0; // At least we will cause a clean crash, instead of random corruption. +} + /** * Returns the current dropper context color. */ guint32 sp_dropper_context_get_color(SPEventContext *ec) { SPDropperContext *dc = SP_DROPPER_CONTEXT(ec); - - int pick = prefs_get_int_attribute("tools.dropper", "pick", + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + + int pick = prefs->getInt("/tools/dropper/pick", SP_DROPPER_PICK_VISIBLE); - int setalpha = prefs_get_int_attribute("tools.dropper", "setalpha", 1); - + bool setalpha = prefs->getBool("/tools/dropper/setalpha", true); + return SP_RGBA32_F_COMPOSE(dc->R, dc->G, dc->B, (pick == SP_DROPPER_PICK_ACTUAL && setalpha) ? dc->alpha : 1.0); } @@ -169,17 +174,24 @@ static gint sp_dropper_context_root_handler(SPEventContext *event_context, GdkEv SPDropperContext *dc = (SPDropperContext *) event_context; int ret = FALSE; SPDesktop *desktop = event_context->desktop; + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - int pick = prefs_get_int_attribute("tools.dropper", "pick", SP_DROPPER_PICK_VISIBLE); - int setalpha = prefs_get_int_attribute("tools.dropper", "setalpha", 1); + int pick = prefs->getInt("/tools/dropper/pick", SP_DROPPER_PICK_VISIBLE); + bool setalpha = prefs->getBool("/tools/dropper/setalpha", true); switch (event->type) { case GDK_BUTTON_PRESS: if (event->button.button == 1 && !event_context->space_panning) { - dc->centre = NR::Point(event->button.x, event->button.y); + dc->centre = Geom::Point(event->button.x, event->button.y); dc->dragging = TRUE; ret = TRUE; } + + sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate), + GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK, + NULL, event->button.time); + dc->grabbed = SP_CANVAS_ITEM(desktop->acetate); + break; case GDK_MOTION_NOTIFY: if (event->motion.state & GDK_BUTTON2_MASK) { @@ -196,24 +208,24 @@ static gint sp_dropper_context_root_handler(SPEventContext *event_context, GdkEv // calculate average // radius - rw = std::min(NR::L2(NR::Point(event->button.x, event->button.y) - dc->centre), 400.0); + rw = std::min(Geom::L2(Geom::Point(event->button.x, event->button.y) - dc->centre), 400.0); if (rw == 0) { // happens sometimes, little idea why... break; } - NR::Point const cd = desktop->w2d(dc->centre); - NR::Matrix const w2dt = desktop->w2d(); - const double scale = rw * NR::expansion(w2dt); - NR::Matrix const sm( NR::scale(scale, scale) * NR::translate(cd) ); + Geom::Point const cd = desktop->w2d(dc->centre); + Geom::Matrix const w2dt = desktop->w2d(); + const double scale = rw * w2dt.descrim(); + Geom::Matrix const sm( Geom::Scale(scale, scale) * Geom::Translate(cd) ); sp_canvas_item_affine_absolute(dc->area, sm); sp_canvas_item_show(dc->area); /* Get buffer */ - const int x0 = (int) floor(dc->centre[NR::X] - rw); - const int y0 = (int) floor(dc->centre[NR::Y] - rw); - const int x1 = (int) ceil(dc->centre[NR::X] + rw); - const int y1 = (int) ceil(dc->centre[NR::Y] + rw); + const int x0 = (int) floor(dc->centre[Geom::X] - rw); + const int y0 = (int) floor(dc->centre[Geom::Y] - rw); + const int x1 = (int) ceil(dc->centre[Geom::X] + rw); + const int y1 = (int) ceil(dc->centre[Geom::Y] + rw); if ((x1 > x0) && (y1 > y0)) { NRPixBlock pb; @@ -223,8 +235,8 @@ static gint sp_dropper_context_root_handler(SPEventContext *event_context, GdkEv for (int y = y0; y < y1; y++) { const unsigned char *s = NR_PIXBLOCK_PX(&pb) + (y - y0) * pb.rs; for (int x = x0; x < x1; x++) { - const double dx = x - dc->centre[NR::X]; - const double dy = y - dc->centre[NR::Y]; + const double dx = x - dc->centre[Geom::X]; + const double dy = y - dc->centre[Geom::Y]; const double w = exp(-((dx * dx) + (dy * dy)) / (rw * rw)); W += w; R += w * s[0]; @@ -320,6 +332,11 @@ static gint sp_dropper_context_root_handler(SPEventContext *event_context, GdkEv { sp_canvas_item_hide(dc->area); dc->dragging = FALSE; + + if (dc->grabbed) { + sp_canvas_item_ungrab(dc->grabbed, event->button.time); + dc->grabbed = NULL; + } double alpha_to_set = setalpha? dc->alpha : 1.0; @@ -333,7 +350,7 @@ static gint sp_dropper_context_root_handler(SPEventContext *event_context, GdkEv if (!(sp_desktop_selection(desktop)->isEmpty())) { - sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_DROPPER, + sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_DROPPER, _("Set picked color")); }