OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011 Apple Inc. All rights reserved. |
3 * Copyright (C) 2013 Google Inc. All rights reserved. | 3 * Copyright (C) 2013 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 matrix.uncheckedAppend(0); | 60 matrix.uncheckedAppend(0); |
61 matrix.uncheckedAppend(0); | 61 matrix.uncheckedAppend(0); |
62 matrix.uncheckedAppend(0); | 62 matrix.uncheckedAppend(0); |
63 matrix.uncheckedAppend(1); | 63 matrix.uncheckedAppend(1); |
64 matrix.uncheckedAppend(0); | 64 matrix.uncheckedAppend(0); |
65 } | 65 } |
66 | 66 |
67 Vector<float> grayscaleMatrix(double amount) { | 67 Vector<float> grayscaleMatrix(double amount) { |
68 double oneMinusAmount = clampTo(1 - amount, 0.0, 1.0); | 68 double oneMinusAmount = clampTo(1 - amount, 0.0, 1.0); |
69 | 69 |
70 // See https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#grayscaleEq
uivalent | 70 // See |
| 71 // https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#grayscaleEquiva
lent |
71 // for information on parameters. | 72 // for information on parameters. |
72 Vector<float> matrix; | 73 Vector<float> matrix; |
73 matrix.reserveInitialCapacity(20); | 74 matrix.reserveInitialCapacity(20); |
74 | 75 |
75 matrix.uncheckedAppend(clampTo<float>(0.2126 + 0.7874 * oneMinusAmount)); | 76 matrix.uncheckedAppend(clampTo<float>(0.2126 + 0.7874 * oneMinusAmount)); |
76 matrix.uncheckedAppend(clampTo<float>(0.7152 - 0.7152 * oneMinusAmount)); | 77 matrix.uncheckedAppend(clampTo<float>(0.7152 - 0.7152 * oneMinusAmount)); |
77 matrix.uncheckedAppend(clampTo<float>(0.0722 - 0.0722 * oneMinusAmount)); | 78 matrix.uncheckedAppend(clampTo<float>(0.0722 - 0.0722 * oneMinusAmount)); |
78 endMatrixRow(matrix); | 79 endMatrixRow(matrix); |
79 | 80 |
80 matrix.uncheckedAppend(clampTo<float>(0.2126 - 0.2126 * oneMinusAmount)); | 81 matrix.uncheckedAppend(clampTo<float>(0.2126 - 0.2126 * oneMinusAmount)); |
81 matrix.uncheckedAppend(clampTo<float>(0.7152 + 0.2848 * oneMinusAmount)); | 82 matrix.uncheckedAppend(clampTo<float>(0.7152 + 0.2848 * oneMinusAmount)); |
82 matrix.uncheckedAppend(clampTo<float>(0.0722 - 0.0722 * oneMinusAmount)); | 83 matrix.uncheckedAppend(clampTo<float>(0.0722 - 0.0722 * oneMinusAmount)); |
83 endMatrixRow(matrix); | 84 endMatrixRow(matrix); |
84 | 85 |
85 matrix.uncheckedAppend(clampTo<float>(0.2126 - 0.2126 * oneMinusAmount)); | 86 matrix.uncheckedAppend(clampTo<float>(0.2126 - 0.2126 * oneMinusAmount)); |
86 matrix.uncheckedAppend(clampTo<float>(0.7152 - 0.7152 * oneMinusAmount)); | 87 matrix.uncheckedAppend(clampTo<float>(0.7152 - 0.7152 * oneMinusAmount)); |
87 matrix.uncheckedAppend(clampTo<float>(0.0722 + 0.9278 * oneMinusAmount)); | 88 matrix.uncheckedAppend(clampTo<float>(0.0722 + 0.9278 * oneMinusAmount)); |
88 endMatrixRow(matrix); | 89 endMatrixRow(matrix); |
89 | 90 |
90 lastMatrixRow(matrix); | 91 lastMatrixRow(matrix); |
91 return matrix; | 92 return matrix; |
92 } | 93 } |
93 | 94 |
94 Vector<float> sepiaMatrix(double amount) { | 95 Vector<float> sepiaMatrix(double amount) { |
95 double oneMinusAmount = clampTo(1 - amount, 0.0, 1.0); | 96 double oneMinusAmount = clampTo(1 - amount, 0.0, 1.0); |
96 | 97 |
97 // See https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#sepiaEquiva
lent | 98 // See |
| 99 // https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html#sepiaEquivalent |
98 // for information on parameters. | 100 // for information on parameters. |
99 Vector<float> matrix; | 101 Vector<float> matrix; |
100 matrix.reserveInitialCapacity(20); | 102 matrix.reserveInitialCapacity(20); |
101 | 103 |
102 matrix.uncheckedAppend(clampTo<float>(0.393 + 0.607 * oneMinusAmount)); | 104 matrix.uncheckedAppend(clampTo<float>(0.393 + 0.607 * oneMinusAmount)); |
103 matrix.uncheckedAppend(clampTo<float>(0.769 - 0.769 * oneMinusAmount)); | 105 matrix.uncheckedAppend(clampTo<float>(0.769 - 0.769 * oneMinusAmount)); |
104 matrix.uncheckedAppend(clampTo<float>(0.189 - 0.189 * oneMinusAmount)); | 106 matrix.uncheckedAppend(clampTo<float>(0.189 - 0.189 * oneMinusAmount)); |
105 endMatrixRow(matrix); | 107 endMatrixRow(matrix); |
106 | 108 |
107 matrix.uncheckedAppend(clampTo<float>(0.349 - 0.349 * oneMinusAmount)); | 109 matrix.uncheckedAppend(clampTo<float>(0.349 - 0.349 * oneMinusAmount)); |
(...skipping 21 matching lines...) Expand all Loading... |
129 m_referenceBox(zoomedReferenceBox), | 131 m_referenceBox(zoomedReferenceBox), |
130 m_zoom(zoom), | 132 m_zoom(zoom), |
131 m_fillPaint(fillPaint), | 133 m_fillPaint(fillPaint), |
132 m_strokePaint(strokePaint) { | 134 m_strokePaint(strokePaint) { |
133 if (m_zoom != 1) | 135 if (m_zoom != 1) |
134 m_referenceBox.scale(1 / m_zoom); | 136 m_referenceBox.scale(1 / m_zoom); |
135 } | 137 } |
136 | 138 |
137 FilterEffect* FilterEffectBuilder::buildFilterEffect( | 139 FilterEffect* FilterEffectBuilder::buildFilterEffect( |
138 const FilterOperations& operations) const { | 140 const FilterOperations& operations) const { |
139 // Create a parent filter for shorthand filters. These have already been scale
d by the CSS code for page zoom, so scale is 1.0 here. | 141 // Create a parent filter for shorthand filters. These have already been |
| 142 // scaled by the CSS code for page zoom, so scale is 1.0 here. |
140 Filter* parentFilter = Filter::create(1.0f); | 143 Filter* parentFilter = Filter::create(1.0f); |
141 FilterEffect* previousEffect = parentFilter->getSourceGraphic(); | 144 FilterEffect* previousEffect = parentFilter->getSourceGraphic(); |
142 for (FilterOperation* filterOperation : operations.operations()) { | 145 for (FilterOperation* filterOperation : operations.operations()) { |
143 FilterEffect* effect = nullptr; | 146 FilterEffect* effect = nullptr; |
144 switch (filterOperation->type()) { | 147 switch (filterOperation->type()) { |
145 case FilterOperation::REFERENCE: { | 148 case FilterOperation::REFERENCE: { |
146 ReferenceFilterOperation& referenceOperation = | 149 ReferenceFilterOperation& referenceOperation = |
147 toReferenceFilterOperation(*filterOperation); | 150 toReferenceFilterOperation(*filterOperation); |
148 if (Filter* referenceFilter = | 151 if (Filter* referenceFilter = |
149 buildReferenceFilter(referenceOperation, previousEffect)) { | 152 buildReferenceFilter(referenceOperation, previousEffect)) { |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 effect = FEBoxReflect::create(parentFilter, | 274 effect = FEBoxReflect::create(parentFilter, |
272 boxReflectOperation->reflection()); | 275 boxReflectOperation->reflection()); |
273 break; | 276 break; |
274 } | 277 } |
275 default: | 278 default: |
276 break; | 279 break; |
277 } | 280 } |
278 | 281 |
279 if (effect) { | 282 if (effect) { |
280 if (filterOperation->type() != FilterOperation::REFERENCE) { | 283 if (filterOperation->type() != FilterOperation::REFERENCE) { |
281 // Unlike SVG, filters applied here should not clip to their primitive s
ubregions. | 284 // Unlike SVG, filters applied here should not clip to their primitive |
| 285 // subregions. |
282 effect->setClipsToBounds(false); | 286 effect->setClipsToBounds(false); |
283 effect->setOperatingColorSpace(ColorSpaceDeviceRGB); | 287 effect->setOperatingColorSpace(ColorSpaceDeviceRGB); |
284 effect->inputEffects().append(previousEffect); | 288 effect->inputEffects().append(previousEffect); |
285 } | 289 } |
286 if (previousEffect->originTainted()) | 290 if (previousEffect->originTainted()) |
287 effect->setOriginTainted(); | 291 effect->setOriginTainted(); |
288 previousEffect = effect; | 292 previousEffect = effect; |
289 } | 293 } |
290 } | 294 } |
291 return previousEffect; | 295 return previousEffect; |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 Filter::create(m_referenceBox, filterRegion, m_zoom, unitScaling); | 434 Filter::create(m_referenceBox, filterRegion, m_zoom, unitScaling); |
431 if (!previousEffect) | 435 if (!previousEffect) |
432 previousEffect = result->getSourceGraphic(); | 436 previousEffect = result->getSourceGraphic(); |
433 SVGFilterBuilder builder(previousEffect, nodeMap, m_fillPaint, m_strokePaint); | 437 SVGFilterBuilder builder(previousEffect, nodeMap, m_fillPaint, m_strokePaint); |
434 builder.buildGraph(result, filterElement, m_referenceBox); | 438 builder.buildGraph(result, filterElement, m_referenceBox); |
435 result->setLastEffect(builder.lastEffect()); | 439 result->setLastEffect(builder.lastEffect()); |
436 return result; | 440 return result; |
437 } | 441 } |
438 | 442 |
439 } // namespace blink | 443 } // namespace blink |
OLD | NEW |