aboutsummaryrefslogtreecommitdiff
path: root/src/FbTk/Font.cc
diff options
context:
space:
mode:
authorMathias Gumz <akira at fluxbox dot org>2010-09-08 18:17:21 (GMT)
committerMathias Gumz <akira at fluxbox dot org>2010-09-08 18:17:21 (GMT)
commit690d926ac444243611cd875fb84fabb4e6db2cf2 (patch)
treec8ef84056b295071f9a9207ffea5393c6cf4ad4d /src/FbTk/Font.cc
parent1e8fe2bc14856fa16508686a28a85e72cb0e422c (diff)
downloadfluxbox-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/Font.cc')
-rw-r--r--src/FbTk/Font.cc34
1 files changed, 11 insertions, 23 deletions
diff --git a/src/FbTk/Font.cc b/src/FbTk/Font.cc
index 28341a7..ea0fbde 100644
--- a/src/FbTk/Font.cc
+++ b/src/FbTk/Font.cc
@@ -247,14 +247,8 @@ bool Font::load(const string &name) {
247 return false; 247 return false;
248} 248}
249 249
250unsigned int Font::textWidth(const FbString &text, unsigned int size) const { 250unsigned int Font::textWidth(const char* text, unsigned int size) const {
251#ifdef HAVE_FRIBIDI 251 return m_fontimp->textWidth(text, size);
252 const FbString visualOrder(FbTk::FbStringUtil::BidiLog2Vis(text));
253#else
254 const FbString &visualOrder = text;
255#endif
256
257 return m_fontimp->textWidth(visualOrder, size);
258} 252}
259 253
260unsigned int Font::height() const { 254unsigned int Font::height() const {
@@ -274,34 +268,28 @@ bool Font::validOrientation(FbTk::Orientation orient) {
274} 268}
275 269
276void Font::drawText(const FbDrawable &w, int screen, GC gc, 270void Font::drawText(const FbDrawable &w, int screen, GC gc,
277 const FbString &text, size_t len, int x, int y, 271 const char* text, size_t len, int x, int y,
278 Orientation orient) const { 272 Orientation orient) const {
279 if (text.empty() || len == 0)
280 return;
281
282#ifdef HAVE_FRIBIDI
283 const FbString visualOrder(FbTk::FbStringUtil::BidiLog2Vis(text));
284#else
285 const FbString &visualOrder = text;
286#endif
287 273
274 if (!text || !*text || len == 0)
275 return;
288 276
289 // draw "effects" first 277 // draw "effects" first
290 if (m_shadow) { 278 if (m_shadow) {
291 FbTk::GContext shadow_gc(w); 279 FbTk::GContext shadow_gc(w);
292 shadow_gc.setForeground(m_shadow_color); 280 shadow_gc.setForeground(m_shadow_color);
293 m_fontimp->drawText(w, screen, shadow_gc.gc(), visualOrder, len, 281 m_fontimp->drawText(w, screen, shadow_gc.gc(), text, len,
294 x + m_shadow_offx, y + m_shadow_offy, orient); 282 x + m_shadow_offx, y + m_shadow_offy, orient);
295 } else if (m_halo) { 283 } else if (m_halo) {
296 FbTk::GContext halo_gc(w); 284 FbTk::GContext halo_gc(w);
297 halo_gc.setForeground(m_halo_color); 285 halo_gc.setForeground(m_halo_color);
298 m_fontimp->drawText(w, screen, halo_gc.gc(), visualOrder, len, x + 1, y + 1, orient); 286 m_fontimp->drawText(w, screen, halo_gc.gc(), text, len, x + 1, y + 1, orient);
299 m_fontimp->drawText(w, screen, halo_gc.gc(), visualOrder, len, x - 1, y + 1, orient); 287 m_fontimp->drawText(w, screen, halo_gc.gc(), text, len, x - 1, y + 1, orient);
300 m_fontimp->drawText(w, screen, halo_gc.gc(), visualOrder, len, x - 1, y - 1, orient); 288 m_fontimp->drawText(w, screen, halo_gc.gc(), text, len, x - 1, y - 1, orient);
301 m_fontimp->drawText(w, screen, halo_gc.gc(), visualOrder, len, x + 1, y - 1, orient); 289 m_fontimp->drawText(w, screen, halo_gc.gc(), text, len, x + 1, y - 1, orient);
302 } 290 }
303 291
304 m_fontimp->drawText(w, screen, gc, visualOrder, len, x, y, orient); 292 m_fontimp->drawText(w, screen, gc, text, len, x, y, orient);
305 293
306 294
307} 295}