<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[169576] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/169576">169576</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2014-06-03 18:27:00 -0700 (Tue, 03 Jun 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>WebKit2 View Gestures (Zoom): Can show unpainted regions when zoom-pinching-out
https://bugs.webkit.org/show_bug.cgi?id=133472
&lt;rdar://problem/15686848&gt;

Reviewed by Simon Fraser.

* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:
* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
(WebKit::TiledCoreAnimationDrawingArea::flushLayers):
(WebKit::TiledCoreAnimationDrawingArea::applyTransientZoomToLayers):
(WebKit::TiledCoreAnimationDrawingArea::adjustTransientZoom):
Use prepopulateRect() when zooming out to ensure that we have tiles for the current exposed area.

Factor applyTransientZoomToLayers out of adjustTransientZoom, so that
flushLayers can call applyTransientZoomToLayers without ending up calling prepopulateRect()
during layer flushing, which causes trouble.

It is OK to populate layers at the current scale even when zooming out, because the overdraw
already covers most of the zoomed out area, and we're only adding a few more tiles at worst.

* WebCore.exp.in:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCoreexpin">trunk/Source/WebCore/WebCore.exp.in</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacTiledCoreAnimationDrawingAreah">trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacTiledCoreAnimationDrawingAreamm">trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (169575 => 169576)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-06-03 23:01:02 UTC (rev 169575)
+++ trunk/Source/WebCore/ChangeLog        2014-06-04 01:27:00 UTC (rev 169576)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2014-06-03  Timothy Horton  &lt;timothy_horton@apple.com&gt;
+
+        WebKit2 View Gestures (Zoom): Can show unpainted regions when zoom-pinching-out
+        https://bugs.webkit.org/show_bug.cgi?id=133472
+        &lt;rdar://problem/15686848&gt;
+
+        Reviewed by Simon Fraser.
+
+        * WebCore.exp.in:
+
</ins><span class="cx"> 2014-06-03  Yoav Weiss  &lt;yoav@yoav.ws&gt;
</span><span class="cx"> 
</span><span class="cx">         Refactor the srcset parser into its own file
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCoreexpin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.exp.in (169575 => 169576)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.exp.in        2014-06-03 23:01:02 UTC (rev 169575)
+++ trunk/Source/WebCore/WebCore.exp.in        2014-06-04 01:27:00 UTC (rev 169576)
</span><span class="lines">@@ -1758,6 +1758,7 @@
</span><span class="cx"> __ZNK7WebCore17ResourceErrorBase8lazyInitEv
</span><span class="cx"> __ZNK7WebCore18PlatformPasteboard11changeCountEv
</span><span class="cx"> __ZNK7WebCore18RenderLayerBacking11contentsBoxEv
</span><ins>+__ZNK7WebCore18RenderLayerBacking12tiledBackingEv
</ins><span class="cx"> __ZNK7WebCore18RenderLayerBacking20compositingLayerTypeEv
</span><span class="cx"> __ZNK7WebCore19AnimationController11isSuspendedEv
</span><span class="cx"> __ZNK7WebCore19AnimationController24numberOfActiveAnimationsEPNS_8DocumentE
</span><span class="lines">@@ -2609,12 +2610,12 @@
</span><span class="cx"> __ZN7WebCore22startOfEditableContentERKNS_15VisiblePositionE
</span><span class="cx"> __ZN7WebCore23applicationIsMobileMailEv
</span><span class="cx"> __ZN7WebCore23atBoundaryOfGranularityERKNS_15VisiblePositionENS_15TextGranularityENS_18SelectionDirectionE
</span><del>-__ZN7WebCore24charactersAroundPositionERKNS_15VisiblePositionERiS3_S3_
</del><span class="cx"> __ZN7WebCore24DocumentMarkerController14markersInRangeEPNS_5RangeENS_14DocumentMarker11MarkerTypesE
</span><span class="cx"> __ZN7WebCore24FloatingPointEnvironment21enableDenormalSupportEv
</span><span class="cx"> __ZN7WebCore24FloatingPointEnvironment25saveMainThreadEnvironmentEv
</span><span class="cx"> __ZN7WebCore24FloatingPointEnvironment6sharedEv
</span><span class="cx"> __ZN7WebCore24acquireLineBreakIteratorEN3WTF10StringViewERKNS0_12AtomicStringEPKtj
</span><ins>+__ZN7WebCore24charactersAroundPositionERKNS_15VisiblePositionERiS3_S3_
</ins><span class="cx"> __ZN7WebCore24createTemporaryDirectoryEP8NSString
</span><span class="cx"> __ZN7WebCore24distanceBetweenPositionsERKNS_15VisiblePositionES2_
</span><span class="cx"> __ZN7WebCore24keyIdentifierForKeyEventEP8WebEvent
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (169575 => 169576)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-06-03 23:01:02 UTC (rev 169575)
+++ trunk/Source/WebKit2/ChangeLog        2014-06-04 01:27:00 UTC (rev 169576)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2014-06-03  Timothy Horton  &lt;timothy_horton@apple.com&gt;
+
+        WebKit2 View Gestures (Zoom): Can show unpainted regions when zoom-pinching-out
+        https://bugs.webkit.org/show_bug.cgi?id=133472
+        &lt;rdar://problem/15686848&gt;
+
+        Reviewed by Simon Fraser.
+
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h:
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
+        (WebKit::TiledCoreAnimationDrawingArea::flushLayers):
+        (WebKit::TiledCoreAnimationDrawingArea::applyTransientZoomToLayers):
+        (WebKit::TiledCoreAnimationDrawingArea::adjustTransientZoom):
+        Use prepopulateRect() when zooming out to ensure that we have tiles for the current exposed area.
+
+        Factor applyTransientZoomToLayers out of adjustTransientZoom, so that
+        flushLayers can call applyTransientZoomToLayers without ending up calling prepopulateRect()
+        during layer flushing, which causes trouble.
+
+        It is OK to populate layers at the current scale even when zooming out, because the overdraw
+        already covers most of the zoomed out area, and we're only adding a few more tiles at worst.
+
</ins><span class="cx"> 2014-06-03  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS][WK2] Align the highlight rects with device pixels
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacTiledCoreAnimationDrawingAreah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h (169575 => 169576)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h        2014-06-03 23:01:02 UTC (rev 169575)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h        2014-06-04 01:27:00 UTC (rev 169576)
</span><span class="lines">@@ -98,6 +98,8 @@
</span><span class="cx">     WebCore::PlatformCALayer* layerForTransientZoom() const;
</span><span class="cx">     WebCore::PlatformCALayer* shadowLayerForTransientZoom() const;
</span><span class="cx"> 
</span><ins>+    void applyTransientZoomToLayers(double scale, WebCore::FloatPoint origin);
+
</ins><span class="cx">     virtual WebCore::TransformationMatrix rootLayerTransform() const override {  return m_transform; }
</span><span class="cx">     virtual void setRootLayerTransform(const WebCore::TransformationMatrix&amp;) override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacTiledCoreAnimationDrawingAreamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (169575 => 169576)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm        2014-06-03 23:01:02 UTC (rev 169575)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm        2014-06-04 01:27:00 UTC (rev 169576)
</span><span class="lines">@@ -284,7 +284,7 @@
</span><span class="cx">     // If we have an active transient zoom, we want the zoom to win over any changes
</span><span class="cx">     // that WebCore makes to the relevant layers, so re-apply our changes after flushing.
</span><span class="cx">     if (m_transientZoomScale != 1)
</span><del>-        adjustTransientZoom(m_transientZoomScale, m_transientZoomOrigin);
</del><ins>+        applyTransientZoomToLayers(m_transientZoomScale, m_transientZoomOrigin);
</ins><span class="cx"> 
</span><span class="cx">     [pool drain];
</span><span class="cx">     return returnValue;
</span><span class="lines">@@ -511,11 +511,9 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TiledCoreAnimationDrawingArea::adjustTransientZoom(double scale, FloatPoint origin)
</del><ins>+void TiledCoreAnimationDrawingArea::applyTransientZoomToLayers(double scale, FloatPoint origin)
</ins><span class="cx"> {
</span><span class="cx">     // FIXME: Scrollbars should stay in-place and change height while zooming.
</span><del>-    // FIXME: Keep around pageScale=1 tiles so we can zoom out without gaps.
-    // FIXME: Bring in unparented-but-painted tiles when zooming out, to fill in any gaps.
</del><span class="cx"> 
</span><span class="cx">     if (!m_hostingLayer)
</span><span class="cx">         return;
</span><span class="lines">@@ -542,6 +540,21 @@
</span><span class="cx">     m_transientZoomOrigin = origin;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void TiledCoreAnimationDrawingArea::adjustTransientZoom(double scale, FloatPoint origin)
+{
+    applyTransientZoomToLayers(scale, origin);
+
+    double currentPageScale = m_webPage-&gt;pageScaleFactor();
+    if (scale &gt; currentPageScale)
+        return;
+
+    FrameView* frameView = m_webPage-&gt;mainFrameView();
+    FloatRect tileCoverageRect = frameView-&gt;visibleContentRectIncludingScrollbars();
+    tileCoverageRect.moveBy(-origin);
+    tileCoverageRect.scale(currentPageScale / scale);
+    frameView-&gt;renderView()-&gt;layer()-&gt;backing()-&gt;tiledBacking()-&gt;prepopulateRect(tileCoverageRect);
+}
+
</ins><span class="cx"> static RetainPtr&lt;CABasicAnimation&gt; transientZoomSnapAnimationForKeyPath(String keyPath)
</span><span class="cx"> {
</span><span class="cx">     const float transientZoomSnapBackDuration = 0.25;
</span></span></pre>
</div>
</div>

</body>
</html>