<!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>[167271] trunk/Source/WebKit2</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/167271">167271</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2014-04-14 14:51:17 -0700 (Mon, 14 Apr 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Allow dynamic changes of WKThumbnailView snapshot scale
https://bugs.webkit.org/show_bug.cgi?id=131628
&lt;rdar://problem/16584156&gt;

Reviewed by Beth Dakin.

* UIProcess/API/Cocoa/_WKThumbnailView.mm:
(-[_WKThumbnailView _requestSnapshotIfNeeded]):
Don't bail from requesting a snapshot just because we already had one; we want to resnapshot.
Keep track of when we bail from requesting a snapshot because we have one in-flight, so we can request it later.

(-[_WKThumbnailView _didTakeSnapshot:]):
Apply the scale to the bitmap size (whoops!).
Make CA always resize the content to fill the thumbnail view's layer, respecting aspect ratio.
Re-snapshot if we previously deferred a snapshot.

(-[_WKThumbnailView setScale:]):
If we get a scale change, request a new snapshot.

(-[_WKThumbnailView setUsesSnapshot:]):
Never apply thumbnail scale to the page if we're using snapshots. It's unnecessary,
because scale will be applied simply when painting the software snapshot.
Apply the thumbnail scale if we're going from usesSnapshot -&gt; !usesSnapshot.

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::snapshotAtSize):
Snapshots should use the greater of the two scales, so as to never leave a portion of the snapshot unpainted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKThumbnailViewmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKThumbnailView.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (167270 => 167271)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-04-14 21:48:13 UTC (rev 167270)
+++ trunk/Source/WebKit2/ChangeLog        2014-04-14 21:51:17 UTC (rev 167271)
</span><span class="lines">@@ -1,5 +1,35 @@
</span><span class="cx"> 2014-04-14  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Allow dynamic changes of WKThumbnailView snapshot scale
+        https://bugs.webkit.org/show_bug.cgi?id=131628
+        &lt;rdar://problem/16584156&gt;
+
+        Reviewed by Beth Dakin.
+
+        * UIProcess/API/Cocoa/_WKThumbnailView.mm:
+        (-[_WKThumbnailView _requestSnapshotIfNeeded]):
+        Don't bail from requesting a snapshot just because we already had one; we want to resnapshot.
+        Keep track of when we bail from requesting a snapshot because we have one in-flight, so we can request it later.
+
+        (-[_WKThumbnailView _didTakeSnapshot:]):
+        Apply the scale to the bitmap size (whoops!).
+        Make CA always resize the content to fill the thumbnail view's layer, respecting aspect ratio.
+        Re-snapshot if we previously deferred a snapshot.
+
+        (-[_WKThumbnailView setScale:]):
+        If we get a scale change, request a new snapshot.
+
+        (-[_WKThumbnailView setUsesSnapshot:]):
+        Never apply thumbnail scale to the page if we're using snapshots. It's unnecessary,
+        because scale will be applied simply when painting the software snapshot.
+        Apply the thumbnail scale if we're going from usesSnapshot -&gt; !usesSnapshot.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::snapshotAtSize):
+        Snapshots should use the greater of the two scales, so as to never leave a portion of the snapshot unpainted.
+
+2014-04-14  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
</ins><span class="cx">         REGRESSION (WebKit2 View Gestures): Double-tap doesn't work properly when there's no element underneath the cursor
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=131629
</span><span class="cx">         &lt;rdar://problem/16192821&gt;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKThumbnailViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKThumbnailView.mm (167270 => 167271)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKThumbnailView.mm        2014-04-14 21:48:13 UTC (rev 167270)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKThumbnailView.mm        2014-04-14 21:51:17 UTC (rev 167271)
</span><span class="lines">@@ -53,6 +53,8 @@
</span><span class="cx">     BOOL _originalSourceViewIsInWindow;
</span><span class="cx"> 
</span><span class="cx">     BOOL _shouldApplyThumbnailScale;
</span><ins>+
+    BOOL _snapshotWasDeferred;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> @synthesize _waitingForSnapshot = _waitingForSnapshot;
</span><span class="lines">@@ -105,16 +107,21 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)_requestSnapshotIfNeeded
</span><span class="cx"> {
</span><del>-    if (!_usesSnapshot || _waitingForSnapshot || self.layer.contents)
</del><ins>+    if (!_usesSnapshot)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    if (_waitingForSnapshot) {
+        _snapshotWasDeferred = YES;
+        return;
+    }
+
</ins><span class="cx">     _waitingForSnapshot = YES;
</span><span class="cx"> 
</span><span class="cx">     RetainPtr&lt;_WKThumbnailView&gt; thumbnailView = self;
</span><span class="cx">     IntRect snapshotRect(IntPoint(), _webPageProxy-&gt;viewSize());
</span><span class="cx">     SnapshotOptions options = SnapshotOptionsRespectDrawingAreaTransform | SnapshotOptionsInViewCoordinates;
</span><span class="cx">     IntSize bitmapSize = snapshotRect.size();
</span><del>-    bitmapSize.scale(_webPageProxy-&gt;deviceScaleFactor());
</del><ins>+    bitmapSize.scale(_scale * _webPageProxy-&gt;deviceScaleFactor());
</ins><span class="cx">     _webPageProxy-&gt;takeSnapshot(snapshotRect, bitmapSize, options, [thumbnailView](bool, const ShareableBitmap::Handle&amp; imageHandle) {
</span><span class="cx">         RefPtr&lt;ShareableBitmap&gt; bitmap = ShareableBitmap::create(imageHandle, SharedMemory::ReadOnly);
</span><span class="cx">         RetainPtr&lt;CGImageRef&gt; cgImage = bitmap-&gt;makeCGImage();
</span><span class="lines">@@ -126,7 +133,14 @@
</span><span class="cx"> {
</span><span class="cx">     _waitingForSnapshot = NO;
</span><span class="cx">     self.layer.sublayers = @[];
</span><ins>+    self.layer.contentsGravity = kCAGravityResizeAspectFill;
</ins><span class="cx">     self.layer.contents = (id)image;
</span><ins>+
+    // If we got a scale change while snapshotting, we'll take another snapshot once the first one returns.
+    if (_snapshotWasDeferred) {
+        _snapshotWasDeferred = NO;
+        [self _requestSnapshotIfNeeded];
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)viewDidMoveToWindow
</span><span class="lines">@@ -146,6 +160,9 @@
</span><span class="cx"> 
</span><span class="cx">     if (self.window &amp;&amp; _shouldApplyThumbnailScale)
</span><span class="cx">         _webPageProxy-&gt;setThumbnailScale(_scale);
</span><ins>+
+    if (_usesSnapshot)
+        [self _requestSnapshotIfNeeded];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)setUsesSnapshot:(BOOL)usesSnapshot
</span><span class="lines">@@ -154,14 +171,17 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     _usesSnapshot = usesSnapshot;
</span><ins>+    _shouldApplyThumbnailScale = _usesSnapshot ? false : !_originalSourceViewIsInWindow;
</ins><span class="cx"> 
</span><span class="cx">     if (!self.window)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (usesSnapshot)
</span><span class="cx">         [self _requestSnapshotIfNeeded];
</span><del>-    else
</del><ins>+    else {
+        _webPageProxy-&gt;setThumbnailScale(_scale);
</ins><span class="cx">         [_wkView _reparentLayerTreeInThumbnailView];
</span><ins>+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)_setThumbnailLayer:(CALayer *)layer
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (167270 => 167271)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-04-14 21:48:13 UTC (rev 167270)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-04-14 21:51:17 UTC (rev 167271)
</span><span class="lines">@@ -1573,7 +1573,7 @@
</span><span class="cx"> 
</span><span class="cx">     float horizontalScaleFactor = static_cast&lt;float&gt;(bitmapSize.width()) / rect.width();
</span><span class="cx">     float verticalScaleFactor = static_cast&lt;float&gt;(bitmapSize.height()) / rect.height();
</span><del>-    float scaleFactor = std::min(horizontalScaleFactor, verticalScaleFactor);
</del><ins>+    float scaleFactor = std::max(horizontalScaleFactor, verticalScaleFactor);
</ins><span class="cx"> 
</span><span class="cx">     RefPtr&lt;WebImage&gt; snapshot = WebImage::create(bitmapSize, snapshotOptionsToImageOptions(options));
</span><span class="cx">     if (!snapshot-&gt;bitmap())
</span></span></pre>
</div>
</div>

</body>
</html>