#ifndef ROOT_TGFont
#define ROOT_TGFont
#ifndef ROOT_TNamed
#include "TNamed.h"
#endif
#ifndef ROOT_TGObject
#include "TGObject.h"
#endif
#ifndef ROOT_TRefCnt
#include "TRefCnt.h"
#endif
class THashTable;
class TObjString;
class TGFont;
enum ETextLayoutFlags {
kTextWholeWords = BIT(0),
kTextAtLeastOne = BIT(1),
kTextPartialOK = BIT(2),
kTextIgnoreTabs = BIT(3),
kTextIgnoreNewlines = BIT(4)
};
enum EFontWeight {
kFontWeightNormal = 0,
kFontWeightMedium = 0,
kFontWeightBold = 1,
kFontWeightLight = 2,
kFontWeightDemibold = 3,
kFontWeightBlack = 4,
kFontWeightUnknown = -1
};
enum EFontSlant {
kFontSlantRoman = 0,
kFontSlantItalic = 1,
kFontSlantOblique = 2,
kFontSlantUnknown = -1
};
struct FontMetrics_t {
Int_t fAscent;
Int_t fDescent;
Int_t fLinespace;
Int_t fMaxWidth;
Bool_t fFixed;
};
struct FontAttributes_t {
const char *fFamily;
Int_t fPointsize;
Int_t fWeight;
Int_t fSlant;
Int_t fUnderline;
Int_t fOverstrike;
FontAttributes_t():
fFamily (0),
fPointsize (0),
fWeight (kFontWeightNormal),
fSlant (kFontSlantRoman),
fUnderline (0),
fOverstrike(0) { }
FontAttributes_t(const FontAttributes_t& f):
fFamily (f.fFamily),
fPointsize (f.fPointsize),
fWeight (f.fWeight),
fSlant (f.fSlant),
fUnderline (f.fUnderline),
fOverstrike(f.fOverstrike) { }
FontAttributes_t& operator=(const FontAttributes_t& f)
{
fFamily = f.fFamily;
fPointsize = f.fPointsize;
fWeight = f.fWeight;
fSlant = f.fSlant;
fUnderline = f.fUnderline;
fOverstrike = f.fOverstrike;
return *this;
}
};
struct LayoutChunk_t;
class TGTextLayout : public TObject {
friend class TGFont;
protected:
const TGFont *fFont;
const char *fString;
Int_t fWidth;
Int_t fNumChunks;
LayoutChunk_t *fChunks;
TGTextLayout(const TGTextLayout &tlayout);
void operator=(const TGTextLayout &tlayout);
public:
TGTextLayout(): fFont(NULL), fString(""), fWidth(0), fNumChunks(0), fChunks(NULL) {}
virtual ~TGTextLayout();
void DrawText(Drawable_t dst, GContext_t gc, Int_t x, Int_t y,
Int_t firstChar, Int_t lastChar) const;
void UnderlineChar(Drawable_t dst, GContext_t gc,
Int_t x, Int_t y, Int_t underline) const;
Int_t PointToChar(Int_t x, Int_t y) const;
Int_t CharBbox(Int_t index, Int_t *x, Int_t *y, Int_t *w, Int_t *h) const;
Int_t DistanceToText(Int_t x, Int_t y) const;
Int_t IntersectText(Int_t x, Int_t y, Int_t w, Int_t h) const;
void ToPostscript(TString *dst) const;
ClassDef(TGTextLayout,0)
};
class TGFont : public TNamed, public TRefCnt {
friend class TGFontPool;
friend class TGTextLayout;
private:
FontStruct_t fFontStruct;
FontH_t fFontH;
FontMetrics_t fFM;
FontAttributes_t fFA;
TObjString *fNamedHash;
Int_t fTabWidth;
Int_t fUnderlinePos;
Int_t fUnderlineHeight;
char fTypes[256];
Int_t fWidths[256];
Int_t fBarHeight;
protected:
TGFont(const char *name)
: TNamed(name,""), TRefCnt(), fFontStruct(0), fFontH(0), fFM(),
fFA(), fNamedHash(0), fTabWidth(0), fUnderlinePos(0), fUnderlineHeight(0), fBarHeight(0)
{
SetRefCount(1);
for (Int_t i=0; i<256; i++) {
fWidths[i] = 0;
fTypes[i] = ' ';
}
}
TGFont(const TGFont &font);
void operator=(const TGFont &font);
LayoutChunk_t *NewChunk(TGTextLayout *layout, int *maxPtr,
const char *start, int numChars,
int curX, int newX, int y) const;
public:
virtual ~TGFont();
FontH_t GetFontHandle() const { return fFontH; }
FontStruct_t GetFontStruct() const { return fFontStruct; }
FontStruct_t operator()() const;
void GetFontMetrics(FontMetrics_t *m) const;
FontAttributes_t GetFontAttributes() const { return fFA; }
Int_t PostscriptFontName(TString *dst) const;
Int_t TextWidth(const char *string, Int_t numChars = -1) const;
Int_t XTextWidth(const char *string, Int_t numChars = -1) const;
Int_t TextHeight() const { return fFM.fLinespace; }
void UnderlineChars(Drawable_t dst, GContext_t gc,
const char *string, Int_t x, Int_t y,
Int_t firstChar, Int_t lastChar) const;
TGTextLayout *ComputeTextLayout(const char *string, Int_t numChars,
Int_t wrapLength, Int_t justify, Int_t flags,
UInt_t *width, UInt_t *height) const;
Int_t MeasureChars(const char *source, Int_t numChars, Int_t maxLength,
Int_t flags, Int_t *length) const;
void DrawCharsExp(Drawable_t dst, GContext_t gc, const char *source,
Int_t numChars, Int_t x, Int_t y) const;
void DrawChars(Drawable_t dst, GContext_t gc, const char *source,
Int_t numChars, Int_t x, Int_t y) const;
void Print(Option_t *option="") const;
virtual void SavePrimitive(ostream &out, Option_t * = "");
ClassDef(TGFont,0)
};
struct FontStateMap_t;
struct XLFDAttributes_t;
class TGFontPool : public TGObject {
private:
THashTable *fList;
THashTable *fUidTable;
THashTable *fNamedTable;
TGFontPool(const TGFontPool& fp);
TGFontPool& operator=(const TGFontPool& fp);
protected:
const char *GetUid(const char *string);
Bool_t ParseXLFD(const char *string, XLFDAttributes_t *xa);
TGFont *GetFontFromAttributes(FontAttributes_t *fa, TGFont *fontPtr);
int FindStateNum(const FontStateMap_t *map, const char *strKey);
const char *FindStateString(const FontStateMap_t *map, int numKey);
Bool_t FieldSpecified(const char *field);
TGFont *GetNativeFont(const char *name, Bool_t fixedDefault = kTRUE);
TGFont *MakeFont(TGFont *font, FontStruct_t fontStruct, const char *fontName);
public:
TGFontPool(TGClient *client);
virtual ~TGFontPool();
TGFont *GetFont(const char *font, Bool_t fixedDefault = kTRUE);
TGFont *GetFont(const TGFont *font);
TGFont *GetFont(FontStruct_t font);
TGFont *GetFont(const char *family, Int_t ptsize, Int_t weight, Int_t slant);
void FreeFont(const TGFont *font);
TGFont *FindFont(FontStruct_t font) const;
TGFont *FindFontByHandle(FontH_t font) const;
char **GetAttributeInfo(const FontAttributes_t *fa);
void FreeAttributeInfo(char **info);
char **GetFontFamilies();
void FreeFontFamilies(char **f);
Bool_t ParseFontName(const char *string, FontAttributes_t *fa);
const char *NameOfFont(TGFont *font);
void Print(Option_t *option="") const;
ClassDef(TGFontPool,0)
};
#endif