18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SimpleFontData.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <windows.h> 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Font.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontCache.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontDescription.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <cairo.h> 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <cairo-win32.h> 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <mlang.h> 40cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include <wtf/MathExtras.h> 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SimpleFontData::platformInit() 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_scriptCache = 0; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_scriptFontProperties = 0; 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isSystemFont = false; 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_syntheticBoldOffset = m_platformData.syntheticBold() ? 1.0f : 0.f; 515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_platformData.useGDI()) 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return initGDIFont(); 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HDC hdc = GetDC(0); 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SaveDC(hdc); 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian cairo_scaled_font_t* scaledFont = m_platformData.scaledFont(); 595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian const double metricsMultiplier = cairo_win32_scaled_font_get_metrics_factor(scaledFont) * m_platformData.size(); 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cairo_win32_scaled_font_select_font(scaledFont, hdc); 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TEXTMETRIC textMetrics; 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetTextMetrics(hdc, &textMetrics); 652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block float ascent = textMetrics.tmAscent * metricsMultiplier; 662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block float descent = textMetrics.tmDescent * metricsMultiplier; 672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block float xHeight = ascent * 0.56f; // Best guess for xHeight for non-Truetype fonts. 682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block float lineGap = textMetrics.tmExternalLeading * metricsMultiplier; 692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_fontMetrics.setAscent(ascent); 702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_fontMetrics.setDescent(descent); 712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_fontMetrics.setLineGap(lineGap); 722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_fontMetrics.setLineSpacing(lroundf(ascent) + lroundf(descent) + lroundf(lineGap)); 732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_avgCharWidth = textMetrics.tmAveCharWidth * metricsMultiplier; 742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_maxCharWidth = textMetrics.tmMaxCharWidth * metricsMultiplier; 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OUTLINETEXTMETRIC metrics; 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (GetOutlineTextMetrics(hdc, sizeof(metrics), &metrics) > 0) { 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This is a TrueType font. We might be able to get an accurate xHeight 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GLYPHMETRICS gm; 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MAT2 mat = { 1, 0, 0, 1 }; 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DWORD len = GetGlyphOutline(hdc, 'x', GGO_METRICS, &gm, 0, 0, &mat); 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (len != GDI_ERROR && gm.gmptGlyphOrigin.y > 0) 832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block xHeight = gm.gmptGlyphOrigin.y * metricsMultiplier; 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_fontMetrics.setXHeight(xHeight); 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cairo_win32_scaled_font_done_font(scaledFont); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isSystemFont = false; 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_scriptCache = 0; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_scriptFontProperties = 0; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RestoreDC(hdc, -1); 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ReleaseDC(0, hdc); 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid SimpleFontData::platformCharWidthInit() 985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // charwidths are set in platformInit. 1005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 10221939df44de1705786c545cd1bf519d47250322dBen MurdochFloatRect SimpleFontData::platformBoundsForGlyph(Glyph glyph) const 10321939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 10421939df44de1705786c545cd1bf519d47250322dBen Murdoch if (m_platformData.useGDI()) 10521939df44de1705786c545cd1bf519d47250322dBen Murdoch return boundsForGDIGlyph(glyph); 10621939df44de1705786c545cd1bf519d47250322dBen Murdoch //FIXME: Implement this 10721939df44de1705786c545cd1bf519d47250322dBen Murdoch return FloatRect(); 10821939df44de1705786c545cd1bf519d47250322dBen Murdoch} 10921939df44de1705786c545cd1bf519d47250322dBen Murdoch 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat SimpleFontData::platformWidthForGlyph(Glyph glyph) const 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_platformData.useGDI()) 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return widthForGDIGlyph(glyph); 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HDC hdc = GetDC(0); 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SaveDC(hdc); 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian cairo_scaled_font_t* scaledFont = m_platformData.scaledFont(); 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cairo_win32_scaled_font_select_font(scaledFont, hdc); 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int width; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetCharWidthI(hdc, glyph, 1, 0, &width); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cairo_win32_scaled_font_done_font(scaledFont); 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RestoreDC(hdc, -1); 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ReleaseDC(0, hdc); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian const double metricsMultiplier = cairo_win32_scaled_font_get_metrics_factor(scaledFont) * m_platformData.size(); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return width * metricsMultiplier; 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 134