先日からやっている GetGlyphOutline .その Q243285 の動作を確認方法.
Q243285: HOWTO: Draw TrueType Glyph Outlines
その中の ::DrawT2Outline の動作を確認しようとコンソール AP でやってみたが,うまく表示されない.
コードを見ればわかるが,::PolyBezier に与えられている pt の y がマイナスの範囲になっている.
以前書いたコードで emf に出力するものがある.また,それの HWND への再生も.
それで,HDC に対して直接出力するのではなく,一度 emf に出力して,それを表示することに.
#include <clocale>
#include <iostream>
#include <fstream>
#include <Windows.h>
#include "Q243285.hxx"
#include "con_wnd.hxx"
#include "E_MF.hxx"
LOGFONT GetLogFont(
LPCTSTR faceName
, const bool tate
, const int ch
, const int cw = 0
, const double rx = 0
, const double ry = 0
, const int weight = FW_DONTCARE
)
{
LOGFONT lf = { 0 } ;
::GetObject(::GetStockObject(SYSTEM_FONT),sizeof(lf),&lf) ;
if (tate) { lf.lfHeight = (cw!=0)?cw:ch ; lf.lfWidth = ch/2 ; }
else { lf.lfHeight = ch ; lf.lfWidth = cw ; }
if (tate) { lf.lfEscapement = int((rx+ry-90)*10) ; lf.lfOrientation= int((ry-90)*10) ; }
else { lf.lfEscapement = int(rx*10) ; lf.lfOrientation= int(ry*10) ; }
lf.lfWeight = weight ;
::TcsCpy(lf.lfFaceName,LF_FACESIZE,tstring(faceName).substr(0,LF_FACESIZE-1).c_str()) ;
return lf ;
}
tstring Get_TMP_path (void)
{
tstring tmp_path ;
size_t size = MAX_PATH ;
tmp_path.resize(size,0) ;
::GetTempPath(DWORD(size),&tmp_path[0]) ;
tmp_path = tstring(tmp_path.c_str()) ;
return tmp_path ;
}
bool DrawOutline(HDC hDC,int xStart,int yStart,LPCTSTR str)
{
#ifdef _UNICODE
LPCTSTR strP = str ;
#else
unsigned char* strP = (unsigned char*)str ;
#endif
// tstring tmp_path = ::Get_i_Tools_tmp_date() ;
tstring tmp_path = ::Get_TMP_path() ;
tstring emf_name ;
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
{
tstring tcs ;
{
if (chr < 0xff) {
tcs += TCHAR(chr) ;
}
else {
tstring buf ; buf.resize(255,0) ;
::_itot(chr,&buf[0],16) ;
tcs = buf.c_str() ;
}
std::tout << tcs << std::endl ;
}
{
emf_name = tmp_path + tcs + _T(".emf") ;
}
}
{
E_MetaF em(emf_name.c_str()) ;
HDC eDC = em.Get_HDC() ;
{
MAT2 mat2 = { {0, 1}, {0, 0}, {0, 0}, {0, 1} };
GLYPHMETRICS gm = { 0 };
DWORD dwSize = ::GetGlyphOutline(hDC,chr, GGO_NATIVE, &gm, 0, NULL, &mat2);
if (dwSize != GDI_ERROR) {
std::vector<char> buffer(dwSize);
GLYPHMETRICS gm2 = { 0 };
::GetGlyphOutline(hDC, chr, GGO_NATIVE, &gm2, buffer.size(), &buffer[0], &mat2);
::DrawT2Outline (eDC,(LPTTPOLYGONHEADER)&buffer[0],dwSize) ;
}
}
}
{
E_MetaF::Play(::GetConsoleHwnd(),emf_name.c_str()) ;
}
}
::TextOut(hDC,xStart,yStart+150,str,_tcslen(str)) ;
return true ;
}
bool test (c_tstring& str)
{
std::terr << str << std::endl ;
{
HWND hWnd = ::GetConsoleHwnd () ;
{
HDC hDC = ::GetDC(hWnd) ;
{
#define face_A _T("Arial")
#define face_M _T("Meiryo UI")
#define face_W _T("Wingdings")
LOGFONT lf = ::GetLogFont(face_M,false,100) ;
HFONT hFont = ::CreateFontIndirect(&lf) ;
HFONT oFont = (HFONT)::SelectObject(hDC,hFont) ;
::DrawOutline(hDC,200,200,str.c_str()) ;
::SelectObject(hDC,oFont) ;
::DeleteObject(hFont) ;
}
::ReleaseDC(hWnd,hDC) ;
}
}
return true ;
}