[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

zimmermann at webkit.org zimmermann at webkit.org
Wed Dec 22 12:42:28 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 50d25555d3fcbb7737af6da934ae8f9010e34243
Author: zimmermann at webkit.org <zimmermann at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri Aug 27 14:46:22 2010 +0000

    2010-08-27  Patrick Gansterer  <paroga at 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/Android.mk b/WebCore/Android.mk
index 68a5f95..6a13b72 100644
--- a/WebCore/Android.mk
+++ b/WebCore/Android.mk
@@ -621,7 +621,8 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
 	rendering/RenderHTMLCanvas.cpp \
 	rendering/RenderIFrame.cpp \
 	rendering/RenderImage.cpp \
-	rendering/RenderImageGeneratedContent.cpp \
+	rendering/RenderImageResource.cpp \
+	rendering/RenderImageResourceStyleImage.cpp \
 	rendering/RenderInline.cpp \
 	rendering/RenderLayer.cpp \
 	rendering/RenderLayerBacking.cpp \
diff --git a/WebCore/CMakeLists.txt b/WebCore/CMakeLists.txt
index 6dbf082..76b84b4 100644
--- a/WebCore/CMakeLists.txt
+++ b/WebCore/CMakeLists.txt
@@ -1381,7 +1381,8 @@ SET(WebCore_SOURCES
     rendering/RenderHTMLCanvas.cpp
     rendering/RenderIFrame.cpp
     rendering/RenderImage.cpp
-    rendering/RenderImageGeneratedContent.cpp
+    rendering/RenderImageResource.cpp
+    rendering/RenderImageResourceStyleImage.cpp
     rendering/RenderIndicator.cpp
     rendering/RenderInline.cpp
     rendering/RenderLayer.cpp
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index c6bc8ea..d9ed548 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,116 @@
+2010-08-27  Patrick Gansterer  <paroga at 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):
+
 2010-08-27  Pavel Feldman  <pfeldman at chromium.org>
 
         Reviewed by Pavel Feldman.
diff --git a/WebCore/GNUmakefile.am b/WebCore/GNUmakefile.am
index fe49ee0..f71ac30 100644
--- a/WebCore/GNUmakefile.am
+++ b/WebCore/GNUmakefile.am
@@ -2269,8 +2269,10 @@ webcore_sources += \
 	WebCore/rendering/RenderIFrame.h \
 	WebCore/rendering/RenderImage.cpp \
 	WebCore/rendering/RenderImage.h \
-	WebCore/rendering/RenderImageGeneratedContent.cpp \
-	WebCore/rendering/RenderImageGeneratedContent.h \
+	WebCore/rendering/RenderImageResource.cpp \
+	WebCore/rendering/RenderImageResource.h \
+	WebCore/rendering/RenderImageResourceStyleImage.cpp \
+	WebCore/rendering/RenderImageResourceStyleImage.h \
 	WebCore/rendering/RenderIndicator.cpp \
 	WebCore/rendering/RenderIndicator.h \
 	WebCore/rendering/RenderInline.cpp \
diff --git a/WebCore/WebCore.gypi b/WebCore/WebCore.gypi
index 1c2fe75..32c4e57 100644
--- a/WebCore/WebCore.gypi
+++ b/WebCore/WebCore.gypi
@@ -3322,8 +3322,10 @@
             'rendering/RenderIFrame.h',
             'rendering/RenderImage.cpp',
             'rendering/RenderImage.h',
-            'rendering/RenderImageGeneratedContent.cpp',
-            'rendering/RenderImageGeneratedContent.h',
+            'rendering/RenderImageResource.cpp',
+            'rendering/RenderImageResource.h',
+            'rendering/RenderImageResourceStyleImage.cpp',
+            'rendering/RenderImageResourceStyleImage.h',
             'rendering/RenderIndicator.cpp',
             'rendering/RenderIndicator.h',
             'rendering/RenderInline.cpp',
diff --git a/WebCore/WebCore.pro b/WebCore/WebCore.pro
index 865cfbc..447d40f 100644
--- a/WebCore/WebCore.pro
+++ b/WebCore/WebCore.pro
@@ -1013,7 +1013,8 @@ SOURCES += \
     rendering/RenderHTMLCanvas.cpp \
     rendering/RenderIFrame.cpp \
     rendering/RenderImage.cpp \
-    rendering/RenderImageGeneratedContent.cpp \
+    rendering/RenderImageResource.cpp \
+    rendering/RenderImageResourceStyleImage.cpp \
     rendering/RenderIndicator.cpp \
     rendering/RenderInline.cpp \
     rendering/RenderLayer.cpp \
@@ -1841,7 +1842,8 @@ HEADERS += \
     rendering/RenderFrameSet.h \
     rendering/RenderHTMLCanvas.h \
     rendering/RenderIFrame.h \
-    rendering/RenderImageGeneratedContent.h \
+    rendering/RenderImageResource.h \
+    rendering/RenderImageResourceStyleImage.h \
     rendering/RenderImage.h \
     rendering/RenderIndicator.h \
     rendering/RenderInline.h \
diff --git a/WebCore/WebCore.vcproj/WebCore.vcproj b/WebCore/WebCore.vcproj/WebCore.vcproj
index 03af224..4914112 100644
--- a/WebCore/WebCore.vcproj/WebCore.vcproj
+++ b/WebCore/WebCore.vcproj/WebCore.vcproj
@@ -29977,11 +29977,19 @@
 				>
 			</File>
 			<File
-				RelativePath="..\rendering\RenderImageGeneratedContent.cpp"
+				RelativePath="..\rendering\RenderImageResource.cpp"
 				>
 			</File>
 			<File
-				RelativePath="..\rendering\RenderImageGeneratedContent.h"
+				RelativePath="..\rendering\RenderImageResource.h"
+				>
+			</File>
+			<File
+				RelativePath="..\rendering\RenderImageResourceStyleImage.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\rendering\RenderImageResourceStyleImage.h"
 				>
 			</File>
 			<File
diff --git a/WebCore/WebCore.xcodeproj/project.pbxproj b/WebCore/WebCore.xcodeproj/project.pbxproj
index be26197..2ef816c 100644
--- a/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -120,6 +120,8 @@
 		085B05C311FAE16C004D65F6 /* SVGResourcesCycleSolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 085B05C111FAE16C004D65F6 /* SVGResourcesCycleSolver.h */; };
 		085B92BA0EFDE73D00E6123C /* FormDataBuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 085B92B80EFDE73D00E6123C /* FormDataBuilder.cpp */; };
 		085B92BB0EFDE73D00E6123C /* FormDataBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 085B92B90EFDE73D00E6123C /* FormDataBuilder.h */; settings = {ATTRIBUTES = (); }; };
