/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2016, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Teigha(R) software pursuant to a license // agreement with Open Design Alliance. // Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// #ifndef ODEX_TTF_FILE_NAME_BY_DESCRIPTO_H_ #define ODEX_TTF_FILE_NAME_BY_DESCRIPTO_H_ #include "Gi/TtfDescriptor.h" #define STL_USING_VECTOR #include "OdaSTL.h" inline bool exTtfFileNameByDescriptor(const OdTtfDescriptor& descr, OdString& fileName) { #if defined(_MSC_VER) && defined(_WIN32) && !defined(_WIN32_WCE) && !defined(_WINRT) OdString sNonExactMatched; OdString sFaceName = descr.typeface(); OSVERSIONINFO os; os.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); ::GetVersionEx(&os); OdString sName; sName.format(OD_T("Software\\Microsoft\\Windows%ls\\CurrentVersion\\"), (os.dwPlatformId & VER_PLATFORM_WIN32_NT)!=0 ? OD_T(" nt") : OD_T("")); LONG nRes; HKEY hFontSubstitutes; DWORD nDataSize; nRes = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, sName + OD_T("FontSubstitutes\\"), 0, KEY_READ, &hFontSubstitutes); if (hFontSubstitutes) { OdString sValueName; sValueName.format(OD_T("%ls,%d"), descr.typeface().c_str(), descr.charSet()); nRes = ::RegQueryValueEx(hFontSubstitutes, sValueName, NULL, NULL, NULL, &nDataSize); if(nRes == ERROR_SUCCESS) { LPBYTE lpData = (LPBYTE)malloc(nDataSize); nRes = ::RegQueryValueEx(hFontSubstitutes, sValueName, NULL, NULL, lpData, &nDataSize); sFaceName = (LPCTSTR)lpData; free(lpData); int n = sFaceName.find(','); if(n>0) { sFaceName = sFaceName.left(n); } } nRes = ::RegCloseKey(hFontSubstitutes); } HKEY hFonts; ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, sName + OD_T("Fonts\\"), 0, KEY_READ, &hFonts); if (hFonts) { DWORD nIndex = 0; DWORD nValNameSize = 20; nDataSize = odmax(fileName.getLength(), 20); int n_BT = sFaceName.replace(OD_T(" BT"), OD_T(" ")); for(;;) { OdString sValueName; do { std::vector lpValName(nValNameSize); std::vector lpData(nDataSize); nRes = ::RegEnumValue(hFonts, nIndex, &lpValName[0], &nValNameSize, NULL, NULL, &lpData[0], &nDataSize); if (nRes == ERROR_MORE_DATA) { nValNameSize += 20; } else if (nRes == ERROR_SUCCESS) { sValueName = &lpValName[0]; fileName = (LPCTSTR)&lpData[0]; } else { sValueName.empty(); fileName.empty(); } } while (nRes == ERROR_MORE_DATA); if (nRes == ERROR_SUCCESS) { ++nIndex; nValNameSize = sValueName.getLength(); nDataSize = fileName.getLength(); if(sValueName.replace(OD_T("(TrueType)"), OD_T(""))) // is TrueType font? { if(sValueName.replace(OD_T(" BT"), OD_T(""))==n_BT) { bool bBold = false; if(n_BT) { sValueName.replace(OD_T(" Extra Bold "), OD_T(" XBd ")); } else { if(sValueName.find(OD_T(" Extra Bold "))==-1) bBold = (sValueName.replace(OD_T(" Bold "), OD_T(" "))!=0); } bool bItalic = (sValueName.replace(OD_T(" Italic "), OD_T(" "))!=0); sValueName.remove(' '); sFaceName.remove(' '); if(sValueName==sFaceName) { sNonExactMatched = fileName; if(descr.isBold()==bBold && descr.isItalic()==bItalic) break; } if ( sValueName.find((sFaceName+L"&").c_str()) != -1 || sValueName.find((L"&"+sFaceName).c_str()) != -1 ) { sNonExactMatched = fileName; break; } } } } else { fileName = sNonExactMatched; break; } } ::RegCloseKey(hFonts); } if ( !fileName.isEmpty() ) { if ( fileName.find(L'\\') == -1 ) { OdString testpath; int nLen = ::GetWindowsDirectory(NULL, 0); if(nLen) { OdChar* szWinDir = testpath.getBufferSetLength(nLen); nLen = ::GetWindowsDirectoryW((LPWSTR)szWinDir, nLen); testpath.releaseBuffer(); testpath += OD_T("\\fonts\\"); fileName = testpath + fileName; } } } if ( !fileName.isEmpty() ) return true; #endif return false; } #endif // ODEX_TTF_FILE_NAME_BY_DESCRIPTO_H_