#include "Riostream.h"
#include "TROOT.h"
#include "TError.h"
#include "TGLText.h"
#include "TGLUtil.h"
#include "TColor.h"
#include "TSystem.h"
#include "TEnv.h"
#include "TGLIncludes.h"
#ifndef BUILTIN_FTGL
# include <FTGL/FTFont.h>
# include <FTGL/FTGLExtrdFont.h>
# include <FTGL/FTGLOutlineFont.h>
# include <FTGL/FTGLPolygonFont.h>
# include <FTGL/FTGLTextureFont.h>
# include <FTGL/FTGLPixmapFont.h>
# include <FTGL/FTGLBitmapFont.h>
#else
# include "FTFont.h"
# include "FTGLExtrdFont.h"
# include "FTGLOutlineFont.h"
# include "FTGLPolygonFont.h"
# include "FTGLTextureFont.h"
# include "FTGLPixmapFont.h"
# include "FTGLBitmapFont.h"
#endif
#include <fontconfig/fontconfig.h>
#define FTGL_BITMAP 0
#define FTGL_PIXMAP 1
#define FTGL_OUTLINE 2
#define FTGL_POLYGON 3
#define FTGL_EXTRUDE 4
#define FTGL_TEXTURE 5
ClassImp(TGLText)
TGLText::TGLText()
{
fX = 0;
fY = 0;
fZ = 0;
fAngle1 = 90;
fAngle2 = 0;
fAngle3 = 0;
fGLTextFont = 0;
SetGLTextFont(13);
}
TGLText::TGLText(Double_t x, Double_t y, Double_t z, const char * )
{
fX = x;
fY = y;
fZ = z;
fAngle1 = 90;
fAngle2 = 0;
fAngle3 = 0;
fGLTextFont = 0;
SetGLTextFont(13);
}
TGLText::~TGLText()
{
if (fGLTextFont) delete fGLTextFont;
}
void TGLText::PaintGLText(Double_t x, Double_t y, Double_t z, const char *text)
{
if (!fGLTextFont) return;
glPushMatrix();
glTranslatef(x, y, z);
TGLUtil::Color(GetTextColor());
Double_t s = GetTextSize();
glScalef(s,s,s);
Float_t llx, lly, llz, urx, ury, urz;
fGLTextFont->BBox(text, llx, lly, llz, urx, ury, urz);
Short_t halign = fTextAlign/10;
Short_t valign = fTextAlign - 10*halign;
Float_t dx = 0, dy = 0;
switch (halign) {
case 1 : dx = 0 ; break;
case 2 : dx = -urx/2; break;
case 3 : dx = -urx ; break;
}
switch (valign) {
case 1 : dy = 0 ; break;
case 2 : dy = -ury/2; break;
case 3 : dy = -ury ; break;
}
glTranslatef(dx, dy, 0);
glRotatef(fAngle1,1.,0.,0.);
glRotatef(fAngle2,0.,1.,0.);
glRotatef(fAngle3,0.,0.,1.);
fGLTextFont->Render(text);
glPopMatrix();
}
void TGLText::PaintBBox(const char *text)
{
Float_t llx, lly, llz, urx, ury, urz;
fGLTextFont->BBox(text, llx, lly, llz, urx, ury, urz);
glBegin(GL_LINES);
glVertex3f( 0, 0, 0); glVertex3f( urx, 0, 0);
glVertex3f( 0, 0, 0); glVertex3f( 0, ury, 0);
glVertex3f( 0, ury, 0); glVertex3f( urx, ury, 0);
glVertex3f( urx, ury, 0); glVertex3f( urx, 0, 0);
glEnd();
}
void TGLText::BBox(const char* string, float& llx, float& lly, float& llz,
float& urx, float& ury, float& urz)
{
fGLTextFont->BBox(string, llx, lly, llz, urx, ury, urz);
}
void TGLText::SetGLTextAngles(Double_t a1, Double_t a2, Double_t a3)
{
fAngle1 = a1;
fAngle2 = a2;
fAngle3 = a3;
}
void TGLText::SetGLTextFont(Font_t fontnumber)
{
int fontid = fontnumber / 10;
FcPattern *pat, *match;
FcResult result;
char *ttfont;
int ttindex;
pat = FcPatternCreate ();
switch (fontid) {
case 1:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
break;
case 2:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
break;
case 3:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
break;
case 4:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
break;
case 5:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
break;
case 0:
case 6:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
break;
case 7:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freesans");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
break;
case 8:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
break;
case 9:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
break;
case 10:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
break;
case 11:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freemono");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_BOLD);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ITALIC);
break;
case 12:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"symbol");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
break;
case 13:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"freeserif");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
break;
case 14:
FcPatternAddString (pat, FC_FAMILY, (const FcChar8*)"dingbats");
FcPatternAddInteger (pat, FC_WEIGHT, FC_WEIGHT_REGULAR);
FcPatternAddInteger (pat, FC_SLANT, FC_SLANT_ROMAN);
break;
}
FcConfigSubstitute (NULL, pat, FcMatchPattern);
FcDefaultSubstitute (pat);
match = FcFontMatch (NULL, pat, &result);
FcPatternGetString (match, FC_FILE, 0, (FcChar8**)&ttfont);
FcPatternGetInteger (match, FC_INDEX, 0, &ttindex);
if (fGLTextFont) delete fGLTextFont;
fGLTextFont = new FTGLPolygonFont(ttfont);
FcPatternDestroy (match);
FcPatternDestroy (pat);
if (!fGLTextFont->FaceSize(1))
Error("SetGLTextFont","Cannot set FTGL::FaceSize");
}