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