<!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>[190623] 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/190623">190623</a></dd>
<dt>Author</dt> <dd>wenson_hsieh@apple.com</dd>
<dt>Date</dt> <dd>2015-10-06 10:28:02 -0700 (Tue, 06 Oct 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Slider knobs should scale when rendering while zoomed
https://bugs.webkit.org/show_bug.cgi?id=149835
&lt;rdar://problem/22897080&gt;

Reviewed by Darin Adler.

Make slider knobs follow suit with the rest of the unscaled form controls
by rendering to an offscreen buffer when the page is zoomed or scaled and
then rendering a scaled version of the offscreen buffer onto the page.

* platform/mac/ThemeMac.mm:
(WebCore::drawCellOrFocusRingIntoRectWithView): Helper function for drawing
    cells and/or focus rings.
(WebCore::ThemeMac::drawCellOrFocusRingWithViewIntoContext): Refactored to
    handle drawing slider knobs as well.
* rendering/RenderThemeMac.mm:
(WebCore::RenderThemeMac::paintSliderThumb): Use scaled rendering when necessary.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformmacThemeMacmm">trunk/Source/WebCore/platform/mac/ThemeMac.mm</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 (190622 => 190623)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-10-06 17:21:22 UTC (rev 190622)
+++ trunk/Source/WebCore/ChangeLog        2015-10-06 17:28:02 UTC (rev 190623)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2015-10-05  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        Slider knobs should scale when rendering while zoomed
+        https://bugs.webkit.org/show_bug.cgi?id=149835
+        &lt;rdar://problem/22897080&gt;
+
+        Reviewed by Darin Adler.
+
+        Make slider knobs follow suit with the rest of the unscaled form controls
+        by rendering to an offscreen buffer when the page is zoomed or scaled and
+        then rendering a scaled version of the offscreen buffer onto the page.
+
+        * platform/mac/ThemeMac.mm:
+        (WebCore::drawCellOrFocusRingIntoRectWithView): Helper function for drawing
+            cells and/or focus rings.
+        (WebCore::ThemeMac::drawCellOrFocusRingWithViewIntoContext): Refactored to
+            handle drawing slider knobs as well.
+        * rendering/RenderThemeMac.mm:
+        (WebCore::RenderThemeMac::paintSliderThumb): Use scaled rendering when necessary.
+
</ins><span class="cx"> 2015-10-06  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Web IDL] 'length' property is wrong for variadic operations
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacThemeMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/ThemeMac.mm (190622 => 190623)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/ThemeMac.mm        2015-10-06 17:21:22 UTC (rev 190622)
+++ trunk/Source/WebCore/platform/mac/ThemeMac.mm        2015-10-06 17:28:02 UTC (rev 190623)
</span><span class="lines">@@ -664,30 +664,38 @@
</span><span class="cx"> 
</span><span class="cx"> const float buttonFocusRectOutlineWidth = 3.0f;
</span><span class="cx"> 
</span><del>-bool ThemeMac::drawCellOrFocusRingWithViewIntoContext(NSCell* cell, GraphicsContext&amp; context, const FloatRect&amp; inflatedRect, NSView* view, bool drawButtonCell, bool drawFocusRing, bool useImageBuffer, float deviceScaleFactor)
</del><ins>+static inline bool drawCellOrFocusRingIntoRectWithView(NSCell *cell, NSRect rect, NSView *view, bool drawButtonCell, bool drawFocusRing)
</ins><span class="cx"> {
</span><ins>+    if (drawButtonCell) {
+        if ([cell isKindOfClass:[NSSliderCell class]]) {
+            // For slider cells, draw only the knob.
+            [(NSSliderCell *)cell drawKnob:rect];
+        } else
+            [cell drawWithFrame:rect inView:view];
+    }
+    if (drawFocusRing)
+        return drawCellFocusRing(cell, rect, view);
+
+    return false;
+}
+
+bool ThemeMac::drawCellOrFocusRingWithViewIntoContext(NSCell *cell, GraphicsContext&amp; context, const FloatRect&amp; rect, NSView *view, bool drawButtonCell, bool drawFocusRing, bool useImageBuffer, float deviceScaleFactor)
+{
</ins><span class="cx">     ASSERT(drawButtonCell || drawFocusRing);
</span><span class="cx">     bool needsRepaint = false;
</span><span class="cx">     if (useImageBuffer) {
</span><del>-        NSRect imageBufferDrawRect = NSRect(FloatRect(buttonFocusRectOutlineWidth, buttonFocusRectOutlineWidth, inflatedRect.width(), inflatedRect.height()));
-        std::unique_ptr&lt;ImageBuffer&gt; imageBuffer = ImageBuffer::createCompatibleBuffer(inflatedRect.size() + 2 * FloatSize(buttonFocusRectOutlineWidth, buttonFocusRectOutlineWidth), deviceScaleFactor, ColorSpaceSRGB, context, false);
</del><ins>+        NSRect imageBufferDrawRect = NSRect(FloatRect(buttonFocusRectOutlineWidth, buttonFocusRectOutlineWidth, rect.width(), rect.height()));
+        auto imageBuffer = ImageBuffer::createCompatibleBuffer(rect.size() + 2 * FloatSize(buttonFocusRectOutlineWidth, buttonFocusRectOutlineWidth), deviceScaleFactor, ColorSpaceSRGB, context, false);
</ins><span class="cx">         {
</span><span class="cx">             LocalCurrentGraphicsContext localContext(imageBuffer-&gt;context());
</span><del>-            if (drawButtonCell)
-                [cell drawWithFrame:imageBufferDrawRect inView:view];
-            
-            if (drawFocusRing)
-                needsRepaint = drawCellFocusRing(cell, imageBufferDrawRect, view);
</del><ins>+            needsRepaint = drawCellOrFocusRingIntoRectWithView(cell, imageBufferDrawRect, view, drawButtonCell, drawFocusRing);
</ins><span class="cx">         }
</span><del>-        context.drawImageBuffer(imageBuffer.get(), ColorSpaceSRGB, inflatedRect.location() - FloatSize(buttonFocusRectOutlineWidth, buttonFocusRectOutlineWidth));
</del><ins>+        context.drawImageBuffer(imageBuffer.get(), ColorSpaceSRGB, rect.location() - FloatSize(buttonFocusRectOutlineWidth, buttonFocusRectOutlineWidth));
</ins><span class="cx">         return needsRepaint;
</span><span class="cx">     }
</span><span class="cx">     if (drawButtonCell)
</span><del>-        [cell drawWithFrame:NSRect(inflatedRect) inView:view];
</del><ins>+        needsRepaint = drawCellOrFocusRingIntoRectWithView(cell, NSRect(rect), view, drawButtonCell, drawFocusRing);
</ins><span class="cx">     
</span><del>-    if (drawFocusRing)
-        needsRepaint = drawCellFocusRing(cell, NSRect(inflatedRect), view);
-    
</del><span class="cx">     return needsRepaint;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderThemeMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderThemeMac.mm (190622 => 190623)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderThemeMac.mm        2015-10-06 17:21:22 UTC (rev 190622)
+++ trunk/Source/WebCore/rendering/RenderThemeMac.mm        2015-10-06 17:28:02 UTC (rev 190623)
</span><span class="lines">@@ -1581,7 +1581,11 @@
</span><span class="cx">         paintInfo.context().translate(-unzoomedRect.x(), -unzoomedRect.y());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    [sliderThumbCell drawKnob:unzoomedRect];
</del><ins>+    bool shouldDrawCell = true;
+    bool shouldDrawFocusRing = false;
+    float deviceScaleFactor = o.document().page()-&gt;deviceScaleFactor();
+    bool shouldUseImageBuffer = deviceScaleFactor != 1 || zoomLevel != 1;
+    ThemeMac::drawCellOrFocusRingWithViewIntoContext(sliderThumbCell, paintInfo.context(), unzoomedRect, view, shouldDrawCell, shouldDrawFocusRing, shouldUseImageBuffer, deviceScaleFactor);
</ins><span class="cx">     [sliderThumbCell setControlView:nil];
</span><span class="cx"> 
</span><span class="cx">     return false;
</span></span></pre>
</div>
</div>

</body>
</html>