[Webkit-unassigned] [Bug 98504] [CSS Shaders] Implement overlay, color-dodge, color-burn, hard-light, soft-light blend modes.
bugzilla-daemon at webkit.org
bugzilla-daemon at webkit.org
Mon Oct 8 11:48:18 PDT 2012
https://bugs.webkit.org/show_bug.cgi?id=98504
--- Comment #2 from Max Vujovic <mvujovic at adobe.com> 2012-10-08 11:48:53 PST ---
(From update of attachment 167299)
View in context: https://bugs.webkit.org/attachment.cgi?id=167299&action=review
> Source/WebCore/ChangeLog:3
> + [CSS Shaders] Implement overlay, color-dodge, color-burn, hard-light, soft-light blend modes.
Thanks for the patch, Huang!
I have some ideas about how to factor this now that you're implementing the more complicated blend modes :)
Basically, I want to break up the GLSL css_Blend function into two functions, css_BlendColor and css_BlendComponent. If we need to do per component blending, css_BlendColor calls css_BlendComponent for each color component. I've provided the details below. Please let me know if something is not clear.
> Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp:189
> const char* expression = 0;
Rename this blendColorExpression.
Give a default value of:
"Co = vec3(blendComponent(Cb.r, Cs.r), blendComponent(Cb.g, Cs.g), blendComponent(Cb.b, Cs.b));"
For the simpler blend modes that don't need to blend by component, we will overwrite this default value.
> Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp:190
> + const char* auxiliaryExpression = "";
Rename this to blendComponentExpression.
Give a default value of:
"return 0.0;"
This default value is just so this function compiles when it is not used.
> Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp:193
> expression = "Cs";
The existing blend mode expressions should change to this format:
blendColorExpression = "Co = Cs";
...
> Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp:213
> case BlendModeOverlay:
This entire case can be:
blendComponentExpression = SHADER(
if (Cb <= 0.5)
Co = Cs * (2.0 * Cb);
else
Co = Cs + (2.0 * Cb - 1.0) - (Cs * (2.0 * Cb - 1.0));
);
> Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp:237
> case BlendModeColorDodge:
This entire case can be:
blendComponentExpression = SHADER(
float divisor = 1.0 - Cs;
Co = (divisor != 0.0) ? (Cb / divisor) : 1.0;
);
Notice the divide by zero check I added. We need to make sure we don't ever divide by zero because different GPUs often behave differently in that case. I've seen some discard the entire fragment when a division by zero occurs in the shader.
> Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp:245
> + mediump vec3 one = vec3(1.0, 1.0, 1.0);
Even though I'm asking you to remove this line, a nicer way to write it in GLSL is:
mediump vec3 one = vec3(1.0);
> Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp:247
> + if (Cs.r >= 1.0)
I think it's better to move this clamping operation to the css_BlendColor function below because we always want the blending result to be between 0.0 and 1.0. Check out the GLSL clamp function: http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml
> Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp:256
> case BlendModeColorBurn:
The rest of the cases can also be written in the format I mentioned.
> Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp:265
> + mediump vec3 B = one - min(one, (one - Cb) / Cs);
When you write this expression, be careful to avoid the divide by zero.
> Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp:341
> return String::format(SHADER(
Add a function:
mediump vec3 css_BlendComponent(mediump float Cb, mediump float Cs)
{
float Co;
%s;
return Co;
}
> Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp:342
> mediump vec3 css_Blend(mediump vec3 Cb, mediump vec3 Cs)
Rename this function to css_BlendColor.
> Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp:345
> return %s;
Replace this function body with:
vec3 Co;
%s
return clamp(Co, 0.0, 1.0);
> Source/WebCore/platform/graphics/filters/CustomFilterValidatedProgram.cpp:347
> + ), auxiliaryExpression, expression);
Replace this with "blendComponentExpression, blendColorExpression".
--
Configure bugmail: https://bugs.webkit.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
More information about the webkit-unassigned
mailing list