[WK2][CoordinatedGraphics] Misuse of DrawingAreaProxy::setVisibleContentsRect() in...
authormarcelo.lira@openbossa.org <marcelo.lira@openbossa.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 27 May 2013 16:52:10 +0000 (16:52 +0000)
committermarcelo.lira@openbossa.org <marcelo.lira@openbossa.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 27 May 2013 16:52:10 +0000 (16:52 +0000)
https://bugs.webkit.org/show_bug.cgi?id=116688

Reviewed by Noam Rosenthal.

Visible contents area passed to DrawingAreaProxy::setVisibleContentsRect()
must be calculated including the page scale factor and avoid crossing the
boundaries of the page contents size. In other words the DrawingArea
must know the actual dimensions of what it being drawn. If the
DrawingArea thinks the visible rectangle is bigger than it is, the
contents will be drawn pixelated and blurry.

* UIProcess/CoordinatedGraphics/WebView.cpp:
(WebKit::WebView::didChangeContentsSize):
(WebKit::WebView::updateViewportSize):
(WebKit::WebView::visibleContentsSize):
(WebKit):
* UIProcess/CoordinatedGraphics/WebView.h:
(WebKit::WebView::contentsSize):
(WebView):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@150764 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.cpp
Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.h

index 9ae9427..4f79231 100644 (file)
@@ -1,3 +1,26 @@
+2013-05-27  Marcelo Lira  <marcelo.lira@openbossa.org>
+
+        [WK2][CoordinatedGraphics] Misuse of DrawingAreaProxy::setVisibleContentsRect() in WebView::updateViewportSize()
+        https://bugs.webkit.org/show_bug.cgi?id=116688
+
+        Reviewed by Noam Rosenthal.
+
+        Visible contents area passed to DrawingAreaProxy::setVisibleContentsRect()
+        must be calculated including the page scale factor and avoid crossing the
+        boundaries of the page contents size. In other words the DrawingArea
+        must know the actual dimensions of what it being drawn. If the
+        DrawingArea thinks the visible rectangle is bigger than it is, the
+        contents will be drawn pixelated and blurry.
+
+        * UIProcess/CoordinatedGraphics/WebView.cpp:
+        (WebKit::WebView::didChangeContentsSize):
+        (WebKit::WebView::updateViewportSize):
+        (WebKit::WebView::visibleContentsSize):
+        (WebKit):
+        * UIProcess/CoordinatedGraphics/WebView.h:
+        (WebKit::WebView::contentsSize):
+        (WebView):
+
 2013-05-27  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [GTK] WebKitWebView child widgets are not rendered with recent GTK+
index aff9613..ff7d6a5 100644 (file)
@@ -186,6 +186,7 @@ void WebView::initializeClient(const WKViewClient* client)
 
 void WebView::didChangeContentsSize(const WebCore::IntSize& size)
 {
+    m_contentsSize = size;
     m_client.didChangeContentsSize(this, size);
 }
 
@@ -224,7 +225,9 @@ void WebView::updateViewportSize()
     if (DrawingAreaProxy* drawingArea = page()->drawingArea()) {
         // Web Process expects sizes in UI units, and not raw device units.
         drawingArea->setSize(roundedIntSize(dipSize()), IntSize(), IntSize());
-        drawingArea->setVisibleContentsRect(FloatRect(contentPosition(), dipSize()), FloatPoint());
+        FloatRect visibleContentsRect(contentPosition(), visibleContentsSize());
+        visibleContentsRect.intersect(FloatRect(FloatPoint(), contentsSize()));
+        drawingArea->setVisibleContentsRect(visibleContentsRect, FloatPoint());
     }
 }
 
@@ -236,6 +239,14 @@ inline WebCore::FloatSize WebView::dipSize() const
     return dipSize;
 }
 
+WebCore::FloatSize WebView::visibleContentsSize() const
+{
+    FloatSize visibleContentsSize(dipSize());
+    visibleContentsSize.scale(1 / m_contentScaleFactor);
+
+    return visibleContentsSize;
+}
+
 // Page Client
 
 PassOwnPtr<DrawingAreaProxy> WebView::createDrawingAreaProxy()
index 81aacf7..c7719ce 100644 (file)
@@ -97,6 +97,8 @@ public:
     WebPageProxy* page() { return m_page.get(); }
 
     void didChangeContentsSize(const WebCore::IntSize&);
+    const WebCore::IntSize& contentsSize() const { return m_contentsSize; }
+    WebCore::FloatSize visibleContentsSize() const;
 
     // FIXME: Should become private when Web Events creation is moved to WebView.
     WebCore::AffineTransform transformFromScene() const;
@@ -195,6 +197,7 @@ protected:
     float m_contentScaleFactor;
     double m_opacity;
     WebCore::FloatPoint m_contentPosition; // Position in UI units.
+    WebCore::IntSize m_contentsSize;
 };
 
 } // namespace WebKit