+		08641D4712142F7D008DE9F6 /* RenderImageResourceStyleImage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08641D4512142F7D008DE9F6 /* RenderImageResourceStyleImage.cpp */; };
+		08641D4812142F7D008DE9F6 /* RenderImageResourceStyleImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 08641D4612142F7D008DE9F6 /* RenderImageResourceStyleImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		0865CCE60EDDF51B00DF9EC3 /* WMLNoopElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0865CCE40EDDF51B00DF9EC3 /* WMLNoopElement.cpp */; };
 		0865CCE70EDDF51B00DF9EC3 /* WMLNoopElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 0865CCE50EDDF51B00DF9EC3 /* WMLNoopElement.h */; };
 		086A400611F6D6B7002CEC53 /* RenderSVGResourceContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 086A400511F6D6B7002CEC53 /* RenderSVGResourceContainer.cpp */; };
@@ -203,6 +205,8 @@
 		08E6A2E90EEE035200AC1206 /* WMLPostfieldElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 08E6A2E70EEE035200AC1206 /* WMLPostfieldElement.h */; };
 		08E6E0F10EFF42BA00029FBF /* WMLFieldSetElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08E6E0EF0EFF42BA00029FBF /* WMLFieldSetElement.cpp */; };
 		08E6E0F20EFF42BA00029FBF /* WMLFieldSetElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 08E6E0F00EFF42BA00029FBF /* WMLFieldSetElement.h */; };
