diff options
author | simonb <simonb> | 2006-03-26 04:02:30 (GMT) |
---|---|---|
committer | simonb <simonb> | 2006-03-26 04:02:30 (GMT) |
commit | af74a2284551c8511b66d77112c7bf32831c1522 (patch) | |
tree | 35a8830352f5facc1fc9c58b82c0c6dce8fc921e /src/FbTk/XftFontImp.cc | |
parent | 872f6a0e1e4230f702ad69fa2d7e10a2fa78b7a3 (diff) | |
download | fluxbox-af74a2284551c8511b66d77112c7bf32831c1522.zip fluxbox-af74a2284551c8511b66d77112c7bf32831c1522.tar.bz2 |
rotated fonts, buttons, containers. Used for tabs for now
Diffstat (limited to 'src/FbTk/XftFontImp.cc')
-rw-r--r-- | src/FbTk/XftFontImp.cc | 102 |
1 files changed, 84 insertions, 18 deletions
diff --git a/src/FbTk/XftFontImp.cc b/src/FbTk/XftFontImp.cc index 1b248fa..a724463 100644 --- a/src/FbTk/XftFontImp.cc +++ b/src/FbTk/XftFontImp.cc | |||
@@ -25,21 +25,28 @@ | |||
25 | #include "App.hh" | 25 | #include "App.hh" |
26 | #include "FbDrawable.hh" | 26 | #include "FbDrawable.hh" |
27 | 27 | ||
28 | #include <math.h> | ||
29 | |||
28 | #ifdef HAVE_CONFIG_H | 30 | #ifdef HAVE_CONFIG_H |
29 | #include "config.h" | 31 | #include "config.h" |
30 | #endif //HAVE_CONFIG_H | 32 | #endif //HAVE_CONFIG_H |
31 | 33 | ||
32 | namespace FbTk { | 34 | namespace FbTk { |
33 | 35 | ||
34 | XftFontImp::XftFontImp(const char *name, bool utf8):m_xftfont(0), | 36 | XftFontImp::XftFontImp(const char *name, bool utf8): |
35 | m_utf8mode(utf8) { | 37 | m_utf8mode(utf8), m_name("") { |
38 | |||
39 | for (int r = ROT0; r <= ROT270; r++) | ||
40 | m_xftfonts[r] = 0; | ||
41 | |||
36 | if (name != 0) | 42 | if (name != 0) |
37 | load(name); | 43 | load(name); |
38 | } | 44 | } |
39 | 45 | ||
40 | XftFontImp::~XftFontImp() { | 46 | XftFontImp::~XftFontImp() { |
41 | if (m_xftfont != 0) | 47 | for (int r = ROT0; r <= ROT270; r++) |
42 | XftFontClose(App::instance()->display(), m_xftfont); | 48 | if (m_xftfonts[r] != 0) |
49 | XftFontClose(App::instance()->display(), m_xftfonts[r]); | ||
43 | } | 50 | } |
44 | 51 | ||
45 | bool XftFontImp::load(const std::string &name) { | 52 | bool XftFontImp::load(const std::string &name) { |
@@ -54,18 +61,39 @@ bool XftFontImp::load(const std::string &name) { | |||
54 | return false; | 61 | return false; |
55 | } | 62 | } |
56 | 63 | ||
57 | // destroy old font and set new | 64 | // destroy all old fonts and set new |
58 | if (m_xftfont != 0) | 65 | for (int r = ROT0; r <= ROT270; r++) |
59 | XftFontClose(disp, m_xftfont); | 66 | if (m_xftfonts[r] != 0) |
67 | XftFontClose(App::instance()->display(), m_xftfonts[r]); | ||
60 | 68 | ||
61 | m_xftfont = newxftfont; | 69 | m_xftfonts[ROT0] = newxftfont; |
70 | m_name = name; | ||
62 | 71 | ||
63 | return true; | 72 | return true; |
64 | } | 73 | } |
65 | 74 | ||
66 | void XftFontImp::drawText(const FbDrawable &w, int screen, GC gc, const char *text, size_t len, int x, int y) const { | 75 | void XftFontImp::drawText(const FbDrawable &w, int screen, GC gc, const char *text, size_t len, int x, int y, FbTk::Orientation orient) const { |
67 | if (m_xftfont == 0) | 76 | if (m_xftfonts[orient] == 0) |
68 | return; | 77 | return; |
78 | |||
79 | // we adjust y slightly so that the baseline is in the right spot | ||
80 | // (it is offset one by rotation >=180 degrees) | ||
81 | switch (orient) { | ||
82 | case ROT0: | ||
83 | break; | ||
84 | case ROT90: | ||
85 | break; | ||
86 | case ROT180: | ||
87 | x+=1; | ||
88 | y+=1; | ||
89 | break; | ||
90 | case ROT270: | ||
91 | y+=1; | ||
92 | break; | ||
93 | } | ||
94 | |||
95 | XftFont *font = m_xftfonts[orient]; | ||
96 | |||
69 | XftDraw *draw = XftDrawCreate(w.display(), | 97 | XftDraw *draw = XftDrawCreate(w.display(), |
70 | w.drawable(), | 98 | w.drawable(), |
71 | DefaultVisual(w.display(), screen), | 99 | DefaultVisual(w.display(), screen), |
@@ -101,13 +129,13 @@ void XftFontImp::drawText(const FbDrawable &w, int screen, GC gc, const char *te | |||
101 | // if the size is zero we use the XftDrawString8 function instead. | 129 | // if the size is zero we use the XftDrawString8 function instead. |
102 | XGlyphInfo ginfo; | 130 | XGlyphInfo ginfo; |
103 | XftTextExtentsUtf8(w.display(), | 131 | XftTextExtentsUtf8(w.display(), |
104 | m_xftfont, | 132 | m_xftfonts[ROT0], |
105 | (XftChar8 *)text, len, | 133 | (XftChar8 *)text, len, |
106 | &ginfo); | 134 | &ginfo); |
107 | if (ginfo.xOff != 0) { | 135 | if (ginfo.xOff != 0) { |
108 | XftDrawStringUtf8(draw, | 136 | XftDrawStringUtf8(draw, |
109 | &xftcolor, | 137 | &xftcolor, |
110 | m_xftfont, | 138 | font, |
111 | x, y, | 139 | x, y, |
112 | (XftChar8 *)(text), len); | 140 | (XftChar8 *)(text), len); |
113 | XftColorFree(w.display(), | 141 | XftColorFree(w.display(), |
@@ -121,7 +149,7 @@ void XftFontImp::drawText(const FbDrawable &w, int screen, GC gc, const char *te | |||
121 | 149 | ||
122 | XftDrawString8(draw, | 150 | XftDrawString8(draw, |
123 | &xftcolor, | 151 | &xftcolor, |
124 | m_xftfont, | 152 | font, |
125 | x, y, | 153 | x, y, |
126 | (XftChar8 *)(text), len); | 154 | (XftChar8 *)(text), len); |
127 | 155 | ||
@@ -133,16 +161,19 @@ void XftFontImp::drawText(const FbDrawable &w, int screen, GC gc, const char *te | |||
133 | } | 161 | } |
134 | 162 | ||
135 | unsigned int XftFontImp::textWidth(const char * const text, unsigned int len) const { | 163 | unsigned int XftFontImp::textWidth(const char * const text, unsigned int len) const { |
136 | if (m_xftfont == 0) | 164 | if (m_xftfonts[ROT0] == 0) |
137 | return 0; | 165 | return 0; |
138 | 166 | ||
139 | XGlyphInfo ginfo; | 167 | XGlyphInfo ginfo; |
140 | Display* disp = App::instance()->display(); | 168 | Display* disp = App::instance()->display(); |
141 | 169 | ||
170 | XftFont *font = m_xftfonts[ROT0]; | ||
171 | |||
172 | |||
142 | #ifdef HAVE_XFT_UTF8_STRING | 173 | #ifdef HAVE_XFT_UTF8_STRING |
143 | if (m_utf8mode) { | 174 | if (m_utf8mode) { |
144 | XftTextExtentsUtf8(disp, | 175 | XftTextExtentsUtf8(disp, |
145 | m_xftfont, | 176 | font, |
146 | (XftChar8 *)text, len, | 177 | (XftChar8 *)text, len, |
147 | &ginfo); | 178 | &ginfo); |
148 | if (ginfo.xOff != 0) | 179 | if (ginfo.xOff != 0) |
@@ -153,7 +184,7 @@ unsigned int XftFontImp::textWidth(const char * const text, unsigned int len) co | |||
153 | #endif //HAVE_XFT_UTF8_STRING | 184 | #endif //HAVE_XFT_UTF8_STRING |
154 | 185 | ||
155 | XftTextExtents8(disp, | 186 | XftTextExtents8(disp, |
156 | m_xftfont, | 187 | font, |
157 | (XftChar8 *)text, len, | 188 | (XftChar8 *)text, len, |
158 | &ginfo); | 189 | &ginfo); |
159 | 190 | ||
@@ -161,12 +192,47 @@ unsigned int XftFontImp::textWidth(const char * const text, unsigned int len) co | |||
161 | } | 192 | } |
162 | 193 | ||
163 | unsigned int XftFontImp::height() const { | 194 | unsigned int XftFontImp::height() const { |
164 | if (m_xftfont == 0) | 195 | if (m_xftfonts[ROT0] == 0) |
165 | return 0; | 196 | return 0; |
166 | return m_xftfont->height; | 197 | else |
198 | return m_xftfonts[ROT0]->height; | ||
167 | //m_xftfont->ascent + m_xftfont->descent; | 199 | //m_xftfont->ascent + m_xftfont->descent; |
168 | // curiously, fonts seem to have a smaller height, but the "height" | 200 | // curiously, fonts seem to have a smaller height, but the "height" |
169 | // is specified within the actual font, so it must be right, right? | 201 | // is specified within the actual font, so it must be right, right? |
170 | } | 202 | } |
171 | 203 | ||
204 | bool XftFontImp::validOrientation(FbTk::Orientation orient) { | ||
205 | if (orient == ROT0 || m_xftfonts[orient]) | ||
206 | return true; | ||
207 | |||
208 | if (m_xftfonts[ROT0] == 0) | ||
209 | return false; | ||
210 | |||
211 | // otherwise, try to load that orientation | ||
212 | // radians is actually anti-clockwise, so we reverse it | ||
213 | double radians = -(orient) * 90 * M_PI / 180; | ||
214 | |||
215 | XftMatrix matrix; | ||
216 | XftMatrixInit(&matrix); | ||
217 | XftMatrixRotate(&matrix, cos(radians), sin(radians)); | ||
218 | |||
219 | Display *disp = App::instance()->display(); | ||
220 | |||
221 | XftPattern * pattern = XftNameParse(m_name.c_str()); | ||
222 | XftPatternAddMatrix(pattern, XFT_MATRIX, &matrix); | ||
223 | XftResult result; | ||
224 | XftPattern * foundpat = XftFontMatch(disp, 0, pattern, &result); | ||
225 | XftPatternDestroy(pattern); | ||
226 | XftFont * new_font = XftFontOpenPattern(disp, foundpat); | ||
227 | |||
228 | if (new_font == 0) | ||
229 | return false; | ||
230 | |||
231 | m_xftfonts[orient] = new_font; | ||
232 | |||
233 | return true; | ||
234 | } | ||
235 | |||
236 | |||
237 | |||
172 | }; // end namespace FbTk | 238 | }; // end namespace FbTk |