summaryrefslogtreecommitdiffstats
path: root/src/ui/widget
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2019-10-14 14:25:28 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2019-10-14 14:25:28 +0000
commitd58f1115618f0458496b0e0a081238d5fda64ef5 (patch)
tree0d87bf8067744160cf824defc783f5ff73935399 /src/ui/widget
parentPrevent returning references to local variable (diff)
downloadinkscape-d58f1115618f0458496b0e0a081238d5fda64ef5.tar.gz
inkscape-d58f1115618f0458496b0e0a081238d5fda64ef5.zip
Re-Add blending modes UI using CSS instead filters
Diffstat (limited to 'src/ui/widget')
-rw-r--r--src/ui/widget/filter-effect-chooser.cpp53
-rw-r--r--src/ui/widget/filter-effect-chooser.h26
-rw-r--r--src/ui/widget/object-composite-settings.cpp54
3 files changed, 99 insertions, 34 deletions
diff --git a/src/ui/widget/filter-effect-chooser.cpp b/src/ui/widget/filter-effect-chooser.cpp
index aeca506eb..d0c0e388a 100644
--- a/src/ui/widget/filter-effect-chooser.cpp
+++ b/src/ui/widget/filter-effect-chooser.cpp
@@ -15,15 +15,47 @@
#include "document.h"
+
+using Inkscape::Util::EnumData;
+using Inkscape::Util::EnumDataConverter;
+
+
namespace Inkscape {
+
+const EnumData<Inkscape::CSSBlendMode> CSSBlendModeData[SP_CSS_BLEND_ENDMODE] = {
+ { SP_CSS_BLEND_NORMAL, _("Normal"), "normal" },
+ { SP_CSS_BLEND_MULTIPLY, _("Multiply"), "multiply" },
+ { SP_CSS_BLEND_SCREEN, _("Screen"), "screen" },
+ { SP_CSS_BLEND_DARKEN, _("Darken"), "darken" },
+ { SP_CSS_BLEND_LIGHTEN, _("Lighten"), "lighten" },
+ // New in Compositing and Blending Level 1
+ { SP_CSS_BLEND_OVERLAY, _("Overlay"), "overlay" },
+ { SP_CSS_BLEND_COLORDODGE, _("Color Dodge"), "color-dodge" },
+ { SP_CSS_BLEND_COLORBURN, _("Color Burn"), "color-burn" },
+ { SP_CSS_BLEND_HARDLIGHT, _("Hard Light"), "hard-light" },
+ { SP_CSS_BLEND_SOFTLIGHT, _("Soft Light"), "soft-light" },
+ { SP_CSS_BLEND_DIFFERENCE, _("Difference"), "difference" },
+ { SP_CSS_BLEND_EXCLUSION, _("Exclusion"), "exclusion" },
+ { SP_CSS_BLEND_HUE, _("Hue"), "hue" },
+ { SP_CSS_BLEND_SATURATION, _("Saturation"), "saturation" },
+ { SP_CSS_BLEND_COLOR, _("Color"), "color" },
+ { SP_CSS_BLEND_LUMINOSITY, _("Luminosity"), "luminosity" }
+};
+#ifdef WITH_CSSBLEND
+const EnumDataConverter<Inkscape::CSSBlendMode> CSSBlendModeConverter(CSSBlendModeData, SP_CSS_BLEND_ENDMODE);
+#else
+// Disable new blend modes in GUI until widely implemented.
+const EnumDataConverter<Inkscape::CSSBlendMode> CSSBlendModeConverter(CSSBlendModeData, SP_CSS_BLEND_LUMINOSITY);
+#endif
+
namespace UI {
namespace Widget {
SimpleFilterModifier::SimpleFilterModifier(int flags)
- : _flags( flags )
+ : _flags(flags)
, _lb_blend(_("Blend mode:"))
- , _blend(BlendModeConverter, SP_ATTR_INVALID, false)
- , _blur( _("Blur (%)" ), 0, 0, 100, 1, 0.1, 1)
+ , _blend(CSSBlendModeConverter, SP_ATTR_INVALID, false)
+ , _blur(_("Blur (%)"), 0, 0, 100, 1, 0.1, 1)
, _opacity(_("Opacity (%)"), 0, 0, 100, 1, 0.1, 1)
{
set_name("SimpleFilterModifier");
@@ -33,9 +65,17 @@ SimpleFilterModifier::SimpleFilterModifier(int flags)
if (flags & BLEND) {
add(_hb_blend);
_lb_blend.set_use_underline();
+ _hb_blend.set_halign(Gtk::ALIGN_END);
+ _hb_blend.set_valign(Gtk::ALIGN_CENTER);
+ _hb_blend.set_margin_top(3);
+ _hb_blend.set_margin_end(5);
_lb_blend.set_mnemonic_widget(_blend);
- _hb_blend.pack_start(_lb_blend, false, false, 0);
- _hb_blend.pack_start(_blend);
+ _hb_blend.pack_start(_lb_blend, false, false, 5);
+ _hb_blend.pack_start(_blend, false, false, 5);
+ Gtk::Separator *separator = Gtk::manage(new Gtk::Separator());
+ separator->set_margin_top(8);
+ separator->set_margin_bottom(8);
+ add(*separator);
}
if (flags & BLUR) {
@@ -45,7 +85,6 @@ SimpleFilterModifier::SimpleFilterModifier(int flags)
if (flags & OPACITY) {
add(_opacity);
}
-
show_all_children();
_blend.signal_changed().connect(signal_blend_changed());
@@ -70,7 +109,7 @@ sigc::signal<void>& SimpleFilterModifier::signal_opacity_changed()
const Glib::ustring SimpleFilterModifier::get_blend_mode()
{
- const Util::EnumData<Inkscape::Filters::FilterBlendMode> *d = _blend.get_active_data();
+ const Util::EnumData<Inkscape::CSSBlendMode> *d = _blend.get_active_data();
if (d) {
return _blend.get_active_data()->key;
} else
diff --git a/src/ui/widget/filter-effect-chooser.h b/src/ui/widget/filter-effect-chooser.h
index 054fac242..c27d82888 100644
--- a/src/ui/widget/filter-effect-chooser.h
+++ b/src/ui/widget/filter-effect-chooser.h
@@ -16,12 +16,34 @@
#include <gtkmm/box.h>
#include <gtkmm/combobox.h>
+#include <gtkmm/separator.h>
#include "combo-enums.h"
-#include "filter-enums.h"
#include "spin-scale.h"
+#include "style-enums.h"
namespace Inkscape {
+enum CSSBlendMode {
+ SP_CSS_BLEND_NORMAL,
+ SP_CSS_BLEND_MULTIPLY,
+ SP_CSS_BLEND_SCREEN,
+ SP_CSS_BLEND_DARKEN,
+ SP_CSS_BLEND_LIGHTEN,
+ // New in CSS Compositing and Blending Level 1
+ SP_CSS_BLEND_OVERLAY,
+ SP_CSS_BLEND_COLORDODGE,
+ SP_CSS_BLEND_COLORBURN,
+ SP_CSS_BLEND_HARDLIGHT,
+ SP_CSS_BLEND_SOFTLIGHT,
+ SP_CSS_BLEND_DIFFERENCE,
+ SP_CSS_BLEND_EXCLUSION,
+ SP_CSS_BLEND_HUE,
+ SP_CSS_BLEND_SATURATION,
+ SP_CSS_BLEND_COLOR,
+ SP_CSS_BLEND_LUMINOSITY,
+ SP_CSS_BLEND_ENDMODE,
+};
+
namespace UI {
namespace Widget {
@@ -59,7 +81,7 @@ private:
Gtk::HBox _hb_blend;
Gtk::Label _lb_blend;
- ComboBoxEnum<Inkscape::Filters::FilterBlendMode> _blend;
+ ComboBoxEnum<Inkscape::CSSBlendMode> _blend;
SpinScale _blur;
SpinScale _opacity;
diff --git a/src/ui/widget/object-composite-settings.cpp b/src/ui/widget/object-composite-settings.cpp
index 6e37c095b..4052e1d38 100644
--- a/src/ui/widget/object-composite-settings.cpp
+++ b/src/ui/widget/object-composite-settings.cpp
@@ -113,13 +113,18 @@ ObjectCompositeSettings::_blendBlurValueChanged()
SPStyle *style = item->style;
g_assert(style != nullptr);
- if (blendmode != "normal") {
- SPFilter *filter = new_filter_simple_from_item(document, item, blendmode.c_str(), radius);
- sp_style_set_property_url(item, "filter", filter, false);
+ SPCSSAttr *css = sp_repr_css_attr_new();
+
+ if (blendmode == "normal") {
+ sp_repr_css_unset_property(css, "mix-blend-mode");
} else {
- sp_style_set_property_url(item, "filter", nullptr, false);
+ sp_repr_css_set_property(css, "mix-blend-mode", blendmode.c_str());
}
+ _subject->setCSS(css);
+
+ sp_repr_css_attr_unref(css);
+
if (radius == 0 && item->style->filter.set
&& filter_is_single_gaussian_blur(SP_FILTER(item->style->getFilter()))) {
remove_filter(item, false);
@@ -192,7 +197,6 @@ ObjectCompositeSettings::_subjectChanged() {
if (_blocked)
return;
_blocked = true;
-
SPStyle query(desktop->getDocument());
int result = _subject->queryStyle(&query, QUERY_STYLE_PROPERTY_MASTEROPACITY);
@@ -213,32 +217,32 @@ ObjectCompositeSettings::_subjectChanged() {
break;
case QUERY_STYLE_SINGLE:
case QUERY_STYLE_MULTIPLE_SAME:
- _filter_modifier.set_blend_mode(query.filter_blend_mode.value);
+ _filter_modifier.set_blend_mode(query.mix_blend_mode.value); // here dont work mix_blend_mode.set
break;
case QUERY_STYLE_MULTIPLE_DIFFERENT:
// TODO: set text
break;
}
- if(blend_result == QUERY_STYLE_SINGLE || blend_result == QUERY_STYLE_MULTIPLE_SAME) {
- int blur_result = _subject->queryStyle(&query, QUERY_STYLE_PROPERTY_BLUR);
- switch (blur_result) {
- case QUERY_STYLE_NOTHING: //no blurring
- _filter_modifier.set_blur_value(0);
- break;
- case QUERY_STYLE_SINGLE:
- case QUERY_STYLE_MULTIPLE_AVERAGED:
- case QUERY_STYLE_MULTIPLE_SAME:
- Geom::OptRect bbox = _subject->getBounds(SPItem::GEOMETRIC_BBOX);
- if (bbox) {
- double perimeter = bbox->dimensions()[Geom::X] + bbox->dimensions()[Geom::Y]; // fixme: this is only half the perimeter, is that correct?
- //update blur widget value
- float radius = query.filter_gaussianBlur_deviation.value;
- float percent = radius * 400 / perimeter; // so that for a square, 100% == half side
- _filter_modifier.set_blur_value(percent);
- }
- break;
- }
+ int blur_result = _subject->queryStyle(&query, QUERY_STYLE_PROPERTY_BLUR);
+ switch (blur_result) {
+ case QUERY_STYLE_NOTHING: // no blurring
+ _filter_modifier.set_blur_value(0);
+ break;
+ case QUERY_STYLE_SINGLE:
+ case QUERY_STYLE_MULTIPLE_AVERAGED:
+ case QUERY_STYLE_MULTIPLE_SAME:
+ Geom::OptRect bbox = _subject->getBounds(SPItem::GEOMETRIC_BBOX);
+ if (bbox) {
+ double perimeter =
+ bbox->dimensions()[Geom::X] +
+ bbox->dimensions()[Geom::Y]; // fixme: this is only half the perimeter, is that correct?
+ // update blur widget value
+ float radius = query.filter_gaussianBlur_deviation.value;
+ float percent = radius * 400 / perimeter; // so that for a square, 100% == half side
+ _filter_modifier.set_blur_value(percent);
+ }
+ break;
}
// If we have nothing selected, disable dialog.