+		08F2F0091213E61700DCEC48 /* RenderImageResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08F2F0071213E61700DCEC48 /* RenderImageResource.cpp */; };
+		08F2F00A1213E61700DCEC48 /* RenderImageResource.h in Headers */ = {isa = PBXBuildFile; fileRef = 08F2F0081213E61700DCEC48 /* RenderImageResource.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		0A4844990CA44CB200B7BD48 /* SoftLinking.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A4844980CA44CB200B7BD48 /* SoftLinking.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		0AFDAC3D10F5448C00E1F3D2 /* PluginViewBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 0AFDAC3C10F5448C00E1F3D2 /* PluginViewBase.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		0B8C56D40F28627F000502E1 /* HTTPHeaderMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0B8C56D30F28627F000502E1 /* HTTPHeaderMap.cpp */; };
@@ -4854,8 +4858,6 @@
 		BCB16C2D0979C3BD00467741 /* loader.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB16C140979C3BD00467741 /* loader.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		BCB16C2E0979C3BD00467741 /* Request.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCB16C150979C3BD00467741 /* Request.cpp */; };
 		BCB16C2F0979C3BD00467741 /* Request.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB16C160979C3BD00467741 /* Request.h */; };
-		BCB4F8900DB28DD60039139B /* RenderImageGeneratedContent.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB4F88F0DB28DD60039139B /* RenderImageGeneratedContent.h */; };
-		BCB4F8930DB28E530039139B /* RenderImageGeneratedContent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCB4F8920DB28E530039139B /* RenderImageGeneratedContent.cpp */; };
 		BCB773610C17853D00132BA4 /* JSNodeFilterCondition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCB7735E0C17853D00132BA4 /* JSNodeFilterCondition.cpp */; };
 		BCB773620C17853D00132BA4 /* JSNodeFilterCondition.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB7735F0C17853D00132BA4 /* JSNodeFilterCondition.h */; };
 		BCB773630C17853D00132BA4 /* JSNodeFilterCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCB773600C17853D00132BA4 /* JSNodeFilterCustom.cpp */; };
@@ -5911,6 +5913,8 @@
 		085B05C111FAE16C004D65F6 /* SVGResourcesCycleSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGResourcesCycleSolver.h; sourceTree = "<group>"; };
 		085B92B80EFDE73D00E6123C /* FormDataBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormDataBuilder.cpp; sourceTree = "<group>"; };
 		085B92B90EFDE73D00E6123C /* FormDataBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormDataBuilder.h; sourceTree = "<group>"; };
+		08641D4512142F7D008DE9F6 /* RenderImageResourceStyleImage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderImageResourceStyleImage.cpp; sourceTree = "<group>"; };
+		08641D4612142F7D008DE9F6 /* RenderImageResourceStyleImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderImageResourceStyleImage.h; sourceTree = "<group>"; };
 		0865CCE40EDDF51B00DF9EC3 /* WMLNoopElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WMLNoopElement.cpp; sourceTree = "<group>"; };
 		0865CCE50EDDF51B00DF9EC3 /* WMLNoopElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMLNoopElement.h; sourceTree = "<group>"; };
 		086A400511F6D6B7002CEC53 /* RenderSVGResourceContainer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderSVGResourceContainer.cpp; sourceTree = "<group>"; };
@@ -5981,6 +5985,8 @@
 		08E6A2E70EEE035200AC1206 /* WMLPostfieldElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMLPostfieldElement.h; sourceTree = "<group>"; };
 		08E6E0EF0EFF42BA00029FBF /* WMLFieldSetElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WMLFieldSetElement.cpp; sourceTree = "<group>"; };
 		08E6E0F00EFF42BA00029FBF /* WMLFieldSetElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMLFieldSetElement.h; sourceTree = "<group>"; };
+		08F2F0071213E61700DCEC48 /* RenderImageResource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderImageResource.cpp; sourceTree = "<group>"; };
+		08F2F0081213E61700DCEC48 /* RenderImageResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderImageResource.h; sourceTree = "<group>"; };
 		08FB84B00ECE373300DC064E /* WMLElementFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WMLElementFactory.cpp; sourceTree = "<group>"; };
 		08FB84B10ECE373300DC064E /* WMLElementFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMLElementFactory.h; sourceTree = "<group>"; };
 		0A4844980CA44CB200B7BD48 /* SoftLinking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoftLinking.h; sourceTree = "<group>"; };
@@ -10655,8 +10661,6 @@
 		BCB16C140979C3BD00467741 /* loader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = loader.h; sourceTree = "<group>"; };
 		BCB16C150979C3BD00467741 /* Request.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = Request.cpp; sourceTree = "<group>"; };
 		BCB16C160979C3BD00467741 /* Request.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Request.h; sourceTree = "<group>"; };
-		BCB4F88F0DB28DD60039139B /* RenderImageGeneratedContent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderImageGeneratedContent.h; sourceTree = "<group>"; };
-		BCB4F8920DB28E530039139B /* RenderImageGeneratedContent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderImageGeneratedContent.cpp; sourceTree = "<group>"; };
 		BCB7735E0C17853D00132BA4 /* JSNodeFilterCondition.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSNodeFilterCondition.cpp; sourceTree = "<group>"; };
 		BCB7735F0C17853D00132BA4 /* JSNodeFilterCondition.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSNodeFilterCondition.h; sourceTree = "<group>"; };
 		BCB773600C17853D00132BA4 /* JSNodeFilterCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSNodeFilterCustom.cpp; sourceTree = "<group>"; };
@@ -17114,8 +17118,10 @@
 				0FD308D4117D168400A791F7 /* RenderIFrame.h */,
 				BCEA4836097D93020094C9E4 /* RenderImage.cpp */,
 				BCEA4837097D93020094C9E4 /* RenderImage.h */,
