Ignore:
Timestamp:
Aug 15, 2013, 2:29:26 PM (12 years ago)
Author:
[email protected]
Message:

Implement CSS Image filter() function
https://bugs.webkit.org/show_bug.cgi?id=119845

Reviewed by Dean Jackson.

Source/WebCore:

The Filter Effects specification defines a new CSS Image function called
filter(). This function takes another CSS Image as well as a filter function
list as input and can be used by various CSS properties.

Example:

background-image: -webkit-filter(url(image.png), brightness(0.5))

This patch implements the current definition of filter() based on other
image generation classes like CSSCrossfadeValue.
A new class called CSSFilterImageValue was added together with an
image observer.

The function is implemented prefixed and behind the compiler flag CSS_FILTERS.

Tests: fast/filter-image/filter-image.html

fast/filter-image/parse-filter-image.html

  • CMakeLists.txt: Added new files to build systems.
  • GNUmakefile.list.am:
  • Target.pri:
  • WebCore.vcxproj/WebCore.vcxproj:
  • WebCore.xcodeproj/project.pbxproj:
  • css/CSSAllInOne.cpp:
  • css/CSSCrossfadeValue.cpp: Share code together with CSSFilterImageValue

in CSSImageGeneratorValue.cpp.

(WebCore::CSSCrossfadeValue::isPending):
(WebCore::CSSCrossfadeValue::loadSubimages):

  • css/CSSFilterImageValue.cpp: Added.

(WebCore::CSSFilterImageValue::~CSSFilterImageValue):
(WebCore::CSSFilterImageValue::customCssText):
(WebCore::CSSFilterImageValue::fixedSize):
(WebCore::CSSFilterImageValue::isPending):
(WebCore::CSSFilterImageValue::knownToBeOpaque):
(WebCore::CSSFilterImageValue::loadSubimages):
(WebCore::CSSFilterImageValue::image):
(WebCore::CSSFilterImageValue::filterImageChanged):
(WebCore::CSSFilterImageValue::createFilterOperations):
(WebCore::CSSFilterImageValue::FilterSubimageObserverProxy::imageChanged):
(WebCore::CSSFilterImageValue::hasFailedOrCanceledSubresources):
(WebCore::CSSFilterImageValue::equals):

  • css/CSSFilterImageValue.h: Added.

(WebCore::CSSFilterImageValue::create):
(WebCore::CSSFilterImageValue::isFixedSize):
(WebCore::CSSFilterImageValue::CSSFilterImageValue):
(WebCore::CSSFilterImageValue::FilterSubimageObserverProxy::FilterSubimageObserverProxy):
(WebCore::CSSFilterImageValue::FilterSubimageObserverProxy::~FilterSubimageObserverProxy):
(WebCore::CSSFilterImageValue::FilterSubimageObserverProxy::setReady):

  • css/CSSImageGeneratorValue.cpp: Shared code between CSSCrossfadeValue and

CSSFilterImageValue.

(WebCore::CSSImageGeneratorValue::image):
(WebCore::CSSImageGeneratorValue::isFixedSize):
(WebCore::CSSImageGeneratorValue::fixedSize):
(WebCore::CSSImageGeneratorValue::isPending):
(WebCore::CSSImageGeneratorValue::knownToBeOpaque):
(WebCore::CSSImageGeneratorValue::loadSubimages):
(WebCore::CSSImageGeneratorValue::subimageIsPending):
(WebCore::CSSImageGeneratorValue::cachedImageForCSSValue):

  • css/CSSImageGeneratorValue.h:
  • css/CSSParser.cpp: Added parsing information for new image function.

(WebCore::CSSParser::parseValue):
(WebCore::CSSParser::isGeneratedImageValue):
(WebCore::CSSParser::parseGeneratedImage):
(WebCore::CSSParser::parseFilterImage):
(WebCore::CSSParser::parseFilter):

  • css/CSSParser.h:
  • css/CSSValue.cpp:

(WebCore::CSSValue::hasFailedOrCanceledSubresources):
(WebCore::CSSValue::equals):
(WebCore::CSSValue::cssText):
(WebCore::CSSValue::destroy):

  • css/CSSValue.h:

(WebCore::CSSValue::isFilterImageValue):

  • css/StyleResolver.cpp:

(WebCore::StyleResolver::applyProperty):
(WebCore::StyleResolver::generatedOrPendingFromValue):
(WebCore::StyleResolver::createFilterOperations):

  • css/StyleResolver.h: StyleResolver needs to be passed to

CSSFilterImageValue in order to resolve blur() and
drop-shadow() function. Both needs to be resolved together
with all other properties and can't be done earlier or later.

  • rendering/FilterEffectRenderer.cpp:

(WebCore::FilterEffectRenderer::build): Pass an argument whether the

intermediate filter results should be clipped or not. The filter
property for instance doesn't clip but scales the intermediate
image sizes.

  • rendering/FilterEffectRenderer.h:

LayoutTests:

Test parsing, style resolving, computed style and behavior of new
CSS image function filter().

  • fast/filter-image/filter-image-expected.html: Added.
  • fast/filter-image/filter-image.html: Added.
  • fast/filter-image/parse-filter-image-expected.txt: Added.
  • fast/filter-image/parse-filter-image.html: Added.
  • fast/filter-image/resources/image.svg: Added.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/css/CSSValue.cpp

    r148921 r154133  
    11/*
    22 * Copyright (C) 2011 Andreas Kling ([email protected])
     3 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
    34 *
    45 * Redistribution and use in source and binary forms, with or without
     
    3435#include "CSSCrossfadeValue.h"
    3536#include "CSSCursorImageValue.h"
     37#include "CSSFilterImageValue.h"
    3638#include "CSSFontFaceSrcValue.h"
    3739#include "CSSFunctionValue.h"
     
    138140    if (classType() == CrossfadeClass)
    139141        return static_cast<const CSSCrossfadeValue*>(this)->hasFailedOrCanceledSubresources();
     142#if ENABLE(CSS_FILTERS)
     143    if (classType() == FilterImageClass)
     144        return static_cast<const CSSFilterImageValue*>(this)->hasFailedOrCanceledSubresources();
     145#endif
    140146#if ENABLE(CSS_IMAGE_SET)
    141147    if (classType() == ImageSetClass)
     
    168174        case CursorImageClass:
    169175            return compareCSSValues<CSSCursorImageValue>(*this, other);
     176#if ENABLE(CSS_FILTERS)
     177        case FilterImageClass:
     178            return compareCSSValues<CSSFilterImageValue>(*this, other);
     179#endif
    170180        case FontClass:
    171181            return compareCSSValues<FontValue>(*this, other);
     
    268278    case CursorImageClass:
    269279        return static_cast<const CSSCursorImageValue*>(this)->customCssText();
     280#if ENABLE(CSS_FILTERS)
     281    case FilterImageClass:
     282        return static_cast<const CSSFilterImageValue*>(this)->customCssText();
     283#endif
    270284    case FontClass:
    271285        return static_cast<const FontValue*>(this)->customCssText();
     
    454468#endif
    455469#if ENABLE(CSS_FILTERS)
     470    case FilterImageClass:
     471        delete static_cast<CSSFilterImageValue*>(this);
     472        return;
    456473    case WebKitCSSFilterClass:
    457474        delete static_cast<WebKitCSSFilterValue*>(this);
Note: See TracChangeset for help on using the changeset viewer.