diff options
Diffstat (limited to 'Source/WebCore/css/CSSImageGeneratorValue.cpp')
-rw-r--r-- | Source/WebCore/css/CSSImageGeneratorValue.cpp | 127 |
1 files changed, 65 insertions, 62 deletions
diff --git a/Source/WebCore/css/CSSImageGeneratorValue.cpp b/Source/WebCore/css/CSSImageGeneratorValue.cpp index 03ee0c982..30ca59c3d 100644 --- a/Source/WebCore/css/CSSImageGeneratorValue.cpp +++ b/Source/WebCore/css/CSSImageGeneratorValue.cpp @@ -11,10 +11,10 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR @@ -32,14 +32,13 @@ #include "CSSFilterImageValue.h" #include "CSSGradientValue.h" #include "CSSImageValue.h" -#include "CSSNamedImageValue.h" #include "GeneratedImage.h" #include "RenderElement.h" #include "StyleCachedImage.h" namespace WebCore { -static const auto timeToKeepCachedGeneratedImages = std::chrono::seconds { 3 }; +static const double timeToKeepCachedGeneratedImagesInSeconds = 3; CSSImageGeneratorValue::CSSImageGeneratorValue(ClassType classType) : CSSValue(classType) @@ -66,7 +65,7 @@ void CSSImageGeneratorValue::removeClient(RenderElement* renderer) deref(); } -GeneratedImage* CSSImageGeneratorValue::cachedImageForSize(FloatSize size) +GeneratedImage* CSSImageGeneratorValue::cachedImageForSize(IntSize size) { if (size.isEmpty()) return nullptr; @@ -79,48 +78,48 @@ GeneratedImage* CSSImageGeneratorValue::cachedImageForSize(FloatSize size) return cachedGeneratedImage->image(); } -void CSSImageGeneratorValue::saveCachedImageForSize(FloatSize size, PassRefPtr<GeneratedImage> image) +void CSSImageGeneratorValue::saveCachedImageForSize(IntSize size, PassRefPtr<GeneratedImage> image) { ASSERT(!m_images.contains(size)); m_images.add(size, std::make_unique<CachedGeneratedImage>(*this, size, image)); } -void CSSImageGeneratorValue::evictCachedGeneratedImage(FloatSize size) +void CSSImageGeneratorValue::evictCachedGeneratedImage(IntSize size) { ASSERT(m_images.contains(size)); m_images.remove(size); } -CSSImageGeneratorValue::CachedGeneratedImage::CachedGeneratedImage(CSSImageGeneratorValue& owner, FloatSize size, PassRefPtr<GeneratedImage> image) +CSSImageGeneratorValue::CachedGeneratedImage::CachedGeneratedImage(CSSImageGeneratorValue& owner, IntSize size, PassRefPtr<GeneratedImage> image) : m_owner(owner) , m_size(size) , m_image(image) - , m_evictionTimer(*this, &CSSImageGeneratorValue::CachedGeneratedImage::evictionTimerFired, timeToKeepCachedGeneratedImages) + , m_evictionTimer(this, &CSSImageGeneratorValue::CachedGeneratedImage::evictionTimerFired, timeToKeepCachedGeneratedImagesInSeconds) { m_evictionTimer.restart(); } -void CSSImageGeneratorValue::CachedGeneratedImage::evictionTimerFired() +void CSSImageGeneratorValue::CachedGeneratedImage::evictionTimerFired(DeferrableOneShotTimer<CachedGeneratedImage>&) { // NOTE: This is essentially a "delete this", the object is no longer valid after this line. m_owner.evictCachedGeneratedImage(m_size); } -RefPtr<Image> CSSImageGeneratorValue::image(RenderElement* renderer, const FloatSize& size) +PassRefPtr<Image> CSSImageGeneratorValue::image(RenderElement* renderer, const IntSize& size) { switch (classType()) { case CanvasClass: - return downcast<CSSCanvasValue>(*this).image(renderer, size); - case NamedImageClass: - return downcast<CSSNamedImageValue>(*this).image(renderer, size); + return toCSSCanvasValue(this)->image(renderer, size); case CrossfadeClass: - return downcast<CSSCrossfadeValue>(*this).image(renderer, size); + return toCSSCrossfadeValue(this)->image(renderer, size); +#if ENABLE(CSS_FILTERS) case FilterImageClass: - return downcast<CSSFilterImageValue>(*this).image(renderer, size); + return toCSSFilterImageValue(this)->image(renderer, size); +#endif case LinearGradientClass: - return downcast<CSSLinearGradientValue>(*this).image(renderer, size); + return toCSSLinearGradientValue(this)->image(renderer, size); case RadialGradientClass: - return downcast<CSSRadialGradientValue>(*this).image(renderer, size); + return toCSSRadialGradientValue(this)->image(renderer, size); default: ASSERT_NOT_REACHED(); } @@ -131,57 +130,59 @@ bool CSSImageGeneratorValue::isFixedSize() const { switch (classType()) { case CanvasClass: - return downcast<CSSCanvasValue>(*this).isFixedSize(); - case NamedImageClass: - return downcast<CSSNamedImageValue>(*this).isFixedSize(); + return toCSSCanvasValue(this)->isFixedSize(); case CrossfadeClass: - return downcast<CSSCrossfadeValue>(*this).isFixedSize(); + return toCSSCrossfadeValue(this)->isFixedSize(); +#if ENABLE(CSS_FILTERS) case FilterImageClass: - return downcast<CSSFilterImageValue>(*this).isFixedSize(); + return toCSSFilterImageValue(this)->isFixedSize(); +#endif case LinearGradientClass: - return downcast<CSSLinearGradientValue>(*this).isFixedSize(); + return toCSSLinearGradientValue(this)->isFixedSize(); case RadialGradientClass: - return downcast<CSSRadialGradientValue>(*this).isFixedSize(); + return toCSSRadialGradientValue(this)->isFixedSize(); default: ASSERT_NOT_REACHED(); } return false; } -FloatSize CSSImageGeneratorValue::fixedSize(const RenderElement* renderer) +IntSize CSSImageGeneratorValue::fixedSize(const RenderElement* renderer) { switch (classType()) { case CanvasClass: - return downcast<CSSCanvasValue>(*this).fixedSize(renderer); + return toCSSCanvasValue(this)->fixedSize(renderer); case CrossfadeClass: - return downcast<CSSCrossfadeValue>(*this).fixedSize(renderer); + return toCSSCrossfadeValue(this)->fixedSize(renderer); +#if ENABLE(CSS_FILTERS) case FilterImageClass: - return downcast<CSSFilterImageValue>(*this).fixedSize(renderer); + return toCSSFilterImageValue(this)->fixedSize(renderer); +#endif case LinearGradientClass: - return downcast<CSSLinearGradientValue>(*this).fixedSize(renderer); + return toCSSLinearGradientValue(this)->fixedSize(renderer); case RadialGradientClass: - return downcast<CSSRadialGradientValue>(*this).fixedSize(renderer); + return toCSSRadialGradientValue(this)->fixedSize(renderer); default: ASSERT_NOT_REACHED(); } - return FloatSize(); + return IntSize(); } bool CSSImageGeneratorValue::isPending() const { switch (classType()) { case CrossfadeClass: - return downcast<CSSCrossfadeValue>(*this).isPending(); + return toCSSCrossfadeValue(this)->isPending(); case CanvasClass: - return downcast<CSSCanvasValue>(*this).isPending(); - case NamedImageClass: - return downcast<CSSNamedImageValue>(*this).isPending(); + return toCSSCanvasValue(this)->isPending(); +#if ENABLE(CSS_FILTERS) case FilterImageClass: - return downcast<CSSFilterImageValue>(*this).isPending(); + return toCSSFilterImageValue(this)->isPending(); +#endif case LinearGradientClass: - return downcast<CSSLinearGradientValue>(*this).isPending(); + return toCSSLinearGradientValue(this)->isPending(); case RadialGradientClass: - return downcast<CSSRadialGradientValue>(*this).isPending(); + return toCSSRadialGradientValue(this)->isPending(); default: ASSERT_NOT_REACHED(); } @@ -192,40 +193,42 @@ bool CSSImageGeneratorValue::knownToBeOpaque(const RenderElement* renderer) cons { switch (classType()) { case CrossfadeClass: - return downcast<CSSCrossfadeValue>(*this).knownToBeOpaque(renderer); + return toCSSCrossfadeValue(this)->knownToBeOpaque(renderer); case CanvasClass: return false; - case NamedImageClass: - return false; +#if ENABLE(CSS_FILTERS) case FilterImageClass: - return downcast<CSSFilterImageValue>(*this).knownToBeOpaque(renderer); + return toCSSFilterImageValue(this)->knownToBeOpaque(renderer); +#endif case LinearGradientClass: - return downcast<CSSLinearGradientValue>(*this).knownToBeOpaque(renderer); + return toCSSLinearGradientValue(this)->knownToBeOpaque(renderer); case RadialGradientClass: - return downcast<CSSRadialGradientValue>(*this).knownToBeOpaque(renderer); + return toCSSRadialGradientValue(this)->knownToBeOpaque(renderer); default: ASSERT_NOT_REACHED(); } return false; } -void CSSImageGeneratorValue::loadSubimages(CachedResourceLoader& cachedResourceLoader, const ResourceLoaderOptions& options) +void CSSImageGeneratorValue::loadSubimages(CachedResourceLoader* cachedResourceLoader) { switch (classType()) { case CrossfadeClass: - downcast<CSSCrossfadeValue>(*this).loadSubimages(cachedResourceLoader, options); + toCSSCrossfadeValue(this)->loadSubimages(cachedResourceLoader); break; case CanvasClass: - downcast<CSSCanvasValue>(*this).loadSubimages(cachedResourceLoader, options); + toCSSCanvasValue(this)->loadSubimages(cachedResourceLoader); break; +#if ENABLE(CSS_FILTERS) case FilterImageClass: - downcast<CSSFilterImageValue>(*this).loadSubimages(cachedResourceLoader, options); + toCSSFilterImageValue(this)->loadSubimages(cachedResourceLoader); break; +#endif case LinearGradientClass: - downcast<CSSLinearGradientValue>(*this).loadSubimages(cachedResourceLoader, options); + toCSSLinearGradientValue(this)->loadSubimages(cachedResourceLoader); break; case RadialGradientClass: - downcast<CSSRadialGradientValue>(*this).loadSubimages(cachedResourceLoader, options); + toCSSRadialGradientValue(this)->loadSubimages(cachedResourceLoader); break; default: ASSERT_NOT_REACHED(); @@ -234,13 +237,13 @@ void CSSImageGeneratorValue::loadSubimages(CachedResourceLoader& cachedResourceL bool CSSImageGeneratorValue::subimageIsPending(CSSValue* value) { - if (is<CSSImageValue>(*value)) - return downcast<CSSImageValue>(*value).cachedOrPendingImage()->isPendingImage(); + if (value->isImageValue()) + return toCSSImageValue(value)->cachedOrPendingImage()->isPendingImage(); - if (is<CSSImageGeneratorValue>(*value)) - return downcast<CSSImageGeneratorValue>(*value).isPending(); + if (value->isImageGeneratorValue()) + return toCSSImageGeneratorValue(value)->isPending(); - if (is<CSSPrimitiveValue>(*value) && downcast<CSSPrimitiveValue>(*value).getValueID() == CSSValueNone) + if (value->isPrimitiveValue() && toCSSPrimitiveValue(value)->getValueID() == CSSValueNone) return false; ASSERT_NOT_REACHED(); @@ -248,26 +251,26 @@ bool CSSImageGeneratorValue::subimageIsPending(CSSValue* value) return false; } -CachedImage* CSSImageGeneratorValue::cachedImageForCSSValue(CSSValue* value, CachedResourceLoader& cachedResourceLoader, const ResourceLoaderOptions& options) +CachedImage* CSSImageGeneratorValue::cachedImageForCSSValue(CSSValue* value, CachedResourceLoader* cachedResourceLoader) { if (!value) return nullptr; - if (is<CSSImageValue>(*value)) { - StyleCachedImage* styleCachedImage = downcast<CSSImageValue>(*value).cachedImage(cachedResourceLoader, options); + if (value->isImageValue()) { + StyleCachedImage* styleCachedImage = toCSSImageValue(value)->cachedImage(cachedResourceLoader); if (!styleCachedImage) return nullptr; return styleCachedImage->cachedImage(); } - if (is<CSSImageGeneratorValue>(*value)) { - downcast<CSSImageGeneratorValue>(*value).loadSubimages(cachedResourceLoader, options); + if (value->isImageGeneratorValue()) { + toCSSImageGeneratorValue(value)->loadSubimages(cachedResourceLoader); // FIXME: Handle CSSImageGeneratorValue (and thus cross-fades with gradients and canvas). return nullptr; } - if (is<CSSPrimitiveValue>(*value) && downcast<CSSPrimitiveValue>(*value).getValueID() == CSSValueNone) + if (value->isPrimitiveValue() && toCSSPrimitiveValue(value)->getValueID() == CSSValueNone) return nullptr; ASSERT_NOT_REACHED(); |