1 #ifndef DEFAULTFONT_H_
2 #define DEFAULTFONT_H_
3 
4 #include <X11/Xlib.h>
5 #if XFT
6 # include <X11/Xft/Xft.h>
7 #endif
8 
9 #include <inttypes.h>
10 
11 #include "encoding.h"
12 #include "rxvtutil.h"
13 #include "rxvttoolkit.h"
14 
15 struct rxvt_term;
16 
17 struct rxvt_fontprop
18 {
19   enum {
20     unset  = -1,
21     medium = 100, bold = 200,
22     roman  = 0, italic = 100,
23   };
24   int width, height, ascent;
25   int weight, slant;
26 };
27 
28 struct rxvt_font
29 {
30   // managed by the fontset
31   rxvt_term *term;
set_termrxvt_font32   void set_term (rxvt_term *term) { this->term = term; }
33 
34   char *name;
35   codeset cs;
36   bool loaded; // whether we tried loading it before (not whether it's loaded)
37 
38   // managed by the font object
39   int ascent, descent,
40       width, height;
41 
42   void set_name (char *name_);
43 
44   rxvt_font ();
~rxvt_fontrxvt_font45   virtual ~rxvt_font () { free (name); };
46 
clearrxvt_font47   virtual void clear () { };
48 
49   void clear_rect (rxvt_drawable &d, int x, int y, int w, int h, int color) const;
50 
51   virtual rxvt_fontprop properties () = 0;
52 
53   virtual bool load (const rxvt_fontprop &morph, bool force_prop) = 0;
54   virtual bool has_char (uint32_t unicode, const rxvt_fontprop *prop, bool &careful) const = 0;
55 
56   virtual void draw (rxvt_drawable &d,
57                      int x, int y,
58                      const text_t *text, int len,
59                      int fg, int bg) = 0;
60 
unrefrxvt_font61   void unref ()
62   {
63     clear ();
64     delete this;
65   }
66 };
67 
68 struct rxvt_fallback_font;
69 
70 struct rxvt_fontset
71 {
72   char *fontdesc;
73 
74   // must be power-of-two - 1, also has to match RS_fontMask in rxvt.h
75 #if USE_256_COLORS
76   enum { fontCount =   7 }; // 2 extra colors bits, 2 fewer fontcount bits
77 #else
78   enum { fontCount =  31 };
79 #endif
80 
81   // index of first font in set
82   enum { firstFont = 2 };
83 
84   rxvt_fontset (rxvt_term *term);
85   ~rxvt_fontset ();
86 
87   bool populate (const char *desc);
set_proprxvt_fontset88   void set_prop (const rxvt_fontprop &prop, bool force_prop) { this->prop = prop; this->force_prop = force_prop; }
89   int find_font_idx (uint32_t unicode);
90   int find_font (const char *name) const;
91   bool realize_font (int i);
92 
93   rxvt_font *operator [] (int id) const
94   {
95     return fonts[id >> 1];
96   }
97 
98   int
find_fontrxvt_fontset99   find_font (unicode_t unicode)
100   {
101     return min<int> ((fontCount << 1) | 1, find_font_idx (unicode));
102   }
103 
104   // find the font containing ' ' - we always assume this is font 1, as
105   // every font should contain space, and font 1 is our base font.
106   // pango assumes this, so it must be correct!
107   int
find_space_fontrxvt_fontset108   find_space_font ()
109   {
110     return 1 << 1;
111   }
112 
113 private:
114   rxvt_term *term;
115   rxvt_fontprop prop;
116   bool force_prop;
117   simplevec<rxvt_font *> fonts;
118   const rxvt_fallback_font *fallback;
119 
120   // this once was a "typedef xxx pagemap[256]
121   // but c++ arrays are not normal types, and cannot be
122   // put into containers, new doesn't work for them etc. etc.
123   // so we wrap out array into an object that acts like one. doh.
124   // example: C++ has no separate new and new [] forms,
125   // and if pagemap is char[256], new incorrectly assumes we want to
126   // allocate an array of chars instead of a single pagemap.
127   struct pagemap
128   {
129     unsigned char cppsucks[256];
130     unsigned char &operator [](int i) { return cppsucks [i]; };
131   };
132   vector<pagemap *> fmap;
133 
134   void clear ();
135   rxvt_font *new_font (const char *name, codeset cs);
136   void prepare_font (rxvt_font *font, codeset cs);
137   void add_fonts (const char *desc);
138   void push_font (rxvt_font *font);
139 };
140 
141 #endif /* _DEFAULTFONT_H_ */
142 
143