-				BCB4F8920DB28E530039139B /* RenderImageGeneratedContent.cpp */,
-				BCB4F88F0DB28DD60039139B /* RenderImageGeneratedContent.h */,
+				08F2F0071213E61700DCEC48 /* RenderImageResource.cpp */,
+				08F2F0081213E61700DCEC48 /* RenderImageResource.h */,
+				08641D4512142F7D008DE9F6 /* RenderImageResourceStyleImage.cpp */,
+				08641D4612142F7D008DE9F6 /* RenderImageResourceStyleImage.h */,
 				A7AA66D411C5ED6A001D8C8C /* RenderIndicator.cpp */,
 				A7AA66D511C5ED6A001D8C8C /* RenderIndicator.h */,
 				BCEA4838097D93020094C9E4 /* RenderInline.cpp */,
@@ -19647,7 +19653,8 @@
 				BCEA486A097D93020094C9E4 /* RenderHTMLCanvas.h in Headers */,
 				0FD308D6117D168500A791F7 /* RenderIFrame.h in Headers */,
 				BCEA4876097D93020094C9E4 /* RenderImage.h in Headers */,
-				BCB4F8900DB28DD60039139B /* RenderImageGeneratedContent.h in Headers */,
+				08F2F00A1213E61700DCEC48 /* RenderImageResource.h in Headers */,
+				08641D4812142F7D008DE9F6 /* RenderImageResourceStyleImage.h in Headers */,
 				A7AA66D711C5ED6A001D8C8C /* RenderIndicator.h in Headers */,
 				BCEA4878097D93020094C9E4 /* RenderInline.h in Headers */,
 				750D029411D0E7F300BD1B27 /* RenderInputSpeech.h in Headers */,
@@ -22190,7 +22197,8 @@
 				BCEA4869097D93020094C9E4 /* RenderHTMLCanvas.cpp in Sources */,
 				0FD308D5117D168500A791F7 /* RenderIFrame.cpp in Sources */,
 				BCEA4875097D93020094C9E4 /* RenderImage.cpp in Sources */,
-				BCB4F8930DB28E530039139B /* RenderImageGeneratedContent.cpp in Sources */,
+				08F2F0091213E61700DCEC48 /* RenderImageResource.cpp in Sources */,
+				08641D4712142F7D008DE9F6 /* RenderImageResourceStyleImage.cpp in Sources */,
 				A7AA66D611C5ED6A001D8C8C /* RenderIndicator.cpp in Sources */,
 				BCEA4877097D93020094C9E4 /* RenderInline.cpp in Sources */,
 				750D029311D0E7F300BD1B27 /* RenderInputSpeech.cpp in Sources */,
