..
2023/03/30
2023/03/29
正しい位置(この exe の場合は,ウィンドウの中央)に移動できていない.
回転する時,回転の中心(ベクトルデータの中心)に移動できていなかった.
あとは,文字の回転(傾き).
文字の傾きは,( X , 高さ/2 ) を中心として回転させる.
2023/03/28
「縦書き」の動作が正しくない.
::CreateFontIndirect の LOGFONT の値がうまくなかった. 次のものを指定して対応.
{
lf.lfOrientation = 0 ;
lf.lfEscapement = 0 ;
}
::GetGlyphOutline を使用する時の動作としては,「@フォント」を指定して,求めたポリラインを -90 している.
2023/03/27
v_PLF GetTTOutline (...,const UINT chr,...) | | GetOutline (...,const UINT chr,...,P2A* ptA) |
vv_PLF GetTTOutline (..., LPCTSTR str,...) | | GetOutline (..., LPCTSTR str,...,P2A* ptA) |
| | DrawTTOutline(dc,point,tate,str,ch,cw,rx,ry,faceName,weight) |
DrawTTOutline
GetOutline で戻される curves は,PolyPolygon の nCount .
GetOutline (...,str,&ptA) を直接,または間接的に呼び出している.
間接の場合は,「P2A の配列」が戻される. 2 重ループで,「POINT の配列」と「頂点数の配列」に変換する.
直接の場合は,P2A と「頂点数の配列」が戻される. それぞれを, 「POINT の配列」と「頂点数の配列」に変換している.
コードを作成したタイミングが異なるためか,PolyPolygon に与えるデータの確保の方法が異なる.
この関数は 2000/03 には存在していて,Parts などから利用していた.
単体テスト用プロジェクト FOutLSDI , FOutLine を利用してテスト予定.
これらのプロジェクトは Parts などを使っていない.
ここから呼出している ::GetOutline などは,TTOline.hxx では公開していない.
縦書き
フォントは @ が付加されたものを TextH として登録.
その時 RX は -90 している.
2023/03/24
QSpline2Polyline(P2A* lpptPolygon, LPPOINTFX lppfSpline)
GetT2Outline (LPTTPOLYGONHEADER lpHeader, DWORD size,CUIntArray* count,P2A* pt)
cInSpline = ::QSpline2Polyline(pt, spline);
GetOutline (CDC* dc,const UINT chr,GLYPHMETRICS* gm,CUIntArray* countA,P2A* ptA)
if (dc->GetGlyphOutline(chr,GGO_NATIVE,gm,size,buf,&mat) == size) {
curves = GetT2Outline((LPTTPOLYGONHEADER)buf, size,countA,ptA) ;
}
GetOutline (CDC* dc,LPCTSTR str,const BOOL tate,CUIntArray* countA,P2A* ptA)
curves1 = GetOutline(dc,chr,&gm,&countA1,&ptA1) ;
GetOutline ( //
CDC* dc,const P2& point,const BOOL tate,LPCTSTR str,LPCTSTR faceName,
CUIntArray* countA,P2A* ptA, //
const int ch,const int cw=0,const double rx=0,const double ry=0,
const int weight=FW_DONTCARE )
curves = ::GetOutline(dc,str,tate,countA,ptA) ;
GetOutline (CArray<P2A,P2A>* p2aA,
CDC* dc,const P2& point,const BOOL tate,LPCTSTR str,LPCTSTR faceName,
const int ch,const int cw=0,const double rx=0,const double ry=0,
const int weight=FW_DONTCARE)
int curves = ::GetOutline(dc,point,tate,str,faceName,&countA,&ptA,ch,cw,rx,ry,weight) ;
DrawTTOutline (CDC* dc,const P2& point,const BOOL tate,const CString& str,
const int ch,const int cw,const double rx,const double ry,
const CString& faceName,const int weight)
if (useP2A_Ary) { curves = ::GetOutline(&p2aA,dc,point,tate,str,faceName, ch,cw,rx,ry,weight) ; }
else { curves = ::GetOutline( dc,point,tate,str,faceName,&countA,&ptA,ch,cw,rx,ry,weight) ; }
Parts::DrawTextH , Parts::DrawTextV (CDC* pDC,const Scale& scale)
DrawTTOutline(pDC,P2(point.x,point.y),FALSE,text.GetText(),ch,cw,rx,ry,text.GetFont(),FW_THIN) ;
DrawTTOutline(pDC,P2(point.x,point.y),TRUE ,text.GetText(),ch,cw,rx,ry,faceName, FW_THIN) ;
PartsA CTToPADlg::MakePA(
const P2& point,const BOOL tate,LPCTSTR str,LPCTSTR faceName,
const int ch,const int cw,
const double r_x, const double ry,const int weight)
if (m_UsePolyPolygon)
{
vv_PLF vv_plf = ::GetTTOutline(dc.GetSafeHdc(),str,(tate==TRUE),faceName,ch,cw,rx,ry,weight) ;
pa = vv_PLF_ToPartsA(vv_plf) ;
}
else
{
::GetOutline(&p2aAry,&dc,point,tate,str,faceName,ch,cw,rx,ry,weight) ;
}
P2A_Ary.Copy(p2aAry) ;
BOOL CTToPADlg::MakePA()
PartsA paTmp = MakePA(point,tate,str,faceName,ch,cw,rx,ry,weight) ;
void CTToPADlg::OnEditchangeFaceName()
PA = MakePA(P2(0),FALSE,str,faceName,ch,0,rx,0,0) ;
void CTToPADlg::OnPaint()
if (m_UsePolyPolygon && P2A_Ary.GetSize()>0) {
p2aAry.Copy(P2A_Ary) ;
int nCount = ::P2AA_ToPointAry(p2aAry,&points,&polyCounts) ;
dc.PolyPolygon(points.GetData(),(int*)polyCounts.GetData(),nCount) ;
}
else {
PA.Draw(&m_Image) ;
}
void CTToPADlg::OnConvertDXF()
PartsA pa = PA ;
vv_PLF vv_plf = ::PartsA_To_PLF(pa) ;
PLF_c_cw plf_c_cw = ::PLF_to_ccw_cw(vv_plf) ;
PLF_face_l plf_f_l = ::PLF_triangulation(v_plf) ;
{ // triangles
pa += vv_PLF_ToPartsA(plf_f_l.Faces) ;
}
PartsA_C3D pc3 ; pc3 = pa ;
CString faceDXF = ::GetChangeExt(NameTXI,_T(".face.dxf")) ;
pc3.Export(faceDXF) ;
FOutLine プロジェクトの OnPaint
{
UINT previousBkMode = dc.SetBkMode(TRANSPARENT) ;
{
CPen pen(PS_SOLID,2,RGB(255,255,0)) ;
CPen* oldPen = dc.SelectObject(&pen) ;
DrawTTTextOut(&dc,point,m_Tate,m_String,ch,cw,rx,ry,m_FaceName,m_Weight*100) ;
dc.SelectObject(oldPen) ;
}
{
CPen pen(PS_SOLID,2,RGB(255,0,255)) ;
CPen* oldPen = dc.SelectObject(&pen) ;
DrawTTOutline(&dc,point,m_Tate,m_String,ch,cw,rx,ry,m_FaceName,m_Weight*100) ;
dc.SelectObject(oldPen) ;
}
dc.SetBkMode(previousBkMode) ;
}
2023/03/23
意図しない座標のデータが存在するのは,オリジナルのデータか,TTPOLYCURVE の処理がうまくないのかはまだ調べていない.
データを簡単に見ただけでは,どこが原因かわからない.穴の処理の問題か?
穴を結合する順番がうまくないため,クロスしているものと思われる.
2023/03/22
うまく処理できないデータ
HG行書体 "線"
HG明朝E "線"
これらのデータでは,同じポリラインを結合しようとして消えてしまった.
2023/03/17
::GetGlyphOutline を使用して,ポリゴン化したもの.穴にはまだ対応できていない.