SimpleFontDataWinCE.cpp [plain text]
#include "config.h"
#include "SimpleFontData.h"
#include "FloatRect.h"
#include "Font.h"
#include "FontCache.h"
#include "FontDescription.h"
#include <mlang.h>
#include <wtf/MathExtras.h>
namespace WebCore {
extern HDC g_screenDC;
void SimpleFontData::platformInit()
{
if (!m_platformData.isValid())
return;
const TEXTMETRIC& tm = m_platformData.metrics();
m_isSystemFont = m_platformData.isSystemFont();
float ascent = (tm.tmAscent * m_platformData.size() + 36) / 72.0f;
float descent = (tm.tmDescent * m_platformData.size() + 36) / 72.0f;
float lineGap = (tm.tmExternalLeading * m_platformData.size() + 36) / 72.0f;
m_fontMetrics.setAscent(ascent);
m_fontMetrics.setDescent(descent);
m_fontMetrics.setLineGap(lineGap);
m_fontMetrics.setLineSpacing(lroundf(ascent) + lroundf(descent) + lroundf(lineGap));
m_fontMetrics.setXHeight(ascent * 0.56f);
}
void SimpleFontData::platformDestroy()
{
}
PassRefPtr<SimpleFontData> SimpleFontData::platformCreateScaledFontData(const FontDescription& fontDescription, float scaleFactor) const
{
FontDescription fontDesc(fontDescription);
fontDesc.setComputedSize(lroundf(scaleFactor * fontDesc.computedSize()));
fontDesc.setSpecifiedSize(lroundf(scaleFactor * fontDesc.specifiedSize()));
fontDesc.setKeywordSize(lroundf(scaleFactor * fontDesc.keywordSize()));
FontPlatformData* result = fontCache()->getCachedFontPlatformData(fontDesc, m_platformData.family());
if (!result)
return 0;
return SimpleFontData::create(*result);
}
DWORD getKnownFontCodePages(const wchar_t* family);
bool SimpleFontData::containsCharacters(const UChar* characters, int length) const
{
if (m_platformData.isDisabled())
return true;
IMLangFontLinkType* langFontLink = fontCache()->getFontLinkInterface();
if (!langFontLink)
return true;
DWORD fontCodePages = m_platformData.codePages();
if (!fontCodePages)
return false;
DWORD acpCodePages = 0;
langFontLink->CodePageToCodePages(CP_ACP, &acpCodePages);
DWORD actualCodePages;
long numCharactersProcessed;
while (length) {
langFontLink->GetStrCodePages(characters, length, acpCodePages, &actualCodePages, &numCharactersProcessed);
if (actualCodePages && !(actualCodePages & fontCodePages))
return false;
length -= numCharactersProcessed;
characters += numCharactersProcessed;
}
return true;
}
void SimpleFontData::determinePitch()
{
if (!m_platformData.isValid())
return;
const TEXTMETRIC& tm = m_platformData.metrics();
m_treatAsFixedPitch = !(tm.tmPitchAndFamily & TMPF_FIXED_PITCH);
}
FloatRect SimpleFontData::platformBoundsForGlyph(Glyph) const
{
return FloatRect();
}
float SimpleFontData::platformWidthForGlyph(Glyph glyph) const
{
if (m_platformData.isDisabled())
return 0;
HGDIOBJ hOldFont = SelectObject(g_screenDC, m_platformData.hfont());
SIZE fontSize;
wchar_t c = glyph;
GetTextExtentPoint32(g_screenDC, &c, 1, &fontSize);
SelectObject(g_screenDC, hOldFont);
return (float)fontSize.cx * (float)m_platformData.size() / 72.f;
}
void SimpleFontData::platformCharWidthInit()
{
if (!m_platformData.isValid())
return;
const TEXTMETRIC& tm = m_platformData.metrics();
m_avgCharWidth = (tm.tmAveCharWidth * m_platformData.size() + 36) / 72;
m_maxCharWidth = (tm.tmMaxCharWidth * m_platformData.size() + 36) / 72;
}
}