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