Index: third_party/WebKit/Source/core/paint/FilterEffectBuilder.cpp |
diff --git a/third_party/WebKit/Source/core/paint/FilterEffectBuilder.cpp b/third_party/WebKit/Source/core/paint/FilterEffectBuilder.cpp |
index dd7124407d0dcd09bc8ef195f751853fe70ed796..a706fa1dc9eaf4255d7233477a21e0b7b0650374 100644 |
--- a/third_party/WebKit/Source/core/paint/FilterEffectBuilder.cpp |
+++ b/third_party/WebKit/Source/core/paint/FilterEffectBuilder.cpp |
@@ -42,21 +42,81 @@ |
namespace blink { |
-static inline void endMatrixRow(Vector<float>& parameters) |
+namespace { |
+ |
+inline void endMatrixRow(Vector<float>& matrix) |
+{ |
+ matrix.uncheckedAppend(0); |
+ matrix.uncheckedAppend(0); |
+} |
+ |
+inline void lastMatrixRow(Vector<float>& matrix) |
{ |
- parameters.append(0); |
- parameters.append(0); |
+ matrix.uncheckedAppend(0); |
+ matrix.uncheckedAppend(0); |
+ matrix.uncheckedAppend(0); |
+ matrix.uncheckedAppend(1); |
+ matrix.uncheckedAppend(0); |
} |
-static inline void lastMatrixRow(Vector<float>& parameters) |
+Vector<float> grayscaleMatrix(double amount) |
{ |
- parameters.append(0); |
- parameters.append(0); |
- parameters.append(0); |
- parameters.append(1); |
- parameters.append(0); |
+ double oneMinusAmount = clampTo(1 - amount, 0.0, 1.0); |
+ |
+ // See https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#grayscaleEquivalent |
+ // for information on parameters. |
+ Vector<float> matrix; |
+ matrix.reserveInitialCapacity(20); |
+ |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.2126 + 0.7874 * oneMinusAmount)); |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.7152 - 0.7152 * oneMinusAmount)); |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.0722 - 0.0722 * oneMinusAmount)); |
+ endMatrixRow(matrix); |
+ |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.2126 - 0.2126 * oneMinusAmount)); |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.7152 + 0.2848 * oneMinusAmount)); |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.0722 - 0.0722 * oneMinusAmount)); |
+ endMatrixRow(matrix); |
+ |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.2126 - 0.2126 * oneMinusAmount)); |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.7152 - 0.7152 * oneMinusAmount)); |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.0722 + 0.9278 * oneMinusAmount)); |
+ endMatrixRow(matrix); |
+ |
+ lastMatrixRow(matrix); |
+ return matrix; |
} |
+Vector<float> sepiaMatrix(double amount) |
+{ |
+ double oneMinusAmount = clampTo(1 - amount, 0.0, 1.0); |
+ |
+ // See https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#sepiaEquivalent |
+ // for information on parameters. |
+ Vector<float> matrix; |
+ matrix.reserveInitialCapacity(20); |
+ |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.393 + 0.607 * oneMinusAmount)); |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.769 - 0.769 * oneMinusAmount)); |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.189 - 0.189 * oneMinusAmount)); |
+ endMatrixRow(matrix); |
+ |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.349 - 0.349 * oneMinusAmount)); |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.686 + 0.314 * oneMinusAmount)); |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.168 - 0.168 * oneMinusAmount)); |
+ endMatrixRow(matrix); |
+ |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.272 - 0.272 * oneMinusAmount)); |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.534 - 0.534 * oneMinusAmount)); |
+ matrix.uncheckedAppend(narrowPrecisionToFloat(0.131 + 0.869 * oneMinusAmount)); |
+ endMatrixRow(matrix); |
+ |
+ lastMatrixRow(matrix); |
+ return matrix; |
+} |
+ |
+} // namespace |
+ |
FilterEffectBuilder::FilterEffectBuilder() |
{ |
} |
@@ -89,56 +149,12 @@ bool FilterEffectBuilder::build(Element* element, const FilterOperations& operat |
break; |
} |
case FilterOperation::GRAYSCALE: { |
- Vector<float> inputParameters; |
- double oneMinusAmount = clampTo(1 - toBasicColorMatrixFilterOperation(filterOperation)->amount(), 0.0, 1.0); |
- |
- // See https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#grayscaleEquivalent |
- // for information on parameters. |
- |
- inputParameters.append(narrowPrecisionToFloat(0.2126 + 0.7874 * oneMinusAmount)); |
- inputParameters.append(narrowPrecisionToFloat(0.7152 - 0.7152 * oneMinusAmount)); |
- inputParameters.append(narrowPrecisionToFloat(0.0722 - 0.0722 * oneMinusAmount)); |
- endMatrixRow(inputParameters); |
- |
- inputParameters.append(narrowPrecisionToFloat(0.2126 - 0.2126 * oneMinusAmount)); |
- inputParameters.append(narrowPrecisionToFloat(0.7152 + 0.2848 * oneMinusAmount)); |
- inputParameters.append(narrowPrecisionToFloat(0.0722 - 0.0722 * oneMinusAmount)); |
- endMatrixRow(inputParameters); |
- |
- inputParameters.append(narrowPrecisionToFloat(0.2126 - 0.2126 * oneMinusAmount)); |
- inputParameters.append(narrowPrecisionToFloat(0.7152 - 0.7152 * oneMinusAmount)); |
- inputParameters.append(narrowPrecisionToFloat(0.0722 + 0.9278 * oneMinusAmount)); |
- endMatrixRow(inputParameters); |
- |
- lastMatrixRow(inputParameters); |
- |
+ Vector<float> inputParameters = grayscaleMatrix(toBasicColorMatrixFilterOperation(filterOperation)->amount()); |
effect = FEColorMatrix::create(parentFilter.get(), FECOLORMATRIX_TYPE_MATRIX, inputParameters); |
break; |
} |
case FilterOperation::SEPIA: { |
- Vector<float> inputParameters; |
- double oneMinusAmount = clampTo(1 - toBasicColorMatrixFilterOperation(filterOperation)->amount(), 0.0, 1.0); |
- |
- // See https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#sepiaEquivalent |
- // for information on parameters. |
- |
- inputParameters.append(narrowPrecisionToFloat(0.393 + 0.607 * oneMinusAmount)); |
- inputParameters.append(narrowPrecisionToFloat(0.769 - 0.769 * oneMinusAmount)); |
- inputParameters.append(narrowPrecisionToFloat(0.189 - 0.189 * oneMinusAmount)); |
- endMatrixRow(inputParameters); |
- |
- inputParameters.append(narrowPrecisionToFloat(0.349 - 0.349 * oneMinusAmount)); |
- inputParameters.append(narrowPrecisionToFloat(0.686 + 0.314 * oneMinusAmount)); |
- inputParameters.append(narrowPrecisionToFloat(0.168 - 0.168 * oneMinusAmount)); |
- endMatrixRow(inputParameters); |
- |
- inputParameters.append(narrowPrecisionToFloat(0.272 - 0.272 * oneMinusAmount)); |
- inputParameters.append(narrowPrecisionToFloat(0.534 - 0.534 * oneMinusAmount)); |
- inputParameters.append(narrowPrecisionToFloat(0.131 + 0.869 * oneMinusAmount)); |
- endMatrixRow(inputParameters); |
- |
- lastMatrixRow(inputParameters); |
- |
+ Vector<float> inputParameters = sepiaMatrix(toBasicColorMatrixFilterOperation(filterOperation)->amount()); |
effect = FEColorMatrix::create(parentFilter.get(), FECOLORMATRIX_TYPE_MATRIX, inputParameters); |
break; |
} |