summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2015-10-31 20:51:10 +0000
committerJabiertxof <jtx@jtx.marker.es>2015-10-31 20:51:10 +0000
commitee0d08e599aae484a6e8354499b126596dc4aa73 (patch)
treeca2f743c554a85678b2932fba4eb65583b60b2b7 /src
parentFix a bug compiling on pow (diff)
downloadinkscape-ee0d08e599aae484a6e8354499b126596dc4aa73.tar.gz
inkscape-ee0d08e599aae484a6e8354499b126596dc4aa73.zip
Working on picker
(bzr r14422.1.33)
Diffstat (limited to 'src')
-rw-r--r--src/ui/dialog/clonetiler.cpp16
-rw-r--r--src/ui/tools/spray-tool.cpp128
-rw-r--r--src/ui/tools/spray-tool.h3
-rw-r--r--src/widgets/spray-toolbar.cpp103
-rw-r--r--src/widgets/toolbox.cpp4
5 files changed, 203 insertions, 51 deletions
diff --git a/src/ui/dialog/clonetiler.cpp b/src/ui/dialog/clonetiler.cpp
index 266d61ed5..da6cc5192 100644
--- a/src/ui/dialog/clonetiler.cpp
+++ b/src/ui/dialog/clonetiler.cpp
@@ -662,7 +662,7 @@ CloneTiler::CloneTiler () :
gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
guint32 rgba = 0x000000ff | sp_svg_read_color (prefs->getString(prefs_path + "initial_color").data(), 0x000000ff);
- color_picker = new Inkscape::UI::Widget::ColorPicker (*new Glib::ustring(_("Initial color of tiled clones")), *new Glib::ustring(_("Initial color for clones (works only if the original has unset fill or stroke)")), rgba, false);
+ color_picker = new Inkscape::UI::Widget::ColorPicker (*new Glib::ustring(_("Initial color of tiled clones")), *new Glib::ustring(_("Initial color for clones (works only if the original has unset fill or stroke or on spray tool in copy mode)")), rgba, false);
color_changed_connection = color_picker->connectChanged (sigc::ptr_fun(on_picker_color_changed));
gtk_box_pack_start (GTK_BOX (hb), reinterpret_cast<GtkWidget*>(color_picker->gobj()), FALSE, FALSE, 0);
@@ -1003,7 +1003,19 @@ CloneTiler::CloneTiler () :
gtk_widget_set_sensitive (vvb, prefs->getBool(prefs_path + "dotrace"));
}
}
-
+ // Info
+ {
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VB_MARGIN);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
+ GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+#endif
+ gtk_box_pack_start (GTK_BOX (mainbox), hb, FALSE, FALSE, 0);
+ GtkWidget *l = gtk_label_new(_(""));
+ gtk_label_set_markup (GTK_LABEL(l), _("Apply to tiled clones:"));
+ gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
+ }
// Rows/columns, width/height
{
#if GTK_CHECK_VERSION(3,0,0)
diff --git a/src/ui/tools/spray-tool.cpp b/src/ui/tools/spray-tool.cpp
index f81a274d1..0b54d3779 100644
--- a/src/ui/tools/spray-tool.cpp
+++ b/src/ui/tools/spray-tool.cpp
@@ -175,6 +175,10 @@ SprayTool::SprayTool()
, dilate_area(NULL)
, overlap(false)
, picker(false)
+ , pickinversescale(false)
+ , pickfill(false)
+ , pickstroke(false)
+ , visible(false)
, offset(0)
{
}
@@ -252,6 +256,10 @@ void SprayTool::setup() {
sp_event_context_read(this, "Scale");
sp_event_context_read(this, "offset");
sp_event_context_read(this, "picker");
+ sp_event_context_read(this, "pickinversescale");
+ sp_event_context_read(this, "pickfill");
+ sp_event_context_read(this, "pickstroke");
+ sp_event_context_read(this, "visible");
sp_event_context_read(this, "overlap");
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
@@ -298,6 +306,14 @@ void SprayTool::set(const Inkscape::Preferences::Entry& val) {
this->offset = CLAMP(val.getDouble(), -1000.0, 1000.0);
} else if (path == "picker") {
this->picker = val.getBool();
+ } else if (path == "pickinversescale") {
+ this->pickinversescale = val.getBool();
+ } else if (path == "pickfill") {
+ this->pickfill = val.getBool();
+ } else if (path == "pickstroke") {
+ this->pickstroke = val.getBool();
+ } else if (path == "visible") {
+ this->visible = val.getBool();
} else if (path == "overlap") {
this->overlap = val.getBool();
}
@@ -424,6 +440,10 @@ static bool fit_item(SPDesktop *desktop,
double &_scale,
double scale,
bool picker,
+ bool pickinversescale,
+ bool pickfill,
+ bool pickstroke,
+ bool visible,
bool overlap,
double offset,
SPCSSAttr *css,
@@ -491,21 +511,21 @@ static bool fit_item(SPDesktop *desktop,
std::abs(bbox_top - bbox_top_main) > std::abs(offset_min))){
return false;
}
- } else if(picker){
+ } else if(picker || visible){
item_down->setHidden(true);
item_down->updateRepr();
}
}
}
}
- if(picker){
+ if(picker || visible){
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
if(!overlap){
doc->ensureUpToDate();
}
int pick = prefs->getInt("/dialogs/clonetiler/pick");
- bool pick_to_presence = prefs->getBool("/dialogs/clonetiler/pick_to_presence");
bool pick_to_size = prefs->getBool("/dialogs/clonetiler/pick_to_size");
+ bool pick_to_presence = prefs->getBool("/dialogs/clonetiler/pick_to_presence", false);
bool pick_to_color = prefs->getBool("/dialogs/clonetiler/pick_to_color");
bool pick_to_opacity = prefs->getBool("/dialogs/clonetiler/pick_to_opacity");
double rand_picked = 0.01 * prefs->getDoubleLimited("/dialogs/clonetiler/rand_picked", 0, 0, 100);
@@ -518,28 +538,24 @@ static bool fit_item(SPDesktop *desktop,
double R = 0, G = 0, B = 0, A = 0;
cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1, 1);
sp_canvas_arena_render_surface(SP_CANVAS_ARENA(desktop->getDrawing()), s, area);
- ink_cairo_surface_average_color_premul(s, R, G, B, A);
+ ink_cairo_surface_average_color(s, R, G, B, A);
cairo_surface_destroy(s);
- if (fabs(A) < 1e-4) {
- A = 0; // suppress exponentials, CSS does not allow that
+ guint32 rgba = SP_RGBA32_F_COMPOSE(R, G, B, A);
+ float r = SP_RGBA32_R_F(rgba);
+ float g = SP_RGBA32_G_F(rgba);
+ float b = SP_RGBA32_B_F(rgba);
+ float a = SP_RGBA32_A_F(rgba);
+ //this can fix the bug #1511998 if confirmed
+ if( a == 0 && r == 0 && g == 0 && b == 0){
+ r = 1;
+ g = 1;
+ b = 1;
}
- if(A == 0 && R == 0 && G == 0 && B == 0){
- R = 1;
- G = 1;
- B = 1;
+ if(visible && (a == 0 || a < 1e-6)){
+ return false;
}
- if(picker){
-// if (A > 0) {
-// R /= A;
-// G /= A;
-// B /= A;
-// }
- guint32 rgba = SP_RGBA32_F_COMPOSE(R, G, B, A);
- float r = SP_RGBA32_R_F(rgba);
- float g = SP_RGBA32_G_F(rgba);
- float b = SP_RGBA32_B_F(rgba);
- float a = SP_RGBA32_A_F(rgba);
+ if(picker){
float hsl[3];
sp_color_rgb_to_hsl_floatv (hsl, r, g, b);
@@ -607,17 +623,17 @@ static bool fit_item(SPDesktop *desktop,
// recompose tweaked color
rgba = SP_RGBA32_F_COMPOSE(r, g, b, a);
- if (pick_to_presence) {
- //this line I think is wrong in original code clonetiler
- //if (g_random_double_range (0, 1) > val) {
- if(a == 0){
- return false;
- }
- }
if (pick_to_size) {
if(!trace_scale){
- _scale = 2 - (val * 1.7);
- return fit_item(desktop,
+ if(pickinversescale){
+ _scale = 1.0 - val;
+ } else {
+ _scale = val;
+ }
+ if _scale == 0.0){
+ return false;
+ }
+ if(!fit_item(desktop,
item,
bbox,
move,
@@ -626,25 +642,47 @@ static bool fit_item(SPDesktop *desktop,
_scale,
scale,
picker,
+ pickinversescale,
+ pickfill,
+ pickstroke,
+ visible,
overlap,
offset,
css,
- true);
+ true)){
+ return false;
+ }
}
}
+
if (pick_to_opacity) {
- opacity *= a;
- std::stringstream fill_opacity;
- fill_opacity.imbue(std::locale::classic());
- fill_opacity << float(opacity);
- sp_repr_css_set_property(css, "fill-opacity", fill_opacity.str().c_str());
+ opacity *= val;
+ std::stringstream opacity_str;
+ opacity_str.imbue(std::locale::classic());
+ opacity_str << opacity;
+ sp_repr_css_set_property(css, "opacity", opacity_str.str().c_str());
+ }
+ if (pick_to_presence) {
+ if (g_random_double_range (0, 1) > val) {
+ //Hidding the element is a way to retain original
+ //beabiohur of tiled clones for presence option.
+ sp_repr_css_set_property(css, "opacity", "0");
+ }
}
if (pick_to_color) {
sp_svg_write_color(color_string, sizeof(color_string), rgba);
- sp_repr_css_set_property(css, "fill", color_string);
+ if(pickfill){
+ sp_repr_css_set_property(css, "fill", color_string);
+ }
+ if(pickstroke){
+ sp_repr_css_set_property(css, "stroke", color_string);
+ }
+ }
+ if (opacity < 1e-6) { // invisibly transparent, skip
+ return false;
}
}
- if(!overlap){
+ if(!overlap && (picker || visible)){
for (std::vector<SPItem *>::const_iterator k=items_down.begin(); k!=items_down.end(); k++) {
SPItem *item_hidden = *k;
item_hidden->setHidden(false);
@@ -674,6 +712,10 @@ static bool sp_spray_recursive(SPDesktop *desktop,
gint _distrib,
bool overlap,
bool picker,
+ bool pickinversescale,
+ bool pickfill,
+ bool pickstroke,
+ bool visible,
double offset,
bool usepressurescale,
double pressure)
@@ -714,8 +756,8 @@ static bool sp_spray_recursive(SPDesktop *desktop,
Geom::Point center = item->getCenter();
Geom::Point move = (Geom::Point(cos(tilt)*cos(dp)*dr/(1-ratio)+sin(tilt)*sin(dp)*dr/(1+ratio), -sin(tilt)*cos(dp)*dr/(1-ratio)+cos(tilt)*sin(dp)*dr/(1+ratio)))+(p-a->midpoint());
SPCSSAttr *css = sp_repr_css_attr_new();
- if(overlap || picker){
- if(!fit_item(desktop, item, a, move, center, angle, _scale, scale, picker, overlap, offset, css, false)){
+ if(overlap || picker || visible){
+ if(!fit_item(desktop, item, a, move, center, angle, _scale, scale, picker, pickinversescale, pickfill, pickstroke, visible, overlap, offset, css, false)){
return false;
}
}
@@ -821,8 +863,8 @@ static bool sp_spray_recursive(SPDesktop *desktop,
Geom::Point center=item->getCenter();
Geom::Point move = (Geom::Point(cos(tilt)*cos(dp)*dr/(1-ratio)+sin(tilt)*sin(dp)*dr/(1+ratio), -sin(tilt)*cos(dp)*dr/(1-ratio)+cos(tilt)*sin(dp)*dr/(1+ratio)))+(p-a->midpoint());
SPCSSAttr *css = sp_repr_css_attr_new();
- if(overlap || picker){
- if(!fit_item(desktop, item, a, move, center, angle, _scale, scale, picker, overlap, offset, css, false)){
+ if(overlap || picker || visible){
+ if(!fit_item(desktop, item, a, move, center, angle, _scale, scale, picker, pickinversescale, pickfill, pickstroke, visible, overlap, offset, css, false)){
return false;
}
}
@@ -900,7 +942,7 @@ static bool sp_spray_dilate(SprayTool *tc, Geom::Point /*event_p*/, Geom::Point
for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
SPItem *item = *i;
g_assert(item != NULL);
- if (sp_spray_recursive(desktop, selection, item, p, vector, tc->mode, radius, population, tc->scale, tc->scale_variation, reverse, move_mean, move_standard_deviation, tc->ratio, tc->tilt, tc->rotation_variation, tc->distrib, tc->overlap, tc->picker, tc->offset, tc->usepressurescale, get_pressure(tc))) {
+ if (sp_spray_recursive(desktop, selection, item, p, vector, tc->mode, radius, population, tc->scale, tc->scale_variation, reverse, move_mean, move_standard_deviation, tc->ratio, tc->tilt, tc->rotation_variation, tc->distrib, tc->overlap, tc->picker, tc->pickinversescale, tc->pickfill, tc->pickstroke, tc->visible, tc->offset, tc->usepressurescale, get_pressure(tc))) {
did = true;
}
}
diff --git a/src/ui/tools/spray-tool.h b/src/ui/tools/spray-tool.h
index 112ab77e9..89a06dee9 100644
--- a/src/ui/tools/spray-tool.h
+++ b/src/ui/tools/spray-tool.h
@@ -91,6 +91,9 @@ public:
SPCanvasItem *dilate_area;
bool overlap;
bool picker;
+ bool pickinversescale;
+ bool pickfill;
+ bool pickstroke;
bool visible;
double offset;
sigc::connection style_set_connection;
diff --git a/src/widgets/spray-toolbar.cpp b/src/widgets/spray-toolbar.cpp
index 842b8e0aa..ce37ac9f7 100644
--- a/src/widgets/spray-toolbar.cpp
+++ b/src/widgets/spray-toolbar.cpp
@@ -67,7 +67,11 @@ static void sp_stb_sensitivize( GObject *tbl )
GtkAdjustment *adj_offset = ege_adjustment_action_get_adjustment( EGE_ADJUSTMENT_ACTION(offset) );
GtkAdjustment *adj_scale = ege_adjustment_action_get_adjustment( EGE_ADJUSTMENT_ACTION(spray_scale) );
GtkToggleAction *overlap = GTK_TOGGLE_ACTION( g_object_get_data(tbl, "overlap") );
+ GtkToggleAction *picker = GTK_TOGGLE_ACTION( g_object_get_data(tbl, "picker") );
GtkToggleAction *usepressurescale = GTK_TOGGLE_ACTION( g_object_get_data(tbl, "usepressurescale") );
+ GtkAction *pickfill = GTK_ACTION( g_object_get_data(tbl, "pickfill") );
+ GtkAction *pickstroke = GTK_ACTION( g_object_get_data(tbl, "pickstroke") );
+ GtkAction *pickinversescale = GTK_ACTION( g_object_get_data(tbl, "pickinversescale") );
gtk_adjustment_set_value( adj_offset, 100.0 );
if (gtk_toggle_action_get_active(overlap)) {
gtk_action_set_sensitive( offset, TRUE );
@@ -80,6 +84,15 @@ static void sp_stb_sensitivize( GObject *tbl )
} else {
gtk_action_set_sensitive( spray_scale, TRUE );
}
+ if(gtk_toggle_action_get_active(picker)){
+ gtk_action_set_sensitive( pickfill, TRUE );
+ gtk_action_set_sensitive( pickstroke, TRUE );
+ gtk_action_set_sensitive( pickinversescale, TRUE );
+ } else {
+ gtk_action_set_sensitive( pickfill, FALSE );
+ gtk_action_set_sensitive( pickstroke, FALSE );
+ gtk_action_set_sensitive( pickinversescale, FALSE );
+ }
}
Inkscape::UI::Dialog::CloneTiler *get_clone_tiler_panel(SPDesktop *desktop)
@@ -173,16 +186,19 @@ static void sp_toggle_pressure_scale( GtkToggleAction* act, gpointer data)
sp_stb_sensitivize( tbl );
}
+static void sp_toggle_visible( GtkToggleAction* act, gpointer data)
+{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ gboolean active = gtk_toggle_action_get_active(act);
+ prefs->setBool("/tools/spray/visible", active);
+}
+
static void sp_toggle_picker( GtkToggleAction* act, gpointer data )
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
gboolean active = gtk_toggle_action_get_active(act);
prefs->setBool("/tools/spray/picker", active);
if(active == true){
- prefs->setBool("/tools/spray/visible", false);
- GObject *tbl = G_OBJECT(data);
- GtkToggleAction *visible = GTK_TOGGLE_ACTION( g_object_get_data(tbl, "visible") );
- gtk_toggle_action_set_active(visible, false);
prefs->setBool("/dialogs/clonetiler/dotrace", true);
SPDesktop *dt = SP_ACTIVE_DESKTOP;
if (Inkscape::UI::Dialog::CloneTiler *ct = get_clone_tiler_panel(dt)){
@@ -190,6 +206,29 @@ static void sp_toggle_picker( GtkToggleAction* act, gpointer data )
ct->show_page_trace();
}
}
+ GObject *tbl = G_OBJECT(data);
+ sp_stb_sensitivize(tbl);
+}
+
+static void sp_toggle_pickfill( GtkToggleAction* act, gpointer data )
+{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ gboolean active = gtk_toggle_action_get_active(act);
+ prefs->setBool("/tools/spray/pickfill", active);
+}
+
+static void sp_toggle_pickinversescale( GtkToggleAction* act, gpointer data )
+{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ gboolean active = gtk_toggle_action_get_active(act);
+ prefs->setBool("/tools/spray/pickinversescale", active);
+}
+
+static void sp_toggle_pickstroke( GtkToggleAction* act, gpointer data )
+{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ gboolean active = gtk_toggle_action_get_active(act);
+ prefs->setBool("/tools/spray/pickstroke", active);
}
void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
@@ -385,8 +424,8 @@ void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObj
/* Picker */
{
InkToggleAction* act = ink_toggle_action_new( "SprayPickColorAction",
- _("Pick down color. Fill must be unset on original when spraying clones"),
- _("Pick down color. Fill must be unset on original when spraying clones"),
+ _("Pick down. Fill or Stroke must be unset on original when spraying color to clones"),
+ _("Pick down. Fill or Stroke must be unset on original when spraying color to clones"),
INKSCAPE_ICON("color-picker"),
secondarySize );
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/spray/picker", false) );
@@ -395,6 +434,58 @@ void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObj
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
}
+ /* Inverse Scale */
+ {
+ InkToggleAction* act = ink_toggle_action_new( "SprayOverPickInverseScaleAction",
+ _("Apply inversed scale to pick"),
+ _("Apply inversed scale to pick"),
+ INKSCAPE_ICON("object-tweak-shrink"),
+ secondarySize );
+ gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/spray/pickinversescale", false) );
+ g_object_set_data( holder, "pickinversescale", act );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_toggle_pickinversescale), holder) ;
+ gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
+ }
+
+ /* Pick Fill */
+ {
+ InkToggleAction* act = ink_toggle_action_new( "SprayOverPickFillAction",
+ _("Apply picked color to fill"),
+ _("Apply picked color to fill"),
+ INKSCAPE_ICON("paint-solid"),
+ secondarySize );
+ gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/spray/pickfill", false) );
+ g_object_set_data( holder, "pickfill", act );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_toggle_pickfill), holder) ;
+ gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
+ }
+
+ /* Pick Stroke */
+ {
+ InkToggleAction* act = ink_toggle_action_new( "SprayOverPickStrokeAction",
+ _("Apply picked color to stroke"),
+ _("Apply picked color to stroke"),
+ INKSCAPE_ICON("no-marker"),
+ secondarySize );
+ gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/spray/pickstroke", false) );
+ g_object_set_data( holder, "pickstroke", act );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_toggle_pickstroke), holder) ;
+ gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
+ }
+
+ /* Visible */
+ {
+ InkToggleAction* act = ink_toggle_action_new( "SprayOverVisibleAction",
+ _("Apply only over non transparent areas"),
+ _("Apply only over non transparent areas"),
+ INKSCAPE_ICON("object-visible"),
+ secondarySize );
+ gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/spray/visible", false) );
+ g_object_set_data( holder, "visible", act );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_toggle_visible), holder) ;
+ gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
+ }
+
/* Overlap */
{
InkToggleAction* act = ink_toggle_action_new( "SprayNotOverlapAction",
diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp
index 0c72242e0..0188beef0 100644
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
@@ -322,6 +322,10 @@ static gchar const * ui_descr =
" <toolitem action='SprayMeanAction' />"
" <separator />"
" <toolitem action='SprayPickColorAction' />"
+ " <toolitem action='SprayOverPickInverseScaleAction' />"
+ " <toolitem action='SprayOverPickFillAction' />"
+ " <toolitem action='SprayOverPickStrokeAction' />"
+ " <toolitem action='SprayOverVisibleAction' />"
" <toolitem action='SprayNotOverlapAction' />"
" <toolitem action='SprayToolOffsetAction' />"