GetGlyphOutline ポリラインの配列に
「MS ゴシック」と「MS Pゴシック」などの幅が,思っていたものと違った.
v_PLF TTPOLYGON_to (LPTTPOLYGONHEADER buf,const DWORD rSize)
{
vv_LQC vv_lqc = ::to_LQC(buf,rSize) ; // buf を座標の配列に
v_PLF v_plf = ::LQC_to(vv_lqc) ; // ポリラインに変換
return v_plf ;
}
v_PLF GetTTOutline (HDC hDC,const UINT chr,GLYPHMETRICS* gm,const UINT format=GGO_NATIVE)
{
v_PLF v_plf ;
{
MAT2 mat2 = { {0, 1}, {0, 0}, {0, 0}, {0, 1} } ;
DWORD dwSize = ::GetGlyphOutline(hDC,chr, format, gm, 0, NULL, &mat2 ) ;
if (dwSize != GDI_ERROR) {
v_char buffer(dwSize) ;
GLYPHMETRICS gm2 = { 0 } ;
::GetGlyphOutline(hDC, chr, format, &gm2, buffer.size(), &buffer[0], &mat2) ;
v_plf = TTPOLYGON_to((LPTTPOLYGONHEADER)&buffer[0],dwSize) ;
}
}
return v_plf ;
}
vv_PLF GetTTOutline (HDC hDC,LPCTSTR str,const bool tate,const UINT format=GGO_NATIVE)
{
vv_PLF vv_plf ;
double lastX = 0 ; // left
double lastY = 0 ; // top tate
int ch = 0 ;
int cw = 0 ;
{ // chracter size
TEXTMETRIC tm = { 0 } ;
::GetTextMetrics(hDC,&tm) ;
ch = tm.tmHeight ;
cw = tm.tmAveCharWidth ;
}
#ifdef _UNICODE
LPCTSTR strP = str ;
#else
unsigned char* strP = (unsigned char*)str ;
#endif
for (size_t mbCount=0 ; mbCount<_tcsclen(str) && *strP!='\0' ; mbCount++) {
UINT chr = 0 ;
#ifdef _UNICODE
{
chr = UINT(*strP) ;
strP++ ;
}
#else
{
chr = _mbsnextc(strP) ;
strP= _mbsinc(strP) ;
}
#endif
if (chr == _T('\r')) { lastX = 0 ; continue ; }
if (chr == _T('\n')) { lastY-= ch ; continue ; }
if (chr == _T('\t')) { lastX+= cw ; continue ; }
{
GLYPHMETRICS gm = { 0 } ;
v_PLF v_plf = ::GetTTOutline(hDC,chr,&gm,format) ;
if (tate) { lastY -= (double(gm.gmBlackBoxY)+gm.gmCellIncX)/2 ; }
else { }
Vd2 last(lastX,lastY) ;
for (size_t index=0 ; index<v_plf.size() ; index++) {
PLF plf = v_plf[index] ;
Vd2A v2a = ::V2_Translate(::ToVd2A(::ToVd3A(plf)),last) ;
v_plf[index] = PLF(PLF::line,::ToVd4A(::ToVd3A(v2a))) ;
}
vv_plf.push_back(v_plf) ;
if (tate) { }
else { lastX += gm.gmCellIncX ; }
}
}
return vv_plf ;
}