2009年4月17日金曜日

FTGL de Orientation

 FTGLがオリエンテーションとフォント・アライメントに対応していなかったので、XY平面上ながら書いてみました。



#define FT_V_MASK 0xFF00
#define FT_V_TOP 0x0100
#define FT_V_CENTER 0x0200
#define FT_V_BOTTOM 0x0300

#define FT_H_MASK 0x00FF
#define FT_H_LEFT 0x0001
#define FT_H_CENTER 0x0002
#define FT_H_RIGHT 0x0003

#define PI 3.14159265

template <typename STR, typename FONT>
void AlignedRender(
FONT& font,
STR* text, int text_len,
FTPoint pos, //!< position
FTPoint spc, //!< Spacing
double ang, //!< Orientation angle
int alignment //!< Font alignment
) {
FTBBox box = font.BBox( text, text_len );
FTPoint sp = box.Upper() - box.Lower();
double offset_x = double();
double offset_y = double();
switch( (alignment & FT_V_MASK) ) {
case FT_V_TOP: offset_y = sp.Y(); break;
case FT_V_CENTER: offset_y = sp.Y() / 2.0; break;
case FT_V_BOTTOM:
default: {}
}
switch( (alignment & FT_H_MASK) ) {
case FT_H_RIGHT: offset_x = sp.X(); break;
case FT_H_CENTER: offset_x = sp.X() / 2.0; break;
case FT_H_LEFT:
default: {}
}
double cpar = std::cos( ang / 180.0 * PI );
double spar = std::sin( ang / 180.0 * PI );
double xx = cpar * offset_x - spar * offset_y;
double yy = spar * offset_x + cpar * offset_y;
offset_x = pos.X() - xx;
offset_y = pos.Y() - yy;
glTranslatef( offset_x, offset_y, 0.0 );
glRotatef( ang, 0.0, 0.0, 1.0 );
font.Render( text, text_len );
glRotatef( - ang, 0.0, 0.0, 1.0 );
glTranslatef( - offset_x, - offset_y, 0.0 );
}

0 件のコメント: