Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TGFont.h
Go to the documentation of this file.
1 // @(#)root/gui:$Id$
2 // Author: Fons Rademakers 20/5/2003
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2003, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TGFont
13 #define ROOT_TGFont
14 
15 
16 //////////////////////////////////////////////////////////////////////////
17 // //
18 // TGFont and TGFontPool //
19 // //
20 // Encapsulate fonts used in the GUI system. //
21 // TGFontPool provides a pool of fonts. //
22 // //
23 //////////////////////////////////////////////////////////////////////////
24 
25 #include "TNamed.h"
26 #include "TGObject.h"
27 #include "TRefCnt.h"
28 
29 class THashTable;
30 class TObjString;
31 class TGFont;
32 
33 // Flags passed to TGFont::MeasureChars and TGFont::ComputeTextLayout
34 
35 enum ETextLayoutFlags {
36  kTextWholeWords = BIT(0),
37  kTextAtLeastOne = BIT(1),
38  kTextPartialOK = BIT(2),
39  kTextIgnoreTabs = BIT(3),
40  kTextIgnoreNewlines = BIT(4)
41 };
42 
43 enum EFontWeight {
44  kFontWeightNormal = 0,
45  kFontWeightMedium = 0,
46  kFontWeightBold = 1,
47  kFontWeightLight = 2,
48  kFontWeightDemibold = 3,
49  kFontWeightBlack = 4,
50  kFontWeightUnknown = -1
51 };
52 
53 enum EFontSlant {
54  kFontSlantRoman = 0,
55  kFontSlantItalic = 1,
56  kFontSlantOblique = 2,
57  kFontSlantUnknown = -1
58 };
59 
60 
61 struct FontMetrics_t {
62  Int_t fAscent; // from baseline to top of font
63  Int_t fDescent; // from baseline to bottom of font
64  Int_t fLinespace; // the sum of the ascent and descent
65  Int_t fMaxWidth; // width of widest character in font
66  Bool_t fFixed; // true if monospace, false otherwise
67 };
68 
69 
70 struct FontAttributes_t {
71 
72  const char *fFamily; // Font family. The most important field.
73  Int_t fPointsize; // Pointsize of font, 0 for default size, or negative number meaning pixel size.
74  Int_t fWeight; // Weight flag; see below for def'n.
75  Int_t fSlant; // Slant flag; see below for def'n.
76  Int_t fUnderline; // Non-zero for underline font.
77  Int_t fOverstrike; // Non-zero for overstrike font.
78 
79  FontAttributes_t(): // default constructor
80  fFamily (0),
81  fPointsize (0),
82  fWeight (kFontWeightNormal),
83  fSlant (kFontSlantRoman),
84  fUnderline (0),
85  fOverstrike(0) { }
86 
87  FontAttributes_t(const FontAttributes_t& f): // copy constructor
88  fFamily (f.fFamily),
89  fPointsize (f.fPointsize),
90  fWeight (f.fWeight),
91  fSlant (f.fSlant),
92  fUnderline (f.fUnderline),
93  fOverstrike(f.fOverstrike) { }
94 
95  FontAttributes_t& operator=(const FontAttributes_t& f) // assignment operator
96  {
97  if (this != &f) {
98  fFamily = f.fFamily;
99  fPointsize = f.fPointsize;
100  fWeight = f.fWeight;
101  fSlant = f.fSlant;
102  fUnderline = f.fUnderline;
103  fOverstrike = f.fOverstrike;
104  }
105  return *this;
106  }
107 
108 };
109 
110 
111 
112 struct LayoutChunk_t;
113 
114 
115 class TGTextLayout : public TObject {
116 
117 friend class TGFont;
118 
119 protected:
120  const TGFont *fFont; // The font used when laying out the text.
121  const char *fString; // The string that was layed out.
122  Int_t fWidth; // The maximum width of all lines in the text layout.
123  Int_t fNumChunks; // Number of chunks actually used in following array.
124  LayoutChunk_t *fChunks; // Array of chunks. The actual size will be maxChunks.
125 
126  TGTextLayout(const TGTextLayout &tlayout); // not implemented
127  void operator=(const TGTextLayout &tlayout); // not implemented
128 
129 public:
130  TGTextLayout(): fFont(NULL), fString(""), fWidth(0), fNumChunks(0), fChunks(NULL) {}
131  virtual ~TGTextLayout();
132 
133  void DrawText(Drawable_t dst, GContext_t gc, Int_t x, Int_t y,
134  Int_t firstChar, Int_t lastChar) const;
135  void UnderlineChar(Drawable_t dst, GContext_t gc,
136  Int_t x, Int_t y, Int_t underline) const;
137  Int_t PointToChar(Int_t x, Int_t y) const;
138  Int_t CharBbox(Int_t index, Int_t *x, Int_t *y, Int_t *w, Int_t *h) const;
139  Int_t DistanceToText(Int_t x, Int_t y) const;
140  Int_t IntersectText(Int_t x, Int_t y, Int_t w, Int_t h) const;
141  void ToPostscript(TString *dst) const;
142 
143  ClassDef(TGTextLayout,0) // Keep track of string measurement information.
144 };
145 
146 
147 // The following class is used to keep track of the generic information about a font.
148 
149 class TGFont : public TNamed, public TRefCnt {
150 
151 friend class TGFontPool;
152 friend class TGTextLayout;
153 
154 private:
155  FontStruct_t fFontStruct; // Low level graphics fontstruct
156  FontH_t fFontH; // Font handle (derived from fontstruct)
157  FontMetrics_t fFM; // Cached font metrics
158  FontAttributes_t fFA; // Actual font attributes obtained when the font was created
159  TObjString *fNamedHash; // Pointer to the named object TGFont was based on
160  Int_t fTabWidth; // Width of tabs in this font (pixels).
161  Int_t fUnderlinePos; // Offset from baseline to origin of underline bar
162  // (used for drawing underlines on a non-underlined font).
163  Int_t fUnderlineHeight; // Height of underline bar (used for drawing
164  // underlines on a non-underlined font).
165  char fTypes[256]; // Array giving types of all characters in
166  // the font, used when displaying control characters.
167  Int_t fWidths[256]; // Array giving widths of all possible characters in the font.
168  Int_t fBarHeight; // Height of underline or overstrike bar
169  // (used for simulating a native underlined or strikeout font).
170 
171 protected:
172  TGFont(const char *name)
173  : TNamed(name,""), TRefCnt(), fFontStruct(0), fFontH(0), fFM(),
174  fFA(), fNamedHash(0), fTabWidth(0), fUnderlinePos(0), fUnderlineHeight(0), fBarHeight(0)
175  {
176  SetRefCount(1);
177  for (Int_t i=0; i<256; i++) {
178  fWidths[i] = 0;
179  fTypes[i] = ' ';
180  }
181  }
182 
183  TGFont(const TGFont &font); // not implemented
184  void operator=(const TGFont &font); // not implemented
185 
186  LayoutChunk_t *NewChunk(TGTextLayout *layout, int *maxPtr,
187  const char *start, int numChars,
188  int curX, int newX, int y) const;
189 public:
190  virtual ~TGFont();
191 
192  FontH_t GetFontHandle() const { return fFontH; }
193  FontStruct_t GetFontStruct() const { return fFontStruct; }
194  FontStruct_t operator()() const;
195  void GetFontMetrics(FontMetrics_t *m) const;
196  FontAttributes_t GetFontAttributes() const { return fFA; }
197 
198  Int_t PostscriptFontName(TString *dst) const;
199  Int_t TextWidth(const char *string, Int_t numChars = -1) const;
200  Int_t XTextWidth(const char *string, Int_t numChars = -1) const;
201  Int_t TextHeight() const { return fFM.fLinespace; }
202  void UnderlineChars(Drawable_t dst, GContext_t gc,
203  const char *string, Int_t x, Int_t y,
204  Int_t firstChar, Int_t lastChar) const;
205  TGTextLayout *ComputeTextLayout(const char *string, Int_t numChars,
206  Int_t wrapLength, Int_t justify, Int_t flags,
207  UInt_t *width, UInt_t *height) const;
208  Int_t MeasureChars(const char *source, Int_t numChars, Int_t maxLength,
209  Int_t flags, Int_t *length) const;
210  void DrawCharsExp(Drawable_t dst, GContext_t gc, const char *source,
211  Int_t numChars, Int_t x, Int_t y) const;
212  void DrawChars(Drawable_t dst, GContext_t gc, const char *source,
213  Int_t numChars, Int_t x, Int_t y) const;
214 
215  void Print(Option_t *option="") const;
216  virtual void SavePrimitive(std::ostream &out, Option_t * = "");
217 
218  ClassDef(TGFont,0) // GUI font description
219 };
220 
221 
222 struct FontStateMap_t;
223 struct XLFDAttributes_t;
224 
225 
226 class TGFontPool : public TGObject {
227 
228 private:
229  THashTable *fList; // TGFont objects pool
230  THashTable *fUidTable; // Hash table for some used string values like family names, etc.
231  THashTable *fNamedTable; // Map a name to a set of attributes for a font
232 
233  TGFontPool(const TGFontPool& fp); // not implemented
234  TGFontPool& operator=(const TGFontPool& fp); // not implemented
235 
236 protected:
237  const char *GetUid(const char *string);
238  Bool_t ParseXLFD(const char *string, XLFDAttributes_t *xa);
239  TGFont *GetFontFromAttributes(FontAttributes_t *fa, TGFont *fontPtr);
240  int FindStateNum(const FontStateMap_t *map, const char *strKey);
241  const char *FindStateString(const FontStateMap_t *map, int numKey);
242  Bool_t FieldSpecified(const char *field);
243  TGFont *GetNativeFont(const char *name, Bool_t fixedDefault = kTRUE);
244  TGFont *MakeFont(TGFont *font, FontStruct_t fontStruct, const char *fontName);
245 
246 public:
247  TGFontPool(TGClient *client);
248  virtual ~TGFontPool();
249 
250  TGFont *GetFont(const char *font, Bool_t fixedDefault = kTRUE);
251  TGFont *GetFont(const TGFont *font);
252  TGFont *GetFont(FontStruct_t font);
253  TGFont *GetFont(const char *family, Int_t ptsize, Int_t weight, Int_t slant);
254 
255  void FreeFont(const TGFont *font);
256 
257  TGFont *FindFont(FontStruct_t font) const;
258  TGFont *FindFontByHandle(FontH_t font) const;
259 
260  char **GetAttributeInfo(const FontAttributes_t *fa);
261  void FreeAttributeInfo(char **info);
262  char **GetFontFamilies();
263  void FreeFontFamilies(char **f);
264  Bool_t ParseFontName(const char *string, FontAttributes_t *fa);
265  const char *NameOfFont(TGFont *font);
266 
267  void Print(Option_t *option="") const;
268 
269  ClassDef(TGFontPool,0) // Font pool
270 };
271 
272 #endif