181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)/* 281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) 481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) 581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved. 681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> 781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> 881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * Copyright (c) 2011, Code Aurora Forum. All rights reserved. 1081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * Copyright (C) Research In Motion Limited 2011. All rights reserved. 1181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved. 1281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * 1381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * This library is free software; you can redistribute it and/or 1481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * modify it under the terms of the GNU Library General Public 1581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * License as published by the Free Software Foundation; either 1681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * version 2 of the License, or (at your option) any later version. 1781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * 1881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * This library is distributed in the hope that it will be useful, 1981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 2081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 2181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * Library General Public License for more details. 2281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * 2381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * You should have received a copy of the GNU Library General Public License 2481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 2581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 2681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) * Boston, MA 02110-1301, USA. 2781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) */ 2881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 2981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "config.h" 3081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/css/resolver/FilterOperationResolver.h" 3181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/css/CSSFilterValue.h" 3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/css/parser/BisonCSSParser.h" 3481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/css/CSSPrimitiveValueMappings.h" 351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/css/CSSShadowValue.h" 3681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/css/resolver/TransformBuilder.h" 3751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/rendering/svg/ReferenceFilterBuilder.h" 3881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/svg/SVGURIReference.h" 3981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 4081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)namespace WebCore { 4181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)static FilterOperation::OperationType filterOperationForType(CSSFilterValue::FilterOperationType type) 4381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){ 4481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) switch (type) { 455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::ReferenceFilterOperation: 4681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return FilterOperation::REFERENCE; 475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::GrayscaleFilterOperation: 4881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return FilterOperation::GRAYSCALE; 495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::SepiaFilterOperation: 5081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return FilterOperation::SEPIA; 515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::SaturateFilterOperation: 5281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return FilterOperation::SATURATE; 535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::HueRotateFilterOperation: 5481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return FilterOperation::HUE_ROTATE; 555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::InvertFilterOperation: 5681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return FilterOperation::INVERT; 575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::OpacityFilterOperation: 5881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return FilterOperation::OPACITY; 595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::BrightnessFilterOperation: 6081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return FilterOperation::BRIGHTNESS; 615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::ContrastFilterOperation: 6281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return FilterOperation::CONTRAST; 635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::BlurFilterOperation: 6481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return FilterOperation::BLUR; 655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::DropShadowFilterOperation: 6681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return FilterOperation::DROP_SHADOW; 675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::UnknownFilterOperation: 6881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return FilterOperation::NONE; 6981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 7081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return FilterOperation::NONE; 7181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)} 7281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 73a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)bool FilterOperationResolver::createFilterOperations(CSSValue* inValue, const CSSToLengthConversionData& unadjustedConversionData, FilterOperations& outOperations, StyleResolverState& state) 7481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){ 7581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) ASSERT(outOperations.isEmpty()); 7681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 7781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (!inValue) 7881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return false; 7981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 8081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (inValue->isPrimitiveValue()) { 81e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(inValue); 825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (primitiveValue->getValueID() == CSSValueNone) 8381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return true; 8481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 8581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 8681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (!inValue->isValueList()) 8781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return false; 8881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 89d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#ifdef BLINK_SCALE_FILTERS_AT_RECORD_TIME 90a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) float zoomFactor = unadjustedConversionData.zoom() * state.elementStyleResources().deviceScaleFactor(); 91d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#else 92d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) float zoomFactor = unadjustedConversionData.zoom(); 93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#endif 94a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) const CSSToLengthConversionData& conversionData = unadjustedConversionData.copyWithAdjustedZoom(zoomFactor); 9581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) FilterOperations operations; 9681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) for (CSSValueListIterator i = inValue; i.hasMore(); i.advance()) { 9781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) CSSValue* currValue = i.value(); 981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (!currValue->isFilterValue()) 9981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) continue; 10081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 1011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) CSSFilterValue* filterValue = toCSSFilterValue(i.value()); 10281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) FilterOperation::OperationType operationType = filterOperationForType(filterValue->operationType()); 10381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 10481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (operationType == FilterOperation::REFERENCE) { 10581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (filterValue->length() != 1) 10681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) continue; 10781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) CSSValue* argument = filterValue->itemWithoutBoundsCheck(0); 10881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 1091e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (!argument->isSVGDocumentValue()) 11081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) continue; 11181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 1121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) CSSSVGDocumentValue* svgDocumentValue = toCSSSVGDocumentValue(argument); 1138abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) KURL url = state.document().completeURL(svgDocumentValue->url()); 11481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<ReferenceFilterOperation> operation = ReferenceFilterOperation::create(svgDocumentValue->url(), AtomicString(url.fragmentIdentifier())); 11681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (SVGURIReference::isExternalURIReference(svgDocumentValue->url(), state.document())) { 11781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (!svgDocumentValue->loadRequested()) 118591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch state.elementStyleResources().addPendingSVGDocument(operation.get(), svgDocumentValue); 11981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) else if (svgDocumentValue->cachedSVGDocument()) 12051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ReferenceFilterBuilder::setDocumentResourceReference(operation.get(), adoptPtr(new DocumentResourceReference(svgDocumentValue->cachedSVGDocument()))); 12181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 12281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) operations.operations().append(operation); 12381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) continue; 12481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 12581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 12681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) // Check that all parameters are primitive values, with the 1271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // exception of drop shadow which has a CSSShadowValue parameter. 12881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (operationType != FilterOperation::DROP_SHADOW) { 12981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) bool haveNonPrimitiveValue = false; 13081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) for (unsigned j = 0; j < filterValue->length(); ++j) { 13181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (!filterValue->itemWithoutBoundsCheck(j)->isPrimitiveValue()) { 13281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) haveNonPrimitiveValue = true; 13381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) break; 13481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 13581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 13681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (haveNonPrimitiveValue) 13781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) continue; 13881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 13981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 140e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) CSSPrimitiveValue* firstValue = filterValue->length() && filterValue->itemWithoutBoundsCheck(0)->isPrimitiveValue() ? toCSSPrimitiveValue(filterValue->itemWithoutBoundsCheck(0)) : 0; 14181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) switch (filterValue->operationType()) { 1425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::GrayscaleFilterOperation: 1435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::SepiaFilterOperation: 1445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::SaturateFilterOperation: { 14581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) double amount = 1; 14681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (filterValue->length() == 1) { 14781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) amount = firstValue->getDoubleValue(); 14881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (firstValue->isPercentage()) 14981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) amount /= 100; 15081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 15181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 15281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) operations.operations().append(BasicColorMatrixFilterOperation::create(amount, operationType)); 15381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) break; 15481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 1555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::HueRotateFilterOperation: { 15681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) double angle = 0; 15781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (filterValue->length() == 1) 15881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) angle = firstValue->computeDegrees(); 15981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 16081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) operations.operations().append(BasicColorMatrixFilterOperation::create(angle, operationType)); 16181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) break; 16281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 1635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::InvertFilterOperation: 1645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::BrightnessFilterOperation: 1655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::ContrastFilterOperation: 1665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::OpacityFilterOperation: { 1675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) double amount = (filterValue->operationType() == CSSFilterValue::BrightnessFilterOperation) ? 0 : 1; 16881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (filterValue->length() == 1) { 16981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) amount = firstValue->getDoubleValue(); 17081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (firstValue->isPercentage()) 17181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) amount /= 100; 17281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 17381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 17481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) operations.operations().append(BasicComponentTransferFilterOperation::create(amount, operationType)); 17581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) break; 17681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 1775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::BlurFilterOperation: { 17881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) Length stdDeviation = Length(0, Fixed); 17981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (filterValue->length() >= 1) 180a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) stdDeviation = firstValue->convertToLength<FixedConversion | PercentConversion>(conversionData); 18151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) operations.operations().append(BlurFilterOperation::create(stdDeviation)); 18281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) break; 18381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 1845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::DropShadowFilterOperation: { 18581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (filterValue->length() != 1) 18681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return false; 18781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 18881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) CSSValue* cssValue = filterValue->itemWithoutBoundsCheck(0); 18981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (!cssValue->isShadowValue()) 19081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) continue; 19181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 1921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) CSSShadowValue* item = toCSSShadowValue(cssValue); 193a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) IntPoint location(item->x->computeLength<int>(conversionData), item->y->computeLength<int>(conversionData)); 194a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) int blur = item->blur ? item->blur->computeLength<int>(conversionData) : 0; 19509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Color shadowColor = Color::transparent; 19681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (item->color) 197a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) shadowColor = state.document().textLinkColors().colorFromPrimitiveValue(item->color.get(), state.style()->color()); 19881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 19909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) operations.operations().append(DropShadowFilterOperation::create(location, blur, shadowColor)); 20081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) break; 20181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 2025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) case CSSFilterValue::UnknownFilterOperation: 20381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) default: 20481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) ASSERT_NOT_REACHED(); 20581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) break; 20681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 20781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 20881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 20981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) outOperations = operations; 21081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return true; 21181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)} 21281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 21381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)} // namespace WebCore 214