<!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>[188510] trunk/Source/WebCore</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/188510">188510</a></dd>
<dt>Author</dt> <dd>wenson_hsieh@apple.com</dd>
<dt>Date</dt> <dd>2015-08-15 10:50:04 -0700 (Sat, 15 Aug 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Search fields should scale when rendering while zoomed
https://bugs.webkit.org/show_bug.cgi?id=147867

Reviewed by Daniel Bates.

When rendering zoomed search fields, draw to an image buffer instead of drawing directly into the context. This
allows us to scale the image buffer up before rendering. Also refactors common logic used to draw both selects
(paintMenuList) and search fields into the new private method paintCellAndSetFocusedElementNeedsRepaintIfNecessary.

* rendering/RenderThemeMac.h: Changed drawCellOrFocusRingWithViewIntoContext to take a raw pointer.
* rendering/RenderThemeMac.mm:
(WebCore::paintToggleButton): Passes a raw pointer to drawCellOrFocusRingWithViewIntoContext.
(WebCore::ThemeMac::drawCellOrFocusRingWithViewIntoContext): Changed to take a raw pointer.
* rendering/RenderThemeMac.h:
* rendering/RenderThemeMac.mm:
(WebCore::RenderThemeMac::paintMenuList): Refactored to use paintCellAndSetFocusedElementNeedsRepaintIfNecessary.
(WebCore::RenderThemeMac::paintCellAndSetFocusedElementNeedsRepaintIfNecessary): Contains logic common to painting
    both selects and search fields.
(WebCore::RenderThemeMac::paintSearchField): Use ThemeMac::drawCellOrFocusRingWithViewIntoContext
    to render search fields, utilizing an offscreen image buffer only when necessary.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformmacThemeMach">trunk/Source/WebCore/platform/mac/ThemeMac.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmacThemeMacmm">trunk/Source/WebCore/platform/mac/ThemeMac.mm</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderThemeMach">trunk/Source/WebCore/rendering/RenderThemeMac.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderThemeMacmm">trunk/Source/WebCore/rendering/RenderThemeMac.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (188509 => 188510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-08-15 05:51:04 UTC (rev 188509)
+++ trunk/Source/WebCore/ChangeLog        2015-08-15 17:50:04 UTC (rev 188510)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2015-08-15  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        Search fields should scale when rendering while zoomed
+        https://bugs.webkit.org/show_bug.cgi?id=147867
+
+        Reviewed by Daniel Bates.
+
+        When rendering zoomed search fields, draw to an image buffer instead of drawing directly into the context. This
+        allows us to scale the image buffer up before rendering. Also refactors common logic used to draw both selects
+        (paintMenuList) and search fields into the new private method paintCellAndSetFocusedElementNeedsRepaintIfNecessary.
+
+        * rendering/RenderThemeMac.h: Changed drawCellOrFocusRingWithViewIntoContext to take a raw pointer.
+        * rendering/RenderThemeMac.mm:
+        (WebCore::paintToggleButton): Passes a raw pointer to drawCellOrFocusRingWithViewIntoContext.
+        (WebCore::ThemeMac::drawCellOrFocusRingWithViewIntoContext): Changed to take a raw pointer.
+        * rendering/RenderThemeMac.h:
+        * rendering/RenderThemeMac.mm:
+        (WebCore::RenderThemeMac::paintMenuList): Refactored to use paintCellAndSetFocusedElementNeedsRepaintIfNecessary.
+        (WebCore::RenderThemeMac::paintCellAndSetFocusedElementNeedsRepaintIfNecessary): Contains logic common to painting
+            both selects and search fields.
+        (WebCore::RenderThemeMac::paintSearchField): Use ThemeMac::drawCellOrFocusRingWithViewIntoContext
+            to render search fields, utilizing an offscreen image buffer only when necessary.
+
</ins><span class="cx"> 2015-08-14  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Refactor HTMLCollection to be as fast as CachedLiveNodeList
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacThemeMach"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/ThemeMac.h (188509 => 188510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/ThemeMac.h        2015-08-15 05:51:04 UTC (rev 188509)
+++ trunk/Source/WebCore/platform/mac/ThemeMac.h        2015-08-15 17:50:04 UTC (rev 188510)
</span><span class="lines">@@ -58,7 +58,7 @@
</span><span class="cx">     // FIXME: Once RenderThemeMac is converted over to use Theme then this can be internal to ThemeMac.
</span><span class="cx">     static NSView* ensuredView(ScrollView*, const ControlStates&amp;, bool useUnparentedView = false);
</span><span class="cx">     static void setFocusRingClipRect(const FloatRect&amp;);
</span><del>-    static bool drawCellOrFocusRingWithViewIntoContext(RetainPtr&lt;NSCell&gt;, GraphicsContext*, const FloatRect&amp;, NSView*, bool /* drawButtonCell */, bool /* drawFocusRing */, bool /* useImageBuffer */, float /* deviceScaleFactor */);
</del><ins>+    static bool drawCellOrFocusRingWithViewIntoContext(NSCell*, GraphicsContext*, const FloatRect&amp;, NSView*, bool /* drawButtonCell */, bool /* drawFocusRing */, bool /* useImageBuffer */, float /* deviceScaleFactor */);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacThemeMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/ThemeMac.mm (188509 => 188510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/ThemeMac.mm        2015-08-15 05:51:04 UTC (rev 188509)
+++ trunk/Source/WebCore/platform/mac/ThemeMac.mm        2015-08-15 17:50:04 UTC (rev 188510)
</span><span class="lines">@@ -437,9 +437,9 @@
</span><span class="cx"> 
</span><span class="cx">         [toggleButtonCell _renderCurrentAnimationFrameInContext:context-&gt;platformContext() atLocation:NSMakePoint(0, 0)];
</span><span class="cx">         if (![toggleButtonCell _stateAnimationRunning] &amp;&amp; isCellFocused)
</span><del>-            needsRepaint = ThemeMac::drawCellOrFocusRingWithViewIntoContext(toggleButtonCell, context, inflatedRect, view, false, true, useImageBuffer, deviceScaleFactor);
</del><ins>+            needsRepaint = ThemeMac::drawCellOrFocusRingWithViewIntoContext(toggleButtonCell.get(), context, inflatedRect, view, false, true, useImageBuffer, deviceScaleFactor);
</ins><span class="cx">     } else
</span><del>-        needsRepaint = ThemeMac::drawCellOrFocusRingWithViewIntoContext(toggleButtonCell, context, inflatedRect, view, true, isCellFocused, useImageBuffer, deviceScaleFactor);
</del><ins>+        needsRepaint = ThemeMac::drawCellOrFocusRingWithViewIntoContext(toggleButtonCell.get(), context, inflatedRect, view, true, isCellFocused, useImageBuffer, deviceScaleFactor);
</ins><span class="cx"> #else
</span><span class="cx">     needsRepaint = ThemeMac::drawCellOrFocusRingWithViewIntoContext(toggleButtonCell, context, inflatedRect, view, true, isCellFocused, useImageBuffer, deviceScaleFactor);
</span><span class="cx"> #endif
</span><span class="lines">@@ -664,7 +664,7 @@
</span><span class="cx"> 
</span><span class="cx"> const float buttonFocusRectOutlineWidth = 3.0f;
</span><span class="cx"> 
</span><del>-bool ThemeMac::drawCellOrFocusRingWithViewIntoContext(RetainPtr&lt;NSCell&gt; cell, GraphicsContext* context, const FloatRect&amp; inflatedRect, NSView* view, bool drawButtonCell, bool drawFocusRing, bool useImageBuffer, float deviceScaleFactor)
</del><ins>+bool ThemeMac::drawCellOrFocusRingWithViewIntoContext(NSCell* cell, GraphicsContext* context, const FloatRect&amp; inflatedRect, NSView* view, bool drawButtonCell, bool drawFocusRing, bool useImageBuffer, float deviceScaleFactor)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(drawButtonCell || drawFocusRing);
</span><span class="cx">     bool needsRepaint = false;
</span><span class="lines">@@ -677,7 +677,7 @@
</span><span class="cx">                 [cell drawWithFrame:imageBufferDrawRect inView:view];
</span><span class="cx">             
</span><span class="cx">             if (drawFocusRing)
</span><del>-                needsRepaint = drawCellFocusRing(cell.get(), imageBufferDrawRect, view);
</del><ins>+                needsRepaint = drawCellFocusRing(cell, imageBufferDrawRect, view);
</ins><span class="cx">         }
</span><span class="cx">         context-&gt;drawImageBuffer(imageBuffer.get(), ColorSpaceSRGB, inflatedRect.location() - FloatSize(buttonFocusRectOutlineWidth, buttonFocusRectOutlineWidth));
</span><span class="cx">         return needsRepaint;
</span><span class="lines">@@ -686,7 +686,7 @@
</span><span class="cx">         [cell drawWithFrame:NSRect(inflatedRect) inView:view];
</span><span class="cx">     
</span><span class="cx">     if (drawFocusRing)
</span><del>-        needsRepaint = drawCellFocusRing(cell.get(), NSRect(inflatedRect), view);
</del><ins>+        needsRepaint = drawCellFocusRing(cell, NSRect(inflatedRect), view);
</ins><span class="cx">     
</span><span class="cx">     return needsRepaint;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderThemeMach"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderThemeMac.h (188509 => 188510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderThemeMac.h        2015-08-15 05:51:04 UTC (rev 188509)
+++ trunk/Source/WebCore/rendering/RenderThemeMac.h        2015-08-15 17:50:04 UTC (rev 188510)
</span><span class="lines">@@ -196,6 +196,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Helpers for adjusting appearance and for painting
</span><span class="cx"> 
</span><ins>+    void paintCellAndSetFocusedElementNeedsRepaintIfNecessary(NSCell*, const RenderObject&amp;, const PaintInfo&amp;, const FloatRect&amp;);
</ins><span class="cx">     void setPopupButtonCellState(const RenderObject&amp;, const IntSize&amp;);
</span><span class="cx">     const IntSize* popupButtonSizes() const;
</span><span class="cx">     const int* popupButtonMargins() const;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderThemeMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderThemeMac.mm (188509 => 188510)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderThemeMac.mm        2015-08-15 05:51:04 UTC (rev 188509)
+++ trunk/Source/WebCore/rendering/RenderThemeMac.mm        2015-08-15 17:50:04 UTC (rev 188510)
</span><span class="lines">@@ -946,16 +946,7 @@
</span><span class="cx">         paintInfo.context-&gt;translate(-inflatedRect.x(), -inflatedRect.y());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    NSView *view = documentViewFor(renderer);
-    Page* page = renderer.document().page();
-    float pageScaleFactor = page-&gt;pageScaleFactor();
-    float deviceScaleFactor = page-&gt;deviceScaleFactor();
-    bool shouldDrawFocusRing = isFocused(renderer) &amp;&amp; renderer.style().outlineStyleIsAuto();
-    bool shouldUseImageBuffer = zoomLevel != 1.0f || pageScaleFactor != 1.0f;
-    bool shouldDrawCell = true;
-    if (ThemeMac::drawCellOrFocusRingWithViewIntoContext(popupButton, paintInfo.context, inflatedRect, view, shouldDrawCell, shouldDrawFocusRing, shouldUseImageBuffer, deviceScaleFactor))
-        page-&gt;focusController().setFocusedElementNeedsRepaint();
-
</del><ins>+    paintCellAndSetFocusedElementNeedsRepaintIfNecessary(popupButton, renderer, paintInfo, inflatedRect);
</ins><span class="cx">     [popupButton setControlView:nil];
</span><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="lines">@@ -1464,6 +1455,16 @@
</span><span class="cx">     updatePressedState(popupButton, o);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RenderThemeMac::paintCellAndSetFocusedElementNeedsRepaintIfNecessary(NSCell* cell, const RenderObject&amp; renderer, const PaintInfo&amp; paintInfo, const FloatRect&amp; rect)
+{
+    Page* page = renderer.document().page();
+    bool shouldDrawFocusRing = isFocused(renderer) &amp;&amp; renderer.style().outlineStyleIsAuto();
+    bool shouldUseImageBuffer = renderer.style().effectiveZoom() != 1 || page-&gt;pageScaleFactor() != 1;
+    bool shouldDrawCell = true;
+    if (ThemeMac::drawCellOrFocusRingWithViewIntoContext(cell, paintInfo.context, rect, documentViewFor(renderer), shouldDrawCell, shouldDrawFocusRing, shouldUseImageBuffer, page-&gt;deviceScaleFactor()))
+        page-&gt;focusController().setFocusedElementNeedsRepaint();
+}
+
</ins><span class="cx"> const IntSize* RenderThemeMac::menuListSizes() const
</span><span class="cx"> {
</span><span class="cx">     static const IntSize sizes[3] = { IntSize(9, 0), IntSize(5, 0), IntSize(0, 0) };
</span><span class="lines">@@ -1616,17 +1617,10 @@
</span><span class="cx">     // Set the search button to nil before drawing.  Then reset it so we can draw it later.
</span><span class="cx">     [search setSearchButtonCell:nil];
</span><span class="cx"> 
</span><del>-    NSView *documentView = documentViewFor(o);
-    [search drawWithFrame:NSRect(unzoomedRect) inView:documentView];
-
</del><ins>+    paintCellAndSetFocusedElementNeedsRepaintIfNecessary(search, o, paintInfo, unzoomedRect);
</ins><span class="cx">     [search setControlView:nil];
</span><span class="cx">     [search resetSearchButtonCell];
</span><span class="cx"> 
</span><del>-    if (isFocused(o) &amp;&amp; o.style().outlineStyleIsAuto()) {
-        if (wkDrawCellFocusRingWithFrameAtTime(search, NSRect(unzoomedRect), documentView, std::numeric_limits&lt;double&gt;::max()))
-            o.document().page()-&gt;focusController().setFocusedElementNeedsRepaint();
-    }
-    
</del><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>