WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
90101.patch (text/plain), 52.54 KB, created by
Max Vujovic
on 2012-07-13 14:35:29 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Max Vujovic
Created:
2012-07-13 14:35:29 PDT
Size:
52.54 KB
patch
obsolete
>diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 828de2d..4b8b5ce 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,16 @@ >+2012-07-13 Max Vujovic <mvujovic@adobe.com> >+ >+ [CSS Shaders] Parse mix function >+ https://bugs.webkit.org/show_bug.cgi?id=90101 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add tests for custom filter mix function parsing. >+ >+ * css3/filters/script-tests/custom-filter-property-computed-style.js: >+ * css3/filters/script-tests/custom-filter-property-parsing-invalid.js: >+ * css3/filters/script-tests/custom-filter-property-parsing.js: >+ > 2012-07-13 Vineet Chaudhary <rgf748@motorola.com> > > Restructure V8Utilities::extractTransferables() with help of toV8Sequence() >diff --git a/LayoutTests/css3/filters/script-tests/custom-filter-property-computed-style.js b/LayoutTests/css3/filters/script-tests/custom-filter-property-computed-style.js >index e80256e..5dd7b93 100644 >--- a/LayoutTests/css3/filters/script-tests/custom-filter-property-computed-style.js >+++ b/LayoutTests/css3/filters/script-tests/custom-filter-property-computed-style.js >@@ -46,7 +46,7 @@ function testFilterRule(description, rule, expectedValue, expectedTypes, expecte > stylesheet.insertRule("body { -webkit-filter: " + rule + "; }", 0); > > filterStyle = window.getComputedStyle(document.body); >- >+ > shouldBe("removeBaseURL(filterStyle.getPropertyValue('-webkit-filter'))", "'" + expectedValue + "'"); > > filterRule = filterStyle.getPropertyCSSValue('-webkit-filter'); >@@ -56,9 +56,9 @@ function testFilterRule(description, rule, expectedValue, expectedTypes, expecte > expectedTypes = ["WebKitCSSFilterValue.CSS_FILTER_CUSTOM"]; > expectedTexts = [expectedValue]; > } >- >+ > shouldBe("filterRule.length", "" + expectedTypes.length); // shouldBe expects string arguments >- >+ > if (filterRule) { > for (var i = 0; i < expectedTypes.length; i++) { > subRule = filterRule[i]; >@@ -66,7 +66,7 @@ function testFilterRule(description, rule, expectedValue, expectedTypes, expecte > shouldBe("removeBaseURL(subRule.cssText)", "'" + expectedTexts[i] + "'"); > } > } >- >+ > stylesheet.deleteRule(0); > } > >@@ -79,6 +79,40 @@ testFilterRule("Custom with fragment shader", > testFilterRule("Custom with both shaders", > "custom(url(vertex.shader) url(fragment.shader))", "custom(url(vertex.shader) url(fragment.shader), 1 1 filter-box)"); > >+testFilterRule("Custom with mix function", >+ "custom(none mix(url(fragment.shader)))", "custom(none mix(url(fragment.shader) normal src-over), 1 1 filter-box)"); >+ >+var blendModes = ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", >+ "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", >+ "saturation", "color", "luminosity"]; >+for (var i = 0; i < blendModes.length; i++) >+{ >+ var blendMode = blendModes[i]; >+ testFilterRule("Custom with mix function and blend mode " + blendMode, >+ "custom(none mix(url(fragment.shader) " + blendMode + "))", "custom(none mix(url(fragment.shader) " + blendMode + " src-over), 1 1 filter-box)"); >+} >+ >+var alphaCompositingModes = ["clear", "src", "dst", "src-over", "dst-over", "src-in", "dst-in", >+ "src-out", "dst-out", "src-atop", "dst-atop", "xor", "plus"]; >+for (var i = 0; i < alphaCompositingModes.length; i++) >+{ >+ var alphaCompositingMode = alphaCompositingModes[i]; >+ testFilterRule("Custom with mix function and alpha compositing mode " + alphaCompositingMode, >+ "custom(none mix(url(fragment.shader) " + alphaCompositingMode + "))", "custom(none mix(url(fragment.shader) normal " + alphaCompositingMode + "), 1 1 filter-box)"); >+} >+ >+testFilterRule("Custom with mix function and blend mode first, alpha compositing mode second", >+ "custom(none mix(url(fragment.shader) multiply clear))", "custom(none mix(url(fragment.shader) multiply clear), 1 1 filter-box)"); >+ >+testFilterRule("Custom with mix function and alpha compositing mode first, blend mode second", >+ "custom(none mix(url(fragment.shader) clear multiply))", "custom(none mix(url(fragment.shader) multiply clear), 1 1 filter-box)"); >+ >+testFilterRule("Custom with vertex shader and mix function", >+ "custom(url(vertex.shader) mix(url(fragment.shader)))", "custom(url(vertex.shader) mix(url(fragment.shader) normal src-over), 1 1 filter-box)"); >+ >+testFilterRule("Custom with mix function and mesh size", >+ "custom(none mix(url(fragment.shader)), 10)", "custom(none mix(url(fragment.shader) normal src-over), 10 10 filter-box)"); >+ > testFilterRule("Custom with mesh size", > "custom(url(vertex.shader), 10)", "custom(url(vertex.shader) none, 10 10 filter-box)"); > >@@ -119,16 +153,16 @@ testFilterRule("Custom with padding-box and detached", > "custom(none url(fragment.shader), padding-box detached)", "custom(none url(fragment.shader), 1 1 padding-box detached)"); > > testFilterRule("Custom with integer parameters", >- "custom(none url(fragment.shader), p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)", >- "custom(none url(fragment.shader), 1 1 filter-box, p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)"); >+ "custom(none url(fragment.shader), p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)", >+ "custom(none url(fragment.shader), 1 1 filter-box, p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)"); > > testFilterRule("Custom with float parameters", >- "custom(none url(fragment.shader), p1 1.1, p2 2.2 3.3, p3 3.1 4.1 5.1, p4 4.1 5.2 6.3 7.4)", >- "custom(none url(fragment.shader), 1 1 filter-box, p1 1.1, p2 2.2 3.3, p3 3.1 4.1 5.1, p4 4.1 5.2 6.3 7.4)"); >+ "custom(none url(fragment.shader), p1 1.1, p2 2.2 3.3, p3 3.1 4.1 5.1, p4 4.1 5.2 6.3 7.4)", >+ "custom(none url(fragment.shader), 1 1 filter-box, p1 1.1, p2 2.2 3.3, p3 3.1 4.1 5.1, p4 4.1 5.2 6.3 7.4)"); > > testFilterRule("Custom with mesh size and number parameters", >- "custom(none url(fragment.shader), 10 20 filter-box, p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)", >- "custom(none url(fragment.shader), 10 20 filter-box, p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)"); >+ "custom(none url(fragment.shader), 10 20 filter-box, p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)", >+ "custom(none url(fragment.shader), 10 20 filter-box, p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)"); > > testFilterRule("Multiple with fragment shader", > "grayscale() custom(none url(fragment.shader)) sepia()", "grayscale(1) custom(none url(fragment.shader), 1 1 filter-box) sepia(1)", >diff --git a/LayoutTests/css3/filters/script-tests/custom-filter-property-parsing-invalid.js b/LayoutTests/css3/filters/script-tests/custom-filter-property-parsing-invalid.js >index 6a14855..f1dd768 100644 >--- a/LayoutTests/css3/filters/script-tests/custom-filter-property-parsing-invalid.js >+++ b/LayoutTests/css3/filters/script-tests/custom-filter-property-parsing-invalid.js >@@ -34,6 +34,17 @@ testInvalidFilterRule("Too many shaders 1", "custom(url(shader1) url(shader2) ur > testInvalidFilterRule("Too many shaders 2", "custom(none none none)"); > testInvalidFilterRule("Too many shaders 3", "custom(none url(shader1) url(shader2) url(shader2))"); > >+testInvalidFilterRule("Mix function as vertex shader", "custom(mix(url(shader)))"); >+testInvalidFilterRule("Mix function with wrong name", "custom(none fn(url(shader)))"); >+testInvalidFilterRule("Mix function with 0 args", "custom(none mix())"); >+testInvalidFilterRule("Mix function with first arg not a URI", "custom(none mix(none))"); >+testInvalidFilterRule("Mix function with second arg not a blend mode or alpha compositing mode", "custom(none mix(url(shader) 0))"); >+testInvalidFilterRule("Mix function with third arg not a blend mode or alpha compositing mode", "custom(none mix(url(shader) normal 0))"); >+testInvalidFilterRule("Mix function with two blend modes", "custom(none mix(url(shader) multiply screen))"); >+testInvalidFilterRule("Mix function with two alpha compositing modes", "custom(none mix(url(shader) src dst))"); >+testInvalidFilterRule("Mix function with 4 args", "custom(none mix(url(shader) multiply clear normal))"); >+testInvalidFilterRule("Mix function with comma separators", "custom(none mix(url(shader), multiply, clear))"); >+ > testInvalidFilterRule("No shader", "custom(none, 10 20)"); > testInvalidFilterRule("Too many mesh sizes", "custom(none, 10 20 30)"); > testInvalidFilterRule("Wrong mesh-box type - 'padding'", "custom(url(shader), padding)"); >diff --git a/LayoutTests/css3/filters/script-tests/custom-filter-property-parsing.js b/LayoutTests/css3/filters/script-tests/custom-filter-property-parsing.js >index 4c0cba9..b403c38 100644 >--- a/LayoutTests/css3/filters/script-tests/custom-filter-property-parsing.js >+++ b/LayoutTests/css3/filters/script-tests/custom-filter-property-parsing.js >@@ -46,7 +46,7 @@ function testFilterRule(description, rule, expectedValue, expectedTypes, expecte > > stylesheet.insertRule("body { -webkit-filter: " + rule + "; }", 0); > cssRule = stylesheet.cssRules.item(0); >- >+ > shouldBe("cssRule.type", "1"); > > declaration = cssRule.style; >@@ -60,9 +60,9 @@ function testFilterRule(description, rule, expectedValue, expectedTypes, expecte > expectedTypes = ["WebKitCSSFilterValue.CSS_FILTER_CUSTOM"]; > expectedTexts = [expectedValue]; > } >- >+ > shouldBe("filterRule.length", "" + expectedTypes.length); // shouldBe expects string arguments >- >+ > if (filterRule) { > for (var i = 0; i < expectedTypes.length; i++) { > subRule = filterRule[i]; >@@ -73,44 +73,84 @@ function testFilterRule(description, rule, expectedValue, expectedTypes, expecte > } > > testFilterRule("Custom with vertex shader", >- "custom(url(vertex.shader))", "custom(url(vertex.shader))"); >+ "custom(url(vertex.shader))", "custom(url(vertex.shader))"); > > testFilterRule("Custom with fragment shader", >- "custom(none url(fragment.shader))", "custom(none url(fragment.shader))"); >+ "custom(none url(fragment.shader))", "custom(none url(fragment.shader))"); > > testFilterRule("Custom with both shaders", >- "custom(url(vertex.shader) url(fragment.shader))", "custom(url(vertex.shader) url(fragment.shader))"); >- >+ "custom(url(vertex.shader) url(fragment.shader))", "custom(url(vertex.shader) url(fragment.shader))"); >+ >+testFilterRule("Custom with mix function", >+ "custom(none mix(url(fragment.shader)))", "custom(none mix(url(fragment.shader)))"); >+ >+var blendModes = ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", >+ "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", >+ "color", "luminosity"]; >+for (var i = 0; i < blendModes.length; i++) >+{ >+ var blendMode = blendModes[i]; >+ testFilterRule("Custom with mix function and blend mode " + blendMode, >+ "custom(none mix(url(fragment.shader) " + blendMode + "))", "custom(none mix(url(fragment.shader) " + blendMode + "))"); >+} >+ >+var alphaCompositingModes = ["clear", "src", "dst", "src-over", "dst-over", "src-in", "dst-in", >+ "src-out", "dst-out", "src-atop", "dst-atop", "xor", "plus"]; >+for (var i = 0; i < alphaCompositingModes.length; i++) >+{ >+ var alphaCompositingMode = alphaCompositingModes[i]; >+ testFilterRule("Custom with mix function and alpha compositing mode " + alphaCompositingMode, >+ "custom(none mix(url(fragment.shader) " + alphaCompositingMode + "))", "custom(none mix(url(fragment.shader) " + alphaCompositingMode + "))"); >+} >+ >+testFilterRule("Custom with mix function and blend mode first, alpha compositing mode second", >+ "custom(none mix(url(fragment.shader) multiply clear))", "custom(none mix(url(fragment.shader) multiply clear))"); >+ >+testFilterRule("Custom with mix function and alpha compositing mode first, blend mode second", >+ "custom(none mix(url(fragment.shader) clear multiply))", "custom(none mix(url(fragment.shader) clear multiply))"); >+ >+testFilterRule("Custom with vertex shader and mix function", >+ "custom(url(vertex.shader) mix(url(fragment.shader)))", "custom(url(vertex.shader) mix(url(fragment.shader)))"); >+ >+testFilterRule("Custom with mix function in CAPS", >+ "custom(none MIX(url(fragment.shader)))", "custom(none mix(url(fragment.shader)))"); >+ >+testFilterRule("Custom with mix function and mesh size", >+ "custom(none mix(url(fragment.shader)), 10)", "custom(none mix(url(fragment.shader)), 10)"); >+ > testFilterRule("Custom with mesh size", >- "custom(url(vertex.shader), 10)", "custom(url(vertex.shader), 10)"); >+ "custom(url(vertex.shader), 10)", "custom(url(vertex.shader), 10)"); > > testFilterRule("Custom with both mesh sizes", >- "custom(none url(fragment.shader), 10 20)", "custom(none url(fragment.shader), 10 20)"); >+ "custom(none url(fragment.shader), 10 20)", "custom(none url(fragment.shader), 10 20)"); > > testFilterRule("Custom with detached mesh", >- "custom(none url(fragment.shader), detached)", "custom(none url(fragment.shader), detached)"); >- >+ "custom(none url(fragment.shader), detached)", "custom(none url(fragment.shader), detached)"); >+ > testFilterRule("Custom with detached and mesh size", >- "custom(none url(fragment.shader), 10 20 detached)", "custom(none url(fragment.shader), 10 20 detached)"); >+ "custom(none url(fragment.shader), 10 20 detached)", "custom(none url(fragment.shader), 10 20 detached)"); > > testFilterRule("Custom with number parameters", >- "custom(none url(fragment.shader), p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)", >- "custom(none url(fragment.shader), p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)"); >+ "custom(none url(fragment.shader), p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)", >+ "custom(none url(fragment.shader), p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)"); > > testFilterRule("Custom with float parameters", >- "custom(none url(fragment.shader), p1 1.1, p2 2.2 3.3, p3 3.1 4.1 5.1, p4 4.1 5.2 6.3 7.4)", >- "custom(none url(fragment.shader), p1 1.1, p2 2.2 3.3, p3 3.1 4.1 5.1, p4 4.1 5.2 6.3 7.4)"); >- >+ "custom(none url(fragment.shader), p1 1.1, p2 2.2 3.3, p3 3.1 4.1 5.1, p4 4.1 5.2 6.3 7.4)", >+ "custom(none url(fragment.shader), p1 1.1, p2 2.2 3.3, p3 3.1 4.1 5.1, p4 4.1 5.2 6.3 7.4)"); > > testFilterRule("Custom with mesh size and number parameters", >- "custom(none url(fragment.shader), 10 20, p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)", >- "custom(none url(fragment.shader), 10 20, p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)"); >+ "custom(none url(fragment.shader), 10 20, p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)", >+ "custom(none url(fragment.shader), 10 20, p1 1, p2 2 3, p3 3 4 5, p4 4 5 6 7)"); > > testFilterRule("Multiple with fragment shader", >- "grayscale() custom(none url(fragment.shader)) sepia()", "grayscale() custom(none url(fragment.shader)) sepia()", >- ["WebKitCSSFilterValue.CSS_FILTER_GRAYSCALE", >- "WebKitCSSFilterValue.CSS_FILTER_CUSTOM", >- "WebKitCSSFilterValue.CSS_FILTER_SEPIA"], >- ["grayscale()", >- "custom(none url(fragment.shader))", >- "sepia()"]); >+ "grayscale() custom(none url(fragment.shader)) sepia()", "grayscale() custom(none url(fragment.shader)) sepia()", >+ ["WebKitCSSFilterValue.CSS_FILTER_GRAYSCALE", >+ "WebKitCSSFilterValue.CSS_FILTER_CUSTOM", >+ "WebKitCSSFilterValue.CSS_FILTER_SEPIA"], >+ ["grayscale()", >+ "custom(none url(fragment.shader))", >+ "sepia()"]); >+ >+testFilterRule("Custom in CAPS", >+ "CUSTOM(url(vertex.shader))", "custom(url(vertex.shader))"); >+ >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index a7dcf2d..d07938b 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,88 @@ >+2012-07-13 Max Vujovic <mvujovic@adobe.com> >+ >+ [CSS Shaders] Parse mix function >+ https://bugs.webkit.org/show_bug.cgi?id=90101 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Parse the mix function syntax for CSS Shaders as defined in the Filter Effects spec: >+ https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#FilterFunction >+ >+ The fragment shader argument of the custom filter function can now be a mix function with >+ the following syntax: >+ mix(<uri> [ <blend-mode> || <alpha-compositing> ]?) >+ >+ For example: >+ -webkit-filter: custom(url(shader.vert) mix(url(shader.frag multiply src-over)) >+ >+ The Filter Effects spec references the Compositing and Blending spec, which defines the >+ supported blend modes and alpha compositing modes. >+ >+ Blend modes: >+ https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blend-mode >+ >+ Alpha compositing modes: >+ https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#alpha-compositing >+ >+ When we implement the Compositing and Blending spec, we can reuse the code related to the >+ blend mode and alpha compositing mode constants. >+ >+ Test: css3/filters/script-tests/custom-filter-property-computed-style.js: >+ css3/filters/script-tests/custom-filter-property-parsing-invalid.js: >+ css3/filters/script-tests/custom-filter-property-parsing.js: >+ >+ * GNUmakefile.list.am: Add WebKitCSSMixFunctionValue.h and .cpp to build. >+ * Target.pri: Ditto. >+ * WebCore.gypi: Ditto. >+ * WebCore.xcodeproj/project.pbxproj: Ditto. >+ * css/CSSComputedStyleDeclaration.cpp: >+ (WebCore::CSSComputedStyleDeclaration::valueForFilter): Add support for mix function for >+ getComputedStyle(). >+ * css/CSSParser.cpp: >+ (WebCore::CSSParser::isBlendMode): This new function is called from CSSParser and >+ StyleResolver. >+ (WebCore): >+ (WebCore::CSSParser::isAlphaCompositingMode): Ditto. >+ (WebCore::CSSParser::parseMixFunction): >+ (WebCore::CSSParser::parseCustomFilter): >+ * css/CSSParser.h: >+ (WebCore): >+ * css/CSSPrimitiveValueMappings.h: >+ (WebCore): >+ (WebCore::CSSPrimitiveValue::CSSPrimitiveValue): >+ (WebCore::CSSPrimitiveValue::operator EBlendMode): >+ (WebCore::CSSPrimitiveValue::operator EAlphaCompositingMode): >+ * css/CSSValue.cpp: >+ (WebCore::CSSValue::cssText): Add support for the new WebKitCSSMixFunction type. >+ (WebCore::CSSValue::destroy): Ditto. >+ (WebCore::CSSValue::cloneForCSSOM): Ditto. >+ * css/CSSValue.h: >+ (WebCore::CSSValue::isWebKitCSSMixFunctionValue): >+ * css/CSSValueKeywords.in: Add all of the blending and compositing modes. >+ * css/StyleResolver.cpp: Resolve the mix function CSS values and set the appropriate >+ properties in the newly created CustomFilterOperation. >+ * css/WebKitCSSMixFunctionValue.cpp: Added. >+ (WebCore): >+ (WebCore::WebKitCSSMixFunctionValue::WebKitCSSMixFunctionValue): >+ (WebCore::WebKitCSSMixFunctionValue::customCssText): Prints "mix(...)". >+ (WebCore::WebKitCSSMixFunctionValue::cloneForCSSOM): >+ * css/WebKitCSSMixFunctionValue.h: Added. >+ (WebCore): >+ (WebKitCSSMixFunctionValue): >+ (WebCore::WebKitCSSMixFunctionValue::create): >+ * platform/graphics/filters/CustomFilterOperation.cpp: >+ (WebCore::CustomFilterOperation::CustomFilterOperation): Add new blend mode and >+ compositing mode properties to constructor. >+ (WebCore::CustomFilterOperation::blend): Use the new CustomFilterOperation constructor. >+ * platform/graphics/filters/CustomFilterOperation.h: >+ (WebCore::CustomFilterOperation::create): >+ (WebCore::CustomFilterOperation::usesBlendingAndCompositing): New property. >+ (WebCore::CustomFilterOperation::blendMode): New property. >+ (WebCore::CustomFilterOperation::alphaCompositingMode): New property. >+ (CustomFilterOperation): >+ * rendering/style/RenderStyleConstants.h: Add constants for the blending and compositing >+ modes. >+ > 2012-07-13 Benjamin Poulain <bpoulain@apple.com> > > Always aggressively preload on iOS >diff --git a/Source/WebCore/GNUmakefile.list.am b/Source/WebCore/GNUmakefile.list.am >index 6b28655..190c219 100644 >--- a/Source/WebCore/GNUmakefile.list.am >+++ b/Source/WebCore/GNUmakefile.list.am >@@ -1790,6 +1790,8 @@ webcore_sources += \ > Source/WebCore/css/WebKitCSSKeyframesRule.h \ > Source/WebCore/css/WebKitCSSMatrix.cpp \ > Source/WebCore/css/WebKitCSSMatrix.h \ >+ Source/WebCore/css/WebKitCSSMixFunctionValue.cpp \ >+ Source/WebCore/css/WebKitCSSMixFunctionValue.h \ > Source/WebCore/css/WebKitCSSRegionRule.cpp \ > Source/WebCore/css/WebKitCSSRegionRule.h \ > Source/WebCore/css/WebKitCSSSVGDocumentValue.cpp \ >diff --git a/Source/WebCore/Target.pri b/Source/WebCore/Target.pri >index d65cedd..676f62a 100644 >--- a/Source/WebCore/Target.pri >+++ b/Source/WebCore/Target.pri >@@ -507,6 +507,7 @@ SOURCES += \ > css/WebKitCSSKeyframeRule.cpp \ > css/WebKitCSSKeyframesRule.cpp \ > css/WebKitCSSMatrix.cpp \ >+ css/WebKitCSSMixFunctionValue.cpp \ > css/WebKitCSSRegionRule.cpp \ > css/WebKitCSSSVGDocumentValue.cpp \ > css/WebKitCSSShaderValue.cpp \ >@@ -1700,6 +1701,7 @@ HEADERS += \ > css/WebKitCSSKeyframeRule.h \ > css/WebKitCSSKeyframesRule.h \ > css/WebKitCSSMatrix.h \ >+ css/WebKitCSSMixFunctionValue.h \ > css/WebKitCSSRegionRule.h \ > css/WebKitCSSSVGDocumentValue.h \ > css/WebKitCSSShaderValue.h \ >diff --git a/Source/WebCore/WebCore.gypi b/Source/WebCore/WebCore.gypi >index b311124..53449a3 100644 >--- a/Source/WebCore/WebCore.gypi >+++ b/Source/WebCore/WebCore.gypi >@@ -108,6 +108,7 @@ > 'css/LengthFunctions.h', > 'css/Pair.h', > 'css/WebKitCSSFilterValue.h', >+ 'css/WebKitCSSMixFunctionValue.h', > 'css/WebKitCSSShaderValue.h', > 'css/WebKitCSSTransformValue.h', > 'editing/ApplyBlockElementCommand.h', >@@ -2596,6 +2597,8 @@ > 'css/WebKitCSSKeyframesRule.h', > 'css/WebKitCSSMatrix.cpp', > 'css/WebKitCSSMatrix.h', >+ 'css/WebKitCSSMixFunctionValue.cpp', >+ 'css/WebKitCSSMixFunctionValue.h', > 'css/WebKitCSSRegionRule.cpp', > 'css/WebKitCSSRegionRule.h', > 'css/WebKitCSSShaderValue.cpp', >diff --git a/Source/WebCore/css/CSSComputedStyleDeclaration.cpp b/Source/WebCore/css/CSSComputedStyleDeclaration.cpp >index 208d470..177e1c3 100644 >--- a/Source/WebCore/css/CSSComputedStyleDeclaration.cpp >+++ b/Source/WebCore/css/CSSComputedStyleDeclaration.cpp >@@ -61,6 +61,7 @@ > #include "CustomFilterNumberParameter.h" > #include "CustomFilterOperation.h" > #include "CustomFilterParameter.h" >+#include "WebKitCSSMixFunctionValue.h" > #endif > > #if ENABLE(CSS_FILTERS) >@@ -861,14 +862,24 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::valueForFilter(RenderStyle* st > StyleCustomFilterProgram* program = static_cast<StyleCustomFilterProgram*>(customOperation->program()); > > RefPtr<CSSValueList> shadersList = CSSValueList::createSpaceSeparated(); >+ > if (program->vertexShader()) > shadersList->append(program->vertexShader()->cssValue()); > else > shadersList->append(cssValuePool().createIdentifierValue(CSSValueNone)); >- if (program->fragmentShader()) >- shadersList->append(program->fragmentShader()->cssValue()); >- else >- shadersList->append(cssValuePool().createIdentifierValue(CSSValueNone)); >+ >+ if (customOperation->usesBlendingAndCompositing()) { >+ RefPtr<WebKitCSSMixFunctionValue> mixFunction = WebKitCSSMixFunctionValue::create(); >+ mixFunction->append(program->fragmentShader()->cssValue()); >+ mixFunction->append(cssValuePool().createValue(customOperation->blendMode())); >+ mixFunction->append(cssValuePool().createValue(customOperation->alphaCompositingMode())); >+ shadersList->append(mixFunction.release()); >+ } else { >+ if (program->fragmentShader()) >+ shadersList->append(program->fragmentShader()->cssValue()); >+ else >+ shadersList->append(cssValuePool().createIdentifierValue(CSSValueNone)); >+ } > filterValue->append(shadersList.release()); > > RefPtr<CSSValueList> meshParameters = CSSValueList::createSpaceSeparated(); >diff --git a/Source/WebCore/css/CSSParser.cpp b/Source/WebCore/css/CSSParser.cpp >index d682883..bcd5198 100644 >--- a/Source/WebCore/css/CSSParser.cpp >+++ b/Source/WebCore/css/CSSParser.cpp >@@ -100,6 +100,7 @@ > #endif > > #if ENABLE(CSS_SHADERS) >+#include "WebKitCSSMixFunctionValue.h" > #include "WebKitCSSShaderValue.h" > #endif > >@@ -7323,6 +7324,100 @@ static bool acceptCommaOperator(CSSParserValueList* argsList) > return true; > } > >+bool CSSParser::isBlendMode(int ident) >+{ >+ switch (ident) { >+ case CSSValueNormal: >+ case CSSValueMultiply: >+ case CSSValueScreen: >+ case CSSValueOverlay: >+ case CSSValueDarken: >+ case CSSValueLighten: >+ case CSSValueColorDodge: >+ case CSSValueColorBurn: >+ case CSSValueHardLight: >+ case CSSValueSoftLight: >+ case CSSValueDifference: >+ case CSSValueExclusion: >+ case CSSValueHue: >+ case CSSValueSaturation: >+ case CSSValueColor: >+ case CSSValueLuminosity: >+ return true; >+ default: >+ return false; >+ } >+} >+ >+bool CSSParser::isAlphaCompositingMode(int ident) >+{ >+ switch (ident) { >+ case CSSValueClear: >+ case CSSValueSrc: >+ case CSSValueDst: >+ case CSSValueSrcOver: >+ case CSSValueDstOver: >+ case CSSValueSrcIn: >+ case CSSValueDstIn: >+ case CSSValueSrcOut: >+ case CSSValueDstOut: >+ case CSSValueSrcAtop: >+ case CSSValueDstAtop: >+ case CSSValueXor: >+ case CSSValuePlus: >+ return true; >+ default: >+ return false; >+ } >+} >+ >+PassRefPtr<WebKitCSSMixFunctionValue> CSSParser::parseMixFunction(CSSParserValue* value) >+{ >+ ASSERT(value->unit == CSSParserValue::Function && value->function); >+ >+ if (!equalIgnoringCase(value->function->name, "mix(")) >+ return 0; >+ >+ RefPtr<WebKitCSSMixFunctionValue> mixFunction = WebKitCSSMixFunctionValue::create(); >+ >+ CSSParserValueList* argsList = value->function->args.get(); >+ int argNumber = 0; >+ bool hasBlendMode = false; >+ bool hasAlphaCompositing = false; >+ CSSParserValue* arg; >+ while ((arg = argsList->current())) { >+ RefPtr<CSSValue> value; >+ >+ if (!argNumber) { >+ if (arg->unit == CSSPrimitiveValue::CSS_URI) { >+ KURL shaderURL = completeURL(arg->string); >+ value = WebKitCSSShaderValue::create(shaderURL.string()); >+ } >+ } else if (argNumber == 1 || argNumber == 2) { >+ if (!hasBlendMode && isBlendMode(arg->id)) { >+ hasBlendMode = true; >+ value = cssValuePool().createIdentifierValue(arg->id); >+ } else if (!hasAlphaCompositing && isAlphaCompositingMode(arg->id)) { >+ hasAlphaCompositing = true; >+ value = cssValuePool().createIdentifierValue(arg->id); >+ } >+ } >+ >+ if (!value) >+ return 0; >+ >+ mixFunction->append(value.release()); >+ >+ arg = argsList->next(); >+ argNumber++; >+ } >+ >+ if (!mixFunction->length()) >+ return 0; >+ >+ return mixFunction; >+} >+ > PassRefPtr<WebKitCSSFilterValue> CSSParser::parseCustomFilter(CSSParserValue* value) > { > CSSParserValueList* argsList = value->function->args.get(); >@@ -7334,7 +7429,13 @@ PassRefPtr<WebKitCSSFilterValue> CSSParser::parseCustomFilter(CSSParserValue* va > // Custom filter syntax: > // > // vertexShader: <uri> | none >- // fragmentShader: <uri> | none >+ // fragmentShader: <uri> | none | mix(<uri> [ <blend-mode> || <alpha-compositing> ]?) >+ // >+ // blend-mode: normal | multiply | screen | overlay | darken | lighten | color-dodge | >+ // color-burn | hard-light | soft-light | difference | exclusion | hue | >+ // saturation | color | luminosity >+ // alpha-compositing: clear | src | dst | src-over | dst-over | src-in | dst-in | >+ // src-out | dst-out | src-atop | dst-atop | xor | plus > // > // box: filter-box | border-box | padding-box | content-box > // vertexMesh: +<integer>{1,2}[wsp<box>][wsp'detached'] >@@ -7359,6 +7460,7 @@ PassRefPtr<WebKitCSSFilterValue> CSSParser::parseCustomFilter(CSSParserValue* va > // 1. Parse the shader URLs: <vertex-shader>[wsp<fragment-shader>] > RefPtr<CSSValueList> shadersList = CSSValueList::createSpaceSeparated(); > bool hadAtLeastOneCustomShader = false; >+ int argNumber = 0; > CSSParserValue* arg; > while ((arg = argsList->current())) { > RefPtr<CSSValue> value; >@@ -7368,11 +7470,16 @@ PassRefPtr<WebKitCSSFilterValue> CSSParser::parseCustomFilter(CSSParserValue* va > KURL shaderURL = completeURL(arg->string); > value = WebKitCSSShaderValue::create(shaderURL.string()); > hadAtLeastOneCustomShader = true; >+ } else if (argNumber == 1 && arg->unit == CSSParserValue::Function) { >+ value = parseMixFunction(arg); >+ hadAtLeastOneCustomShader = value; > } >+ > if (!value) > break; > shadersList->append(value.release()); > argsList->next(); >+ argNumber++; > } > > if (!shadersList->length() || !hadAtLeastOneCustomShader || shadersList->length() > 2 || !acceptCommaOperator(argsList)) >diff --git a/Source/WebCore/css/CSSParser.h b/Source/WebCore/css/CSSParser.h >index 6acbba2..a6aa4dd 100644 >--- a/Source/WebCore/css/CSSParser.h >+++ b/Source/WebCore/css/CSSParser.h >@@ -64,6 +64,10 @@ class StyleKeyframe; > class StyleSheetContents; > class StyledElement; > >+#if ENABLE(CSS_SHADERS) >+class WebKitCSSMixFunctionValue; >+#endif >+ > class CSSParser { > public: > CSSParser(const CSSParserContext&); >@@ -213,6 +217,9 @@ public: > PassRefPtr<CSSValueList> parseFilter(); > PassRefPtr<WebKitCSSFilterValue> parseBuiltinFilterArguments(CSSParserValueList*, WebKitCSSFilterValue::FilterOperationType); > #if ENABLE(CSS_SHADERS) >+ static bool isBlendMode(int ident); >+ static bool isAlphaCompositingMode(int ident); >+ PassRefPtr<WebKitCSSMixFunctionValue> parseMixFunction(CSSParserValue*); > PassRefPtr<WebKitCSSFilterValue> parseCustomFilter(CSSParserValue*); > #endif > #endif >diff --git a/Source/WebCore/css/CSSPrimitiveValueMappings.h b/Source/WebCore/css/CSSPrimitiveValueMappings.h >index 4855ec3..890aad2 100644 >--- a/Source/WebCore/css/CSSPrimitiveValueMappings.h >+++ b/Source/WebCore/css/CSSPrimitiveValueMappings.h >@@ -3362,6 +3362,185 @@ template<> inline CSSPrimitiveValue::operator CustomFilterOperation::MeshBoxType > return CustomFilterOperation::FILTER_BOX; > } > } >+ >+template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBlendMode blendMode) >+ : CSSValue(PrimitiveClass) >+{ >+ m_primitiveUnitType = CSS_IDENT; >+ switch (blendMode) { >+ case BlendModeNormal: >+ m_value.ident = CSSValueNormal; >+ break; >+ case BlendModeMultiply: >+ m_value.ident = CSSValueMultiply; >+ break; >+ case BlendModeScreen: >+ m_value.ident = CSSValueScreen; >+ break; >+ case BlendModeOverlay: >+ m_value.ident = CSSValueOverlay; >+ break; >+ case BlendModeDarken: >+ m_value.ident = CSSValueDarken; >+ break; >+ case BlendModeLighten: >+ m_value.ident = CSSValueLighten; >+ break; >+ case BlendModeColorDodge: >+ m_value.ident = CSSValueColorDodge; >+ break; >+ case BlendModeColorBurn: >+ m_value.ident = CSSValueColorBurn; >+ break; >+ case BlendModeHardLight: >+ m_value.ident = CSSValueHardLight; >+ break; >+ case BlendModeSoftLight: >+ m_value.ident = CSSValueSoftLight; >+ break; >+ case BlendModeDifference: >+ m_value.ident = CSSValueDifference; >+ break; >+ case BlendModeExclusion: >+ m_value.ident = CSSValueExclusion; >+ break; >+ case BlendModeHue: >+ m_value.ident = CSSValueHue; >+ break; >+ case BlendModeSaturation: >+ m_value.ident = CSSValueSaturation; >+ break; >+ case BlendModeColor: >+ m_value.ident = CSSValueColor; >+ break; >+ case BlendModeLuminosity: >+ m_value.ident = CSSValueLuminosity; >+ break; >+ } >+} >+ >+template<> inline CSSPrimitiveValue::operator EBlendMode() const >+{ >+ switch (m_value.ident) { >+ case CSSValueNormal: >+ return BlendModeNormal; >+ case CSSValueMultiply: >+ return BlendModeMultiply; >+ case CSSValueScreen: >+ return BlendModeScreen; >+ case CSSValueOverlay: >+ return BlendModeOverlay; >+ case CSSValueDarken: >+ return BlendModeDarken; >+ case CSSValueLighten: >+ return BlendModeLighten; >+ case CSSValueColorDodge: >+ return BlendModeColorDodge; >+ case CSSValueColorBurn: >+ return BlendModeColorBurn; >+ case CSSValueHardLight: >+ return BlendModeHardLight; >+ case CSSValueSoftLight: >+ return BlendModeSoftLight; >+ case CSSValueDifference: >+ return BlendModeDifference; >+ case CSSValueExclusion: >+ return BlendModeExclusion; >+ case CSSValueHue: >+ return BlendModeHue; >+ case CSSValueSaturation: >+ return BlendModeSaturation; >+ case CSSValueColor: >+ return BlendModeColor; >+ case CSSValueLuminosity: >+ return BlendModeLuminosity; >+ default: >+ ASSERT_NOT_REACHED(); >+ return BlendModeNormal; >+ } >+} >+ >+template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EAlphaCompositingMode alphaCompositingMode) >+ : CSSValue(PrimitiveClass) >+{ >+ m_primitiveUnitType = CSS_IDENT; >+ switch (alphaCompositingMode) { >+ case AlphaCompositingModeClear: >+ m_value.ident = CSSValueClear; >+ break; >+ case AlphaCompositingModeSrc: >+ m_value.ident = CSSValueSrc; >+ break; >+ case AlphaCompositingModeDst: >+ m_value.ident = CSSValueDst; >+ break; >+ case AlphaCompositingModeSrcOver: >+ m_value.ident = CSSValueSrcOver; >+ break; >+ case AlphaCompositingModeDstOver: >+ m_value.ident = CSSValueDstOver; >+ break; >+ case AlphaCompositingModeSrcIn: >+ m_value.ident = CSSValueSrcIn; >+ break; >+ case AlphaCompositingModeDstIn: >+ m_value.ident = CSSValueDstIn; >+ break; >+ case AlphaCompositingModeSrcOut: >+ m_value.ident = CSSValueSrcOut; >+ break; >+ case AlphaCompositingModeDstOut: >+ m_value.ident = CSSValueDstOut; >+ break; >+ case AlphaCompositingModeSrcAtop: >+ m_value.ident = CSSValueSrcAtop; >+ break; >+ case AlphaCompositingModeDstAtop: >+ m_value.ident = CSSValueDstAtop; >+ break; >+ case AlphaCompositingModeXor: >+ m_value.ident = CSSValueXor; >+ break; >+ case AlphaCompositingModePlus: >+ m_value.ident = CSSValuePlus; >+ break; >+ } >+} >+ >+template<> inline CSSPrimitiveValue::operator EAlphaCompositingMode() const >+{ >+ switch (m_value.ident) { >+ case CSSValueClear: >+ return AlphaCompositingModeClear; >+ case CSSValueSrc: >+ return AlphaCompositingModeSrc; >+ case CSSValueDst: >+ return AlphaCompositingModeDst; >+ case CSSValueSrcOver: >+ return AlphaCompositingModeSrcOver; >+ case CSSValueDstOver: >+ return AlphaCompositingModeDstOver; >+ case CSSValueSrcIn: >+ return AlphaCompositingModeSrcIn; >+ case CSSValueDstIn: >+ return AlphaCompositingModeDstIn; >+ case CSSValueSrcOut: >+ return AlphaCompositingModeSrcOut; >+ case CSSValueDstOut: >+ return AlphaCompositingModeDstOut; >+ case CSSValueSrcAtop: >+ return AlphaCompositingModeSrcAtop; >+ case CSSValueDstAtop: >+ return AlphaCompositingModeDstAtop; >+ case CSSValueXor: >+ return AlphaCompositingModeXor; >+ case CSSValuePlus: >+ return AlphaCompositingModePlus; >+ default: >+ ASSERT_NOT_REACHED(); >+ return AlphaCompositingModeSrcOver; >+ } >+} > #endif // ENABLE(CSS_SHADERS) > > #if ENABLE(SVG) >diff --git a/Source/WebCore/css/CSSValue.cpp b/Source/WebCore/css/CSSValue.cpp >index cda43b9..b492474 100644 >--- a/Source/WebCore/css/CSSValue.cpp >+++ b/Source/WebCore/css/CSSValue.cpp >@@ -56,6 +56,7 @@ > #include "SVGColor.h" > #include "SVGPaint.h" > #include "WebKitCSSFilterValue.h" >+#include "WebKitCSSMixFunctionValue.h" > #include "WebKitCSSShaderValue.h" > #include "WebKitCSSTransformValue.h" > >@@ -188,6 +189,8 @@ String CSSValue::cssText() const > case WebKitCSSFilterClass: > return static_cast<const WebKitCSSFilterValue*>(this)->customCssText(); > #if ENABLE(CSS_SHADERS) >+ case WebKitCSSMixFunctionClass: >+ return static_cast<const WebKitCSSMixFunctionValue*>(this)->customCssText(); > case WebKitCSSShaderClass: > return static_cast<const WebKitCSSShaderValue*>(this)->customCssText(); > #endif >@@ -320,6 +323,9 @@ void CSSValue::destroy() > delete static_cast<WebKitCSSFilterValue*>(this); > return; > #if ENABLE(CSS_SHADERS) >+ case WebKitCSSMixFunctionClass: >+ delete static_cast<WebKitCSSMixFunctionValue*>(this); >+ return; > case WebKitCSSShaderClass: > delete static_cast<WebKitCSSShaderValue*>(this); > return; >@@ -358,6 +364,10 @@ PassRefPtr<CSSValue> CSSValue::cloneForCSSOM() const > #if ENABLE(CSS_FILTERS) > case WebKitCSSFilterClass: > return static_cast<const WebKitCSSFilterValue*>(this)->cloneForCSSOM(); >+#if ENABLE(CSS_SHADERS) >+ case WebKitCSSMixFunctionClass: >+ return static_cast<const WebKitCSSMixFunctionValue*>(this)->cloneForCSSOM(); >+#endif > #endif > case WebKitCSSTransformClass: > return static_cast<const WebKitCSSTransformValue*>(this)->cloneForCSSOM(); >diff --git a/Source/WebCore/css/CSSValue.h b/Source/WebCore/css/CSSValue.h >index 3850961..ba0c0cf 100644 >--- a/Source/WebCore/css/CSSValue.h >+++ b/Source/WebCore/css/CSSValue.h >@@ -90,6 +90,7 @@ public: > #if ENABLE(CSS_FILTERS) > bool isWebKitCSSFilterValue() const { return m_classType == WebKitCSSFilterClass; } > #if ENABLE(CSS_SHADERS) >+ bool isWebKitCSSMixFunctionValue() const { return m_classType == WebKitCSSMixFunctionClass; } > bool isWebKitCSSShaderValue() const { return m_classType == WebKitCSSShaderClass; } > #endif > #endif // ENABLE(CSS_FILTERS) >@@ -172,6 +173,9 @@ protected: > #endif > #if ENABLE(CSS_FILTERS) > WebKitCSSFilterClass, >+#if ENABLE(CSS_SHADERS) >+ WebKitCSSMixFunctionClass, >+#endif > #endif > WebKitCSSTransformClass, > // Do not append non-list class types here. >diff --git a/Source/WebCore/css/CSSValueKeywords.in b/Source/WebCore/css/CSSValueKeywords.in >index 8dc27c8..32fdd9f 100644 >--- a/Source/WebCore/css/CSSValueKeywords.in >+++ b/Source/WebCore/css/CSSValueKeywords.in >@@ -929,6 +929,40 @@ fine > // content-box > filter-box > detached >+ >+// blend modes >+// normal >+multiply >+screen >+// overlay >+darken >+lighten >+color-dodge >+color-burn >+hard-light >+soft-light >+difference >+exclusion >+hue >+saturation >+color >+luminosity >+ >+// compositing modes >+// clear >+src >+dst >+src-over >+dst-over >+src-in >+dst-in >+src-out >+dst-out >+src-atop >+dst-atop >+// xor >+plus >+ > #endif // CSS_SHADERS > #endif // CSS_FILTERS > >diff --git a/Source/WebCore/css/StyleResolver.cpp b/Source/WebCore/css/StyleResolver.cpp >index 8bc5efe..b9165f8 100644 >--- a/Source/WebCore/css/StyleResolver.cpp >+++ b/Source/WebCore/css/StyleResolver.cpp >@@ -152,6 +152,7 @@ > #include "StyleCustomFilterProgram.h" > #include "StylePendingShader.h" > #include "StyleShader.h" >+#include "WebKitCSSMixFunctionValue.h" > #include "WebKitCSSShaderValue.h" > #endif > >@@ -5207,7 +5208,40 @@ PassRefPtr<CustomFilterOperation> StyleResolver::createCustomFilterOperation(Web > > ASSERT(shadersList->length()); > RefPtr<StyleShader> vertexShader = styleShader(shadersList->itemWithoutBoundsCheck(0)); >- RefPtr<StyleShader> fragmentShader = (shadersList->length() > 1) ? styleShader(shadersList->itemWithoutBoundsCheck(1)) : 0; >+ >+ RefPtr<StyleShader> fragmentShader; >+ bool usesBlendingAndCompositing = false; >+ EBlendMode blendMode = BlendModeNormal; >+ EAlphaCompositingMode alphaCompositingMode = AlphaCompositingModeSrcOver; >+ >+ if (shadersList->length() > 1) { >+ CSSValue* fragmentShaderOrMixFunction = shadersList->itemWithoutBoundsCheck(1); >+ if (fragmentShaderOrMixFunction->isWebKitCSSMixFunctionValue()) { >+ usesBlendingAndCompositing = true; >+ >+ WebKitCSSMixFunctionValue* mixFunction = static_cast<WebKitCSSMixFunctionValue*>(fragmentShaderOrMixFunction); >+ CSSValueListIterator iterator(mixFunction); >+ >+ ASSERT(mixFunction->length()); >+ fragmentShader = styleShader(iterator.value()); >+ iterator.advance(); >+ >+ ASSERT(mixFunction->length() <= 3); >+ while (iterator.hasMore()) { >+ CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(iterator.value()); >+ >+ if (CSSParser::isBlendMode(primitiveValue->getIdent())) >+ blendMode = *primitiveValue; >+ else if (CSSParser::isAlphaCompositingMode(primitiveValue->getIdent())) >+ alphaCompositingMode = *primitiveValue; >+ else >+ ASSERT_NOT_REACHED(); >+ >+ iterator.advance(); >+ } >+ } else >+ fragmentShader = styleShader(fragmentShaderOrMixFunction); >+ } > > unsigned meshRows = 1; > unsigned meshColumns = 1; >@@ -5277,7 +5311,7 @@ PassRefPtr<CustomFilterOperation> StyleResolver::createCustomFilterOperation(Web > return 0; > > RefPtr<StyleCustomFilterProgram> program = StyleCustomFilterProgram::create(vertexShader.release(), fragmentShader.release()); >- return CustomFilterOperation::create(program.release(), parameterList, meshRows, meshColumns, meshBoxType, meshType); >+ return CustomFilterOperation::create(program.release(), parameterList, meshRows, meshColumns, meshBoxType, meshType, usesBlendingAndCompositing, blendMode, alphaCompositingMode); > } > #endif > >diff --git a/Source/WebCore/css/WebKitCSSMixFunctionValue.cpp b/Source/WebCore/css/WebKitCSSMixFunctionValue.cpp >new file mode 100644 >index 0000000..596b4d2 >--- /dev/null >+++ b/Source/WebCore/css/WebKitCSSMixFunctionValue.cpp >@@ -0,0 +1,59 @@ >+/* >+ * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * >+ * 1. Redistributions of source code must retain the above >+ * copyright notice, this list of conditions and the following >+ * disclaimer. >+ * 2. Redistributions in binary form must reproduce the above >+ * copyright notice, this list of conditions and the following >+ * disclaimer in the documentation and/or other materials >+ * provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER âAS ISâ AND ANY >+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE >+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, >+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, >+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR >+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR >+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF >+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF >+ * SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "WebKitCSSMixFunctionValue.h" >+ >+#if ENABLE(CSS_SHADERS) >+ >+namespace WebCore { >+ >+WebKitCSSMixFunctionValue::WebKitCSSMixFunctionValue() >+ : CSSValueList(WebKitCSSMixFunctionClass, SpaceSeparator) >+{ >+} >+ >+WebKitCSSMixFunctionValue::WebKitCSSMixFunctionValue(const WebKitCSSMixFunctionValue& cloneFrom) >+ : CSSValueList(cloneFrom) >+{ >+} >+ >+String WebKitCSSMixFunctionValue::customCssText() const >+{ >+ return "mix(" + CSSValueList::customCssText() + ")"; >+} >+ >+PassRefPtr<WebKitCSSMixFunctionValue> WebKitCSSMixFunctionValue::cloneForCSSOM() const >+{ >+ return adoptRef(new WebKitCSSMixFunctionValue(*this)); >+} >+ >+} // namespace WebCore >+ >+#endif // ENABLE(CSS_SHADERS) >diff --git a/Source/WebCore/css/WebKitCSSMixFunctionValue.h b/Source/WebCore/css/WebKitCSSMixFunctionValue.h >new file mode 100644 >index 0000000..8358968 >--- /dev/null >+++ b/Source/WebCore/css/WebKitCSSMixFunctionValue.h >@@ -0,0 +1,60 @@ >+/* >+ * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * >+ * 1. Redistributions of source code must retain the above >+ * copyright notice, this list of conditions and the following >+ * disclaimer. >+ * 2. Redistributions in binary form must reproduce the above >+ * copyright notice, this list of conditions and the following >+ * disclaimer in the documentation and/or other materials >+ * provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER âAS ISâ AND ANY >+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE >+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, >+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, >+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR >+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR >+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF >+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF >+ * SUCH DAMAGE. >+ */ >+ >+#ifndef WebKitCSSMixFunctionValue_h >+#define WebKitCSSMixFunctionValue_h >+ >+#if ENABLE(CSS_SHADERS) >+ >+#include "CSSValueList.h" >+#include <wtf/PassRefPtr.h> >+ >+namespace WebCore { >+ >+class WebKitCSSMixFunctionValue : public CSSValueList { >+public: >+ static PassRefPtr<WebKitCSSMixFunctionValue> create() >+ { >+ return adoptRef(new WebKitCSSMixFunctionValue()); >+ } >+ >+ String customCssText() const; >+ >+ PassRefPtr<WebKitCSSMixFunctionValue> cloneForCSSOM() const; >+ >+private: >+ WebKitCSSMixFunctionValue(); >+ WebKitCSSMixFunctionValue(const WebKitCSSMixFunctionValue& cloneFrom); >+}; >+ >+} // namespace WebCore >+ >+#endif // ENABLE(CSS_SHADERS) >+ >+#endif >diff --git a/Source/WebCore/platform/graphics/filters/CustomFilterOperation.cpp b/Source/WebCore/platform/graphics/filters/CustomFilterOperation.cpp >index f5c8172..e17b0cc 100644 >--- a/Source/WebCore/platform/graphics/filters/CustomFilterOperation.cpp >+++ b/Source/WebCore/platform/graphics/filters/CustomFilterOperation.cpp >@@ -94,7 +94,7 @@ void blendCustomFilterParameters(const CustomFilterParameterList& fromList, cons > ASSERT(checkCustomFilterParametersOrder(resultList)); > } > >-CustomFilterOperation::CustomFilterOperation(PassRefPtr<CustomFilterProgram> program, const CustomFilterParameterList& sortedParameters, unsigned meshRows, unsigned meshColumns, MeshBoxType meshBoxType, MeshType meshType) >+CustomFilterOperation::CustomFilterOperation(PassRefPtr<CustomFilterProgram> program, const CustomFilterParameterList& sortedParameters, unsigned meshRows, unsigned meshColumns, MeshBoxType meshBoxType, MeshType meshType, bool usesBlendingAndCompositing, EBlendMode blendMode, EAlphaCompositingMode alphaCompositingMode) > : FilterOperation(CUSTOM) > , m_program(program) > , m_parameters(sortedParameters) >@@ -102,6 +102,9 @@ CustomFilterOperation::CustomFilterOperation(PassRefPtr<CustomFilterProgram> pro > , m_meshColumns(meshColumns) > , m_meshBoxType(meshBoxType) > , m_meshType(meshType) >+ , m_usesBlendingAndCompositing(usesBlendingAndCompositing) >+ , m_blendMode(blendMode) >+ , m_alphaCompositingMode(alphaCompositingMode) > { > // Make sure that the parameters are alwyas sorted by name. We use that to merge two CustomFilterOperations in animations. > ASSERT(checkCustomFilterParametersOrder(m_parameters)); >@@ -129,7 +132,7 @@ PassRefPtr<FilterOperation> CustomFilterOperation::blend(const FilterOperation* > > CustomFilterParameterList animatedParameters; > blendCustomFilterParameters(fromOp->m_parameters, m_parameters, progress, animatedParameters); >- return CustomFilterOperation::create(m_program, animatedParameters, m_meshRows, m_meshColumns, m_meshBoxType, m_meshType); >+ return CustomFilterOperation::create(m_program, animatedParameters, m_meshRows, m_meshColumns, m_meshBoxType, m_meshType, m_usesBlendingAndCompositing, m_blendMode, m_alphaCompositingMode); > } > > } // namespace WebCore >diff --git a/Source/WebCore/platform/graphics/filters/CustomFilterOperation.h b/Source/WebCore/platform/graphics/filters/CustomFilterOperation.h >index 63507f5..ecf1cd8 100644 >--- a/Source/WebCore/platform/graphics/filters/CustomFilterOperation.h >+++ b/Source/WebCore/platform/graphics/filters/CustomFilterOperation.h >@@ -33,6 +33,7 @@ > #if ENABLE(CSS_SHADERS) > #include "CustomFilterProgram.h" > #include "FilterOperation.h" >+#include "RenderStyleConstants.h" > > #include <wtf/text/WTFString.h> > >@@ -59,10 +60,10 @@ public: > ATTACHED, > DETACHED > }; >- >- static PassRefPtr<CustomFilterOperation> create(PassRefPtr<CustomFilterProgram> program, const CustomFilterParameterList& sortedParameters, unsigned meshRows, unsigned meshColumns, MeshBoxType meshBoxType, MeshType meshType) >+ >+ static PassRefPtr<CustomFilterOperation> create(PassRefPtr<CustomFilterProgram> program, const CustomFilterParameterList& sortedParameters, unsigned meshRows, unsigned meshColumns, MeshBoxType meshBoxType, MeshType meshType, bool usesBlendingAndCompositing, EBlendMode blendMode, EAlphaCompositingMode alphaCompositingMode) > { >- return adoptRef(new CustomFilterOperation(program, sortedParameters, meshRows, meshColumns, meshBoxType, meshType)); >+ return adoptRef(new CustomFilterOperation(program, sortedParameters, meshRows, meshColumns, meshBoxType, meshType, usesBlendingAndCompositing, blendMode, alphaCompositingMode)); > } > > virtual PassRefPtr<FilterOperation> clone() const >@@ -82,6 +83,10 @@ public: > MeshBoxType meshBoxType() const { return m_meshBoxType; } > MeshType meshType() const { return m_meshType; } > >+ bool usesBlendingAndCompositing() const { return m_usesBlendingAndCompositing; } >+ EBlendMode blendMode() const { return m_blendMode; } >+ EAlphaCompositingMode alphaCompositingMode() const { return m_alphaCompositingMode; } >+ > virtual ~CustomFilterOperation(); > > virtual bool affectsOpacity() const { return true; } >@@ -103,7 +108,7 @@ private: > && customFilterParametersEqual(m_parameters, other->m_parameters); > } > >- CustomFilterOperation(PassRefPtr<CustomFilterProgram>, const CustomFilterParameterList&, unsigned meshRows, unsigned meshColumns, MeshBoxType, MeshType); >+ CustomFilterOperation(PassRefPtr<CustomFilterProgram>, const CustomFilterParameterList&, unsigned meshRows, unsigned meshColumns, MeshBoxType, MeshType, bool usesBlendingAndCompositing, EBlendMode, EAlphaCompositingMode); > > RefPtr<CustomFilterProgram> m_program; > CustomFilterParameterList m_parameters; >@@ -112,6 +117,10 @@ private: > unsigned m_meshColumns; > MeshBoxType m_meshBoxType; > MeshType m_meshType; >+ >+ bool m_usesBlendingAndCompositing; >+ EBlendMode m_blendMode; >+ EAlphaCompositingMode m_alphaCompositingMode; > }; > > } // namespace WebCore >diff --git a/Source/WebCore/rendering/style/RenderStyleConstants.h b/Source/WebCore/rendering/style/RenderStyleConstants.h >index 9c03f39..3260598 100644 >--- a/Source/WebCore/rendering/style/RenderStyleConstants.h >+++ b/Source/WebCore/rendering/style/RenderStyleConstants.h >@@ -470,6 +470,43 @@ enum WrapFlow { WrapFlowAuto, WrapFlowBoth, WrapFlowStart, WrapFlowEnd, WrapFlow > > enum WrapThrough { WrapThroughWrap, WrapThroughNone }; > >+#if ENABLE(CSS_SHADERS) >+enum EBlendMode { >+ BlendModeNormal, >+ BlendModeMultiply, >+ BlendModeScreen, >+ BlendModeOverlay, >+ BlendModeDarken, >+ BlendModeLighten, >+ BlendModeColorDodge, >+ BlendModeColorBurn, >+ BlendModeHardLight, >+ BlendModeSoftLight, >+ BlendModeDifference, >+ BlendModeExclusion, >+ BlendModeHue, >+ BlendModeSaturation, >+ BlendModeColor, >+ BlendModeLuminosity >+}; >+ >+enum EAlphaCompositingMode { >+ AlphaCompositingModeClear, >+ AlphaCompositingModeSrc, >+ AlphaCompositingModeDst, >+ AlphaCompositingModeSrcOver, >+ AlphaCompositingModeDstOver, >+ AlphaCompositingModeSrcIn, >+ AlphaCompositingModeDstIn, >+ AlphaCompositingModeSrcOut, >+ AlphaCompositingModeDstOut, >+ AlphaCompositingModeSrcAtop, >+ AlphaCompositingModeDstAtop, >+ AlphaCompositingModeXor, >+ AlphaCompositingModePlus >+}; >+#endif >+ > } // namespace WebCore > > #endif // RenderStyleConstants_h
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 90101
:
152334
|
152343
|
152371
|
152388
|
153877
|
153882
|
153908
|
153926
|
154184
|
154212
|
156115
|
156495
|
156759