static const char* get_opentype_script(HDC hdc, SCRIPT_ANALYSIS *psa) { UINT charset; if (ShapingData[psa->eScript].otTag[0] != 0) return ShapingData[psa->eScript].otTag; /* * fall back to the font charset */ charset = GetTextCharsetInfo(hdc, NULL, 0x0); switch (charset) { case ANSI_CHARSET: return "latn"; case BALTIC_CHARSET: return "latn"; /* ?? */ case CHINESEBIG5_CHARSET: return "hani"; case EASTEUROPE_CHARSET: return "latn"; /* ?? */ case GB2312_CHARSET: return "hani"; case GREEK_CHARSET: return "grek"; case HANGUL_CHARSET: return "hang"; case RUSSIAN_CHARSET: return "cyrl"; case SHIFTJIS_CHARSET: return "kana"; case TURKISH_CHARSET: return "latn"; /* ?? */ case VIETNAMESE_CHARSET: return "latn"; case JOHAB_CHARSET: return "latn"; /* ?? */ case ARABIC_CHARSET: return "arab"; case HEBREW_CHARSET: return "hebr"; case THAI_CHARSET: return "thai"; default: return "latn"; } }
static int CALLBACK EnumFontCallback(const ENUMLOGFONTEX *logfont, const NEWTEXTMETRICEX *metric, DWORD type, LPARAM lParam) { EFCParam *info = (EFCParam *)lParam; /* Skip duplicates */ if (!info->fonts.Add((const TCHAR*)logfont->elfFullName)) return 1; /* Only use TrueType fonts */ if (!(type & TRUETYPE_FONTTYPE)) return 1; /* Don't use SYMBOL fonts */ if (logfont->elfLogFont.lfCharSet == SYMBOL_CHARSET) return 1; /* Use monospaced fonts when asked for it. */ if (info->callback->Monospace() && (logfont->elfLogFont.lfPitchAndFamily & (FF_MODERN | FIXED_PITCH)) != (FF_MODERN | FIXED_PITCH)) return 1; /* The font has to have at least one of the supported locales to be usable. */ if ((metric->ntmFontSig.fsCsb[0] & info->locale.lsCsbSupported[0]) == 0 && (metric->ntmFontSig.fsCsb[1] & info->locale.lsCsbSupported[1]) == 0) { /* On win9x metric->ntmFontSig seems to contain garbage. */ FONTSIGNATURE fs; memset(&fs, 0, sizeof(fs)); HFONT font = CreateFontIndirect(&logfont->elfLogFont); if (font != NULL) { HDC dc = GetDC(NULL); HGDIOBJ oldfont = SelectObject(dc, font); GetTextCharsetInfo(dc, &fs, 0); SelectObject(dc, oldfont); ReleaseDC(NULL, dc); DeleteObject(font); } if ((fs.fsCsb[0] & info->locale.lsCsbSupported[0]) == 0 && (fs.fsCsb[1] & info->locale.lsCsbSupported[1]) == 0) return 1; } char font_name[MAX_PATH]; convert_from_fs((const TCHAR *)logfont->elfFullName, font_name, lengthof(font_name)); /* Add english name after font name */ const char *english_name = GetEnglishFontName(logfont); strecpy(font_name + strlen(font_name) + 1, english_name, lastof(font_name)); /* Check whether we can actually load the font. */ bool ft_init = _library != NULL; bool found = false; FT_Face face; /* Init FreeType if needed. */ if ((ft_init || FT_Init_FreeType(&_library) == FT_Err_Ok) && GetFontByFaceName(font_name, &face) == FT_Err_Ok) { FT_Done_Face(face); found = true; } if (!ft_init) { /* Uninit FreeType if we did the init. */ FT_Done_FreeType(_library); _library = NULL; } if (!found) return 1; info->callback->SetFontNames(info->settings, font_name); if (info->callback->FindMissingGlyphs(NULL)) return 1; DEBUG(freetype, 1, "Fallback font: %s (%s)", font_name, english_name); return 0; // stop enumerating }
/** * Initializes the material editor tool. */ void MaterialEditorInit( void ) { InitPropTree(win32.hInstance); com_editors = EDITOR_MATERIAL; Sys_GrabMouseCursor( false ); InitAfx(); InitCommonControls(); // Initialize OLE libraries if (!AfxOleInit()) { return; } AfxEnableControlContainer(); NONCLIENTMETRICS info; info.cbSize = sizeof(info); ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0); LOGFONT lf; memset(&lf, 0, sizeof (LOGFONT)); CWindowDC dc(NULL); lf.lfCharSet = (BYTE)GetTextCharsetInfo(dc.GetSafeHdc(), NULL, 0); lf.lfHeight = info.lfMenuFont.lfHeight; lf.lfWeight = info.lfMenuFont.lfWeight; lf.lfItalic = info.lfMenuFont.lfItalic; // check if we should use system font _tcscpy(lf.lfFaceName, info.lfMenuFont.lfFaceName); materialEditorFont = new CFont; materialEditorFont->CreateFontIndirect(&lf); // To create the main window, this code creates a new frame window // object and then sets it as the application's main window object meMainFrame = new MEMainFrame; // create and load the frame with its resources meMainFrame->LoadFrame(IDR_ME_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL); // hide the doom window by default ::ShowWindow ( win32.hWnd, SW_HIDE ); // The one and only window has been initialized, so show and update it meMainFrame->ShowWindow(SW_SHOW); meMainFrame->UpdateWindow(); }
void COptionTree::InitGlobalResources() { // Declare variables CWindowDC dc(NULL); NONCLIENTMETRICS cmInfo; cmInfo.cbSize = sizeof(cmInfo); LOGFONT lfFont; BOOL bUseSystemFont; // Delete global resources DeleteGlobalResources(); // Get system parameter information ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(cmInfo), &cmInfo, 0); // Initialize logfont memset(&lfFont, 0, sizeof(LOGFONT)); lfFont.lfCharSet = (BYTE)GetTextCharsetInfo(dc.GetSafeHdc(), NULL, 0); lfFont.lfHeight = cmInfo.lfMenuFont.lfHeight; lfFont.lfWeight = cmInfo.lfMenuFont.lfWeight; lfFont.lfItalic = cmInfo.lfMenuFont.lfItalic; // Check if we should use system font //_tcscpy(lfFont.lfFaceName, cmInfo.lfMenuFont.lfFaceName);//#OBSOLETE _tcscpy_s(lfFont.lfFaceName, sizeof(lfFont.lfFaceName),cmInfo.lfMenuFont.lfFaceName); // Use system font bUseSystemFont = (cmInfo.lfMenuFont.lfCharSet > SYMBOL_CHARSET); if (!bUseSystemFont) { // -- Check for "Tahoma" font existance: if (::EnumFontFamilies(dc.GetSafeHdc(), NULL, _FontFamilyProcFonts, 0) == 0) { // -- -- Found! Use MS Office font //_tcscpy(lfFont.lfFaceName, _T("Tahoma"));//#OBSOLETE _tcscpy_s(lfFont.lfFaceName, sizeof(lfFont.lfFaceName), _T("Tahoma")); } else { // -- -- Not found. Use default font //_tcscpy(lfFont.lfFaceName, _T("MS Sans Serif"));//#OBSOLETE _tcscpy_s(lfFont.lfFaceName, sizeof(lfFont.lfFaceName), _T("MS Sans Serif")); } } // Normal font m_fNormalFont = new CFont; m_fNormalFont->CreateFontIndirect(&lfFont); // Bold font lfFont.lfWeight = FW_BOLD; m_fBoldFont = new CFont; m_fBoldFont->CreateFontIndirect(&lfFont); }
void CPropTree::InitGlobalResources( bool bFontBold ) { NONCLIENTMETRICS info; info.cbSize = sizeof(info); #if (WINVER >= 0x0600) ncm.cbSize -= 4; //<== ADD HERE!! #endif ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0); LOGFONT lf; memset(&lf, 0, sizeof (LOGFONT)); CWindowDC dc(NULL); lf.lfCharSet = (BYTE)GetTextCharsetInfo(dc.GetSafeHdc(), NULL, 0); lf.lfHeight = info.lfMenuFont.lfHeight; lf.lfWeight = info.lfMenuFont.lfWeight; lf.lfItalic = info.lfMenuFont.lfItalic; // check if we should use system font _ncscpy(lf.lfFaceName, info.lfMenuFont.lfFaceName); BOOL fUseSystemFont = (info.lfMenuFont.lfCharSet > SYMBOL_CHARSET); if (!fUseSystemFont) { // check for "Tahoma" font existance: if (::EnumFontFamilies(dc.GetSafeHdc(), NULL, FontFamilyProcFonts, 0)==0) { // Found! Use MS Office font! _tcscpy_s(lf.lfFaceName, strOfficeFontName); } else { // Not found. Use default font: _tcscpy_s(lf.lfFaceName, strDefaultFontName); } } s_pNormalFont = new CFont; s_pNormalFont->CreateFontIndirect(&lf); if( bFontBold ) lf.lfWeight = FW_DEMIBOLD; s_pBoldFont = new CFont; s_pBoldFont->CreateFontIndirect(&lf); }
static int CALLBACK EnumFontCallback(const ENUMLOGFONTEX *logfont, const NEWTEXTMETRICEX *metric, DWORD type, LPARAM lParam) { EFCParam *info = (EFCParam *)lParam; /* Only use TrueType fonts */ if (!(type & TRUETYPE_FONTTYPE)) return 1; /* Don't use SYMBOL fonts */ if (logfont->elfLogFont.lfCharSet == SYMBOL_CHARSET) return 1; /* The font has to have at least one of the supported locales to be usable. */ if ((metric->ntmFontSig.fsCsb[0] & info->locale.lsCsbSupported[0]) == 0 && (metric->ntmFontSig.fsCsb[1] & info->locale.lsCsbSupported[1]) == 0) { /* On win9x metric->ntmFontSig seems to contain garbage. */ FONTSIGNATURE fs; memset(&fs, 0, sizeof(fs)); HFONT font = CreateFontIndirect(&logfont->elfLogFont); if (font != NULL) { HDC dc = GetDC(NULL); HGDIOBJ oldfont = SelectObject(dc, font); GetTextCharsetInfo(dc, &fs, 0); SelectObject(dc, oldfont); ReleaseDC(NULL, dc); DeleteObject(font); } if ((fs.fsCsb[0] & info->locale.lsCsbSupported[0]) == 0 && (fs.fsCsb[1] & info->locale.lsCsbSupported[1]) == 0) return 1; } const char *english_name = GetEnglishFontName(logfont); const char *font_name = WIDE_TO_MB((const TCHAR*)logfont->elfFullName); DEBUG(freetype, 1, "Fallback font: %s (%s)", font_name, english_name); strecpy(info->settings->small_font, font_name, lastof(info->settings->small_font)); strecpy(info->settings->medium_font, font_name, lastof(info->settings->medium_font)); strecpy(info->settings->large_font, font_name, lastof(info->settings->large_font)); /* Add english name after font name */ strecpy(info->settings->small_font + strlen(info->settings->small_font) + 1, english_name, lastof(info->settings->small_font)); strecpy(info->settings->medium_font + strlen(info->settings->medium_font) + 1, english_name, lastof(info->settings->medium_font)); strecpy(info->settings->large_font + strlen(info->settings->large_font) + 1, english_name, lastof(info->settings->large_font)); return 0; // stop enumerating }
void AFX_GLOBAL_DATA::UpdateFonts() { CWindowDC dc(NULL); m_dblRibbonImageScale = dc.GetDeviceCaps(LOGPIXELSX) / 96.0f; if (m_dblRibbonImageScale > 1. && m_dblRibbonImageScale < 1.1) { m_dblRibbonImageScale = 1.; } if (fontRegular.GetSafeHandle() != NULL) { ::DeleteObject(fontRegular.Detach()); } if (fontTooltip.GetSafeHandle() != NULL) { ::DeleteObject(fontTooltip.Detach()); } if (fontBold.GetSafeHandle() != NULL) { ::DeleteObject(fontBold.Detach()); } if (fontDefaultGUIBold.GetSafeHandle() != NULL) { ::DeleteObject(fontDefaultGUIBold.Detach()); } if (fontUnderline.GetSafeHandle() != NULL) { ::DeleteObject(fontUnderline.Detach()); } if (fontDefaultGUIUnderline.GetSafeHandle() != NULL) { ::DeleteObject(fontDefaultGUIUnderline.Detach()); } if (fontVert.GetSafeHandle() != NULL) { ::DeleteObject(fontVert.Detach()); } if (fontVertCaption.GetSafeHandle() != NULL) { ::DeleteObject(fontVertCaption.Detach()); } if (fontMarlett.GetSafeHandle() != NULL) { ::DeleteObject(fontMarlett.Detach()); } if (fontSmall.GetSafeHandle() != NULL) { ::DeleteObject(fontSmall.Detach()); } // Initialize fonts: NONCLIENTMETRICS info; info.cbSize = sizeof(info); GetNonClientMetrics (info); LOGFONT lf; memset(&lf, 0, sizeof(LOGFONT)); lf.lfCharSet = (BYTE) GetTextCharsetInfo(dc.GetSafeHdc(), NULL, 0); lf.lfHeight = info.lfMenuFont.lfHeight; lf.lfWeight = info.lfMenuFont.lfWeight; lf.lfItalic = info.lfMenuFont.lfItalic; //------------------ // Adjust font size: //------------------ int nFontHeight = lf.lfHeight < 0 ? -lf.lfHeight : lf.lfHeight; if (nFontHeight <= 12) { nFontHeight = 11; } else if (!m_bDontReduceFontHeight) { nFontHeight--; } lf.lfHeight = (lf.lfHeight < 0) ? -nFontHeight : nFontHeight; // Check if we should use system font lstrcpy(lf.lfFaceName, info.lfMenuFont.lfFaceName); BOOL fUseSystemFont = m_bUseSystemFont || (info.lfMenuFont.lfCharSet > SYMBOL_CHARSET); if (!fUseSystemFont) { // Check for "Segoe UI" or "Tahoma" font existance: if (::EnumFontFamilies(dc.GetSafeHdc(), NULL, FontFamilyProcFonts, (LPARAM)(LPCTSTR) AFX_FONT_NAME_OFFICE_2007) == 0) { // Found! Use MS Office 2007 font! lstrcpy(lf.lfFaceName, AFX_FONT_NAME_OFFICE_2007); lf.lfQuality = 5 /*CLEARTYPE_QUALITY*/; } else if (::EnumFontFamilies(dc.GetSafeHdc(), NULL, FontFamilyProcFonts, (LPARAM)(LPCTSTR) AFX_FONT_NAME_OFFICE) == 0) { // Found! Use MS Office font! lstrcpy(lf.lfFaceName, AFX_FONT_NAME_OFFICE); } else { // Not found. Use default font: lstrcpy(lf.lfFaceName, AFX_FONT_NAME_DEFAULT); } } fontRegular.CreateFontIndirect(&lf); // Create small font: LONG lfHeightSaved = lf.lfHeight; lf.lfHeight = (long)((1. + abs(lf.lfHeight)) * 2 / 3); if (lfHeightSaved < 0) { lf.lfHeight = -lf.lfHeight; } fontSmall.CreateFontIndirect(&lf); lf.lfHeight = lfHeightSaved; // Create tooltip font: NONCLIENTMETRICS ncm; ncm.cbSize = sizeof(ncm); GetNonClientMetrics (ncm); lf.lfItalic = ncm.lfStatusFont.lfItalic; lf.lfWeight = ncm.lfStatusFont.lfWeight; fontTooltip.CreateFontIndirect(&lf); lf.lfItalic = info.lfMenuFont.lfItalic; lf.lfWeight = info.lfMenuFont.lfWeight; // Create "underline" font: lf.lfUnderline = TRUE; fontUnderline.CreateFontIndirect(&lf); lf.lfUnderline = FALSE; // Create bold font: lf.lfWeight = FW_BOLD; fontBold.CreateFontIndirect(&lf); // Create Marlett font: BYTE bCharSet = lf.lfCharSet; lf.lfWeight = info.lfMenuFont.lfWeight; lf.lfCharSet = SYMBOL_CHARSET; lf.lfWeight = 0; lf.lfHeight = ::GetSystemMetrics(SM_CYMENUCHECK) - 1; lstrcpy(lf.lfFaceName, AFX_FONT_NAME_MARLETT); fontMarlett.CreateFontIndirect(&lf); lf.lfCharSet = bCharSet; // Restore charset // Create vertical font: CFont font; if (font.CreateStockObject(DEFAULT_GUI_FONT)) { if (font.GetLogFont(&lf) != 0) { lf.lfOrientation = 900; lf.lfEscapement = 2700; lf.lfHeight = info.lfMenuFont.lfHeight; lf.lfWeight = info.lfMenuFont.lfWeight; lf.lfItalic = info.lfMenuFont.lfItalic; { lstrcpy(lf.lfFaceName, AFX_FONT_NAME_VERT); } fontVert.CreateFontIndirect(&lf); lf.lfEscapement = 900; fontVertCaption.CreateFontIndirect(&lf); } } // Create dialog underline and bold fonts: CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT)); ASSERT_VALID(pDefaultGUIFont); pDefaultGUIFont->GetLogFont(&lf); lf.lfUnderline = TRUE; fontDefaultGUIUnderline.CreateFontIndirect(&lf); lf.lfUnderline = FALSE; lf.lfWeight = FW_BOLD; fontDefaultGUIBold.CreateFontIndirect(&lf); UpdateTextMetrics(); #if 0 // Notify toolbars about font changing: for (POSITION posTlb = afxAllToolBars.GetHeadPosition(); posTlb != NULL;) { CMFCToolBar* pToolBar = (CMFCToolBar*) afxAllToolBars.GetNext(posTlb); ENSURE(pToolBar != NULL); if (CWnd::FromHandlePermanent(pToolBar->m_hWnd) != NULL) { ASSERT_VALID(pToolBar); pToolBar->OnGlobalFontsChanged(); } } #endif }