diff --git a/WebCore/html/HTMLEmbedElement.cpp b/WebCore/html/HTMLEmbedElement.cpp
index bb40f25..fb2b351 100644
--- a/WebCore/html/HTMLEmbedElement.cpp
+++ b/WebCore/html/HTMLEmbedElement.cpp
@@ -154,8 +154,11 @@ bool HTMLEmbedElement::rendererIsNeeded(RenderStyle* style)
 
 RenderObject* HTMLEmbedElement::createRenderer(RenderArena* arena, RenderStyle*)
 {
-    if (isImageType())
-        return new (arena) RenderImage(this);
+    if (isImageType()) {
+        RenderImage* image = new (arena) RenderImage(this);
+        image->setImageResource(RenderImageResource::create());
+        return image;
+    }
     return new (arena) RenderEmbeddedObject(this);
 }
 
@@ -176,7 +179,7 @@ void HTMLEmbedElement::attach()
         m_imageLoader->updateFromElement();
 
         if (renderer())
-            toRenderImage(renderer())->setCachedImage(m_imageLoader->image());
+            toRenderImage(renderer())->imageResource()->setCachedImage(m_imageLoader->image());
     }
 }
 
diff --git a/WebCore/html/HTMLImageElement.cpp b/WebCore/html/HTMLImageElement.cpp
index 82eeab1..b7ece78 100644
--- a/WebCore/html/HTMLImageElement.cpp
+++ b/WebCore/html/HTMLImageElement.cpp
@@ -183,7 +183,9 @@ RenderObject* HTMLImageElement::createRenderer(RenderArena* arena, RenderStyle*
      if (style->contentData())
         return RenderObject::createObject(this, style);
 
-     return new (arena) RenderImage(this);
+    RenderImage* image = new (arena) RenderImage(this);
+    image->setImageResource(RenderImageResource::create());
+    return image;
 }
 
 void HTMLImageElement::attach()
@@ -191,15 +193,16 @@ void HTMLImageElement::attach()
     HTMLElement::attach();
 
     if (renderer() && renderer()->isImage() && m_imageLoader.haveFiredBeforeLoadEvent()) {
-        RenderImage* imageObj = toRenderImage(renderer());
-        if (imageObj->hasImage())
+        RenderImage* renderImage = toRenderImage(renderer());
+        RenderImageResource* renderImageResource = renderImage->imageResource();
+        if (renderImageResource->hasImage())
             return;
-        imageObj->setCachedImage(m_imageLoader.image());
+        renderImageResource->setCachedImage(m_imageLoader.image());
 
         // If we have no image at all because we have no src attribute, set
         // image height and width for the alt text instead.
-        if (!m_imageLoader.image() && !imageObj->cachedImage())
-            imageObj->setImageSizeForAltText();
+        if (!m_imageLoader.image() && !renderImageResource->cachedImage())
+            renderImage->setImageSizeForAltText();
     }
 }
 
diff --git a/WebCore/html/HTMLInputElement.cpp b/WebCore/html/HTMLInputElement.cpp
index 629e07b..16d7358 100644
--- a/WebCore/html/HTMLInputElement.cpp
+++ b/WebCore/html/HTMLInputElement.cpp
@@ -1168,8 +1168,11 @@ RenderObject* HTMLInputElement::createRenderer(RenderArena *arena, RenderStyle *
         return new (arena) RenderFileUploadControl(this);
     case HIDDEN:
         break;
-    case IMAGE:
-        return new (arena) RenderImage(this);
+    case IMAGE: {
+        RenderImage* image = new (arena) RenderImage(this);
+        image->setImageResource(RenderImageResource::create());
+        return image;
+    }
     case RANGE:
         return new (arena) RenderSlider(this);
     case COLOR:
@@ -1208,13 +1211,14 @@ void HTMLInputElement::attach()
             m_imageLoader = adoptPtr(new HTMLImageLoader(this));
         m_imageLoader->updateFromElement();
         if (renderer() && m_imageLoader->haveFiredBeforeLoadEvent()) {
-            RenderImage* imageObj = toRenderImage(renderer());
-            imageObj->setCachedImage(m_imageLoader->image()); 
-            
+            RenderImage* renderImage = toRenderImage(renderer());
+            RenderImageResource* renderImageResource = renderImage->imageResource();
+            renderImageResource->setCachedImage(m_imageLoader->image()); 
+
             // If we have no image at all because we have no src attribute, set
             // image height and width for the alt text instead.
-            if (!m_imageLoader->image() && !imageObj->cachedImage())
-                imageObj->setImageSizeForAltText();
+            if (!m_imageLoader->image() && !renderImageResource->cachedImage())
+                renderImage->setImageSizeForAltText();
         }
     }
 
