[subpixel] Change intrinsicSize to LayoutUnit
https://bugs.webkit.org/show_bug.cgi?id=99104

Reviewed by Levi Weintraub.

Source/WebCore:

Change RenderReplaced and intrinsicSize to LayoutUnit to avoid
rounding problems when zooming/scaling. Also change imageSize to
LayoutUnit as it can return a scaled size.

Test: fast/sub-pixel/tiled-canvas-elements.html

* html/ImageDocument.cpp:
(WebCore::ImageDocumentParser::finish):
* loader/cache/CachedImage.cpp:
(WebCore::CachedImage::imageSizeForRenderer):
* loader/cache/CachedImage.h:
(CachedImage):
* platform/graphics/FractionalLayoutSize.h:
(FractionalLayoutSize):
(WebCore::FractionalLayoutSize::scale):
(WebCore::FractionalLayoutSize::clampToMinimumSize):
* rendering/RenderBox.h:
(WebCore::RenderBox::intrinsicSize):
* rendering/RenderHTMLCanvas.cpp:
(WebCore::RenderHTMLCanvas::canvasSizeChanged):
* rendering/RenderImage.cpp:
(WebCore::RenderImage::imageChanged):
(WebCore::RenderImage::updateIntrinsicSizeIfNeeded):
(WebCore::RenderImage::paintReplaced):
(WebCore::RenderImage::minimumReplacedHeight):
* rendering/RenderImage.h:
(RenderImage):
* rendering/RenderImageResource.h:
(WebCore::RenderImageResource::imageSize):
* rendering/RenderImageResourceStyleImage.h:
* rendering/RenderReplaced.cpp:
(WebCore::RenderReplaced::RenderReplaced):
(WebCore::RenderReplaced::computeAspectRatioInformationForRenderBox):
(WebCore::RenderReplaced::computeReplacedLogicalWidth):
(WebCore::RenderReplaced::computeReplacedLogicalHeight):
* rendering/RenderReplaced.h:
(RenderReplaced):
(WebCore::RenderReplaced::minimumReplacedHeight):
(WebCore::RenderReplaced::setIntrinsicSize):
* rendering/RenderVideo.cpp:
(WebCore::RenderVideo::updateIntrinsicSize):
(WebCore::RenderVideo::calculateIntrinsicSize):
(WebCore::RenderVideo::videoBox):
(WebCore::RenderVideo::minimumReplacedHeight):
* rendering/RenderVideo.h:
(RenderVideo):
* rendering/style/StyleCachedImage.cpp:
(WebCore::StyleCachedImage::imageSize):
* rendering/style/StyleCachedImage.h:
(StyleCachedImage):
* rendering/style/StyleCachedImageSet.cpp:
(WebCore::StyleCachedImageSet::imageSize):
* rendering/style/StyleCachedImageSet.h:
(StyleCachedImageSet):
* rendering/style/StyleGeneratedImage.cpp:
(WebCore::StyleGeneratedImage::imageSize):
(WebCore::StyleGeneratedImage::computeIntrinsicDimensions):
* rendering/style/StyleGeneratedImage.h:
(StyleGeneratedImage):
* rendering/style/StyleImage.h:
(StyleImage):
* rendering/style/StylePendingImage.h:

LayoutTests:

Add test for tiled replaced elements and update existing expectations as needed.

* fast/sub-pixel/tiled-canvas-elements-expected.txt: Added.
* fast/sub-pixel/tiled-canvas-elements.html: Added.
* platform/chromium-linux/compositing/overflow/overflow-compositing-descendant-expected.png:
* platform/chromium-linux/compositing/overflow/scroll-ancestor-update-expected.png:
* platform/chromium-linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png:
* platform/chromium-linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.txt:
* platform/chromium-linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.txt:
* platform/chromium-linux/svg/zoom/page/zoom-svg-through-object-with-auto-size-expected.png:
* platform/chromium-linux/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png:
* platform/chromium-linux/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.txt:
* platform/chromium-win/svg/as-image/svg-non-integer-scaled-image-expected.png:
* platform/chromium-win/svg/zoom/page/zoom-svg-through-object-with-auto-size-expected.txt:
* platform/chromium/fast/reflections/reflection-with-zoom-expected.txt:
* platform/chromium/svg/as-image/svg-non-integer-scaled-image-expected.txt:
* platform/chromium/svg/zoom/page/zoom-svg-as-image-expected.txt:
* platform/chromium/svg/zoom/page/zoom-svg-as-relative-image-expected.txt:


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@133172 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/rendering/RenderImage.cpp b/Source/WebCore/rendering/RenderImage.cpp
index 25a62f5..c3bcf3a 100644
--- a/Source/WebCore/rendering/RenderImage.cpp
+++ b/Source/WebCore/rendering/RenderImage.cpp
@@ -165,7 +165,8 @@
         return;
     
     if (!m_didIncrementVisuallyNonEmptyPixelCount) {
-        view()->frameView()->incrementVisuallyNonEmptyPixelCount(m_imageResource->imageSize(1.0f));
+        // At a zoom level of 1 the image is guaranteed to have an integer size.
+        view()->frameView()->incrementVisuallyNonEmptyPixelCount(flooredIntSize(m_imageResource->imageSize(1.0f)));
         m_didIncrementVisuallyNonEmptyPixelCount = true;
     }
 
@@ -187,7 +188,7 @@
     imageDimensionsChanged(imageSizeChanged, rect);
 }
 
-bool RenderImage::updateIntrinsicSizeIfNeeded(const IntSize& newSize, bool imageSizeChanged)
+bool RenderImage::updateIntrinsicSizeIfNeeded(const LayoutSize& newSize, bool imageSizeChanged)
 {
     if (newSize == intrinsicSize() && !imageSizeChanged)
         return false;
@@ -326,7 +327,7 @@
                 if (centerY < 0)
                     centerY = 0;
                 imageOffset = LayoutSize(leftBorder + leftPad + centerX + 1, topBorder + topPad + centerY + 1);
-                context->drawImage(image.get(), style()->colorSpace(), IntRect(roundedIntPoint(paintOffset + imageOffset), imageSize), CompositeSourceOver, shouldRespectImageOrientation());
+                context->drawImage(image.get(), style()->colorSpace(), pixelSnappedIntRect(LayoutRect(paintOffset + imageOffset, imageSize)), CompositeSourceOver, shouldRespectImageOrientation());
                 errorPictureDrawn = true;
             }
 
@@ -485,9 +486,9 @@
     return true;
 }
 
-int RenderImage::minimumReplacedHeight() const
+LayoutUnit RenderImage::minimumReplacedHeight() const
 {
-    return m_imageResource->errorOccurred() ? intrinsicSize().height() : 0;
+    return m_imageResource->errorOccurred() ? intrinsicSize().height() : LayoutUnit();
 }
 
 HTMLMapElement* RenderImage::imageMap() const