35#include <X11/cursorfont.h>
36#include <X11/keysym.h>
47#include <X11/Xft/Xft.h>
64 fGC =
gc; fXftFont = (XftFont *)font;
70 if (fXftFont) XftFontClose((Display*)
gVirtualX->GetDisplay(), fXftFont);
82 TXftFontData *FindByName(
const char *
name)
91 while (
auto d = (TXftFontData*) next()) {
92 if (
d->fXftFont == (XftFont *)font)
102 while (
auto d = (TXftFontData*) next()) {
109 void AddFont(TXftFontData *
data)
116 while (
auto d = (TXftFontData*) next()) {
117 if (
d->fXftFont ==
data->fXftFont)
118 data->AddReference();
124 void FreeFont(TXftFontData *
data)
155 SetTitle(
"ROOT interface to X11 with TrueType fonts");
165 fXftFontHash =
nullptr;
187 fXftFontHash =
nullptr;
188 XFontStruct *
fs =
nullptr;
189 if (display)
fs = XLoadQueryFont((Display *)display,
"-*-helvetica-*-r-*-*-14-*-*-*-*-*-*-*");
191 if (display &&
fs) XFreeFont((Display *)display,
fs);
194 fXftFontHash =
new TXftFontHash();
261 const Int_t maxdots = 50000;
263 dots =
Int_t(source->width * source->rows);
264 dots = dots > maxdots ? maxdots : dots;
269 for (
y = 0;
y < (
int) source->rows;
y++) {
270 for (
x = 0;
x < (
int) source->width;
x++, bc++) {
272 bc->pixel = XGetPixel(xim, bx +
x, by +
y);
273 bc->flags = DoRed | DoGreen | DoBlue;
274 if (++dotcnt >= maxdots)
break;
281 for (
y = 0;
y < (
int) source->rows;
y++) {
282 for (
x = 0;
x < (
int) source->width;
x++, bc++) {
286 if (++dotcnt >= maxdots)
break;
295 if (bc->red ==
r && bc->green ==
g && bc->blue ==
b)
309 if (fore != col[4].
pixel || back != col[0].
pixel) {
311 col[4].flags = DoRed|DoGreen|DoBlue;
314 col[3].flags = DoRed | DoGreen | DoBlue;
322 for (
x = 3;
x > 0;
x--) {
323 col[
x].red = (col[4].red *
x + col[0].red *(4-
x)) /4;
324 col[
x].green = (col[4].green*
x + col[0].green*(4-
x)) /4;
325 col[
x].blue = (col[4].blue *
x + col[0].blue *(4-
x)) /4;
327 Warning(
"DrawImage",
"cannot allocate smoothing color");
328 col[
x].pixel = col[
x+1].pixel;
335 for (
y = 0;
y < (
int) source->rows;
y++) {
336 for (
x = 0;
x < (
int) source->width;
x++) {
338 d = ((
d + 10) * 5) / 256;
340 if (
d &&
x < (
int) source->width) {
342 XPutPixel(xim, bx +
x, by +
y,
p);
349 for (
int y = 0;
y < (
int) source->rows;
y++) {
352 for (
int x = 0;
x < (
int) source->width;
x++) {
353 if (
n == 0)
d = *s++;
355 XPutPixel(xim, bx +
x, by +
y, fore);
358 row += source->pitch;
439 if ((
int)
w == 0 || (
int)
h == 0)
return kFALSE;
475 depth, ZPixmap, 0,
nullptr,
w,
h,
476 depth <= 8 ? 8 : (depth <= 16 ? 16 : 32), 0);
481 xim->data = (
char *)
malloc(xim->bytes_per_line *
h);
482 memset(xim->data, 0, xim->bytes_per_line *
h);
488 Error(
"DrawText",
"error getting Graphics Context");
491 XGetGCValues((Display*)
fDisplay, *
gc, GCForeground | GCBackground, &values);
498 Error(
"DrawText",
"error getting background image");
503 Int_t xo = 0, yo = 0;
504 if (
x1 < 0) xo = -
x1;
505 if (
y1 < 0) yo = -
y1;
507 for (
int yp = 0; yp < (
int) bim->height; yp++) {
508 for (
int xp = 0; xp < (
int) bim->width; xp++) {
510 XPutPixel(xim, xo+xp, yo+yp,
pixel);
517 XAddPixel(xim, values.background);
518 bg = values.background;
524 if (FT_Glyph_To_Bitmap(&glyph->
fImage,
526 : ft_render_mode_mono,
527 nullptr, 1 ))
continue;
529 FT_Bitmap* source = &
bitmap->bitmap;
601 TXftFontData *
data = fXftFontHash->FindByName(font_name);
610 data =
new TXftFontData(0, xftfont, font_name);
611 fXftFontHash->AddFont(
data);
626 TXftFontData *
data = fXftFontHash->FindByFont(
fs);
629 fXftFontHash->FreeFont(
data);
642 TXftFontData *gcdata = fXftFontHash->FindByGC(
gc);
643 if (gcdata) fXftFontHash->FreeFont(gcdata);
668 TXftFontData *
data = fXftFontHash->FindByGC(
gc);
684 TXftFontData *gcdata = fXftFontHash->FindByGC(
gc);
685 TXftFontData *fontdata = fXftFontHash->FindByFont(font);
688 gcdata->fXftFont = (XftFont *)font;
691 TXftFontData *
data =
new TXftFontData(
gc, (XftFont *)font, fontdata->GetName());
692 fXftFontHash->AddFont(
data);
705 TXftFontData *
data = fXftFontHash->FindByFont(font);
709 XftFont *xftfont =
data->fXftFont;
712 XGlyphInfo glyph_info;
713 XftTextExtents8((Display *)
fDisplay, xftfont, (XftChar8 *)s,
len, &glyph_info);
714 return glyph_info.xOff;
729 TXftFontData *
data = fXftFontHash->FindByFont(font);
736 XftFont *xftfont =
data->fXftFont;
743 max_ascent = xftfont->ascent;
744 max_descent = xftfont->descent;
779 TXftFontData *
data = fXftFontHash->FindByGC(
gc);
787 xftfont =
data->fXftFont;
809 memset(&xcolor, 0,
sizeof(xcolor));
810 xcolor.pixel =
gval.fForeground;
823 xftcolor.color.red = xcolor.red;
824 xftcolor.color.green = xcolor.green;
825 xftcolor.color.blue = xcolor.blue;
826 xftcolor.color.alpha = 0xffff;
827 xftcolor.pixel =
gval.fForeground;
829 XftDrawString8(xftdraw, &xftcolor, xftfont,
x,
y, (XftChar8 *)
text,
len);
832 XftDrawDestroy(xftdraw);
const Mask_t kGCBackground
const Mask_t kGCForeground
Handle_t FontH_t
Font handle (as opposed to Font_t which is an index)
Handle_t Window_t
Window handle.
Handle_t GContext_t
Graphics context handle.
Handle_t Drawable_t
Drawable handle.
Handle_t FontStruct_t
Pointer to font structure.
constexpr ULong_t kBitsPerByte
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GetGCValues
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void pixel
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t fontnumber
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char bitmap
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t textsize
Option_t Option_t TPoint TPoint angle
Option_t Option_t TPoint xy
Option_t Option_t TPoint TPoint const char mode
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t org
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char fontname
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize fs
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t gval
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t height
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void gc
Option_t Option_t TPoint TPoint const char text
Option_t Option_t TPoint TPoint const char y1
static TTFX11Init gTTFX11Init
Font_t fTextFont
Text font.
Float_t fTextSize
Text size.
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
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.
Interface to low level X11 (Xlib).
void RenderString(Int_t x, Int_t y, ETextMode mode)
Perform the string rendering in the pad.
static void Activate()
Static method setting TGX11TTF as the acting gVirtualX.
void Align(void)
Compute alignment variables.
RXImage * GetBackground(Int_t x, Int_t y, UInt_t w, UInt_t h)
Get the background of the current window in an XImage.
Bool_t Init(void *display) override
Initialize X11 system. Returns kFALSE in case of failure.
void SetTextSize(Float_t textsize) override
Set current text size.
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.
FT_Vector fAlign
alignment vector
void SetTextFont(Font_t fontnumber) override
Set specified font.
TGX11TTF(const TGX11 &org)
Create copy of TGX11 but now use TrueType fonts.
Bool_t IsVisible(Int_t x, Int_t y, UInt_t w, UInt_t h)
Test if there is really something to render.
void DrawText(Int_t x, Int_t y, Float_t angle, Float_t mgn, const char *text, ETextMode mode) override
Draw text using TrueType fonts.
This class is the basic interface to the X11 (Xlib) graphics system.
void * fDisplay
Pointer to display.
Colormap fColormap
Default colormap, 0 if b/w.
FontStruct_t LoadQueryFont(const char *font_name) override
Load font and query font.
Int_t fScreenNumber
Screen number.
Bool_t AllocColor(Colormap cmap, RXColor *color)
Allocate color in colormap.
void DrawText(Int_t x, Int_t y, Float_t angle, Float_t mgn, const char *text, ETextMode mode) override
Draw a text string using current font.
void QueryColors(Colormap cmap, RXColor *colors, Int_t ncolors)
Returns the current RGB value for the pixel in the XColor structure.
void * GetGC(Int_t which) const
Return desired Graphics Context ("which" maps directly on gGCList[]).
Bool_t fHasXft
True when XftFonts are used.
Int_t SetTextFont(char *fontname, ETextSetMode mode) override
Set text font to specified name.
Int_t fTextAlign
Text alignment (set in SetTextAlign)
Int_t fDepth
Number of color planes.
Bool_t Init(void *display) override
Initialize X11 system. Returns kFALSE in case of failure.
void DeleteGC(GContext_t gc) override
Explicitly delete a graphics context.
void SetTextSize(Float_t textsize) override
Set current text size.
void DeleteFont(FontStruct_t fs) override
Explicitly delete font structure obtained with LoadQueryFont().
Int_t TextWidth(FontStruct_t font, const char *s, Int_t len) override
Return length of string in pixels. Size depends on font.
FontH_t GetFontHandle(FontStruct_t fs) override
Return handle to font described by font structure.
void DrawString(Drawable_t id, GContext_t gc, Int_t x, Int_t y, const char *s, Int_t len) override
Draw a string using a specific graphics context in position (x,y).
RVisual * fVisual
Pointer to visual used by all windows.
Window_t GetCurrentWindow() const override
Return current window pointer. Protected method used by TGX11TTF.
void GetFontProperties(FontStruct_t font, Int_t &max_ascent, Int_t &max_descent) override
Return some font properties.
Bool_t fHasTTFonts
True when TrueType fonts are used.
THashTable implements a hash table to store TObject's.
void Add(TObject *obj) override
Add object to the hash table.
TObject * Remove(TObject *obj) override
Remove object from the hashtable.
TObject * FindObject(const char *name) const override
Find object using its name.
The TNamed class is the base class for all named ROOT classes.
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
virtual void SetName(const char *name)
Set the name of the TNamed.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definitions for TRefCnt, base class for reference counted objects.
void SetRefCount(UInt_t r)
UInt_t References() const
Small utility class that takes care of switching the current gVirtualX to the new TGX11TTF class as s...
TTF helper class containing glyphs description.
FT_Glyph fImage
glyph image
static void PrepareString(const char *string)
Put the characters in "string" in the "glyphs" array.
static TTF::TTGlyph fgGlyphs[kMaxGlyphs]
glyphs
static Bool_t fgSmoothing
use anti-aliasing (true when >8 planes, false otherwise)
static void Init()
Initialise the TrueType fonts interface.
static void LayoutGlyphs()
Compute the glyphs positions, fgAscent and fgWidth (needed for alignment).
static void SetSmoothing(Bool_t state)
Set smoothing (anti-aliasing) flag.
static void SetRotationMatrix(Float_t angle)
Set the rotation matrix used to rotate the font outlines.
static void SetTextFont(Font_t fontnumber)
Set specified font.
static Int_t fgAscent
string ascent, used to compute Y alignment
static Int_t fgWidth
string width, used to compute X alignment
static Bool_t fgInit
true if the Init has been called
static const FT_BBox & GetBox()
static Int_t fgNumGlyphs
number of glyphs in the string
static FT_Matrix * fgRotMatrix
rotation matrix
static void SetTextSize(Float_t textsize)
Set current text size.
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.
Graphics context structure.