diff --git a/WebCore/html/HTMLObjectElement.cpp b/WebCore/html/HTMLObjectElement.cpp
index de1ed91..bf2deba 100644
--- a/WebCore/html/HTMLObjectElement.cpp
+++ b/WebCore/html/HTMLObjectElement.cpp
@@ -136,8 +136,11 @@ RenderObject *HTMLObjectElement::createRenderer(RenderArena* arena, RenderStyle*
 {
     if (m_useFallbackContent)
         return RenderObject::createObject(this, style);
-    if (isImageType())
-        return new (arena) RenderImage(this);
+    if (isImageType()) {
+        RenderImage* image = new (arena) RenderImage(this);
+        image->setImageResource(RenderImageResource::create());
+        return image;
+    }
     return new (arena) RenderEmbeddedObject(this);
 }
 
diff --git a/WebCore/html/HTMLVideoElement.cpp b/WebCore/html/HTMLVideoElement.cpp
index cd9c7ec..219bb85 100644
--- a/WebCore/html/HTMLVideoElement.cpp
+++ b/WebCore/html/HTMLVideoElement.cpp
@@ -78,10 +78,8 @@ void HTMLVideoElement::attach()
         if (!m_imageLoader)
             m_imageLoader = adoptPtr(new HTMLImageLoader(this));
         m_imageLoader->updateFromElement();
-        if (renderer()) {
-            RenderImage* imageRenderer = toRenderImage(renderer());
-            imageRenderer->setCachedImage(m_imageLoader->image()); 
-        }
+        if (renderer())
+            toRenderImage(renderer())->imageResource()->setCachedImage(m_imageLoader->image()); 
     }
 #endif
 }
@@ -111,7 +109,7 @@ void HTMLVideoElement::parseMappedAttribute(Attribute* attr)
             if (m_imageLoader)
                 m_imageLoader.clear();
             if (renderer())
-                toRenderImage(renderer())->setCachedImage(0); 
+                toRenderImage(renderer())->imageResource()->setCachedImage(0); 
         }
 #endif
     } else if (attrName == widthAttr)
diff --git a/WebCore/loader/ImageLoader.cpp b/WebCore/loader/ImageLoader.cpp
index d169d3e..242bf94 100644
--- a/WebCore/loader/ImageLoader.cpp
+++ b/WebCore/loader/ImageLoader.cpp
@@ -31,6 +31,13 @@
 #include "HTMLObjectElement.h"
 #include "RenderImage.h"
 
+#if ENABLE(SVG)
+#include "RenderSVGImage.h"
+#endif
+#if ENABLE(VIDEO)
+#include "RenderVideo.h"
+#endif
+
 #if !ASSERT_DISABLED
 // ImageLoader objects are allocated as members of other objects, so generic pointer check would always fail.
 namespace WTF {
@@ -130,11 +137,8 @@ void ImageLoader::setImage(CachedImage* newImage)
             oldImage->removeClient(this);
     }
 
-    if (RenderObject* renderer = m_element->renderer()) {
-        if (!renderer->isImage())
-            return;
-        toRenderImage(renderer)->resetAnimation();
-    }
+    if (RenderImageResource* imageResource = renderImageResource())
+        imageResource->resetAnimation();
 }
 
 void ImageLoader::updateFromElement()
@@ -195,11 +199,8 @@ void ImageLoader::updateFromElement()
             oldImage->removeClient(this);
     }
 
-    if (RenderObject* renderer = m_element->renderer()) {
-        if (!renderer->isImage())
-            return;
-        toRenderImage(renderer)->resetAnimation();
-    }
+    if (RenderImageResource* imageResource = renderImageResource())
+        imageResource->resetAnimation();
 }
 
 void ImageLoader::updateFromElementIgnoringPreviousError()
@@ -223,20 +224,42 @@ void ImageLoader::notifyFinished(CachedResource*)
     loadEventSender().dispatchEventSoon(this);
 }
 
