Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(749)

Side by Side Diff: third_party/WebKit/Source/core/paint/FilterEffectBuilder.cpp

Issue 2453033004: Make sure to always reset the cached filter in ReferenceFilterOperation (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698