get short font name
get short font name
hi,
is there a function to get the short ttf-name from a given ttf-filename?
example: i have the filename "arial.ttf" and i'd like to have the short font name "arial", not the long name "arial (truetype)".
the reason for this is a dwg file i just received. the file contains an mtext with a segment, for which oddbmtextfragment::fontname is the name of the ttf-file instead of the short fontname.
note: when opening this file in dd 2.2.0, oddbmtextfragment::fontname is the short fontname. with dd 2.4.2, the result is as described above.
torsten
hello torsten,
there is such behavior in case mtext has switch like {\farial.ttf}. you may get face name (short name) in desc::typeface() by use next code (for windows platform).
code:
void getttfontnamebyfilename(odttfdescriptor* descr)
{
osversioninfo os;
int result,n;
hkey fontkey;
// int len;
int value_len=255;
int data_len=255;
odchar value[256];
odchar data[256];
dword type;
odchar *s;
os.dwosversioninfosize=sizeof(osversioninfo);
getversionex(&os);
if (os.dwplatformid & ver_platform_win32_nt) {
result = regopenkeyex(hkey_local_machine,
dd_t("software\\microsoft\\windows nt\\currentversion\\fonts"),
0,
key_read,
&fontkey);
}
else {
result=regopenkeyex(hkey_local_machine,
dd_t("software\\microsoft\\windows\\currentversion\\fonts"),
0,
key_read,
&fontkey);
}
odchar fontfilename[max_path];
odchar ext[max_path];
odstring sourcefontfilename = descr->filename();
_wsplitpath(sourcefontfilename, null, null, fontfilename, ext);
odstring fontfilename = fontfilename;
if ( :

dstrlen(ext) > 0 )
{
fontfilename += ext;
} else
{
fontfilename += dd_t(".ttf");
}
for(n = 0; ; n++) {
value_len = data_len = 255;
result = regenumvalue(fontkey,
n, // index of value to query
value, // address of buffer for value string
(unsigned long *)&value_len, // address for size of value buffer
0, // reserved
&type, // address of buffer for type code
(lpbyte)data, // address of buffer for value data
(unsigned long *)&data_len); // address for size of data buffer);
if (result != error_success) {
break;
}
// len = odstrlen(pttf->m_filename);
if( fontfilename.icompare((odchar*)data) == 0 ||
sourcefontfilename.icompare((odchar*)data) == 0 )
{
if ((s = wcsstr(value,dd_t(" (truetype)"))) != null)
{
*s=0;
}
odstring val = value;
int n = val.replace(dd_t(" bold"), dd_t(""));
descr->setbold( n > 0 ? true : false );
n = val.replace(dd_t(" italic"), dd_t(""));
descr->setitalic(n > 0 ? true : false );
descr->settypeface(val);
break;
}
}
if (fontkey) {
regclosekey(fontkey);
}
}
best regards,
sergey z.