[webkit-reviews] review granted: [Bug 21853] text drawing on WX port on OSX is a few pixels off : [Attachment 24639] Use CGFont API for better metrics and fix y offset of text

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Fri Oct 24 09:30:16 PDT 2008


Kevin Ollivier <kevino at theolliviers.com> has granted Kevin Watters
<kevinwatters at gmail.com>'s request for review:
Bug 21853: text drawing on WX port on OSX is a few pixels off
https://bugs.webkit.org/show_bug.cgi?id=21853

Attachment 24639: Use CGFont API for better metrics and fix y offset of text
https://bugs.webkit.org/attachment.cgi?id=24639&action=edit

------- Additional Comments from Kevin Ollivier <kevino at theolliviers.com>
> Index: WebCore/platform/wx/wxcode/mac/carbon/non-kerned-drawing.cpp
> ===================================================================
> --- WebCore/platform/wx/wxcode/mac/carbon/non-kerned-drawing.cpp     
(revision 37839)
> +++ WebCore/platform/wx/wxcode/mac/carbon/non-kerned-drawing.cpp     
(working copy)
> @@ -57,11 +57,10 @@
>	   offset += glyphBuffer.advanceAt(from + i);
>      }
>      
> -    // the y point is actually the bottom point of the text, turn it into
the top
> -    float height = font->ascent() - font->descent();
> -    wxCoord ypoint = (wxCoord) (point.y() - height);
> -	
> -    dc->DrawText(text, (wxCoord)point.x(), ypoint);
> +    // NOTE: The wx API actually adds the ascent to the y value internally,
> +    // so we have to subtract it from the y point here so that the ascent
> +    // isn't added twice. 
> +    dc->DrawText(text, (wxCoord)point.x(), int(point.y() - font->ascent()));

>  }
>  
>  }
> Index: WebCore/platform/wx/wxcode/mac/carbon/fontprops.cpp
> ===================================================================
> --- WebCore/platform/wx/wxcode/mac/carbon/fontprops.cpp	(revision
37839)
> +++ WebCore/platform/wx/wxcode/mac/carbon/fontprops.cpp	(working copy)
> @@ -23,9 +23,7 @@
>   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>   */
>  
> -#if __WXMAC__
>  #include <ApplicationServices/ApplicationServices.h>
> -#endif
>  
>  #include <wx/defs.h>
>  #include <wx/gdicmn.h>
> @@ -39,23 +37,38 @@
>  m_ascent(0), m_descent(0), m_lineGap(0), m_lineSpacing(0), m_xHeight(0)
>  {
>      ATSFontRef fontRef;
> +    CGFontRef cgFont;
>      
>      fontRef = FMGetATSFontRefFromFont(font->MacGetATSUFontID());
> -    if (fontRef){
> -	   ATSFontMetrics vMetrics;
> -	   OSStatus err;
> +    
> +    if (fontRef)
> +	   cgFont = CGFontCreateWithPlatformFont((void*)&fontRef);
>	   
> -	   int height = font->GetPointSize(); //.GetHeight();
> -	   err = ATSFontGetHorizontalMetrics(fontRef, 0, &vMetrics);
> -	   if (err != noErr)
> -	       fprintf(stderr, "Error number is %d\n", err);
> -	   m_ascent = lroundf(vMetrics.ascent * height);
> -	   m_descent = lroundf(vMetrics.descent * height);
> -	   m_lineGap = lroundf(vMetrics.leading * height);
> +    if (cgFont) {
> +	   int iAscent;
> +	   int iDescent;
> +	   int iLineGap;
> +	   float unitsPerEm;
> +#ifdef BUILDING_ON_TIGER
> +	   wkGetFontMetrics(cgFont, &iAscent, &iDescent, &iLineGap,
&unitsPerEm);
> +#else
> +	   iAscent = CGFontGetAscent(cgFont);
> +	   iDescent = CGFontGetDescent(cgFont);
> +	   iLineGap = CGFontGetLeading(cgFont);
> +	   unitsPerEm = CGFontGetUnitsPerEm(cgFont);
> +#endif
> +	   float pointSize = font->GetPointSize();
> +	   float fAscent = scaleEmToUnits(iAscent, unitsPerEm) * pointSize;
> +	   float fDescent = -scaleEmToUnits(iDescent, unitsPerEm) * pointSize;
> +	   float fLineGap = scaleEmToUnits(iLineGap, unitsPerEm) * pointSize;
> +
> +	   m_ascent = lroundf(fAscent);
> +	   m_descent = lroundf(fDescent);
> +	   m_lineGap = lroundf(fLineGap);
>	   wxCoord xHeight = 0;
>	   GetTextExtent(*font, wxT("x"), NULL, &xHeight, NULL, NULL);
>	   m_xHeight = lroundf(xHeight);
> -	   m_lineSpacing = m_ascent - m_descent + m_lineGap;
> +	   m_lineSpacing = m_ascent + m_descent + m_lineGap;
>  
>      }
>  
> Index: WebCore/ChangeLog
> ===================================================================
> --- WebCore/ChangeLog (revision 37840)
> +++ WebCore/ChangeLog (working copy)
> @@ -1,3 +1,16 @@
> +2008-10-23  Kevin Watters  <kevinwatters at gmail.com>
> +
> +	   Reviewed by NOBODY (OOPS!).
> +
> +	   Use the CGFont metrics APIs for more accurate measurements, and
tweak the y
> +	   value the text is drawn at (it was a couple pixels off before
because wx
> +	   internally adds to the y value.
> +
> +	   * platform/wx/wxcode/mac/carbon/fontprops.cpp:
> +	   (wxFontProperties::wxFontProperties):
> +	   * platform/wx/wxcode/mac/carbon/non-kerned-drawing.cpp:
> +	   (WebCore::drawTextWithSpacing):
> +
>  2008-10-23  Greg Bolsinga  <bolsinga at apple.com>
>  
>	   Reviewed by Sam Weinig.


More information about the webkit-reviews mailing list