Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TGX11TTF.cxx
Go to the documentation of this file.
1// @(#)root/x11ttf:$Id: 80028b538e60290371c1c5d73728f78b1c32f09a $
2// Author: Valeriy Onuchin (Xft support) 02/10/07
3// Author: Olivier Couet 01/10/02
4// Author: Fons Rademakers 21/11/98
5
6/*************************************************************************
7 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
8 * All rights reserved. *
9 * *
10 * For the licensing terms see $ROOTSYS/LICENSE. *
11 * For the list of contributors see $ROOTSYS/README/CREDITS. *
12 *************************************************************************/
13
14/** \class TGX11TTF
15\ingroup x11
16
17Interface to low level X11 (Xlib). This class gives access to basic
18X11 graphics via the parent class TGX11. However, all text and font
19handling is done via the Freetype TrueType library. When the
20shared library containing this class is loaded the global gVirtualX
21is redirected to point to this class.
22*/
23
24#include <cstdlib>
25
26#include <ft2build.h>
27#include FT_FREETYPE_H
28#include FT_GLYPH_H
29#include "TGX11TTF.h"
30#include "TEnv.h"
31
32#include <X11/Xlib.h>
33#include <X11/Xutil.h>
34#include <X11/Xatom.h>
35#include <X11/cursorfont.h>
36#include <X11/keysym.h>
37#include <X11/xpm.h>
38
39struct RXColor:XColor{};
40struct RVisual:Visual{};
41struct RXImage:XImage{};
42
43#ifdef R__HAS_XFT
44
45#include "THashTable.h"
46#include "TRefCnt.h"
47#include <X11/Xft/Xft.h>
48
49///////////////////////// xft font data //////////////////////////////////////
50class TXftFontData : public TNamed, public TRefCnt {
51public:
52 GContext_t fGC; // graphics context
53 XftFont *fXftFont; // xft font
54
55 TXftFontData(GContext_t gc, XftFont *xftfont, const char *name) :
56 TNamed(name, ""), TRefCnt(), fXftFont(xftfont)
57 {
58 SetRefCount(1);
59 fGC = gc;
60 }
61
62 void MapGCFont(GContext_t gc, FontStruct_t font)
63 {
64 fGC = gc; fXftFont = (XftFont *)font;
65 }
66
67 ~TXftFontData()
68 {
69 if (References() == 1) {
70 if (fXftFont) XftFontClose((Display*)gVirtualX->GetDisplay(), fXftFont);
71 }
72 }
73};
74
75/////////////////// hash table //////////////////////////////////////////////
76class TXftFontHash {
77public:
78 THashTable *fList; // hash table
79
80 TXftFontHash() { fList = new THashTable(50); }
81
82 TXftFontData *FindByName(const char *name)
83 {
84 return (TXftFontData*)fList->FindObject(name);
85 }
86
87 TXftFontData *FindByFont(FontStruct_t font)
88 {
89 TIter next(fList);
90 TXftFontData *d = 0;
91
92 while ((d = (TXftFontData*) next())) {
93 if (d->fXftFont == (XftFont *)font) {
94 return d;
95 }
96 }
97 return 0;
98 }
99
100 TXftFontData *FindByGC(GContext_t gc)
101 {
102 TIter next(fList);
103 TXftFontData *d = 0;
104
105 while ((d = (TXftFontData*) next())) {
106 if (d->fGC == gc) {
107 return d;
108 }
109 }
110 return 0;
111 }
112
113 void AddFont(TXftFontData *data)
114 {
115 // Loop over all existing TXftFontData, if we already have one with the same
116 // font data, set the reference counter of this one beyond 1 so it does
117 // delete the font pointer
118 TIter next(fList);
119 TXftFontData *d = 0;
120
121 while ((d = (TXftFontData*) next())) {
122 if (d->fXftFont == data->fXftFont) {
123 data->AddReference();
124 }
125 }
126
127 fList->Add(data);
128 }
129
130 void FreeFont(TXftFontData *data)
131 {
132 fList->Remove(data);
133 delete data;
134 }
135};
136#endif // R__HAS_XFT
137
138/** \class TTFX11Init
139\ingroup GraphicsBackends
140
141Small utility class that takes care of switching the current
142gVirtualX to the new TGX11TTF class as soon as the shared library
143containing this class is loaded.
144*/
145
147public:
149};
151
152
154
155////////////////////////////////////////////////////////////////////////////////
156/// Create copy of TGX11 but now use TrueType fonts.
157
159{
160 SetName("X11TTF");
161 SetTitle("ROOT interface to X11 with TrueType fonts");
162
163 if (!TTF::fgInit) TTF::Init();
164
166 fHasXft = kFALSE;
167 fAlign.x = 0;
168 fAlign.y = 0;
169
170#ifdef R__HAS_XFT
171 fXftFontHash = 0;
172#endif
173}
174
175////////////////////////////////////////////////////////////////////////////////
176/// Static method setting TGX11TTF as the acting gVirtualX.
177
179{
180 if (gVirtualX && dynamic_cast<TGX11*>(gVirtualX)) {
181 TGX11 *oldg = (TGX11 *) gVirtualX;
182 gVirtualX = new TGX11TTF(*oldg);
183 delete oldg;
184 }
185}
186
187////////////////////////////////////////////////////////////////////////////////
188/// Initialize X11 system. Returns kFALSE in case of failure.
189
190Bool_t TGX11TTF::Init(void *display)
191{
192#ifdef R__HAS_XFT
193 fXftFontHash = 0;
194 XFontStruct *fs = 0;
195 if (display) fs = XLoadQueryFont((Display *)display, "-*-helvetica-*-r-*-*-14-*-*-*-*-*-*-*");
196 if (!fs) gEnv->SetValue("X11.UseXft", 1);
197 if (display && fs) XFreeFont((Display *)display, fs);
198 if (gEnv->GetValue("X11.UseXft", 0)) {
199 fHasXft = kTRUE;
200 fXftFontHash = new TXftFontHash();
201 }
202#endif
203 Bool_t r = TGX11::Init(display);
204
205 if (fDepth > 8) {
207 } else {
209 }
210
211 return r;
212}
213
214////////////////////////////////////////////////////////////////////////////////
215/// Compute alignment variables. The alignment is done on the horizontal string
216/// then the rotation is applied on the alignment variables.
217/// SetRotation and LayoutGlyphs should have been called before.
218
220{
221 EAlign align = (EAlign) fTextAlign;
222
223 // vertical alignment
224 if (align == kTLeft || align == kTCenter || align == kTRight) {
226 } else if (align == kMLeft || align == kMCenter || align == kMRight) {
227 fAlign.y = TTF::fgAscent/2;
228 } else {
229 fAlign.y = 0;
230 }
231
232 // horizontal alignment
233 if (align == kTRight || align == kMRight || align == kBRight) {
235 } else if (align == kTCenter || align == kMCenter || align == kBCenter) {
236 fAlign.x = TTF::fgWidth/2;
237 } else {
238 fAlign.x = 0;
239 }
240
241 FT_Vector_Transform(&fAlign, TTF::fgRotMatrix);
242 fAlign.x = fAlign.x >> 6;
243 fAlign.y = fAlign.y >> 6;
244}
245
246////////////////////////////////////////////////////////////////////////////////
247/// Draw FT_Bitmap bitmap to xim image at position bx,by using specified
248/// foreground color.
249
250void TGX11TTF::DrawImage(FT_Bitmap *source, ULong_t fore, ULong_t back,
251 RXImage *xim, Int_t bx, Int_t by)
252{
253 UChar_t d = 0, *s = source->buffer;
254
255 if (TTF::fgSmoothing) {
256
257 static RXColor col[5];
258 RXColor *bcol = 0;
259 XColor *bc;
260 Int_t x, y;
261
262 // background kClear, i.e. transparent, we take as background color
263 // the average of the rgb values of all pixels covered by this character
264 if (back == (ULong_t) -1 && (UInt_t)source->width) {
265 ULong_t r, g, b;
266 Int_t dots, dotcnt;
267 const Int_t maxdots = 50000;
268
269 dots = Int_t(source->width * source->rows);
270 dots = dots > maxdots ? maxdots : dots;
271 bcol = new RXColor[dots];
272 if (!bcol) return;
273 bc = bcol;
274 dotcnt = 0;
275 for (y = 0; y < (int) source->rows; y++) {
276 for (x = 0; x < (int) source->width; x++, bc++) {
277/// bc->pixel = XGetPixel(xim, bx + x, by - c->TTF::fgAscent + y);
278 bc->pixel = XGetPixel(xim, bx + x, by + y);
279 bc->flags = DoRed | DoGreen | DoBlue;
280 if (++dotcnt >= maxdots) break;
281 }
282 }
283 QueryColors(fColormap, bcol, dots);
284 r = g = b = 0;
285 bc = bcol;
286 dotcnt = 0;
287 for (y = 0; y < (int) source->rows; y++) {
288 for (x = 0; x < (int) source->width; x++, bc++) {
289 r += bc->red;
290 g += bc->green;
291 b += bc->blue;
292 if (++dotcnt >= maxdots) break;
293 }
294 }
295 if (dots != 0) {
296 r /= dots;
297 g /= dots;
298 b /= dots;
299 }
300 bc = &col[0];
301 if (bc->red == r && bc->green == g && bc->blue == b)
302 bc->pixel = back;
303 else {
304 bc->pixel = ~back;
305 bc->red = (UShort_t) r;
306 bc->green = (UShort_t) g;
307 bc->blue = (UShort_t) b;
308 }
309 }
310 delete [] bcol;
311
312 // if fore or background have changed from previous character
313 // recalculate the 3 smoothing colors (interpolation between fore-
314 // and background colors)
315 if (fore != col[4].pixel || back != col[0].pixel) {
316 col[4].pixel = fore;
317 col[4].flags = DoRed|DoGreen|DoBlue;
318 if (back != (ULong_t) -1) {
319 col[3].pixel = back;
320 col[3].flags = DoRed | DoGreen | DoBlue;
321 QueryColors(fColormap, &col[3], 2);
322 col[0] = col[3];
323 } else {
324 QueryColors(fColormap, &col[4], 1);
325 }
326
327 // interpolate between fore and background colors
328 for (x = 3; x > 0; x--) {
329 col[x].red = (col[4].red *x + col[0].red *(4-x)) /4;
330 col[x].green = (col[4].green*x + col[0].green*(4-x)) /4;
331 col[x].blue = (col[4].blue *x + col[0].blue *(4-x)) /4;
332 if (!AllocColor(fColormap, &col[x])) {
333 Warning("DrawImage", "cannot allocate smoothing color");
334 col[x].pixel = col[x+1].pixel;
335 }
336 }
337 }
338
339 // put smoothed character, character pixmap values are an index
340 // into the 5 colors used for aliasing (4 = foreground, 0 = background)
341 for (y = 0; y < (int) source->rows; y++) {
342 for (x = 0; x < (int) source->width; x++) {
343 d = *s++ & 0xff;
344 d = ((d + 10) * 5) / 256;
345 if (d > 4) d = 4;
346 if (d && x < (int) source->width) {
347 ULong_t p = col[d].pixel;
348 XPutPixel(xim, bx + x, by + y, p);
349 }
350 }
351 }
352 } else {
353 // no smoothing, just put character using foreground color
354 UChar_t* row=s;
355 for (int y = 0; y < (int) source->rows; y++) {
356 int n = 0;
357 s = row;
358 for (int x = 0; x < (int) source->width; x++) {
359 if (n == 0) d = *s++;
360 if (TESTBIT(d,7-n))
361 XPutPixel(xim, bx + x, by + y, fore);
362 if (++n == (int) kBitsPerByte) n = 0;
363 }
364 row += source->pitch;
365 }
366 }
367}
368
369////////////////////////////////////////////////////////////////////////////////
370/// Draw text using TrueType fonts. If TrueType fonts are not available the
371/// text is drawn with TGX11::DrawText.
372
374 const char *text, ETextMode mode)
375{
376 if (!fHasTTFonts) {
377 TGX11::DrawText(x, y, angle, mgn, text, mode);
378 } else {
379 if (!TTF::fgInit) TTF::Init();
383 Align();
384 RenderString(x, y, mode);
385 }
386}
387
388////////////////////////////////////////////////////////////////////////////////
389/// Draw text using TrueType fonts. If TrueType fonts are not available the
390/// text is drawn with TGX11::DrawText.
391
393 const wchar_t *text, ETextMode mode)
394{
395 if (!fHasTTFonts) {
396 TGX11::DrawText(x, y, angle, mgn, text, mode);
397 } else {
398 if (!TTF::fgInit) TTF::Init();
402 Align();
403 RenderString(x, y, mode);
404 }
405}
406
407////////////////////////////////////////////////////////////////////////////////
408/// Get the background of the current window in an XImage.
409
411{
414 UInt_t height;
415 Int_t xy;
416 gVirtualX->GetWindowSize(cws, xy, xy, width, height);
417
418 if (x < 0) {
419 w += x;
420 x = 0;
421 }
422 if (y < 0) {
423 h += y;
424 y = 0;
425 }
426
427 if (x+w > width) w = width - x;
428 if (y+h > height) h = height - y;
429
430 return (RXImage*)XGetImage((Display*)fDisplay, cws, x, y, w, h, AllPlanes, ZPixmap);
431}
432
433////////////////////////////////////////////////////////////////////////////////
434/// Test if there is really something to render.
435
437{
440 UInt_t height;
441 Int_t xy;
442 gVirtualX->GetWindowSize(cws, xy, xy, width, height);
443
444 // If w or h is 0, very likely the string is only blank characters
445 if ((int)w == 0 || (int)h == 0) return kFALSE;
446
447 // If string falls outside window, there is probably no need to draw it.
448 if (x + (int)w <= 0 || x >= (int)width) return kFALSE;
449 if (y + (int)h <= 0 || y >= (int)height) return kFALSE;
450
451 // If w or h are much larger than the window size, there is probably no need
452 // to draw it. Moreover a to large text size may produce a Seg Fault in
453 // malloc in RenderString.
454 if (w > 10*width) return kFALSE;
455 if (h > 10*height) return kFALSE;
456
457 return kTRUE;
458}
459
460////////////////////////////////////////////////////////////////////////////////
461/// Perform the string rendering in the pad.
462/// LayoutGlyphs should have been called before.
463
465{
467 GC *gc;
468
469 // compute the size and position of the XImage that will contain the text
470 Int_t Xoff = 0; if (TTF::GetBox().xMin < 0) Xoff = -TTF::GetBox().xMin;
471 Int_t Yoff = 0; if (TTF::GetBox().yMin < 0) Yoff = -TTF::GetBox().yMin;
472 Int_t w = TTF::GetBox().xMax + Xoff;
473 Int_t h = TTF::GetBox().yMax + Yoff;
474 Int_t x1 = x-Xoff-fAlign.x;
475 Int_t y1 = y+Yoff+fAlign.y-h;
476
477 if (!IsVisible(x1, y1, w, h)) return;
478
479 // create the XImage that will contain the text
480 UInt_t depth = fDepth;
481 XImage *xim = 0;
482 xim = XCreateImage((Display*)fDisplay, fVisual,
483 depth, ZPixmap, 0, 0, w, h,
484 depth <= 8 ? 8 : (depth <= 16 ? 16 : 32), 0);
485 //bitmap_pad should be 8, 16 or 32 https://www.x.org/releases/X11R7.5/doc/man/man3/XPutPixel.3.html
486 if (!xim) return;
487
488 // use malloc since Xlib will use free() in XDestroyImage
489 xim->data = (char *) malloc(xim->bytes_per_line * h);
490 memset(xim->data, 0, xim->bytes_per_line * h);
491
492 ULong_t bg;
493 XGCValues values;
494 gc = (GC*)GetGC(3);
495 if (!gc) {
496 Error("DrawText", "error getting Graphics Context");
497 return;
498 }
499 XGetGCValues((Display*)fDisplay, *gc, GCForeground | GCBackground, &values);
500
501 // get the background
502 if (mode == kClear) {
503 // if mode == kClear we need to get an image of the background
504 XImage *bim = GetBackground(x1, y1, w, h);
505 if (!bim) {
506 Error("DrawText", "error getting background image");
507 return;
508 }
509
510 // and copy it into the text image
511 Int_t xo = 0, yo = 0;
512 if (x1 < 0) xo = -x1;
513 if (y1 < 0) yo = -y1;
514
515 for (int yp = 0; yp < (int) bim->height; yp++) {
516 for (int xp = 0; xp < (int) bim->width; xp++) {
517 ULong_t pixel = XGetPixel(bim, xp, yp);
518 XPutPixel(xim, xo+xp, yo+yp, pixel);
519 }
520 }
521 XDestroyImage(bim);
522 bg = (ULong_t) -1;
523 } else {
524 // if mode == kOpaque its simple, we just draw the background
525 XAddPixel(xim, values.background);
526 bg = values.background;
527 }
528
529 // paint the glyphs in the XImage
530 glyph = TTF::fgGlyphs;
531 for (int n = 0; n < TTF::fgNumGlyphs; n++, glyph++) {
532 if (FT_Glyph_To_Bitmap(&glyph->fImage,
533 TTF::fgSmoothing ? ft_render_mode_normal
534 : ft_render_mode_mono,
535 0, 1 )) continue;
536 FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyph->fImage;
537 FT_Bitmap* source = &bitmap->bitmap;
538 Int_t bx, by;
539
540 bx = bitmap->left+Xoff;
541 by = h - bitmap->top-Yoff;
542 DrawImage(source, values.foreground, bg, (RXImage*)xim, bx, by);
543 }
544
545 // put the Ximage on the screen
547 gc = (GC*)GetGC(6);
548 if (gc) XPutImage((Display*)fDisplay, cws, *gc, xim, 0, 0, x1, y1, w, h);
549 XDestroyImage(xim);
550}
551
552////////////////////////////////////////////////////////////////////////////////
553/// Set specified font.
554
556{
557 fTextFont = fontnumber;
558 if (!fHasTTFonts) {
559 TGX11::SetTextFont(fontnumber);
560 } else {
561 TTF::SetTextFont(fontnumber);
562 }
563}
564
565////////////////////////////////////////////////////////////////////////////////
566/// Set text font to specified name.
567/// mode : loading flag
568/// mode=0 : search if the font exist (kCheck)
569/// mode=1 : search the font and load it if it exists (kLoad)
570/// font : font name
571///
572/// Set text font to specified name. This function returns 0 if
573/// the specified font is found, 1 if not.
574
576{
577 if (!fHasTTFonts) {
578 return TGX11::SetTextFont(fontname, mode);
579 } else {
580 return TTF::SetTextFont(fontname);
581 }
582}
583
584////////////////////////////////////////////////////////////////////////////////
585/// Set current text size.
586
588{
589 fTextSize = textsize;
590 if (!fHasTTFonts) {
591 TGX11::SetTextSize(textsize);
592 } else {
593 TTF::SetTextSize(textsize);
594 }
595}
596
597#ifdef R__HAS_XFT
598
599///////////////////////////// Xft font methods /////////////////////////////////
600////////////////////////////////////////////////////////////////////////////////
601/// Parses an XLFD name and opens a font.
602
603FontStruct_t TGX11TTF::LoadQueryFont(const char *font_name)
604{
605 if (!fXftFontHash) {
606 return TGX11::LoadQueryFont(font_name);
607 }
608
609 TXftFontData *data = fXftFontHash->FindByName(font_name);
610
611 // already loaded
612 if (data) {
613 return (FontStruct_t)data->fXftFont;
614 }
615
616 XftFont *xftfont = XftFontOpenXlfd((Display*)fDisplay, fScreenNumber, font_name);
617
618 data = new TXftFontData(0, xftfont, font_name);
619 fXftFontHash->AddFont(data);
620
621 return (FontStruct_t)xftfont;
622}
623
624////////////////////////////////////////////////////////////////////////////////
625/// Explicitly delete font structure obtained with LoadQueryFont().
626
628{
629 if (!fXftFontHash) {
631 return;
632 }
633
634 TXftFontData *data = fXftFontHash->FindByFont(fs);
635
636 if (data)
637 fXftFontHash->FreeFont(data);
638}
639
640////////////////////////////////////////////////////////////////////////////////
641/// Explicitly delete a graphics context.
642
644{
645 if (!fXftFontHash) {
646 TGX11::DeleteGC(gc);
647 return;
648 }
649
650 TXftFontData *gcdata = fXftFontHash->FindByGC(gc);
651 if (gcdata) fXftFontHash->FreeFont(gcdata);
652 TGX11::DeleteGC(gc);
653}
654
655////////////////////////////////////////////////////////////////////////////////
656/// Return handle to font described by font structure.
657
659{
660 if (!fXftFontHash) {
661 return TGX11::GetFontHandle(fs);
662 }
663
664 return (FontH_t)fs;
665}
666
667////////////////////////////////////////////////////////////////////////////////
668/// Return the font associated with the graphics context gc
669
671{
672 if (!fXftFontHash) {
673 return 0;
674 }
675
676 TXftFontData *data = fXftFontHash->FindByGC(gc);
677
678 // no XftFont data
679 if (!data) return 0;
680
681 return (FontStruct_t)data->fXftFont;
682}
683
684////////////////////////////////////////////////////////////////////////////////
685/// Map the XftFont with the Graphics Context using it.
686
688{
689 if (!fXftFontHash)
690 return;
691
692 TXftFontData *gcdata = fXftFontHash->FindByGC(gc);
693 TXftFontData *fontdata = fXftFontHash->FindByFont(font);
694
695 if (gcdata) { // && (gcdata->fXftFont == 0)) {
696 gcdata->fXftFont = (XftFont *)font;
697 }
698 else if (fontdata) {
699 TXftFontData *data = new TXftFontData(gc, (XftFont *)font, fontdata->GetName());
700 fXftFontHash->AddFont(data);
701 }
702}
703
704////////////////////////////////////////////////////////////////////////////////
705/// Return length of string in pixels. Size depends on font
706
707Int_t TGX11TTF::TextWidth(FontStruct_t font, const char *s, Int_t len)
708{
709 if (!fXftFontHash) {
710 return TGX11::TextWidth(font, s, len);
711 }
712
713 TXftFontData *data = fXftFontHash->FindByFont(font);
714
715 if (!data) return 0;
716
717 XftFont *xftfont = data->fXftFont;
718
719 if (xftfont) {
720 XGlyphInfo glyph_info;
721 XftTextExtents8((Display *)fDisplay, xftfont, (XftChar8 *)s, len, &glyph_info);
722 return glyph_info.xOff;
723 }
724 return 0;
725}
726
727////////////////////////////////////////////////////////////////////////////////
728/// Return some font properties
729
730void TGX11TTF::GetFontProperties(FontStruct_t font, Int_t &max_ascent, Int_t &max_descent)
731{
732 if (!fXftFontHash) {
733 TGX11::GetFontProperties(font, max_ascent, max_descent);
734 return;
735 }
736
737 TXftFontData *data = fXftFontHash->FindByFont(font);
738
739 if (!data) {
740 TGX11::GetFontProperties(font, max_ascent, max_descent);
741 return;
742 }
743
744 XftFont *xftfont = data->fXftFont;
745
746 if (!xftfont) {
747 TGX11::GetFontProperties(font, max_ascent, max_descent);
748 return;
749 }
750
751 max_ascent = xftfont->ascent;
752 max_descent = xftfont->descent;
753}
754
755////////////////////////////////////////////////////////////////////////////////
756/// Draw text string
757
759 const char *text, Int_t len)
760{
761 XftDraw *xftdraw;
762 XftColor xftcolor;
763 XColor xcolor;
764 XftFont *xftfont;
765
766 if (!xwindow) {
767 return;
768 }
769
770 if (!gc) {
771 return;
772 }
773
774 if (!text || (len < 1) || !text[0]) {
775 return;
776 }
777
778 if (!fXftFontHash) {
779 TGX11::DrawString(xwindow, gc, x, y, text, len);
780 return;
781 }
782
783 GCValues_t gval;
784 gval.fMask = kGCForeground | kGCBackground; // retrieve GC values
785 GetGCValues(gc, gval);
786
787 TXftFontData *data = fXftFontHash->FindByGC(gc);
788
789 // no XftFont data
790 if (!data) {
791 TGX11::DrawString(xwindow, gc, x, y, text, len);
792 return;
793 }
794
795 xftfont = data->fXftFont;
796
797 // no Xft font
798 if (!xftfont) {
799 TGX11::DrawString(xwindow, gc, x, y, text, len);
800 return;
801 }
802
803 // dummies
804 Window droot;
805 Int_t dx,dy;
806 UInt_t bwidth, width, height, depth;
807
808 // check if drawable is bitmap
809 XGetGeometry((Display*)fDisplay, (Drawable)xwindow, &droot, &dx, &dy,
810 &width, &height, &bwidth, &depth);
811
812 if (depth <= 1) {
813 TGX11::DrawString(xwindow, gc, x, y, text, len);
814 return;
815 }
816
817 memset(&xcolor, 0, sizeof(xcolor));
818 xcolor.pixel = gval.fForeground;
819
820 XQueryColor((Display*)fDisplay, fColormap, &xcolor);
821
822 // create XftDraw
823 xftdraw = XftDrawCreate((Display*)fDisplay, (Drawable)xwindow, fVisual, fColormap);
824
825 if (!xftdraw) {
826 //Warning("could not create an XftDraw");
827 TGX11::DrawString(xwindow, gc, x, y, text, len);
828 return;
829 }
830
831 xftcolor.color.red = xcolor.red;
832 xftcolor.color.green = xcolor.green;
833 xftcolor.color.blue = xcolor.blue;
834 xftcolor.color.alpha = 0xffff;
835 xftcolor.pixel = gval.fForeground;
836
837 XftDrawString8(xftdraw, &xftcolor, xftfont, x, y, (XftChar8 *)text, len);
838
839 // cleanup
840 XftDrawDestroy(xftdraw);
841}
842
843#endif // R__HAS_XFT
const Mask_t kGCBackground
Definition GuiTypes.h:289
const Mask_t kGCForeground
Definition GuiTypes.h:288
Handle_t FontH_t
Font handle (as opposed to Font_t which is an index)
Definition GuiTypes.h:35
Handle_t Drawable_t
Drawable handle.
Definition GuiTypes.h:31
Handle_t GContext_t
Graphics context handle.
Definition GuiTypes.h:38
Handle_t FontStruct_t
Pointer to font structure.
Definition GuiTypes.h:39
Handle_t Window_t
Window handle.
Definition GuiTypes.h:29
ROOT::R::TRInterface & r
Definition Object.C:4
#define d(i)
Definition RSha256.hxx:102
#define b(i)
Definition RSha256.hxx:100
#define g(i)
Definition RSha256.hxx:105
#define h(i)
Definition RSha256.hxx:106
static const double x1[5]
unsigned short UShort_t
Definition RtypesCore.h:40
int Int_t
Definition RtypesCore.h:45
unsigned char UChar_t
Definition RtypesCore.h:38
unsigned int UInt_t
Definition RtypesCore.h:46
const Bool_t kFALSE
Definition RtypesCore.h:101
unsigned long ULong_t
Definition RtypesCore.h:55
short Font_t
Definition RtypesCore.h:88
const ULong_t kBitsPerByte
Definition RtypesCore.h:123
float Float_t
Definition RtypesCore.h:57
const Bool_t kTRUE
Definition RtypesCore.h:100
#define ClassImp(name)
Definition Rtypes.h:364
#define TESTBIT(n, i)
Definition Rtypes.h:88
include TDocParser_001 C image html pict1_TDocParser_001 png width
R__EXTERN TEnv * gEnv
Definition TEnv.h:170
static TTFX11Init gTTFX11Init
Definition TGX11TTF.cxx:150
char name[80]
Definition TGX11.cxx:110
XPoint xy[kMAXMK]
Definition TGX11.cxx:123
XID Window
Definition TGX11.h:39
XID Drawable
Definition TGX11.h:36
#define gVirtualX
Definition TVirtualX.h:338
#define malloc
Definition civetweb.c:1536
Font_t fTextFont
Text font.
Definition TAttText.h:25
Float_t fTextSize
Text size.
Definition TAttText.h:22
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Definition TEnv.cxx:491
virtual void SetValue(const char *name, const char *value, EEnvLevel level=kEnvChange, const char *type=nullptr)
Set the value of a resource or create a new resource.
Definition TEnv.cxx:736
Interface to low level X11 (Xlib).
Definition TGX11TTF.h:27
void SetTextSize(Float_t textsize)
Set current text size.
Definition TGX11TTF.cxx:587
void RenderString(Int_t x, Int_t y, ETextMode mode)
Perform the string rendering in the pad.
Definition TGX11TTF.cxx:464
static void Activate()
Static method setting TGX11TTF as the acting gVirtualX.
Definition TGX11TTF.cxx:178
void Align(void)
Compute alignment variables.
Definition TGX11TTF.cxx:219
RXImage * GetBackground(Int_t x, Int_t y, UInt_t w, UInt_t h)
Get the background of the current window in an XImage.
Definition TGX11TTF.cxx:410
void DrawText(Int_t x, Int_t y, Float_t angle, Float_t mgn, const char *text, ETextMode mode)
Draw text using TrueType fonts.
Definition TGX11TTF.cxx:373
void DrawImage(FT_Bitmap *source, ULong_t fore, ULong_t back, RXImage *xim, Int_t bx, Int_t by)
Draw FT_Bitmap bitmap to xim image at position bx,by using specified foreground color.
Definition TGX11TTF.cxx:250
FT_Vector fAlign
alignment vector
Definition TGX11TTF.h:33
Bool_t Init(void *display)
Initialize X11 system. Returns kFALSE in case of failure.
Definition TGX11TTF.cxx:190
TGX11TTF(const TGX11 &org)
Create copy of TGX11 but now use TrueType fonts.
Definition TGX11TTF.cxx:158
Bool_t IsVisible(Int_t x, Int_t y, UInt_t w, UInt_t h)
Test if there is really something to render.
Definition TGX11TTF.cxx:436
void SetTextFont(Font_t fontnumber)
Set specified font.
Definition TGX11TTF.cxx:555
@ kTCenter
Definition TGX11TTF.h:30
@ kBRight
Definition TGX11TTF.h:31
@ kBCenter
Definition TGX11TTF.h:31
@ kMCenter
Definition TGX11TTF.h:30
@ kMRight
Definition TGX11TTF.h:30
@ kTRight
Definition TGX11TTF.h:30
This class is the basic interface to the X11 (Xlib) graphics system.
Definition TGX11.h:83
void * fDisplay
Pointer to display.
Definition TGX11.h:128
Colormap fColormap
Default colormap, 0 if b/w.
Definition TGX11.h:132
Int_t fScreenNumber
Screen number.
Definition TGX11.h:135
void DrawString(Drawable_t id, GContext_t gc, Int_t x, Int_t y, const char *s, Int_t len)
Draw a string using a specific graphics context in position (x,y).
Definition GX11Gui.cxx:2057
void DeleteGC(GContext_t gc)
Explicitly delete a graphics context.
Definition GX11Gui.cxx:1034
Bool_t AllocColor(Colormap cmap, RXColor *color)
Allocate color in colormap.
Definition TGX11.cxx:366
void QueryColors(Colormap cmap, RXColor *colors, Int_t ncolors)
Returns the current RGB value for the pixel in the XColor structure.
Definition TGX11.cxx:383
FontH_t GetFontHandle(FontStruct_t fs)
Return handle to font described by font structure.
Definition GX11Gui.cxx:952
void * GetGC(Int_t which) const
Return desired Graphics Context ("which" maps directly on gGCList[]).
Definition TGX11.cxx:931
Bool_t fHasXft
True when XftFonts are used.
Definition TGX11.h:150
void GetFontProperties(FontStruct_t font, Int_t &max_ascent, Int_t &max_descent)
Return some font properties.
Definition GX11Gui.cxx:2076
Int_t TextWidth(FontStruct_t font, const char *s, Int_t len)
Return length of string in pixels. Size depends on font.
Definition GX11Gui.cxx:2068
void DeleteFont(FontStruct_t fs)
Explicitly delete font structure obtained with LoadQueryFont().
Definition GX11Gui.cxx:964
Int_t fTextAlign
Text alignment (set in SetTextAlign)
Definition TGX11.h:138
Window_t GetCurrentWindow() const
Return current window pointer. Protected method used by TGX11TTF.
Definition TGX11.cxx:922
Int_t fDepth
Number of color planes.
Definition TGX11.h:142
FontStruct_t LoadQueryFont(const char *font_name)
Load font and query font.
Definition GX11Gui.cxx:943
void GetGCValues(GContext_t gc, GCValues_t &gval)
Get current values from graphics context gc.
Definition GX11Gui.cxx:2089
virtual void DrawText(Int_t x, Int_t y, Float_t angle, Float_t mgn, const char *text, ETextMode mode)
Draw a text string using current font.
Definition TGX11.cxx:751
Bool_t Init(void *display)
Initialize X11 system. Returns kFALSE in case of failure.
Definition TGX11.cxx:342
virtual void SetTextSize(Float_t textsize)
Set current text size.
Definition TGX11.cxx:3203
RVisual * fVisual
Pointer to visual used by all windows.
Definition TGX11.h:129
virtual Int_t SetTextFont(char *fontname, ETextSetMode mode)
Set text font to specified name.
Definition TGX11.cxx:3154
Bool_t fHasTTFonts
True when TrueType fonts are used.
Definition TGX11.h:149
THashTable implements a hash table to store TObject's.
Definition THashTable.h:35
TObject * Remove(TObject *obj)
Remove object from the hashtable.
void Add(TObject *obj)
Add object to the hash table.
TObject * FindObject(const char *name) const
Find object using its name.
The TNamed class is the base class for all named ROOT classes.
Definition TNamed.h:29
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
Definition TNamed.cxx:164
virtual void SetName(const char *name)
Set the name of the TNamed.
Definition TNamed.cxx:140
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition TObject.cxx:949
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition TObject.cxx:963
Definitions for TRefCnt, base class for reference counted objects.
Definition TRefCnt.h:27
void SetRefCount(UInt_t r)
Definition TRefCnt.h:39
UInt_t References() const
Definition TRefCnt.h:38
Small utility class that takes care of switching the current gVirtualX to the new TGX11TTF class as s...
Definition TGX11TTF.cxx:146
TTF helper class containing glyphs description.
Definition TTF.h:65
FT_Glyph fImage
glyph image
Definition TTF.h:69
static void PrepareString(const char *string)
Put the characters in "string" in the "glyphs" array.
Definition TTF.cxx:250
static TTF::TTGlyph fgGlyphs[kMaxGlyphs]
glyphs
Definition TTF.h:83
static Bool_t fgSmoothing
use anti-aliasing (true when >8 planes, false otherwise)
Definition TTF.h:90
static void Init()
Initialise the TrueType fonts interface.
Definition TTF.cxx:65
static void LayoutGlyphs()
Compute the glyphs positions, fgAscent and fgWidth (needed for alignment).
Definition TTF.cxx:181
static void SetSmoothing(Bool_t state)
Set smoothing (anti-aliasing) flag.
Definition TTF.cxx:365
static void SetRotationMatrix(Float_t angle)
Set the rotation matrix used to rotate the font outlines.
Definition TTF.cxx:342
static void SetTextFont(Font_t fontnumber)
Set specified font.
Definition TTF.cxx:491
static Int_t fgAscent
string ascent, used to compute Y alignment
Definition TTF.h:75
static Int_t fgWidth
string width, used to compute X alignment
Definition TTF.h:92
static Bool_t fgInit
true if the Init has been called
Definition TTF.h:85
static const FT_BBox & GetBox()
Definition TTF.cxx:643
static Int_t fgNumGlyphs
number of glyphs in the string
Definition TTF.h:88
static FT_Matrix * fgRotMatrix
rotation matrix
Definition TTF.h:89
static void SetTextSize(Float_t textsize)
Set current text size.
Definition TTF.cxx:562
virtual void DeleteFont(FontStruct_t fs)
Explicitly deletes the font structure "fs" obtained via LoadQueryFont().
virtual FontStruct_t GetGCFont(GContext_t gc)
Return the font associated with the graphics context gc.
virtual FontStruct_t LoadQueryFont(const char *font_name)
Provides the most common way for accessing a font: opens (loads) the specified font and returns a poi...
virtual FontH_t GetFontHandle(FontStruct_t fs)
Returns the font handle of the specified font structure "fs".
virtual void GetFontProperties(FontStruct_t font, Int_t &max_ascent, Int_t &max_descent)
Returns the font properties.
virtual void DeleteGC(GContext_t gc)
Deletes the specified GC "gc".
virtual void DrawString(Drawable_t id, GContext_t gc, Int_t x, Int_t y, const char *s, Int_t len)
Each character image, as defined by the font in the GC, is treated as an additional mask for a fill o...
virtual void MapGCFont(GContext_t, FontStruct_t)
Map the XftFont with the Graphics Context using it.
virtual Int_t TextWidth(FontStruct_t font, const char *s, Int_t len)
Return length of the string "s" in pixels. Size depends on font.
TText * text
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
const Int_t n
Definition legend1.C:16
Graphics context structure.
Definition GuiTypes.h:224
Mask_t fMask
bit mask specifying which fields are valid
Definition GuiTypes.h:251
ULong_t fForeground
foreground pixel
Definition GuiTypes.h:227
#define org(otri, vertexptr)
Definition triangle.c:1038