summaryrefslogtreecommitdiff
path: root/src/FbTk
diff options
context:
space:
mode:
Diffstat (limited to 'src/FbTk')
-rw-r--r--src/FbTk/FontImp.hh2
-rw-r--r--src/FbTk/XFontImp.cc21
-rw-r--r--src/FbTk/XFontImp.hh3
-rw-r--r--src/FbTk/XftFontImp.cc18
-rw-r--r--src/FbTk/XftFontImp.hh3
-rw-r--r--src/FbTk/XmbFontImp.cc2
-rw-r--r--src/FbTk/XmbFontImp.hh2
7 files changed, 37 insertions, 14 deletions
diff --git a/src/FbTk/FontImp.hh b/src/FbTk/FontImp.hh
index 8a093f2..378c45f 100644
--- a/src/FbTk/FontImp.hh
+++ b/src/FbTk/FontImp.hh
@@ -44,7 +44,7 @@ class FontImp {
44public: 44public:
45 virtual ~FontImp() { } 45 virtual ~FontImp() { }
46 virtual bool load(const std::string &name) = 0; 46 virtual bool load(const std::string &name) = 0;
47 virtual void drawText(const FbDrawable &w, int screen, GC gc, const FbString &text, size_t len, int x, int y, FbTk::Orientation orient) const = 0; 47 virtual void drawText(const FbDrawable &w, int screen, GC gc, const FbString &text, size_t len, int x, int y, FbTk::Orientation orient) = 0;
48 virtual unsigned int textWidth(const FbString &text, unsigned int size) const = 0; 48 virtual unsigned int textWidth(const FbString &text, unsigned int size) const = 0;
49 virtual bool validOrientation(FbTk::Orientation orient) { return orient == ROT0; } 49 virtual bool validOrientation(FbTk::Orientation orient) { return orient == ROT0; }
50 virtual int ascent() const = 0; 50 virtual int ascent() const = 0;
diff --git a/src/FbTk/XFontImp.cc b/src/FbTk/XFontImp.cc
index 515b1e2..0c404a1 100644
--- a/src/FbTk/XFontImp.cc
+++ b/src/FbTk/XFontImp.cc
@@ -45,8 +45,10 @@ using std::nothrow;
45namespace FbTk { 45namespace FbTk {
46 46
47XFontImp::XFontImp(const char *fontname):m_fontstruct(0) { 47XFontImp::XFontImp(const char *fontname):m_fontstruct(0) {
48 for (int i = ROT0; i <= ROT270; ++i) 48 for (int i = ROT0; i <= ROT270; ++i) {
49 m_rotfonts[i] = 0; 49 m_rotfonts[i] = 0;
50 m_rotfonts_loaded[i] = false;
51 }
50 52
51 if (fontname != 0) 53 if (fontname != 0)
52 load(fontname); 54 load(fontname);
@@ -78,19 +80,23 @@ bool XFontImp::load(const string &fontname) {
78 80
79 m_fontstruct = font; //set new font 81 m_fontstruct = font; //set new font
80 82
81 for (int i = ROT0; i <= ROT270; ++i) 83 for (int i = ROT0; i <= ROT270; ++i) {
82 if (m_rotfonts[i] != 0) 84 m_rotfonts_loaded[i] = false;
85 if (m_rotfonts[i] != 0) {
83 freeRotFont(m_rotfonts[i]); 86 freeRotFont(m_rotfonts[i]);
87 m_rotfonts[i] = 0;
88 }
89 }
84 90
85 return true; 91 return true;
86} 92}
87 93
88void XFontImp::drawText(const FbDrawable &w, int screen, GC gc, const FbString &text, size_t len, int x, int y, FbTk::Orientation orient) const { 94void XFontImp::drawText(const FbDrawable &w, int screen, GC gc, const FbString &text, size_t len, int x, int y, FbTk::Orientation orient) {
89 if (m_fontstruct == 0) 95 if (m_fontstruct == 0)
90 return; 96 return;
91 97
92 // use roated font functions? 98 // use roated font functions?
93 if (orient != ROT0 && m_rotfonts[orient] != 0) { 99 if (orient != ROT0 && validOrientation(orient)) {
94 drawRotText(w.drawable(), screen, gc, text, len, x, y, orient); 100 drawRotText(w.drawable(), screen, gc, text, len, x, y, orient);
95 return; 101 return;
96 } 102 }
@@ -389,7 +395,12 @@ bool XFontImp::validOrientation(FbTk::Orientation orient) {
389 if (orient == ROT0 || m_rotfonts[orient]) 395 if (orient == ROT0 || m_rotfonts[orient])
390 return true; 396 return true;
391 397
398 if (m_rotfonts_loaded[orient])
399 return false; // load must have failed
400
401 m_rotfonts_loaded[orient] = true;
392 rotate(orient); 402 rotate(orient);
403
393 return m_rotfonts[orient] != 0; 404 return m_rotfonts[orient] != 0;
394} 405}
395 406
diff --git a/src/FbTk/XFontImp.hh b/src/FbTk/XFontImp.hh
index 02f17ee..d491a07 100644
--- a/src/FbTk/XFontImp.hh
+++ b/src/FbTk/XFontImp.hh
@@ -40,7 +40,7 @@ public:
40 unsigned int height() const; 40 unsigned int height() const;
41 int ascent() const; 41 int ascent() const;
42 int descent() const { return m_fontstruct ? m_fontstruct->descent : 0; } 42 int descent() const { return m_fontstruct ? m_fontstruct->descent : 0; }
43 void drawText(const FbDrawable &w, int screen, GC gc, const FbString &text, size_t len, int x, int y, FbTk::Orientation orient) const; 43 void drawText(const FbDrawable &w, int screen, GC gc, const FbString &text, size_t len, int x, int y, FbTk::Orientation orient);
44 44
45 bool validOrientation(FbTk::Orientation orient); 45 bool validOrientation(FbTk::Orientation orient);
46 46
@@ -79,6 +79,7 @@ private:
79 void drawRotText(Drawable w, int screen, GC gc, const FbString &text, size_t len, int x, int y, FbTk::Orientation orient) const; 79 void drawRotText(Drawable w, int screen, GC gc, const FbString &text, size_t len, int x, int y, FbTk::Orientation orient) const;
80 80
81 XRotFontStruct *m_rotfonts[4]; ///< rotated font structure (only 3 used) 81 XRotFontStruct *m_rotfonts[4]; ///< rotated font structure (only 3 used)
82 bool m_rotfonts_loaded[4]; // whether we've tried yet
82 XFontStruct *m_fontstruct; ///< X font structure 83 XFontStruct *m_fontstruct; ///< X font structure
83 84
84}; 85};
diff --git a/src/FbTk/XftFontImp.cc b/src/FbTk/XftFontImp.cc
index 5acf0af..b80474a 100644
--- a/src/FbTk/XftFontImp.cc
+++ b/src/FbTk/XftFontImp.cc
@@ -36,8 +36,10 @@ namespace FbTk {
36XftFontImp::XftFontImp(const char *name, bool utf8): 36XftFontImp::XftFontImp(const char *name, bool utf8):
37 m_utf8mode(utf8), m_name("") { 37 m_utf8mode(utf8), m_name("") {
38 38
39 for (int r = ROT0; r <= ROT270; r++) 39 for (int r = ROT0; r <= ROT270; r++) {
40 m_xftfonts[r] = 0; 40 m_xftfonts[r] = 0;
41 m_xftfonts_loaded[r] = false;
42 }
41 43
42 if (name != 0) 44 if (name != 0)
43 load(name); 45 load(name);
@@ -62,21 +64,24 @@ bool XftFontImp::load(const std::string &name) {
62 } 64 }
63 65
64 // destroy all old fonts and set new 66 // destroy all old fonts and set new
65 for (int r = ROT0; r <= ROT270; r++) 67 for (int r = ROT0; r <= ROT270; r++) {
68 m_xftfonts_loaded[r] = false;
66 if (m_xftfonts[r] != 0) { 69 if (m_xftfonts[r] != 0) {
67 XftFontClose(App::instance()->display(), m_xftfonts[r]); 70 XftFontClose(App::instance()->display(), m_xftfonts[r]);
68 m_xftfonts[r] = 0; 71 m_xftfonts[r] = 0;
69 } 72 }
73 }
70 74
71 m_xftfonts[ROT0] = newxftfont; 75 m_xftfonts[ROT0] = newxftfont;
76 m_xftfonts_loaded[ROT0] = true;
72 m_name = name; 77 m_name = name;
73 78
74 return true; 79 return true;
75} 80}
76 81
77void XftFontImp::drawText(const FbDrawable &w, int screen, GC gc, const FbString &text, size_t len, int x, int y, FbTk::Orientation orient) const { 82void XftFontImp::drawText(const FbDrawable &w, int screen, GC gc, const FbString &text, size_t len, int x, int y, FbTk::Orientation orient) {
78 83
79 if (m_xftfonts[orient] == 0) 84 if (!validOrientation(orient))
80 return; 85 return;
81 86
82 // we adjust y slightly so that the baseline is in the right spot 87 // we adjust y slightly so that the baseline is in the right spot
@@ -212,9 +217,14 @@ bool XftFontImp::validOrientation(FbTk::Orientation orient) {
212 if (orient == ROT0 || m_xftfonts[orient]) 217 if (orient == ROT0 || m_xftfonts[orient])
213 return true; 218 return true;
214 219
220 if (m_xftfonts_loaded[orient])
221 return false; // m_xftfonts is zero here
222
215 if (m_xftfonts[ROT0] == 0) 223 if (m_xftfonts[ROT0] == 0)
216 return false; 224 return false;
217 225
226 m_xftfonts_loaded[orient] = true;
227
218 // otherwise, try to load that orientation 228 // otherwise, try to load that orientation
219 // radians is actually anti-clockwise, so we reverse it 229 // radians is actually anti-clockwise, so we reverse it
220 double radians = -(orient) * 90 * M_PI / 180; 230 double radians = -(orient) * 90 * M_PI / 180;
diff --git a/src/FbTk/XftFontImp.hh b/src/FbTk/XftFontImp.hh
index 14e9712..178ef3a 100644
--- a/src/FbTk/XftFontImp.hh
+++ b/src/FbTk/XftFontImp.hh
@@ -36,7 +36,7 @@ public:
36 XftFontImp(const char *fontname, bool utf8); 36 XftFontImp(const char *fontname, bool utf8);
37 ~XftFontImp(); 37 ~XftFontImp();
38 bool load(const std::string &name); 38 bool load(const std::string &name);
39 void drawText(const FbDrawable &w, int screen, GC gc, const FbString &text, size_t len, int x, int y , FbTk::Orientation orient) const; 39 void drawText(const FbDrawable &w, int screen, GC gc, const FbString &text, size_t len, int x, int y , FbTk::Orientation orient);
40 unsigned int textWidth(const FbString &text, unsigned int len) const; 40 unsigned int textWidth(const FbString &text, unsigned int len) const;
41 unsigned int height() const; 41 unsigned int height() const;
42 int ascent() const { return m_xftfonts[0] ? m_xftfonts[0]->ascent : 0; } 42 int ascent() const { return m_xftfonts[0] ? m_xftfonts[0]->ascent : 0; }
@@ -47,6 +47,7 @@ public:
47 47
48private: 48private:
49 XftFont *m_xftfonts[4]; // 4 possible orientations 49 XftFont *m_xftfonts[4]; // 4 possible orientations
50 bool m_xftfonts_loaded[4]; // whether we've tried loading the orientation
50 // rotated xft fonts don't give proper extents info, so we keep the "real" 51 // rotated xft fonts don't give proper extents info, so we keep the "real"
51 // one around for it 52 // one around for it
52 bool m_utf8mode; 53 bool m_utf8mode;
diff --git a/src/FbTk/XmbFontImp.cc b/src/FbTk/XmbFontImp.cc
index 9b3c302..b1fd991 100644
--- a/src/FbTk/XmbFontImp.cc
+++ b/src/FbTk/XmbFontImp.cc
@@ -190,7 +190,7 @@ bool XmbFontImp::load(const string &fontname) {
190} 190}
191 191
192void XmbFontImp::drawText(const FbDrawable &d, int screen, GC main_gc, const FbString &text, 192void XmbFontImp::drawText(const FbDrawable &d, int screen, GC main_gc, const FbString &text,
193 size_t len, int x, int y, FbTk::Orientation orient) const { 193 size_t len, int x, int y, FbTk::Orientation orient) {
194 194
195 if (m_fontset == 0) 195 if (m_fontset == 0)
196 return; 196 return;
diff --git a/src/FbTk/XmbFontImp.hh b/src/FbTk/XmbFontImp.hh
index 0c8e1a1..992fa90 100644
--- a/src/FbTk/XmbFontImp.hh
+++ b/src/FbTk/XmbFontImp.hh
@@ -36,7 +36,7 @@ public:
36 XmbFontImp(const char *fontname, bool utf8); 36 XmbFontImp(const char *fontname, bool utf8);
37 ~XmbFontImp(); 37 ~XmbFontImp();
38 bool load(const std::string &name); 38 bool load(const std::string &name);
39 virtual void drawText(const FbDrawable &w, int screen, GC gc, const FbString &text, size_t len, int x, int y, FbTk::Orientation orient) const; 39 virtual void drawText(const FbDrawable &w, int screen, GC gc, const FbString &text, size_t len, int x, int y, FbTk::Orientation orient);
40 unsigned int textWidth(const FbString &text, unsigned int len) const; 40 unsigned int textWidth(const FbString &text, unsigned int len) const;
41 unsigned int height() const; 41 unsigned int height() const;
42 int ascent() const { return m_setextents ? -m_setextents->max_ink_extent.y : 0; } 42 int ascent() const { return m_setextents ? -m_setextents->max_ink_extent.y : 0; }