+RenderImageResource* ImageLoader::renderImageResource()
+{
+    RenderObject* renderer = m_element->renderer();
+
+    if (!renderer)
+        return 0;
+
+    if (renderer->isImage())
+        return toRenderImage(renderer)->imageResource();
+
+#if ENABLE(SVG)
+    if (renderer->isSVGImage())
+        return toRenderSVGImage(renderer)->imageResource();
+#endif
+
+#if ENABLE(VIDEO)
+    if (renderer->isVideo())
+        return toRenderVideo(renderer)->imageResource();
+#endif
+
+    return 0;
+}
+
 void ImageLoader::updateRenderer()
 {
-    if (RenderObject* renderer = m_element->renderer()) {
-        if (!renderer->isImage() && !renderer->isVideo())
-            return;
-        RenderImage* imageRenderer = toRenderImage(renderer);
-        
-        // Only update the renderer if it doesn't have an image or if what we have
-        // is a complete image.  This prevents flickering in the case where a dynamic
-        // change is happening between two images.
-        CachedImage* cachedImage = imageRenderer->cachedImage();
-        if (m_image != cachedImage && (m_imageComplete || !cachedImage))
-            imageRenderer->setCachedImage(m_image.get());
-    }
+    RenderImageResource* imageResource = renderImageResource();
+
+    if (!imageResource)
+        return;
+
+    // Only update the renderer if it doesn't have an image or if what we have
+    // is a complete image.  This prevents flickering in the case where a dynamic
+    // change is happening between two images.
+    CachedImage* cachedImage = imageResource->cachedImage();
+    if (m_image != cachedImage && (m_imageComplete || !cachedImage))
+        imageResource->setCachedImage(m_image.get());
 }
 
 void ImageLoader::dispatchPendingBeforeLoadEvent()
