diff options
author | Mathias Gumz <akira at fluxbox dot org> | 2010-09-08 18:17:21 (GMT) |
---|---|---|
committer | Mathias Gumz <akira at fluxbox dot org> | 2010-09-08 18:17:21 (GMT) |
commit | 690d926ac444243611cd875fb84fabb4e6db2cf2 (patch) | |
tree | c8ef84056b295071f9a9207ffea5393c6cf4ad4d /src/FbTk/XftFontImp.cc | |
parent | 1e8fe2bc14856fa16508686a28a85e72cb0e422c (diff) | |
download | fluxbox-690d926ac444243611cd875fb84fabb4e6db2cf2.zip fluxbox-690d926ac444243611cd875fb84fabb4e6db2cf2.tar.bz2 |
introduced FbTk::BidiString
a 'BidiString' holds both the logical content and the visual reordered
version of the content of a string. this helps to reduce the number of
calls to reorder the string before drawing it (as introduced in the patch
from Ken Bloom) and to be more consistent in menus and textboxes (drawing
cursors and underlining text).
Diffstat (limited to 'src/FbTk/XftFontImp.cc')
-rw-r--r-- | src/FbTk/XftFontImp.cc | 55 |
1 files changed, 19 insertions, 36 deletions
diff --git a/src/FbTk/XftFontImp.cc b/src/FbTk/XftFontImp.cc index 80eb2c4..15c8212 100644 --- a/src/FbTk/XftFontImp.cc +++ b/src/FbTk/XftFontImp.cc | |||
@@ -77,7 +77,10 @@ bool XftFontImp::load(const std::string &name) { | |||
77 | return true; | 77 | return true; |
78 | } | 78 | } |
79 | 79 | ||
80 | void XftFontImp::drawText(const FbDrawable &w, int screen, GC gc, const FbString &text, size_t len, int x, int y, FbTk::Orientation orient) { | 80 | void XftFontImp::drawText(const FbDrawable &w, int screen, GC gc, const char* text, size_t len, int x, int y, FbTk::Orientation orient) { |
81 | |||
82 | if (!text || !*text) | ||
83 | return; | ||
81 | 84 | ||
82 | if (!validOrientation(orient)) | 85 | if (!validOrientation(orient)) |
83 | return; | 86 | return; |
@@ -98,12 +101,11 @@ void XftFontImp::drawText(const FbDrawable &w, int screen, GC gc, const FbString | |||
98 | break; | 101 | break; |
99 | } | 102 | } |
100 | 103 | ||
101 | XftFont *font = m_xftfonts[orient]; | 104 | Visual* def_visual = DefaultVisual(w.display(), screen); |
105 | Colormap def_colmap = DefaultColormap(w.display(), screen); | ||
102 | 106 | ||
103 | XftDraw *draw = XftDrawCreate(w.display(), | 107 | XftFont *font = m_xftfonts[orient]; |
104 | w.drawable(), | 108 | XftDraw *draw = XftDrawCreate(w.display(), w.drawable(), def_visual, def_colmap); |
105 | DefaultVisual(w.display(), screen), | ||
106 | DefaultColormap(w.display(), screen)); | ||
107 | 109 | ||
108 | XGCValues gc_val; | 110 | XGCValues gc_val; |
109 | 111 | ||
@@ -114,7 +116,7 @@ void XftFontImp::drawText(const FbDrawable &w, int screen, GC gc, const FbString | |||
114 | // get red, green, blue values | 116 | // get red, green, blue values |
115 | XColor xcol; | 117 | XColor xcol; |
116 | xcol.pixel = gc_val.foreground; | 118 | xcol.pixel = gc_val.foreground; |
117 | XQueryColor(w.display(), DefaultColormap(w.display(), screen), &xcol); | 119 | XQueryColor(w.display(), def_colmap, &xcol); |
118 | 120 | ||
119 | // convert xcolor to XftColor | 121 | // convert xcolor to XftColor |
120 | XRenderColor rendcol; | 122 | XRenderColor rendcol; |
@@ -123,10 +125,7 @@ void XftFontImp::drawText(const FbDrawable &w, int screen, GC gc, const FbString | |||
123 | rendcol.blue = xcol.blue; | 125 | rendcol.blue = xcol.blue; |
124 | rendcol.alpha = 0xFFFF; | 126 | rendcol.alpha = 0xFFFF; |
125 | XftColor xftcolor; | 127 | XftColor xftcolor; |
126 | XftColorAllocValue(w.display(), | 128 | XftColorAllocValue(w.display(), def_visual, def_colmap, &rendcol, &xftcolor); |
127 | DefaultVisual(w.display(), screen), | ||
128 | DefaultColormap(w.display(), screen), | ||
129 | &rendcol, &xftcolor); | ||
130 | 129 | ||
131 | // draw string | 130 | // draw string |
132 | #ifdef HAVE_XFT_UTF8_STRING | 131 | #ifdef HAVE_XFT_UTF8_STRING |
@@ -134,39 +133,25 @@ void XftFontImp::drawText(const FbDrawable &w, int screen, GC gc, const FbString | |||
134 | // check the string size, | 133 | // check the string size, |
135 | // if the size is zero we use the XftDrawString8 function instead. | 134 | // if the size is zero we use the XftDrawString8 function instead. |
136 | XGlyphInfo ginfo; | 135 | XGlyphInfo ginfo; |
137 | XftTextExtentsUtf8(w.display(), | 136 | XftTextExtentsUtf8(w.display(), m_xftfonts[ROT0], (XftChar8 *)text, len, &ginfo); |
138 | m_xftfonts[ROT0], | ||
139 | (XftChar8 *)text.data(), len, | ||
140 | &ginfo); | ||
141 | if (ginfo.xOff != 0) { | 137 | if (ginfo.xOff != 0) { |
142 | XftDrawStringUtf8(draw, | 138 | XftDrawStringUtf8(draw, &xftcolor, font, x, y, (XftChar8 *)text, len); |
143 | &xftcolor, | 139 | XftColorFree(w.display(), def_visual, def_colmap, &xftcolor); |
144 | font, | ||
145 | x, y, | ||
146 | (XftChar8 *)(text.data()), len); | ||
147 | XftColorFree(w.display(), | ||
148 | DefaultVisual(w.display(), screen), | ||
149 | DefaultColormap(w.display(), screen), &xftcolor); | ||
150 | XftDrawDestroy(draw); | 140 | XftDrawDestroy(draw); |
151 | return; | 141 | return; |
152 | } | 142 | } |
153 | } | 143 | } |
154 | #endif // HAVE_XFT_UTF8_STRING | 144 | #endif // HAVE_XFT_UTF8_STRING |
155 | 145 | ||
156 | XftDrawString8(draw, | 146 | XftDrawString8(draw, &xftcolor, font, x, y, (XftChar8 *)text, len); |
157 | &xftcolor, | ||
158 | font, | ||
159 | x, y, | ||
160 | (XftChar8 *)(text.data()), len); | ||
161 | 147 | ||
162 | 148 | ||
163 | XftColorFree(w.display(), | 149 | XftColorFree(w.display(), def_visual, def_colmap, &xftcolor); |
164 | DefaultVisual(w.display(), screen), | ||
165 | DefaultColormap(w.display(), screen), &xftcolor); | ||
166 | XftDrawDestroy(draw); | 150 | XftDrawDestroy(draw); |
167 | } | 151 | } |
168 | 152 | ||
169 | unsigned int XftFontImp::textWidth(const FbString &text, unsigned int len) const { | 153 | unsigned int XftFontImp::textWidth(const char* text, unsigned int len) const { |
154 | |||
170 | if (m_xftfonts[ROT0] == 0) | 155 | if (m_xftfonts[ROT0] == 0) |
171 | return 0; | 156 | return 0; |
172 | 157 | ||
@@ -180,7 +165,7 @@ unsigned int XftFontImp::textWidth(const FbString &text, unsigned int len) const | |||
180 | if (m_utf8mode) { | 165 | if (m_utf8mode) { |
181 | XftTextExtentsUtf8(disp, | 166 | XftTextExtentsUtf8(disp, |
182 | font, | 167 | font, |
183 | (XftChar8 *)text.data(), len, | 168 | (XftChar8 *)text, len, |
184 | &ginfo); | 169 | &ginfo); |
185 | if (ginfo.xOff != 0) | 170 | if (ginfo.xOff != 0) |
186 | return ginfo.xOff; | 171 | return ginfo.xOff; |
@@ -189,9 +174,7 @@ unsigned int XftFontImp::textWidth(const FbString &text, unsigned int len) const | |||
189 | } | 174 | } |
190 | #endif //HAVE_XFT_UTF8_STRING | 175 | #endif //HAVE_XFT_UTF8_STRING |
191 | 176 | ||
192 | std::string localestr = text; | 177 | std::string localestr = FbStringUtil::FbStrToLocale(FbString(text, len)); |
193 | localestr.erase(len, std::string::npos); | ||
194 | localestr = FbStringUtil::FbStrToLocale(localestr); | ||
195 | 178 | ||
196 | XftTextExtents8(disp, | 179 | XftTextExtents8(disp, |
197 | font, | 180 | font, |