1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/*
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2006, 2007 Apple Inc. All Rights Reserved.
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (c) 2008, 2009, Google Inc. All rights reserved.
4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions are
7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * met:
8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions of source code must retain the above copyright
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer.
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions in binary form must reproduce the above
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * copyright notice, this list of conditions and the following disclaimer
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * in the documentation and/or other materials provided with the
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * distribution.
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Neither the name of Google Inc. nor the names of its
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * contributors may be used to endorse or promote products derived from
17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * this software without specific prior written permission.
18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "config.h"
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "SimpleFontData.h"
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
35ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "FloatRect.h"
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Font.h"
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FontCache.h"
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FontDescription.h"
39ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "PlatformBridge.h"
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/MathExtras.h>
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <unicode/uchar.h>
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <unicode/unorm.h>
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <objidl.h>
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <mlang.h>
46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore {
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic inline float scaleEmToUnits(float x, int unitsPerEm)
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return unitsPerEm ? x / static_cast<float>(unitsPerEm) : x;
52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SimpleFontData::platformInit()
55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!m_platformData.size()) {
572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_fontMetrics.reset();
584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        m_avgCharWidth = 0;
594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        m_maxCharWidth = 0;
604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return;
614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    HDC dc = GetDC(0);
645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    HGDIOBJ oldFont = SelectObject(dc, m_platformData.hfont());
65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    TEXTMETRIC textMetric = {0};
67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!GetTextMetrics(dc, &textMetric)) {
68ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (PlatformBridge::ensureFontLoaded(m_platformData.hfont())) {
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // Retry GetTextMetrics.
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // FIXME: Handle gracefully the error if this call also fails.
71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // See http://crbug.com/6401.
72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (!GetTextMetrics(dc, &textMetric))
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                LOG_ERROR("Unable to get the text metrics after second attempt");
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_avgCharWidth = textMetric.tmAveCharWidth;
78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_maxCharWidth = textMetric.tmMaxCharWidth;
79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // FIXME: Access ascent/descent/lineGap with floating point precision.
812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    float ascent = textMetric.tmAscent;
822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    float descent = textMetric.tmDescent;
832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    float lineGap = textMetric.tmExternalLeading;
842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    float xHeight = ascent * 0.56f; // Best guess for xHeight for non-Truetype fonts.
85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    OUTLINETEXTMETRIC outlineTextMetric;
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (GetOutlineTextMetrics(dc, sizeof(outlineTextMetric), &outlineTextMetric) > 0) {
88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // This is a TrueType font.  We might be able to get an accurate xHeight.
89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        GLYPHMETRICS glyphMetrics = {0};
90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        MAT2 identityMatrix = {{0, 1}, {0, 0}, {0, 0}, {0, 1}};
91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        DWORD len = GetGlyphOutlineW(dc, 'x', GGO_METRICS, &glyphMetrics, 0, 0, &identityMatrix);
92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (len != GDI_ERROR && glyphMetrics.gmBlackBoxY > 0)
932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            xHeight = static_cast<float>(glyphMetrics.gmBlackBoxY);
94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_fontMetrics.setAscent(ascent);
972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_fontMetrics.setDescent(descent);
982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_fontMetrics.setLineGap(lineGap);
992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_fontMetrics.setXHeight(xHeight);
1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_fontMetrics.setLineSpacing(ascent + descent + lineGap);
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SelectObject(dc, oldFont);
103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ReleaseDC(0, dc);
104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid SimpleFontData::platformCharWidthInit()
1075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
1085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // charwidths are set in platformInit.
1095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
1105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SimpleFontData::platformDestroy()
112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
115f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochSimpleFontData* SimpleFontData::scaledFontData(const FontDescription& fontDescription, float scaleFactor) const
116f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
117f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    LOGFONT winFont;
118f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    GetObject(m_platformData.hfont(), sizeof(LOGFONT), &winFont);
119f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    float scaledSize = scaleFactor * fontDescription.computedSize();
120f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    winFont.lfHeight = -lroundf(scaledSize);
121f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    HFONT hfont = CreateFontIndirect(&winFont);
122f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return new SimpleFontData(FontPlatformData(hfont, scaledSize), isCustomFont(), false);
123f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
124f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectSimpleFontData* SimpleFontData::smallCapsFontData(const FontDescription& fontDescription) const
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
127f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!m_derivedFontData)
128f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_derivedFontData = DerivedFontData::create(isCustomFont());
129f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!m_derivedFontData->smallCaps)
130f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_derivedFontData->smallCaps = scaledFontData(fontDescription, .7);
131f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
132f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return m_derivedFontData->smallCaps.get();
133f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
134f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
135f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochSimpleFontData* SimpleFontData::emphasisMarkFontData(const FontDescription& fontDescription) const
136f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
137f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!m_derivedFontData)
138f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_derivedFontData = DerivedFontData::create(isCustomFont());
139f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!m_derivedFontData->emphasisMark)
140f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_derivedFontData->emphasisMark = scaledFontData(fontDescription, .5);
141f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
142f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return m_derivedFontData->emphasisMark.get();
143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool SimpleFontData::containsCharacters(const UChar* characters, int length) const
146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project  // This used to be implemented with IMLangFontLink2, but since that code has
148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project  // been disabled, this would always return false anyway.
149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project  return false;
150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SimpleFontData::determinePitch()
153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // TEXTMETRICS have this.  Set m_treatAsFixedPitch based off that.
155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    HDC dc = GetDC(0);
1565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    HGDIOBJ oldFont = SelectObject(dc, m_platformData.hfont());
157635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Yes, this looks backwards, but the fixed pitch bit is actually set if the font
159635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // is *not* fixed pitch.  Unbelievable but true.
160635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    TEXTMETRIC textMetric = {0};
161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!GetTextMetrics(dc, &textMetric)) {
162ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (PlatformBridge::ensureFontLoaded(m_platformData.hfont())) {
163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // Retry GetTextMetrics.
164635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // FIXME: Handle gracefully the error if this call also fails.
165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // See http://crbug.com/6401.
166635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (!GetTextMetrics(dc, &textMetric))
1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                LOG_ERROR("Unable to get the text metrics after second attempt");
168635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
169635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
171635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_treatAsFixedPitch = ((textMetric.tmPitchAndFamily & TMPF_FIXED_PITCH) == 0);
172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SelectObject(dc, oldFont);
174635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ReleaseDC(0, dc);
175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
176635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
17721939df44de1705786c545cd1bf519d47250322dBen MurdochFloatRect SimpleFontData::platformBoundsForGlyph(Glyph) const
17821939df44de1705786c545cd1bf519d47250322dBen Murdoch{
17921939df44de1705786c545cd1bf519d47250322dBen Murdoch    return FloatRect();
18021939df44de1705786c545cd1bf519d47250322dBen Murdoch}
18121939df44de1705786c545cd1bf519d47250322dBen Murdoch
18221939df44de1705786c545cd1bf519d47250322dBen Murdochfloat SimpleFontData::platformWidthForGlyph(Glyph glyph) const
183635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
1844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!m_platformData.size())
1854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return 0;
1864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    HDC dc = GetDC(0);
1885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    HGDIOBJ oldFont = SelectObject(dc, m_platformData.hfont());
189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int width = 0;
191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!GetCharWidthI(dc, glyph, 1, 0, &width)) {
192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Ask the browser to preload the font and retry.
193ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (PlatformBridge::ensureFontLoaded(m_platformData.hfont())) {
194635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // FIXME: Handle gracefully the error if this call also fails.
195635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // See http://crbug.com/6401.
196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (!GetCharWidthI(dc, glyph, 1, 0, &width))
1970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                LOG_ERROR("Unable to get the char width after second attempt");
198635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
199635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
200635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SelectObject(dc, oldFont);
202635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ReleaseDC(0, dc);
203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
20421939df44de1705786c545cd1bf519d47250322dBen Murdoch    return static_cast<float>(width);
205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}  // namespace WebCore
208