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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
141 // Create a parent filter for shorthand filters. These have already been | 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. | 142 // scaled by the CSS code for page zoom, so scale is 1.0 here. |
143 Filter* parentFilter = Filter::create(1.0f); | 143 Filter* parentFilter = Filter::create(1.0f); |
144 FilterEffect* previousEffect = parentFilter->getSourceGraphic(); | 144 FilterEffect* previousEffect = parentFilter->getSourceGraphic(); |
145 for (FilterOperation* filterOperation : operations.operations()) { | 145 for (FilterOperation* filterOperation : operations.operations()) { |
146 FilterEffect* effect = nullptr; | 146 FilterEffect* effect = nullptr; |
147 switch (filterOperation->type()) { | 147 switch (filterOperation->type()) { |
148 case FilterOperation::REFERENCE: { | 148 case FilterOperation::REFERENCE: { |
149 ReferenceFilterOperation& referenceOperation = | 149 ReferenceFilterOperation& referenceOperation = |
150 toReferenceFilterOperation(*filterOperation); | 150 toReferenceFilterOperation(*filterOperation); |
151 if (Filter* referenceFilter = | 151 Filter* referenceFilter = |
152 buildReferenceFilter(referenceOperation, previousEffect)) { | 152 buildReferenceFilter(referenceOperation, previousEffect); |
153 if (referenceFilter) { | |
154 effect = referenceFilter->lastEffect(); | |
Stephen White
2016/10/27 17:10:51
I'm not sure I understand why we now grab the last
fs
2016/10/28 08:46:31
That's what we did previously as well (I only reor
Stephen White
2016/10/28 14:58:06
Oh right; I misread.
fs
2016/10/31 09:19:12
I'd expect something along those lines to be the r
| |
153 // TODO(fs): This is essentially only needed for the | 155 // TODO(fs): This is essentially only needed for the |
154 // side-effects (mapRect). The filter differs from the one | 156 // side-effects (mapRect). The filter differs from the one |
155 // computed just above in what the SourceGraphic is, and how | 157 // computed just above in what the SourceGraphic is, and how |
156 // it's connected to the filter-chain. | 158 // it's connected to the filter-chain. |
157 referenceOperation.setFilter( | 159 referenceFilter = buildReferenceFilter(referenceOperation, nullptr); |
158 buildReferenceFilter(referenceOperation, nullptr)); | |
159 effect = referenceFilter->lastEffect(); | |
160 } | 160 } |
161 referenceOperation.setFilter(referenceFilter); | |
161 break; | 162 break; |
162 } | 163 } |
163 case FilterOperation::GRAYSCALE: { | 164 case FilterOperation::GRAYSCALE: { |
164 Vector<float> inputParameters = grayscaleMatrix( | 165 Vector<float> inputParameters = grayscaleMatrix( |
165 toBasicColorMatrixFilterOperation(filterOperation)->amount()); | 166 toBasicColorMatrixFilterOperation(filterOperation)->amount()); |
166 effect = FEColorMatrix::create(parentFilter, FECOLORMATRIX_TYPE_MATRIX, | 167 effect = FEColorMatrix::create(parentFilter, FECOLORMATRIX_TYPE_MATRIX, |
167 inputParameters); | 168 inputParameters); |
168 break; | 169 break; |
169 } | 170 } |
170 case FilterOperation::SEPIA: { | 171 case FilterOperation::SEPIA: { |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
301 | 302 |
302 CompositorFilterOperations filters; | 303 CompositorFilterOperations filters; |
303 for (FilterOperation* op : operations.operations()) { | 304 for (FilterOperation* op : operations.operations()) { |
304 switch (op->type()) { | 305 switch (op->type()) { |
305 case FilterOperation::REFERENCE: { | 306 case FilterOperation::REFERENCE: { |
306 ReferenceFilterOperation& referenceOperation = | 307 ReferenceFilterOperation& referenceOperation = |
307 toReferenceFilterOperation(*op); | 308 toReferenceFilterOperation(*op); |
308 Filter* referenceFilter = | 309 Filter* referenceFilter = |
309 buildReferenceFilter(referenceOperation, nullptr); | 310 buildReferenceFilter(referenceOperation, nullptr); |
310 if (referenceFilter && referenceFilter->lastEffect()) { | 311 if (referenceFilter && referenceFilter->lastEffect()) { |
311 referenceOperation.setFilter(referenceFilter); | |
312 SkiaImageFilterBuilder::populateSourceGraphicImageFilters( | 312 SkiaImageFilterBuilder::populateSourceGraphicImageFilters( |
313 referenceFilter->getSourceGraphic(), nullptr, currentColorSpace); | 313 referenceFilter->getSourceGraphic(), nullptr, currentColorSpace); |
314 | 314 |
315 FilterEffect* filterEffect = referenceFilter->lastEffect(); | 315 FilterEffect* filterEffect = referenceFilter->lastEffect(); |
316 currentColorSpace = filterEffect->operatingColorSpace(); | 316 currentColorSpace = filterEffect->operatingColorSpace(); |
317 filters.appendReferenceFilter( | 317 filters.appendReferenceFilter( |
318 SkiaImageFilterBuilder::build(filterEffect, currentColorSpace)); | 318 SkiaImageFilterBuilder::build(filterEffect, currentColorSpace)); |
319 } | 319 } |
320 referenceOperation.setFilter(referenceFilter); | |
320 break; | 321 break; |
321 } | 322 } |
322 case FilterOperation::GRAYSCALE: | 323 case FilterOperation::GRAYSCALE: |
323 case FilterOperation::SEPIA: | 324 case FilterOperation::SEPIA: |
324 case FilterOperation::SATURATE: | 325 case FilterOperation::SATURATE: |
325 case FilterOperation::HUE_ROTATE: { | 326 case FilterOperation::HUE_ROTATE: { |
326 float amount = toBasicColorMatrixFilterOperation(*op).amount(); | 327 float amount = toBasicColorMatrixFilterOperation(*op).amount(); |
327 switch (op->type()) { | 328 switch (op->type()) { |
328 case FilterOperation::GRAYSCALE: | 329 case FilterOperation::GRAYSCALE: |
329 filters.appendGrayscaleFilter(amount); | 330 filters.appendGrayscaleFilter(amount); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
434 Filter::create(m_referenceBox, filterRegion, m_zoom, unitScaling); | 435 Filter::create(m_referenceBox, filterRegion, m_zoom, unitScaling); |
435 if (!previousEffect) | 436 if (!previousEffect) |
436 previousEffect = result->getSourceGraphic(); | 437 previousEffect = result->getSourceGraphic(); |
437 SVGFilterBuilder builder(previousEffect, nodeMap, m_fillPaint, m_strokePaint); | 438 SVGFilterBuilder builder(previousEffect, nodeMap, m_fillPaint, m_strokePaint); |
438 builder.buildGraph(result, filterElement, m_referenceBox); | 439 builder.buildGraph(result, filterElement, m_referenceBox); |
439 result->setLastEffect(builder.lastEffect()); | 440 result->setLastEffect(builder.lastEffect()); |
440 return result; | 441 return result; |
441 } | 442 } |
442 | 443 |
443 } // namespace blink | 444 } // namespace blink |
OLD | NEW |