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

Unified Diff: third_party/WebKit/Source/core/css/resolver/FilterOperationResolver.cpp

Issue 2326633002: Adds filter support for offscreen canvas (Closed)
Patch Set: New version without StyleResolver Created 4 years, 2 months 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/css/resolver/FilterOperationResolver.cpp
diff --git a/third_party/WebKit/Source/core/css/resolver/FilterOperationResolver.cpp b/third_party/WebKit/Source/core/css/resolver/FilterOperationResolver.cpp
index 041f1914cd3145754a62c46196089ce2942d2042..8d7d637e0fe3aaeabf7f962cd0cb5a2ac2db27d5 100644
--- a/third_party/WebKit/Source/core/css/resolver/FilterOperationResolver.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/FilterOperationResolver.cpp
@@ -119,7 +119,7 @@ static void countFilterUse(FilterOperation::OperationType operationType,
}
FilterOperations FilterOperationResolver::createFilterOperations(
- StyleResolverState& state,
+ StyleResolverState* state,
Justin Novosad 2016/10/24 18:51:22 This approach seems reasonable to me, but I'll def
esprehn 2016/11/22 01:38:37 Lets refactor this into two methods, one that take
const CSSValue& inValue) {
FilterOperations operations;
@@ -128,24 +128,29 @@ FilterOperations FilterOperationResolver::createFilterOperations(
return operations;
}
- const CSSToLengthConversionData& conversionData =
- state.cssToLengthConversionData();
+ const CSSToLengthConversionData* conversionData;
+ if (state)
+ conversionData = &(state->cssToLengthConversionData());
+
for (auto& currValue : toCSSValueList(inValue)) {
if (currValue->isURIValue()) {
- countFilterUse(FilterOperation::REFERENCE, state.document());
+ if (!state)
+ continue;
meade_UTC10 2016/10/26 06:57:34 This for loop is big and kind of hard to reason ab
fserb 2016/10/26 19:08:26 True. Although there's nothing to do if there's a
+ countFilterUse(FilterOperation::REFERENCE, state->document());
const CSSURIValue& urlValue = toCSSURIValue(*currValue);
- SVGURLReferenceResolver resolver(urlValue.value(), state.document());
+ SVGURLReferenceResolver resolver(urlValue.value(), state->document());
ReferenceFilterOperation* operation = ReferenceFilterOperation::create(
urlValue.value(), resolver.fragmentIdentifier());
if (!resolver.isLocal()) {
- if (!urlValue.loadRequested())
- state.elementStyleResources().addPendingSVGDocument(operation,
- &urlValue);
- else if (urlValue.cachedDocument())
+ if (!urlValue.loadRequested()) {
+ state->elementStyleResources().addPendingSVGDocument(operation,
+ &urlValue);
+ } else if (urlValue.cachedDocument()) {
ReferenceFilterBuilder::setDocumentResourceReference(
operation,
new DocumentResourceReference(urlValue.cachedDocument()));
+ }
}
operations.operations().append(operation);
continue;
@@ -154,7 +159,8 @@ FilterOperations FilterOperationResolver::createFilterOperations(
const CSSFunctionValue* filterValue = toCSSFunctionValue(currValue.get());
FilterOperation::OperationType operationType =
filterOperationForType(filterValue->functionType());
- countFilterUse(operationType, state.document());
+ if (state)
+ countFilterUse(operationType, state->document());
DCHECK_LE(filterValue->length(), 1u);
const CSSPrimitiveValue* firstValue =
@@ -204,22 +210,34 @@ FilterOperations FilterOperationResolver::createFilterOperations(
}
case CSSValueBlur: {
Length stdDeviation = Length(0, Fixed);
- if (filterValue->length() >= 1)
- stdDeviation = firstValue->convertToLength(conversionData);
+ if (filterValue->length() >= 1) {
+ if (state)
+ stdDeviation = firstValue->convertToLength(*conversionData);
+ else
+ stdDeviation = Length(firstValue->getDoubleValue(), Fixed);
Justin Novosad 2016/10/24 18:51:22 This part is doubtful. We probably want some kind
fserb 2016/10/26 19:08:26 I did try to create a deafult ConversionData. I'm
+ }
operations.operations().append(
BlurFilterOperation::create(stdDeviation));
break;
}
case CSSValueDropShadow: {
const CSSShadowValue& item = toCSSShadowValue(filterValue->item(0));
- IntPoint location(item.x->computeLength<int>(conversionData),
- item.y->computeLength<int>(conversionData));
- int blur =
- item.blur ? item.blur->computeLength<int>(conversionData) : 0;
+ IntPoint location;
+ int blur;
+
+ if (state) {
+ location = IntPoint(item.x->computeLength<int>(*conversionData),
+ item.y->computeLength<int>(*conversionData));
+ blur = item.blur ? item.blur->computeLength<int>(*conversionData) : 0;
+ } else {
+ location = IntPoint(item.x->getIntValue(), item.y->getIntValue());
+ blur = item.blur ? item.blur->getIntValue() : 0;
Justin Novosad 2016/10/24 18:51:22 More doubtful conversions.
fserb 2016/10/26 19:08:26 I'll try that.
+ }
Color shadowColor = Color::black;
- if (item.color)
- shadowColor = state.document().textLinkColors().colorFromCSSValue(
- *item.color, state.style()->color());
+ if (item.color && state) {
+ shadowColor = state->document().textLinkColors().colorFromCSSValue(
+ *item.color, state->style()->color());
+ }
operations.operations().append(
DropShadowFilterOperation::create(location, blur, shadowColor));

Powered by Google App Engine
This is Rietveld 408576698