#include "config.h"
#include <wtf/unicode/Unicode.h>
#include "fontprops.h"
#include "math.h"
#include "MathExtras.h"
#include <wx/defs.h>
#include <wx/gdicmn.h>
#include <wx/wx.h>
#include "wx/msw/private.h"
#include <mlang.h>
#include <usp10.h>
inline long my_round(double x)
{
return (long)(x < 0 ? x - 0.5 : x + 0.5);
}
wxFontProperties::wxFontProperties(wxFont* font):
m_ascent(0), m_descent(0), m_lineGap(0), m_lineSpacing(0), m_xHeight(0)
{
HDC dc = GetDC(0);
WXHFONT hFont = font->GetHFONT();
::SelectObject(dc, hFont);
if (font){
int height = font->GetPointSize();
TEXTMETRIC tm;
GetTextMetrics(dc, &tm);
m_ascent = lroundf(tm.tmAscent);
m_descent = lroundf(tm.tmDescent);
m_xHeight = m_ascent * 0.56f; m_lineGap = lroundf(tm.tmExternalLeading);
m_lineSpacing = m_lineGap + m_ascent + m_descent;
}
RestoreDC(dc, -1);
ReleaseDC(0, dc);
}
bool wxFontContainsCharacters(void* font, const UChar* characters, int length)
{
static IMultiLanguage *multiLanguage;
if (!multiLanguage) {
if (CoCreateInstance(CLSID_CMultiLanguage, 0, CLSCTX_ALL, IID_IMultiLanguage, (void**)&multiLanguage) != S_OK)
return true;
}
static IMLangFontLink2* langFontLink;
if (!langFontLink) {
if (multiLanguage->QueryInterface(&langFontLink) != S_OK)
return true;
}
HDC dc = GetDC(0);
DWORD acpCodePages;
langFontLink->CodePageToCodePages(CP_ACP, &acpCodePages);
DWORD fontCodePages;
langFontLink->GetFontCodePages(dc, (HFONT)font, &fontCodePages);
DWORD actualCodePages;
long numCharactersProcessed;
long offset = 0;
while (offset < length) {
langFontLink->GetStrCodePages(characters, length, acpCodePages, &actualCodePages, &numCharactersProcessed);
if ((actualCodePages & fontCodePages))
return false;
offset += numCharactersProcessed;
}
ReleaseDC(0, dc);
return true;
}
void GetTextExtent( const wxFont& font, const wxString& str, wxCoord *width, wxCoord *height,
wxCoord *descent, wxCoord *externalLeading )
{
HDC dc = GetDC(0);
WXHFONT hFont = font.GetHFONT();
::SelectObject(dc, hFont);
HFONT hfontOld;
if ( font != wxNullFont )
{
wxASSERT_MSG( font.Ok(), _T("invalid font in wxDC::GetTextExtent") );
hfontOld = (HFONT)::SelectObject(dc, hFont);
}
else {
hfontOld = 0;
}
SIZE sizeRect;
const size_t len = str.length();
if ( !::GetTextExtentPoint32(dc, str, len, &sizeRect) )
{
wxLogLastError(_T("GetTextExtentPoint32()"));
}
#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
if ( len > 1 )
{
ABC width;
const wxChar chFirst = *str.begin();
if ( ::GetCharABCWidths(dc, chFirst, chFirst, &width) )
{
if ( width.abcA < 0 )
sizeRect.cx -= width.abcA;
if ( len > 1 )
{
const wxChar chLast = *str.rbegin();
::GetCharABCWidths(dc, chLast, chLast, &width);
}
if ( width.abcC < 0 )
sizeRect.cx -= width.abcC;
}
}
#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
TEXTMETRIC tm;
::GetTextMetrics(dc, &tm);
if (width)
*width = sizeRect.cx;
if (height)
*height = sizeRect.cy;
if (descent)
*descent = tm.tmDescent;
if (externalLeading)
*externalLeading = tm.tmExternalLeading;
if ( hfontOld )
{
::SelectObject(dc, hfontOld);
}
ReleaseDC(0, dc);
}