diff --git a/WebCore/loader/ImageLoader.h b/WebCore/loader/ImageLoader.h
index 02ddce8..9bf7624 100644
--- a/WebCore/loader/ImageLoader.h
+++ b/WebCore/loader/ImageLoader.h
@@ -31,6 +31,7 @@ namespace WebCore {
 
 class Element;
 class ImageLoadEventSender;
+class RenderImageResource;
 
 class ImageLoader : public CachedResourceClient {
 public:
@@ -72,6 +73,7 @@ private:
     void dispatchPendingBeforeLoadEvent();
     void dispatchPendingLoadEvent();
 
+    RenderImageResource* renderImageResource();
     void updateRenderer();
 
     Element* m_element;
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 @@ using namespace HTMLNames;
 
 RenderImage::RenderImage(Node* node)
     : RenderReplaced(node, IntSize(0, 0))
-    , m_cachedImage(0)
 {
     updateAltText();
 
@@ -66,22 +65,15 @@ RenderImage::RenderImage(Node* node)
 
 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 @@ void RenderImage::imageChanged(WrappedImagePtr newImage, const IntRect* rect)
 
     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 @@ void RenderImage::imageChanged(WrappedImagePtr newImage, const IntRect* rect)
         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 @@ void RenderImage::notifyFinished(CachedResource* newImage)
         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 @@ void RenderImage::notifyFinished(CachedResource* newImage)
     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 @@ void RenderImage::paintReplaced(PaintInfo& paintInfo, int tx, int ty)
 
     GraphicsContext* context = paintInfo.context;
 
-    if (!hasImage() || errorOccurred()) {
+    if (!m_imageResource->hasImage() || m_imageResource->errorOccurred()) {
         if (paintInfo.phase == PaintPhaseSelection)
             return;
 
@@ -255,17 +238,19 @@ void RenderImage::paintReplaced(PaintInfo& paintInfo, int tx, int ty)
             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 @@ void RenderImage::paintReplaced(PaintInfo& paintInfo, int tx, int ty)
                     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::paintFocusRings(PaintInfo& paintInfo, const RenderStyle* style
     
 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 @@ bool RenderImage::isHeightSpecified() const
 
 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 RenderImage::calcReplacedHeight() const
     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 @@ int RenderImage::calcAspectRatioWidth() const
     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 @@ int RenderImage::calcAspectRatioHeight() const
     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 @@ void RenderImage::calcPrefWidths()
     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 @@ public:
     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 @@ protected:
     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 @@ private:
 
     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 at kde.org>
+ * Copyright (C) 1999 Antti Koivisto <koivisto at kde.org>
+ * Copyright (C) 2000 Dirk Mueller <mueller at kde.org>
+ * Copyright (C) 2006 Allan Sandfeld Jensen <kde at carewolf.com>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig at 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 at 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 at kde.org>
+ * Copyright (C) 1999 Antti Koivisto <koivisto at kde.org>
+ * Copyright (C) 2006 Allan Sandfeld Jensen <kde at carewolf.com>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig at gmail.com>
+ * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 Patrick Gansterer <paroga at 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 at kde.org>
+ * Copyright (C) 1999 Antti Koivisto <koivisto at kde.org>
+ * Copyright (C) 2000 Dirk Mueller <mueller at kde.org>
+ * Copyright (C) 2006 Allan Sandfeld Jensen <kde at carewolf.com>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig at 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 at 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 at kde.org>
+ * Copyright (C) 1999 Antti Koivisto <koivisto at kde.org>
+ * Copyright (C) 2006 Allan Sandfeld Jensen <kde at carewolf.com>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig at gmail.com>
+ * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 Patrick Gansterer <paroga at 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 @@ RenderMedia::RenderMedia(HTMLMediaElement* video)
     , m_opacityAnimationFrom(0)
     , m_opacityAnimationTo(1.0f)
 {
+    setImageResource(RenderImageResource::create());
 }
 
 RenderMedia::RenderMedia(HTMLMediaElement* video, const IntSize& intrinsicSize)
@@ -69,6 +70,7 @@ RenderMedia::RenderMedia(HTMLMediaElement* video, const IntSize& intrinsicSize)
     , 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 @@ RenderObject* RenderObject::createObject(Node* node, RenderStyle* style)
     // 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..d8c7955 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 @@ void RenderObjectChildList::updateBeforeAfterContent(RenderObject* owner, Pseudo
                 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 @@ RenderSVGImage::RenderSVGImage(SVGImageElement* impl)
     : RenderImage(impl)
     , m_needsTransformUpdate(true)
 {
+    setImageResource(RenderImageResource::create());
 }
 
 void RenderSVGImage::layout()
@@ -62,7 +63,7 @@ void RenderSVGImage::layout()
     }
 
     // minimum height
-    setHeight(errorOccurred() ? intrinsicSize().height() : 0);
+    setHeight(imageResource()->errorOccurred() ? intrinsicSize().height() : 0);
 
     calcWidth();
     calcHeight();
@@ -91,14 +92,15 @@ void RenderSVGImage::paint(PaintInfo& paintInfo, int, int)
         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 0f444b2..3f4e2bf 100644
--- a/WebCore/rendering/RenderVideo.cpp
+++ b/WebCore/rendering/RenderVideo.cpp
@@ -110,7 +110,7 @@ IntSize RenderVideo::calculateIntrinsicSize()
     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
diff --git a/WebCore/svg/SVGImageElement.cpp b/WebCore/svg/SVGImageElement.cpp
index c5e4802..0e4fb13 100644
--- a/WebCore/svg/SVGImageElement.cpp
+++ b/WebCore/svg/SVGImageElement.cpp
@@ -172,10 +172,10 @@ void SVGImageElement::attach()
     SVGStyledTransformableElement::attach();
 
     if (RenderSVGImage* imageObj = toRenderSVGImage(renderer())) {
-        if (imageObj->hasImage())
+        if (imageObj->imageResource()->hasImage())
             return;
 
-        imageObj->setCachedImage(m_imageLoader.image());
+        imageObj->imageResource()->setCachedImage(m_imageLoader.image());
     }
 }
 
diff --git a/WebCore/wml/WMLImageElement.cpp b/WebCore/wml/WMLImageElement.cpp
index f6b3f1e..f3ae433 100644
--- a/WebCore/wml/WMLImageElement.cpp
+++ b/WebCore/wml/WMLImageElement.cpp
@@ -109,7 +109,9 @@ void WMLImageElement::attach()
 
 RenderObject* WMLImageElement::createRenderer(RenderArena* arena, RenderStyle*)
 {
-    return new (arena) RenderImage(this);
+    RenderImage* image = new (arena) RenderImage(this);
+    image->setImageResource(RenderImageResource::create());
+    return image;
 }
 
 void WMLImageElement::insertedIntoDocument()

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list