summaryrefslogtreecommitdiffstats
path: root/src/display
diff options
context:
space:
mode:
authorTavmjong Bah <tavmjong@free.fr>2013-12-05 19:27:44 +0000
committertavmjong-free <tavmjong@free.fr>2013-12-05 19:27:44 +0000
commit74bdba2b41e6609f3cee0e5eac4f766307577968 (patch)
tree16fff098e56126eddfe1abdd4f0f7cb490bcb7ba /src/display
parentImageMagick exception handling improvements (see Bug #1252719). (diff)
downloadinkscape-74bdba2b41e6609f3cee0e5eac4f766307577968.tar.gz
inkscape-74bdba2b41e6609f3cee0e5eac4f766307577968.zip
New CSS blending and compositing modes.
Define WITH_CSSBLEND and/or WITH_CSSCOMPOSITE to try out. Note: these new modes are not yet defined to apply to SVG filters in the CSS Compositing and Blending Level 1 or in CSS Filters Level 1 specifications. They are expected to be included in Level 2. (bzr r12837)
Diffstat (limited to 'src/display')
-rw-r--r--src/display/nr-filter-blend.cpp52
-rw-r--r--src/display/nr-filter-blend.h16
-rw-r--r--src/display/nr-filter-composite.cpp35
3 files changed, 92 insertions, 11 deletions
diff --git a/src/display/nr-filter-blend.cpp b/src/display/nr-filter-blend.cpp
index bff7405b7..099816bce 100644
--- a/src/display/nr-filter-blend.cpp
+++ b/src/display/nr-filter-blend.cpp
@@ -83,6 +83,43 @@ void FilterBlend::render_cairo(FilterSlot &slot)
case BLEND_LIGHTEN:
cairo_set_operator(out_ct, CAIRO_OPERATOR_LIGHTEN);
break;
+#ifdef WITH_CSSBLEND
+ // NEW
+ case BLEND_OVERLAY:
+ cairo_set_operator(out_ct, CAIRO_OPERATOR_OVERLAY);
+ break;
+ case BLEND_COLORDODGE:
+ cairo_set_operator(out_ct, CAIRO_OPERATOR_COLOR_DODGE);
+ break;
+ case BLEND_COLORBURN:
+ cairo_set_operator(out_ct, CAIRO_OPERATOR_COLOR_BURN);
+ break;
+ case BLEND_HARDLIGHT:
+ cairo_set_operator(out_ct, CAIRO_OPERATOR_HARD_LIGHT);
+ break;
+ case BLEND_SOFTLIGHT:
+ cairo_set_operator(out_ct, CAIRO_OPERATOR_SOFT_LIGHT);
+ break;
+ case BLEND_DIFFERENCE:
+ cairo_set_operator(out_ct, CAIRO_OPERATOR_DIFFERENCE);
+ break;
+ case BLEND_EXCLUSION:
+ cairo_set_operator(out_ct, CAIRO_OPERATOR_EXCLUSION);
+ break;
+ case BLEND_HUE:
+ cairo_set_operator(out_ct, CAIRO_OPERATOR_HSL_HUE);
+ break;
+ case BLEND_SATURATION:
+ cairo_set_operator(out_ct, CAIRO_OPERATOR_HSL_SATURATION);
+ break;
+ case BLEND_COLOR:
+ cairo_set_operator(out_ct, CAIRO_OPERATOR_HSL_COLOR);
+ break;
+ case BLEND_LUMINOSITY:
+ cairo_set_operator(out_ct, CAIRO_OPERATOR_HSL_LUMINOSITY);
+ break;
+#endif
+
case BLEND_NORMAL:
default:
cairo_set_operator(out_ct, CAIRO_OPERATOR_OVER);
@@ -128,9 +165,18 @@ void FilterBlend::set_input(int input, int slot) {
}
void FilterBlend::set_mode(FilterBlendMode mode) {
- if (mode == BLEND_NORMAL || mode == BLEND_MULTIPLY ||
- mode == BLEND_SCREEN || mode == BLEND_DARKEN ||
- mode == BLEND_LIGHTEN)
+ if (mode == BLEND_NORMAL || mode == BLEND_MULTIPLY ||
+ mode == BLEND_SCREEN || mode == BLEND_DARKEN ||
+ mode == BLEND_LIGHTEN
+#ifdef WITH_CSSBLEND
+ || mode == BLEND_OVERLAY ||
+ mode == BLEND_COLORDODGE || mode == BLEND_COLORBURN ||
+ mode == BLEND_HARDLIGHT || mode == BLEND_SOFTLIGHT ||
+ mode == BLEND_DIFFERENCE || mode == BLEND_EXCLUSION ||
+ mode == BLEND_HUE || mode == BLEND_SATURATION ||
+ mode == BLEND_COLOR || mode == BLEND_LUMINOSITY
+#endif
+ )
{
_blend_mode = mode;
}
diff --git a/src/display/nr-filter-blend.h b/src/display/nr-filter-blend.h
index 957d3cfc8..0a2927d87 100644
--- a/src/display/nr-filter-blend.h
+++ b/src/display/nr-filter-blend.h
@@ -28,7 +28,21 @@ enum FilterBlendMode {
BLEND_SCREEN,
BLEND_DARKEN,
BLEND_LIGHTEN,
- BLEND_ENDMODE
+#ifdef WITH_CSSBLEND
+ // New in CSS Compositing and Blending Level 1
+ BLEND_OVERLAY,
+ BLEND_COLORDODGE,
+ BLEND_COLORBURN,
+ BLEND_HARDLIGHT,
+ BLEND_SOFTLIGHT,
+ BLEND_DIFFERENCE,
+ BLEND_EXCLUSION,
+ BLEND_HUE,
+ BLEND_SATURATION,
+ BLEND_COLOR,
+ BLEND_LUMINOSITY,
+#endif
+ BLEND_ENDMODE,
};
class FilterBlend : public FilterPrimitive {
diff --git a/src/display/nr-filter-composite.cpp b/src/display/nr-filter-composite.cpp
index f6decad0d..dc5e4278f 100644
--- a/src/display/nr-filter-composite.cpp
+++ b/src/display/nr-filter-composite.cpp
@@ -98,6 +98,33 @@ void FilterComposite::render_cairo(FilterSlot &slot)
case COMPOSITE_XOR:
cairo_set_operator(ct, CAIRO_OPERATOR_XOR);
break;
+#ifdef WITH_CSSCOMPOSITE
+ /* New CSS Operators */
+ case COMPOSITE_CLEAR:
+ cairo_set_operator(ct, CAIRO_OPERATOR_CLEAR);
+ break;
+ case COMPOSITE_COPY:
+ cairo_set_operator(ct, CAIRO_OPERATOR_SOURCE);
+ break;
+ case COMPOSITE_DESTINATION:
+ cairo_set_operator(ct, CAIRO_OPERATOR_DEST);
+ break;
+ case COMPOSITE_DESTINATION_OVER:
+ cairo_set_operator(ct, CAIRO_OPERATOR_DEST_OVER);
+ break;
+ case COMPOSITE_DESTINATION_IN:
+ cairo_set_operator(ct, CAIRO_OPERATOR_DEST_IN);
+ break;
+ case COMPOSITE_DESTINATION_OUT:
+ cairo_set_operator(ct, CAIRO_OPERATOR_DEST_OUT);
+ break;
+ case COMPOSITE_DESTINATION_ATOP:
+ cairo_set_operator(ct, CAIRO_OPERATOR_DEST_ATOP);
+ break;
+ case COMPOSITE_LIGHTER:
+ cairo_set_operator(ct, CAIRO_OPERATOR_ADD);
+ break;
+#endif
case COMPOSITE_OVER:
case COMPOSITE_DEFAULT:
default:
@@ -129,13 +156,7 @@ void FilterComposite::set_input(int input, int slot) {
void FilterComposite::set_operator(FeCompositeOperator op) {
if (op == COMPOSITE_DEFAULT) {
this->op = COMPOSITE_OVER;
- } else if (op == COMPOSITE_OVER ||
- op == COMPOSITE_IN ||
- op == COMPOSITE_OUT ||
- op == COMPOSITE_ATOP ||
- op == COMPOSITE_XOR ||
- op == COMPOSITE_ARITHMETIC)
- {
+ } else if (op != COMPOSITE_ENDOPERATOR) {
this->op = op;
}
}