2010-08-27 Patrick Gansterer <paroga@paroga.com>
Reviewed by Nikolas Zimmermann.
RenderImage::imageChanged invalidates wrong area
https://bugs.webkit.org/show_bug.cgi?id=43779
At the moment RenderSVGImage inherits from RenderImage, which makes non-SVG compatible
assumptions about repainting, and thus has to be fixed to inherit from RenderSVGModelObject.
This patch moves the CachedImage from RenderImage into a separate class.
The new class contains the common behavior of RenderImage and RenderSVGImage.
An additional patch will remove the inheritance of RenderImage at RenderSVGImage.
* Android.mk:
* CMakeLists.txt:
* GNUmakefile.am:
* WebCore.gypi:
* WebCore.pro:
* WebCore.vcproj/WebCore.vcproj:
* WebCore.xcodeproj/project.pbxproj:
* html/HTMLEmbedElement.cpp:
(WebCore::HTMLEmbedElement::createRenderer):
(WebCore::HTMLEmbedElement::attach):
* html/HTMLImageElement.cpp:
(WebCore::HTMLImageElement::createRenderer):
(WebCore::HTMLImageElement::attach):
* html/HTMLInputElement.cpp:
(WebCore::HTMLInputElement::createRenderer):
(WebCore::HTMLInputElement::attach):
* html/HTMLObjectElement.cpp:
(WebCore::HTMLObjectElement::createRenderer):
* html/HTMLVideoElement.cpp:
(WebCore::HTMLVideoElement::attach):
(WebCore::HTMLVideoElement::parseMappedAttribute):
* loader/ImageLoader.cpp:
(WebCore::ImageLoader::setImage):
(WebCore::ImageLoader::updateFromElement):
(WebCore::ImageLoader::renderImageResource):
(WebCore::ImageLoader::updateRenderer):
* loader/ImageLoader.h:
* rendering/RenderImage.cpp:
(WebCore::RenderImage::RenderImage):
(WebCore::RenderImage::~RenderImage):
(WebCore::RenderImage::setImageResource):
(WebCore::RenderImage::imageChanged):
(WebCore::RenderImage::notifyFinished):
(WebCore::RenderImage::paintReplaced):
(WebCore::RenderImage::paintIntoRect):
(WebCore::RenderImage::minimumReplacedHeight):
(WebCore::RenderImage::calcReplacedWidth):
(WebCore::RenderImage::calcReplacedHeight):
(WebCore::RenderImage::calcAspectRatioWidth):
(WebCore::RenderImage::calcAspectRatioHeight):
* rendering/RenderImage.h:
(WebCore::RenderImage::imageResource):
(WebCore::RenderImage::cachedImage):
(WebCore::RenderImage::intrinsicSizeChanged):
(WebCore::toRenderImage):
* rendering/RenderImageGeneratedContent.cpp: Removed.
* rendering/RenderImageGeneratedContent.h: Removed.
* rendering/RenderImageResource.cpp: Added.
(WebCore::RenderImageResource::RenderImageResource):
(WebCore::RenderImageResource::~RenderImageResource):
(WebCore::RenderImageResource::initialize):
(WebCore::RenderImageResource::shutdown):
(WebCore::RenderImageResource::setCachedImage):
(WebCore::RenderImageResource::resetAnimation):
(WebCore::RenderImageResource::setImageContainerSize):
(WebCore::RenderImageResource::nullImage):
* rendering/RenderImageResource.h: Added.
(WebCore::RenderImageResource::create):
(WebCore::RenderImageResource::cachedImage):
(WebCore::RenderImageResource::hasImage):
(WebCore::RenderImageResource::image):
(WebCore::RenderImageResource::errorOccurred):
(WebCore::RenderImageResource::usesImageContainerSize):
(WebCore::RenderImageResource::imageHasRelativeWidth):
(WebCore::RenderImageResource::imageHasRelativeHeight):
(WebCore::RenderImageResource::imageSize):
(WebCore::RenderImageResource::imagePtr):
* rendering/RenderImageResourceStyleImage.cpp: Added.
(WebCore::RenderImageResourceStyleImage::RenderImageResourceStyleImage):
(WebCore::RenderImageResourceStyleImage::~RenderImageResourceStyleImage):
(WebCore::RenderImageResourceStyleImage::initialize):
(WebCore::RenderImageResourceStyleImage::shutdown):
* rendering/RenderImageResourceStyleImage.h: Added.
(WebCore::RenderImageResourceStyleImage::create):
(WebCore::RenderImageResourceStyleImage::image):
(WebCore::RenderImageResourceStyleImage::errorOccurred):
(WebCore::RenderImageResourceStyleImage::setImageContainerSize):
(WebCore::RenderImageResourceStyleImage::usesImageContainerSize):
(WebCore::RenderImageResourceStyleImage::imageHasRelativeWidth):
(WebCore::RenderImageResourceStyleImage::imageHasRelativeHeight):
(WebCore::RenderImageResourceStyleImage::imageSize):
(WebCore::RenderImageResourceStyleImage::imagePtr):
* rendering/RenderMedia.cpp:
(WebCore::RenderMedia::RenderMedia):
* rendering/RenderObject.cpp:
(WebCore::RenderObject::createObject):
* rendering/RenderObjectChildList.cpp:
(WebCore::RenderObjectChildList::updateBeforeAfterContent):
* rendering/RenderSVGImage.cpp:
(WebCore::RenderSVGImage::RenderSVGImage):
(WebCore::RenderSVGImage::layout):
(WebCore::RenderSVGImage::paint):
* rendering/RenderVideo.cpp:
(WebCore::RenderVideo::calculateIntrinsicSize):
* svg/SVGImageElement.cpp:
(WebCore::SVGImageElement::attach):
* wml/WMLImageElement.cpp:
(WebCore::WMLImageElement::createRenderer):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@66223 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/rendering/RenderImage.cpp b/WebCore/rendering/RenderImage.cpp
index 2073479..a7f7df4 100644
--- a/WebCore/rendering/RenderImage.cpp
+++ b/WebCore/rendering/RenderImage.cpp
@@ -57,7 +57,6 @@
RenderImage::RenderImage(Node* node)
: RenderReplaced(node, IntSize(0, 0))
- , m_cachedImage(0)
{
updateAltText();
@@ -66,22 +65,15 @@
RenderImage::~RenderImage()
{
- if (m_cachedImage)
- m_cachedImage->removeClient(this);
+ ASSERT(m_imageResource);
+ m_imageResource->shutdown();
}
-void RenderImage::setCachedImage(CachedImage* newImage)
+void RenderImage::setImageResource(PassOwnPtr<RenderImageResource> imageResource)
{
- if (m_cachedImage == newImage)
- return;
- if (m_cachedImage)
- m_cachedImage->removeClient(this);
- m_cachedImage = newImage;
- if (m_cachedImage) {
- m_cachedImage->addClient(this);
- if (m_cachedImage->errorOccurred())
- imageChanged(m_cachedImage.get());
- }
+ ASSERT(!m_imageResource);
+ m_imageResource = imageResource;
+ m_imageResource->initialize(this);
}
// If we'll be displaying either alt text or an image, add some padding.
@@ -135,22 +127,22 @@
if (hasBoxDecorations() || hasMask())
RenderReplaced::imageChanged(newImage, rect);
-
- if (newImage != imagePtr() || !newImage)
+
+ if (newImage != m_imageResource->imagePtr() || !newImage)
return;
bool imageSizeChanged = false;
// Set image dimensions, taking into account the size of the alt text.
- if (errorOccurred())
- imageSizeChanged = setImageSizeForAltText(m_cachedImage.get());
-
+ if (m_imageResource->errorOccurred())
+ imageSizeChanged = setImageSizeForAltText(m_imageResource->cachedImage());
+
bool shouldRepaint = true;
// Image dimensions have been changed, see what needs to be done
- if (imageSize(style()->effectiveZoom()) != intrinsicSize() || imageSizeChanged) {
- if (!errorOccurred())
- setIntrinsicSize(imageSize(style()->effectiveZoom()));
+ if (m_imageResource->imageSize(style()->effectiveZoom()) != intrinsicSize() || imageSizeChanged) {
+ if (!m_imageResource->errorOccurred())
+ setIntrinsicSize(m_imageResource->imageSize(style()->effectiveZoom()));
// In the case of generated image content using :before/:after, we might not be in the
// render tree yet. In that case, we don't need to worry about check for layout, since we'll get a
@@ -180,7 +172,7 @@
if (rect) {
// The image changed rect is in source image coordinates (pre-zooming),
// so map from the bounds of the image to the contentsBox.
- repaintRect = enclosingIntRect(mapRect(*rect, FloatRect(FloatPoint(), imageSize(1.0f)), contentBoxRect()));
+ repaintRect = enclosingIntRect(mapRect(*rect, FloatRect(FloatPoint(), m_imageResource->imageSize(1.0f)), contentBoxRect()));
// Guard against too-large changed rects.
repaintRect.intersect(contentBoxRect());
} else
@@ -203,7 +195,7 @@
return;
#if USE(ACCELERATED_COMPOSITING)
- if ((newImage == m_cachedImage) && hasLayer()) {
+ if (newImage == m_imageResource->cachedImage() && hasLayer()) {
// tell any potential compositing layers
// that the image is done and they can reference it directly.
layer()->rendererContentChanged();
@@ -212,15 +204,6 @@
UNUSED_PARAM(newImage);
#endif
}
-
-void RenderImage::resetAnimation()
-{
- if (m_cachedImage) {
- image()->resetAnimation();
- if (!needsLayout())
- repaint();
- }
-}
void RenderImage::paintReplaced(PaintInfo& paintInfo, int tx, int ty)
{
@@ -236,7 +219,7 @@
GraphicsContext* context = paintInfo.context;
- if (!hasImage() || errorOccurred()) {
+ if (!m_imageResource->hasImage() || m_imageResource->errorOccurred()) {
if (paintInfo.phase == PaintPhaseSelection)
return;
@@ -255,17 +238,19 @@
int usableWidth = cWidth - 2;
int usableHeight = cHeight - 2;
- if (errorOccurred() && !image()->isNull() && (usableWidth >= image()->width()) && (usableHeight >= image()->height())) {
+ Image* image = m_imageResource->image();
+
+ if (m_imageResource->errorOccurred() && !image->isNull() && usableWidth >= image->width() && usableHeight >= image->height()) {
// Center the error image, accounting for border and padding.
- int centerX = (usableWidth - image()->width()) / 2;
+ int centerX = (usableWidth - image->width()) / 2;
if (centerX < 0)
centerX = 0;
- int centerY = (usableHeight - image()->height()) / 2;
+ int centerY = (usableHeight - image->height()) / 2;
if (centerY < 0)
centerY = 0;
imageX = leftBorder + leftPad + centerX + 1;
imageY = topBorder + topPad + centerY + 1;
- context->drawImage(image(), style()->colorSpace(), IntPoint(tx + imageX, ty + imageY));
+ context->drawImage(image, style()->colorSpace(), IntPoint(tx + imageX, ty + imageY));
errorPictureDrawn = true;
}
@@ -288,8 +273,8 @@
context->drawText(style()->font(), textRun, IntPoint(ax, ay + ascent));
}
}
- } else if (hasImage() && cWidth > 0 && cHeight > 0) {
- Image* img = image(cWidth, cHeight);
+ } else if (m_imageResource->hasImage() && cWidth > 0 && cHeight > 0) {
+ Image* img = m_imageResource->image(cWidth, cHeight);
if (!img || img->isNull())
return;
@@ -351,22 +336,22 @@
void RenderImage::paintIntoRect(GraphicsContext* context, const IntRect& rect)
{
- if (!hasImage() || errorOccurred() || rect.width() <= 0 || rect.height() <= 0)
+ if (!m_imageResource->hasImage() || m_imageResource->errorOccurred() || rect.width() <= 0 || rect.height() <= 0)
return;
- Image* img = image(rect.width(), rect.height());
+ Image* img = m_imageResource->image(rect.width(), rect.height());
if (!img || img->isNull())
return;
HTMLImageElement* imageElt = (node() && node()->hasTagName(imgTag)) ? static_cast<HTMLImageElement*>(node()) : 0;
CompositeOperator compositeOperator = imageElt ? imageElt->compositeOperator() : CompositeSourceOver;
- bool useLowQualityScaling = shouldPaintAtLowQuality(context, this->image(), rect.size());
- context->drawImage(image(rect.width(), rect.height()), style()->colorSpace(), rect, compositeOperator, useLowQualityScaling);
+ bool useLowQualityScaling = shouldPaintAtLowQuality(context, m_imageResource->image(), rect.size());
+ context->drawImage(m_imageResource->image(rect.width(), rect.height()), style()->colorSpace(), rect, compositeOperator, useLowQualityScaling);
}
int RenderImage::minimumReplacedHeight() const
{
- return errorOccurred() ? intrinsicSize().height() : 0;
+ return m_imageResource->errorOccurred() ? intrinsicSize().height() : 0;
}
HTMLMapElement* RenderImage::imageMap() const
@@ -449,18 +434,18 @@
int RenderImage::calcReplacedWidth(bool includeMaxWidth) const
{
- if (imageHasRelativeWidth())
+ if (m_imageResource->imageHasRelativeWidth())
if (RenderObject* cb = isPositioned() ? container() : containingBlock()) {
if (cb->isBox())
- setImageContainerSize(IntSize(toRenderBox(cb)->availableWidth(), toRenderBox(cb)->availableHeight()));
+ m_imageResource->setImageContainerSize(IntSize(toRenderBox(cb)->availableWidth(), toRenderBox(cb)->availableHeight()));
}
int width;
if (isWidthSpecified())
width = calcReplacedWidthUsing(style()->width());
- else if (usesImageContainerSize())
- width = imageSize(style()->effectiveZoom()).width();
- else if (imageHasRelativeWidth())
+ else if (m_imageResource->usesImageContainerSize())
+ width = m_imageResource->imageSize(style()->effectiveZoom()).width();
+ else if (m_imageResource->imageHasRelativeWidth())
width = 0; // If the image is relatively-sized, set the width to 0 until there is a set container size.
else
width = calcAspectRatioWidth();
@@ -476,9 +461,9 @@
int height;
if (isHeightSpecified())
height = calcReplacedHeightUsing(style()->height());
- else if (usesImageContainerSize())
- height = imageSize(style()->effectiveZoom()).height();
- else if (imageHasRelativeHeight())
+ else if (m_imageResource->usesImageContainerSize())
+ height = m_imageResource->imageSize(style()->effectiveZoom()).height();
+ else if (m_imageResource->imageHasRelativeHeight())
height = 0; // If the image is relatively-sized, set the height to 0 until there is a set container size.
else
height = calcAspectRatioHeight();
@@ -494,7 +479,7 @@
IntSize size = intrinsicSize();
if (!size.height())
return 0;
- if (!hasImage() || errorOccurred())
+ if (!m_imageResource->hasImage() || m_imageResource->errorOccurred())
return size.width(); // Don't bother scaling.
return RenderReplaced::calcReplacedHeight() * size.width() / size.height();
}
@@ -504,7 +489,7 @@
IntSize size = intrinsicSize();
if (!size.width())
return 0;
- if (!hasImage() || errorOccurred())
+ if (!m_imageResource->hasImage() || m_imageResource->errorOccurred())
return size.height(); // Don't bother scaling.
return RenderReplaced::calcReplacedWidth() * size.height() / size.width();
}
@@ -529,9 +514,4 @@
setPrefWidthsDirty(false);
}
-Image* RenderImage::nullImage()
-{
- return Image::nullImage();
-}
-
} // namespace WebCore
diff --git a/WebCore/rendering/RenderImage.h b/WebCore/rendering/RenderImage.h
index b89a652..2b88c32 100644
--- a/WebCore/rendering/RenderImage.h
+++ b/WebCore/rendering/RenderImage.h
@@ -25,6 +25,7 @@
#ifndef RenderImage_h
#define RenderImage_h
+#include "RenderImageResource.h"
#include "RenderReplaced.h"
namespace WebCore {
@@ -36,25 +37,21 @@
RenderImage(Node*);
virtual ~RenderImage();
+ void setImageResource(PassOwnPtr<RenderImageResource>);
+
+ RenderImageResource* imageResource() { return m_imageResource.get(); }
+ const RenderImageResource* imageResource() const { return m_imageResource.get(); }
+ CachedImage* cachedImage() const { return m_imageResource->cachedImage(); }
+
bool setImageSizeForAltText(CachedImage* newImage = 0);
void updateAltText();
- void setCachedImage(CachedImage*);
- CachedImage* cachedImage() const { return m_cachedImage.get(); }
-
HTMLMapElement* imageMap() const;
- void resetAnimation();
-
- virtual bool hasImage() const { return m_cachedImage; }
-
void highQualityRepaintTimerFired(Timer<RenderImage>*);
protected:
- virtual Image* image(int /* width */ = 0, int /* height */ = 0) { return m_cachedImage ? m_cachedImage->image() : nullImage(); }
- virtual bool errorOccurred() const { return m_cachedImage && m_cachedImage->errorOccurred(); }
-
virtual void imageChanged(WrappedImagePtr, const IntRect* = 0);
virtual void paintIntoRect(GraphicsContext*, const IntRect&);
@@ -64,14 +61,14 @@
bool isWidthSpecified() const;
bool isHeightSpecified() const;
- virtual void intrinsicSizeChanged() { imageChanged(imagePtr()); }
+ virtual void intrinsicSizeChanged() { imageChanged(m_imageResource->imagePtr()); }
private:
virtual const char* renderName() const { return "RenderImage"; }
virtual bool isImage() const { return true; }
virtual bool isRenderImage() const { return true; }
-
+
virtual void paintReplaced(PaintInfo&, int tx, int ty);
virtual int minimumReplacedHeight() const;
@@ -84,37 +81,25 @@
virtual void calcPrefWidths();
- virtual bool usesImageContainerSize() const { return m_cachedImage ? m_cachedImage->usesImageContainerSize() : false; }
- virtual void setImageContainerSize(const IntSize& size) const { if (m_cachedImage) m_cachedImage->setImageContainerSize(size); }
- virtual bool imageHasRelativeWidth() const { return m_cachedImage ? m_cachedImage->imageHasRelativeWidth() : false; }
- virtual bool imageHasRelativeHeight() const { return m_cachedImage ? m_cachedImage->imageHasRelativeHeight() : false; }
- virtual IntSize imageSize(float multiplier) const { return m_cachedImage ? m_cachedImage->imageSize(multiplier) : IntSize(); }
- virtual WrappedImagePtr imagePtr() const { return m_cachedImage.get(); }
-
int calcAspectRatioWidth() const;
int calcAspectRatioHeight() const;
-protected:
- // The image we are rendering.
- CachedResourceHandle<CachedImage> m_cachedImage;
-
private:
// Text to display as long as the image isn't available.
String m_altText;
+ OwnPtr<RenderImageResource> m_imageResource;
- static Image* nullImage();
-
friend class RenderImageScaleObserver;
};
inline RenderImage* toRenderImage(RenderObject* object)
-{
+{
ASSERT(!object || object->isRenderImage());
return static_cast<RenderImage*>(object);
}
inline const RenderImage* toRenderImage(const RenderObject* object)
-{
+{
ASSERT(!object || object->isRenderImage());
return static_cast<const RenderImage*>(object);
}
diff --git a/WebCore/rendering/RenderImageGeneratedContent.cpp b/WebCore/rendering/RenderImageGeneratedContent.cpp
deleted file mode 100644
index 29d0508..0000000
--- a/WebCore/rendering/RenderImageGeneratedContent.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2008 Apple Computer, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * 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 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 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
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "RenderImageGeneratedContent.h"
-
-#include "RenderBlock.h"
-#include "RenderStyle.h"
-#include "StyleCachedImage.h"
-
-namespace WebCore {
-
-RenderImageGeneratedContent::RenderImageGeneratedContent(Node* n)
-: RenderImage(n)
-{}
-
-RenderImageGeneratedContent::~RenderImageGeneratedContent()
-{
- m_cachedImage = 0;
- m_styleImage->removeClient(this);
-}
-
-void RenderImageGeneratedContent::setStyleImage(StyleImage* image)
-{
- if (image->isCachedImage())
- m_cachedImage = static_cast<StyleCachedImage*>(image)->cachedImage();
- m_styleImage = image;
- m_styleImage->addClient(this);
-}
-
-}
diff --git a/WebCore/rendering/RenderImageGeneratedContent.h b/WebCore/rendering/RenderImageGeneratedContent.h
deleted file mode 100644
index 9f8330d..0000000
--- a/WebCore/rendering/RenderImageGeneratedContent.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2008 Apple Computer, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * 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 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 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
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef RenderImageGeneratedContent_h
-#define RenderImageGeneratedContent_h
-
-#include "RenderImage.h"
-#include "StyleImage.h"
-#include <wtf/RefPtr.h>
-
-namespace WebCore {
-
-class StyleImage;
-
-class RenderImageGeneratedContent : public RenderImage {
-public:
- RenderImageGeneratedContent(Node*);
- virtual ~RenderImageGeneratedContent();
-
- void setStyleImage(StyleImage*);
-
- virtual bool hasImage() const { return true; }
-
-protected:
- virtual Image* image(int w = 0, int h = 0) { return m_styleImage->image(this, IntSize(w, h)); }
- virtual bool errorOccurred() const { return m_styleImage->errorOccurred(); }
- virtual bool usesImageContainerSize() const { return m_styleImage->usesImageContainerSize(); }
- virtual void setImageContainerSize(const IntSize& size) const { m_styleImage->setImageContainerSize(size); }
- virtual bool imageHasRelativeWidth() const { return m_styleImage->imageHasRelativeWidth(); }
- virtual bool imageHasRelativeHeight() const { return m_styleImage->imageHasRelativeHeight(); }
- virtual IntSize imageSize(float multiplier) const { return m_styleImage->imageSize(this, multiplier); }
-
- // |m_styleImage| can be 0 if we get a callback for a background image from RenderObject::setStyle.
- virtual WrappedImagePtr imagePtr() const { return m_styleImage ? m_styleImage->data() : 0; }
-
-private:
- RefPtr<StyleImage> m_styleImage;
-};
-
-} // namespace WebCore
-
-#endif // RenderImageGeneratedContent_h
diff --git a/WebCore/rendering/RenderImageResource.cpp b/WebCore/rendering/RenderImageResource.cpp
new file mode 100644
index 0000000..ea3ed2f
--- /dev/null
+++ b/WebCore/rendering/RenderImageResource.cpp
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 1999 Lars Knoll <knoll@kde.org>
+ * Copyright (C) 1999 Antti Koivisto <koivisto@kde.org>
+ * Copyright (C) 2000 Dirk Mueller <mueller@kde.org>
+ * Copyright (C) 2006 Allan Sandfeld Jensen <kde@carewolf.com>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+#include "RenderImageResource.h"
+
+#include "RenderImageResourceStyleImage.h"
+#include "RenderObject.h"
+
+namespace WebCore {
+
+RenderImageResource::RenderImageResource()
+ : m_renderer(0)
+ , m_cachedImage(0)
+{
+}
+
+RenderImageResource::~RenderImageResource()
+{
+}
+
+void RenderImageResource::initialize(RenderObject* renderer)
+{
+ ASSERT(!m_renderer);
+ ASSERT(renderer);
+ m_renderer = renderer;
+}
+
+void RenderImageResource::shutdown()
+{
+ ASSERT(m_renderer);
+
+ if (m_cachedImage)
+ m_cachedImage->removeClient(m_renderer);
+}
+
+void RenderImageResource::setCachedImage(CachedImage* newImage)
+{
+ ASSERT(m_renderer);
+
+ if (m_cachedImage == newImage)
+ return;
+
+ if (m_cachedImage)
+ m_cachedImage->removeClient(m_renderer);
+ m_cachedImage = newImage;
+ if (m_cachedImage) {
+ m_cachedImage->addClient(m_renderer);
+ if (m_cachedImage->errorOccurred())
+ m_renderer->imageChanged(m_cachedImage.get());
+ }
+}
+
+void RenderImageResource::resetAnimation()
+{
+ ASSERT(m_renderer);
+
+ if (!m_cachedImage)
+ return;
+
+ image()->resetAnimation();
+
+ if (!m_renderer->needsLayout())
+ m_renderer->repaint();
+}
+
+void RenderImageResource::setImageContainerSize(const IntSize& size) const
+{
+ ASSERT(m_renderer);
+
+ if (!m_cachedImage)
+ return;
+
+ m_cachedImage->setImageContainerSize(size);
+}
+
+Image* RenderImageResource::nullImage()
+{
+ return Image::nullImage();
+}
+
+} // namespace WebCore
diff --git a/WebCore/rendering/RenderImageResource.h b/WebCore/rendering/RenderImageResource.h
new file mode 100644
index 0000000..bdd49a0
--- /dev/null
+++ b/WebCore/rendering/RenderImageResource.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 1999 Lars Knoll <knoll@kde.org>
+ * Copyright (C) 1999 Antti Koivisto <koivisto@kde.org>
+ * Copyright (C) 2006 Allan Sandfeld Jensen <kde@carewolf.com>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef RenderImageResource_h
+#define RenderImageResource_h
+
+#include "CachedImage.h"
+#include "CachedResourceHandle.h"
+#include "StyleImage.h"
+#include <wtf/Noncopyable.h>
+
+namespace WebCore {
+
+class RenderObject;
+
+class RenderImageResource : public Noncopyable {
+public:
+ virtual ~RenderImageResource();
+
+ static PassOwnPtr<RenderImageResource> create()
+ {
+ return adoptPtr(new RenderImageResource);
+ }
+
+ virtual void initialize(RenderObject*);
+ virtual void shutdown();
+
+ void setCachedImage(CachedImage*);
+ CachedImage* cachedImage() const { return m_cachedImage.get(); }
+ bool hasImage() const { return m_cachedImage; }
+
+ void resetAnimation();
+
+ virtual Image* image(int /* width */ = 0, int /* height */ = 0) { return m_cachedImage ? m_cachedImage->image() : nullImage(); }
+ virtual bool errorOccurred() const { return m_cachedImage && m_cachedImage->errorOccurred(); }
+
+ virtual void setImageContainerSize(const IntSize& size) const;
+ virtual bool usesImageContainerSize() const { return m_cachedImage ? m_cachedImage->usesImageContainerSize() : false; }
+ virtual bool imageHasRelativeWidth() const { return m_cachedImage ? m_cachedImage->imageHasRelativeWidth() : false; }
+ virtual bool imageHasRelativeHeight() const { return m_cachedImage ? m_cachedImage->imageHasRelativeHeight() : false; }
+
+ virtual IntSize imageSize(float multiplier) const { return m_cachedImage ? m_cachedImage->imageSize(multiplier) : IntSize(); }
+
+ virtual WrappedImagePtr imagePtr() const { return m_cachedImage.get(); }
+
+protected:
+ RenderImageResource();
+ RenderObject* m_renderer;
+ CachedResourceHandle<CachedImage> m_cachedImage;
+
+private:
+ static Image* nullImage();
+};
+
+} // namespace WebCore
+
+#endif // RenderImage_h
diff --git a/WebCore/rendering/RenderImageResourceStyleImage.cpp b/WebCore/rendering/RenderImageResourceStyleImage.cpp
new file mode 100644
index 0000000..7f41984
--- /dev/null
+++ b/WebCore/rendering/RenderImageResourceStyleImage.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 1999 Lars Knoll <knoll@kde.org>
+ * Copyright (C) 1999 Antti Koivisto <koivisto@kde.org>
+ * Copyright (C) 2000 Dirk Mueller <mueller@kde.org>
+ * Copyright (C) 2006 Allan Sandfeld Jensen <kde@carewolf.com>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+#include "RenderImageResourceStyleImage.h"
+
+#include "RenderObject.h"
+#include "StyleCachedImage.h"
+
+namespace WebCore {
+
+RenderImageResourceStyleImage::RenderImageResourceStyleImage(StyleImage* styleImage)
+ : m_styleImage(styleImage)
+{
+ ASSERT(m_styleImage);
+}
+
+RenderImageResourceStyleImage::~RenderImageResourceStyleImage()
+{
+}
+
+void RenderImageResourceStyleImage::initialize(RenderObject* renderer)
+{
+ RenderImageResource::initialize(renderer);
+
+ if (m_styleImage->isCachedImage())
+ m_cachedImage = static_cast<StyleCachedImage*>(m_styleImage.get())->cachedImage();
+
+ m_styleImage->addClient(m_renderer);
+}
+
+void RenderImageResourceStyleImage::shutdown()
+{
+ ASSERT(m_renderer);
+ m_styleImage->removeClient(m_renderer);
+ m_cachedImage = 0;
+}
+
+} // namespace WebCore
diff --git a/WebCore/rendering/RenderImageResourceStyleImage.h b/WebCore/rendering/RenderImageResourceStyleImage.h
new file mode 100644
index 0000000..0281304
--- /dev/null
+++ b/WebCore/rendering/RenderImageResourceStyleImage.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 1999 Lars Knoll <knoll@kde.org>
+ * Copyright (C) 1999 Antti Koivisto <koivisto@kde.org>
+ * Copyright (C) 2006 Allan Sandfeld Jensen <kde@carewolf.com>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef RenderImageResourceStyleImage_h
+#define RenderImageResourceStyleImage_h
+
+#include "RenderImageResource.h"
+#include "StyleImage.h"
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+
+class RenderObject;
+
+class RenderImageResourceStyleImage : public RenderImageResource {
+public:
+ virtual ~RenderImageResourceStyleImage();
+
+ static PassOwnPtr<RenderImageResource> create(StyleImage* styleImage)
+ {
+ return adoptPtr(new RenderImageResourceStyleImage(styleImage));
+ }
+ virtual void initialize(RenderObject*);
+ virtual void shutdown();
+
+ virtual Image* image(int width = 0, int height = 0) { return m_styleImage->image(m_renderer, IntSize(width, height)); }
+ virtual bool errorOccurred() const { return m_styleImage->errorOccurred(); }
+
+ virtual void setImageContainerSize(const IntSize& size) const { m_styleImage->setImageContainerSize(size); }
+ virtual bool usesImageContainerSize() const { return m_styleImage->usesImageContainerSize(); }
+ virtual bool imageHasRelativeWidth() const { return m_styleImage->imageHasRelativeWidth(); }
+ virtual bool imageHasRelativeHeight() const { return m_styleImage->imageHasRelativeHeight(); }
+
+ virtual IntSize imageSize(float multiplier) const { return m_styleImage->imageSize(m_renderer, multiplier); }
+
+ virtual WrappedImagePtr imagePtr() const { return m_styleImage->data(); }
+
+private:
+ RenderImageResourceStyleImage(StyleImage*);
+ RefPtr<StyleImage> m_styleImage;
+};
+
+} // namespace WebCore
+
+#endif // RenderImageStyleImage_h
diff --git a/WebCore/rendering/RenderMedia.cpp b/WebCore/rendering/RenderMedia.cpp
index d7b4a99..a589a2d 100644
--- a/WebCore/rendering/RenderMedia.cpp
+++ b/WebCore/rendering/RenderMedia.cpp
@@ -57,6 +57,7 @@
, m_opacityAnimationFrom(0)
, m_opacityAnimationTo(1.0f)
{
+ setImageResource(RenderImageResource::create());
}
RenderMedia::RenderMedia(HTMLMediaElement* video, const IntSize& intrinsicSize)
@@ -69,6 +70,7 @@
, m_opacityAnimationFrom(0)
, m_opacityAnimationTo(1.0f)
{
+ setImageResource(RenderImageResource::create());
setIntrinsicSize(intrinsicSize);
}
diff --git a/WebCore/rendering/RenderObject.cpp b/WebCore/rendering/RenderObject.cpp
index 0eb05b1..576aad0 100644
--- a/WebCore/rendering/RenderObject.cpp
+++ b/WebCore/rendering/RenderObject.cpp
@@ -41,7 +41,8 @@
#include "RenderArena.h"
#include "RenderCounter.h"
#include "RenderFlexibleBox.h"
-#include "RenderImageGeneratedContent.h"
+#include "RenderImage.h"
+#include "RenderImageResourceStyleImage.h"
#include "RenderInline.h"
#include "RenderLayer.h"
#include "RenderListItem.h"
@@ -107,10 +108,12 @@
// Otherwise acts as if we didn't support this feature.
const ContentData* contentData = style->contentData();
if (contentData && !contentData->next() && contentData->isImage() && doc != node) {
- RenderImageGeneratedContent* image = new (arena) RenderImageGeneratedContent(node);
+ RenderImage* image = new (arena) RenderImage(node);
image->setStyle(style);
if (StyleImage* styleImage = contentData->image())
- image->setStyleImage(styleImage);
+ image->setImageResource(RenderImageResourceStyleImage::create(styleImage));
+ else
+ image->setImageResource(RenderImageResource::create());
return image;
}
diff --git a/WebCore/rendering/RenderObjectChildList.cpp b/WebCore/rendering/RenderObjectChildList.cpp
index 68e392c..d8c79556 100644
--- a/WebCore/rendering/RenderObjectChildList.cpp
+++ b/WebCore/rendering/RenderObjectChildList.cpp
@@ -30,7 +30,8 @@
#include "AXObjectCache.h"
#include "RenderBlock.h"
#include "RenderCounter.h"
-#include "RenderImageGeneratedContent.h"
+#include "RenderImage.h"
+#include "RenderImageResourceStyleImage.h"
#include "RenderInline.h"
#include "RenderLayer.h"
#include "RenderListItem.h"
@@ -430,12 +431,14 @@
renderer->setStyle(pseudoElementStyle);
break;
case CONTENT_OBJECT: {
- RenderImageGeneratedContent* image = new (owner->renderArena()) RenderImageGeneratedContent(owner->document()); // anonymous object
+ RenderImage* image = new (owner->renderArena()) RenderImage(owner->document()); // anonymous object
RefPtr<RenderStyle> style = RenderStyle::create();
style->inheritFrom(pseudoElementStyle);
image->setStyle(style.release());
if (StyleImage* styleImage = content->image())
- image->setStyleImage(styleImage);
+ image->setImageResource(RenderImageResourceStyleImage::create(styleImage));
+ else
+ image->setImageResource(RenderImageResource::create());
renderer = image;
break;
}
diff --git a/WebCore/rendering/RenderSVGImage.cpp b/WebCore/rendering/RenderSVGImage.cpp
index 893a4ea..6214ffe 100644
--- a/WebCore/rendering/RenderSVGImage.cpp
+++ b/WebCore/rendering/RenderSVGImage.cpp
@@ -47,6 +47,7 @@
: RenderImage(impl)
, m_needsTransformUpdate(true)
{
+ setImageResource(RenderImageResource::create());
}
void RenderSVGImage::layout()
@@ -62,7 +63,7 @@
}
// minimum height
- setHeight(errorOccurred() ? intrinsicSize().height() : 0);
+ setHeight(imageResource()->errorOccurred() ? intrinsicSize().height() : 0);
calcWidth();
calcHeight();
@@ -91,14 +92,15 @@
PaintInfo savedInfo(paintInfo);
if (SVGRenderSupport::prepareToRenderSVGContent(this, paintInfo)) {
+ Image* image = imageResource()->image();
FloatRect destRect = m_localBounds;
- FloatRect srcRect(0, 0, image()->width(), image()->height());
+ FloatRect srcRect(0, 0, image->width(), image->height());
SVGImageElement* imageElt = static_cast<SVGImageElement*>(node());
if (imageElt->preserveAspectRatio().align() != SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_NONE)
imageElt->preserveAspectRatio().transformRect(destRect, srcRect);
- paintInfo.context->drawImage(image(), DeviceColorSpace, destRect, srcRect);
+ paintInfo.context->drawImage(image, DeviceColorSpace, destRect, srcRect);
}
SVGRenderSupport::finishRenderSVGContent(this, paintInfo, savedInfo.context);
}
diff --git a/WebCore/rendering/RenderVideo.cpp b/WebCore/rendering/RenderVideo.cpp
index 0f444b28..3f4e2bf 100644
--- a/WebCore/rendering/RenderVideo.cpp
+++ b/WebCore/rendering/RenderVideo.cpp
@@ -110,7 +110,7 @@
if (player() && video->readyState() >= HTMLVideoElement::HAVE_METADATA)
return player()->naturalSize();
- if (video->shouldDisplayPosterImage() && !m_cachedImageSize.isEmpty() && !errorOccurred())
+ if (video->shouldDisplayPosterImage() && !m_cachedImageSize.isEmpty() && !imageResource()->errorOccurred())
return m_cachedImageSize;
// When the natural size of the video is unavailable, we use the provided