<!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>[184796] 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/184796">184796</a></dd>
<dt>Author</dt> <dd>mmaxfield@apple.com</dd>
<dt>Date</dt> <dd>2015-05-22 14:43:14 -0700 (Fri, 22 May 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Cocoa] Use CTFontDrawGlyphs() instead of CGContextShowGlyphsWithAdvances()/CGContextShowGlyphsAtPositions()
https://bugs.webkit.org/show_bug.cgi?id=145234

Reviewed by Enrica Casucci.

Eventually, we want to migrate entirely off of text-related CoreGraphics calls
and onto CoreText calls (in order to reduce complexity as well as eventually
removing the need for FontPlatformData to hold a CGFontRef). There is an
equivalent call to CGContextShowGlyphsWithAdvances() and
CGContextShowGlyphsAtPositions(), namely, CTFontDrawGlyphs(), which we have
found is as performant as its CoreGraphics counterparts. This patch simply
migrates these two CG calls to its CT counterpart.

Performance was measured on a iPhone 4s as well as a Mid 2010 Mac Pro.

No new tests because there is no behavior change.

* platform/graphics/cocoa/FontCascadeCocoa.mm:
(WebCore::showGlyphsWithAdvances):
(WebCore::FontCascade::drawGlyphs):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscocoaFontCascadeCocoamm">trunk/Source/WebCore/platform/graphics/cocoa/FontCascadeCocoa.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (184795 => 184796)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-05-22 21:23:16 UTC (rev 184795)
+++ trunk/Source/WebCore/ChangeLog        2015-05-22 21:43:14 UTC (rev 184796)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2015-05-22  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        [Cocoa] Use CTFontDrawGlyphs() instead of CGContextShowGlyphsWithAdvances()/CGContextShowGlyphsAtPositions()
+        https://bugs.webkit.org/show_bug.cgi?id=145234
+
+        Reviewed by Enrica Casucci.
+
+        Eventually, we want to migrate entirely off of text-related CoreGraphics calls
+        and onto CoreText calls (in order to reduce complexity as well as eventually
+        removing the need for FontPlatformData to hold a CGFontRef). There is an
+        equivalent call to CGContextShowGlyphsWithAdvances() and
+        CGContextShowGlyphsAtPositions(), namely, CTFontDrawGlyphs(), which we have
+        found is as performant as its CoreGraphics counterparts. This patch simply
+        migrates these two CG calls to its CT counterpart.
+
+        Performance was measured on a iPhone 4s as well as a Mid 2010 Mac Pro.
+
+        No new tests because there is no behavior change.
+
+        * platform/graphics/cocoa/FontCascadeCocoa.mm:
+        (WebCore::showGlyphsWithAdvances):
+        (WebCore::FontCascade::drawGlyphs):
+
</ins><span class="cx"> 2015-05-22  Eric Carlson  &lt;eric.carlson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Mac] Don't show default controls after playing to wireless target
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscocoaFontCascadeCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontCascadeCocoa.mm (184795 => 184796)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cocoa/FontCascadeCocoa.mm        2015-05-22 21:23:16 UTC (rev 184795)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontCascadeCocoa.mm        2015-05-22 21:43:14 UTC (rev 184796)
</span><span class="lines">@@ -190,12 +190,10 @@
</span><span class="cx"> 
</span><span class="cx">     const FontPlatformData&amp; platformData = font-&gt;platformData();
</span><span class="cx">     Vector&lt;CGPoint, 256&gt; positions(count);
</span><del>-    if (platformData.isColorBitmapFont())
-        fillVectorWithHorizontalGlyphPositions(positions, context, advances, count);
</del><ins>+    fillVectorWithHorizontalGlyphPositions(positions, context, advances, count);
</ins><span class="cx">     if (platformData.orientation() == Vertical) {
</span><del>-        CGAffineTransform savedMatrix;
</del><span class="cx">         CGAffineTransform rotateLeftTransform = CGAffineTransformMake(0, -1, 1, 0, 0, 0);
</span><del>-        savedMatrix = CGContextGetTextMatrix(context);
</del><ins>+        CGAffineTransform savedMatrix = CGContextGetTextMatrix(context);
</ins><span class="cx">         CGAffineTransform runMatrix = CGAffineTransformConcat(savedMatrix, rotateLeftTransform);
</span><span class="cx">         CGContextSetTextMatrix(context, runMatrix);
</span><span class="cx"> 
</span><span class="lines">@@ -211,21 +209,10 @@
</span><span class="cx">             position.x += advances[i].width;
</span><span class="cx">             position.y += advances[i].height;
</span><span class="cx">         }
</span><del>-        if (!platformData.isColorBitmapFont()) {
-            RenderingStyleSaver saver(platformData.ctFont(), context);
-            CGContextShowGlyphsAtPositions(context, glyphs, positions.data(), count);
-        } else
-            CTFontDrawGlyphs(platformData.ctFont(), glyphs, positions.data(), count, context);
</del><ins>+        CTFontDrawGlyphs(platformData.ctFont(), glyphs, positions.data(), count, context);
</ins><span class="cx">         CGContextSetTextMatrix(context, savedMatrix);
</span><span class="cx">     } else {
</span><del>-        if (!platformData.isColorBitmapFont()) {
-            RenderingStyleSaver saver(platformData.ctFont(), context);
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored &quot;-Wdeprecated-declarations&quot;
-            CGContextShowGlyphsWithAdvances(context, glyphs, advances, count);
-#pragma clang diagnostic pop
-        } else
-            CTFontDrawGlyphs(platformData.ctFont(), glyphs, positions.data(), count, context);
</del><ins>+        CTFontDrawGlyphs(platformData.ctFont(), glyphs, positions.data(), count, context);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -371,24 +358,13 @@
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> #endif
</span><del>-
-#if !PLATFORM(IOS)
-    NSFont* drawFont = [platformData.nsFont() printerFont];
-#endif
</del><span class="cx">     
</span><span class="cx">     CGContextSetFont(cgContext, platformData.cgFont());
</span><span class="cx"> 
</span><span class="cx">     bool useLetterpressEffect = shouldUseLetterpressEffect(*context);
</span><span class="cx">     FloatPoint point = pointAdjustedForEmoji(platformData, anchorPoint);
</span><span class="cx"> 
</span><del>-#if PLATFORM(IOS)
-    float fontSize = platformData.size();
-    CGAffineTransform matrix = useLetterpressEffect || platformData.isColorBitmapFont() ? CGAffineTransformIdentity : CGAffineTransformMakeScale(fontSize, fontSize);
-#else
-    CGAffineTransform matrix = CGAffineTransformIdentity;
-    if (drawFont &amp;&amp; !platformData.isColorBitmapFont())
-        memcpy(&amp;matrix, [drawFont matrix], sizeof(matrix));
-#endif
</del><ins>+    CGAffineTransform matrix = CTFontGetMatrix(platformData.ctFont());
</ins><span class="cx">     matrix.b = -matrix.b;
</span><span class="cx">     matrix.d = -matrix.d;
</span><span class="cx">     if (platformData.m_syntheticOblique) {
</span><span class="lines">@@ -401,17 +377,11 @@
</span><span class="cx">     CGContextSetTextMatrix(cgContext, matrix);
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><del>-    CGContextSetFontSize(cgContext, 1);
</del><span class="cx">     CGContextSetShouldSubpixelQuantizeFonts(cgContext, context-&gt;shouldSubpixelQuantizeFonts());
</span><span class="cx"> #else
</span><del>-    setCGFontRenderingMode(cgContext, [drawFont renderingMode], context-&gt;shouldSubpixelQuantizeFonts());
-    if (drawFont)
-        CGContextSetFontSize(cgContext, 1);
-    else
-        CGContextSetFontSize(cgContext, platformData.m_size);
</del><ins>+    setCGFontRenderingMode(cgContext, [[platformData.nsFont() printerFont] renderingMode], context-&gt;shouldSubpixelQuantizeFonts());
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-
</del><span class="cx">     FloatSize shadowOffset;
</span><span class="cx">     float shadowBlur;
</span><span class="cx">     Color shadowColor;
</span></span></pre>
</div>
</div>

</body>
</html>