35#include <X11/cursorfont.h>
36#include <X11/keysym.h>
39struct RXColor:XColor{};
40struct RVisual:Visual{};
41struct RXImage:XImage{};
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)
92 while ((
d = (TXftFontData*) next())) {
93 if (
d->fXftFont == (XftFont *)font) {
105 while ((
d = (TXftFontData*) next())) {
113 void AddFont(TXftFontData *data)
121 while ((
d = (TXftFontData*) next())) {
122 if (
d->fXftFont == data->fXftFont) {
123 data->AddReference();
130 void FreeFont(TXftFontData *data)
161 SetTitle(
"ROOT interface to X11 with TrueType fonts");
195 if (display) fs = XLoadQueryFont((Display *)display,
"-*-helvetica-*-r-*-*-14-*-*-*-*-*-*-*");
197 if (display && fs) XFreeFont((Display *)display, fs);
200 fXftFontHash =
new TXftFontHash();
257 static RXColor col[5];
267 const Int_t maxdots = 50000;
269 dots =
Int_t(source->width * source->rows);
270 dots = dots > maxdots ? maxdots : dots;
271 bcol =
new RXColor[dots];
275 for (
y = 0;
y < (
int) source->rows;
y++) {
276 for (
x = 0;
x < (
int) source->width;
x++, bc++) {
278 bc->pixel = XGetPixel(xim, bx +
x, by +
y);
279 bc->flags = DoRed | DoGreen | DoBlue;
280 if (++dotcnt >= maxdots)
break;
287 for (
y = 0;
y < (
int) source->rows;
y++) {
288 for (
x = 0;
x < (
int) source->width;
x++, bc++) {
292 if (++dotcnt >= maxdots)
break;
301 if (bc->red ==
r && bc->green ==
g && bc->blue ==
b)
315 if (fore != col[4].pixel || back != col[0].pixel) {
317 col[4].flags = DoRed|DoGreen|DoBlue;
320 col[3].flags = DoRed | DoGreen | DoBlue;
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;
333 Warning(
"DrawImage",
"cannot allocate smoothing color");
334 col[
x].pixel = col[
x+1].pixel;
341 for (
y = 0;
y < (
int) source->rows;
y++) {
342 for (
x = 0;
x < (
int) source->width;
x++) {
344 d = ((
d + 10) * 5) / 256;
346 if (
d &&
x < (
int) source->width) {
348 XPutPixel(xim, bx +
x, by +
y, p);
355 for (
int y = 0;
y < (
int) source->rows;
y++) {
358 for (
int x = 0;
x < (
int) source->width;
x++) {
359 if (
n == 0)
d = *s++;
361 XPutPixel(xim, bx +
x, by +
y, fore);
364 row += source->pitch;
428 if (
y+
h > height)
h = height -
y;
430 return (RXImage*)XGetImage((Display*)
fDisplay, cws,
x,
y, w,
h, AllPlanes, ZPixmap);
445 if ((
int)w == 0 || (
int)
h == 0)
return kFALSE;
449 if (
y + (
int)h <= 0 || y >= (
int)height)
return kFALSE;
455 if (
h > 10*height)
return kFALSE;
483 depth, ZPixmap, 0, 0, w,
h,
484 depth == 24 ? 32 : (depth==15?16:depth), 0);
488 xim->data = (
char *)
malloc(xim->bytes_per_line *
h);
489 memset(xim->data, 0, xim->bytes_per_line *
h);
495 Error(
"DrawText",
"error getting Graphics Context");
498 XGetGCValues((Display*)
fDisplay, *gc, GCForeground | GCBackground, &values);
505 Error(
"DrawText",
"error getting background image");
510 Int_t xo = 0, yo = 0;
511 if (
x1 < 0) xo = -
x1;
512 if (y1 < 0) yo = -y1;
514 for (
int yp = 0; yp < (
int) bim->height; yp++) {
515 for (
int xp = 0; xp < (
int) bim->width; xp++) {
516 ULong_t pixel = XGetPixel(bim, xp, yp);
517 XPutPixel(xim, xo+xp, yo+yp, pixel);
524 XAddPixel(xim, values.background);
525 bg = values.background;
531 if (FT_Glyph_To_Bitmap(&glyph->
fImage,
533 : ft_render_mode_mono,
535 FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyph->
fImage;
536 FT_Bitmap* source = &bitmap->bitmap;
539 bx = bitmap->left+Xoff;
540 by =
h - bitmap->top-Yoff;
541 DrawImage(source, values.foreground, bg, (RXImage*)xim, bx, by);
547 if (gc) XPutImage((Display*)
fDisplay, cws, *gc, xim, 0, 0,
x1, y1, w,
h);
608 TXftFontData *data = fXftFontHash->FindByName(font_name);
617 data =
new TXftFontData(0, xftfont, font_name);
618 fXftFontHash->AddFont(data);
633 TXftFontData *data = fXftFontHash->FindByFont(fs);
636 fXftFontHash->FreeFont(data);
649 TXftFontData *gcdata = fXftFontHash->FindByGC(gc);
650 if (gcdata) fXftFontHash->FreeFont(gcdata);
675 TXftFontData *data = fXftFontHash->FindByGC(gc);
691 TXftFontData *gcdata = fXftFontHash->FindByGC(gc);
692 TXftFontData *fontdata = fXftFontHash->FindByFont(font);
695 gcdata->fXftFont = (XftFont *)font;
698 TXftFontData *data =
new TXftFontData(gc, (XftFont *)font, fontdata->GetName());
699 fXftFontHash->AddFont(data);
712 TXftFontData *data = fXftFontHash->FindByFont(font);
716 XftFont *xftfont = data->fXftFont;
719 XGlyphInfo glyph_info;
720 XftTextExtents8((Display *)
fDisplay, xftfont, (XftChar8 *)s, len, &glyph_info);
721 return glyph_info.xOff;
736 TXftFontData *data = fXftFontHash->FindByFont(font);
743 XftFont *xftfont = data->fXftFont;
750 max_ascent = xftfont->ascent;
751 max_descent = xftfont->descent;
773 if (!
text || (len < 1) || !
text[0]) {
786 TXftFontData *data = fXftFontHash->FindByGC(gc);
794 xftfont = data->fXftFont;
809 &
width, &height, &bwidth, &depth);
816 memset(&xcolor, 0,
sizeof(xcolor));
830 xftcolor.color.red = xcolor.red;
831 xftcolor.color.green = xcolor.green;
832 xftcolor.color.blue = xcolor.blue;
833 xftcolor.color.alpha = 0xffff;
836 XftDrawString8(xftdraw, &xftcolor, xftfont,
x,
y, (XftChar8 *)
text, len);
839 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 Drawable_t
Drawable handle.
Handle_t GContext_t
Graphics context handle.
Handle_t FontStruct_t
Pointer to font structure.
Handle_t Window_t
Window handle.
static const double x1[5]
const ULong_t kBitsPerByte
include TDocParser_001 C image html pict1_TDocParser_001 png width
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 SetTextSize(Float_t textsize)
Set current text size.
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.
void DrawText(Int_t x, Int_t y, Float_t angle, Float_t mgn, const char *text, ETextMode mode)
Draw text using TrueType fonts.
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
Bool_t Init(void *display)
Initialize X11 system. Returns kFALSE in case of failure.
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 SetTextFont(Font_t fontnumber)
Set specified font.
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.
Int_t fScreenNumber
Screen number.
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).
void DeleteGC(GContext_t gc)
Explicitly delete a graphics context.
Bool_t AllocColor(Colormap cmap, RXColor *color)
Allocate color in colormap.
void QueryColors(Colormap cmap, RXColor *colors, Int_t ncolors)
Returns the current RGB value for the pixel in the XColor structure.
FontH_t GetFontHandle(FontStruct_t fs)
Return handle to font described by font structure.
void * GetGC(Int_t which) const
Return desired Graphics Context ("which" maps directly on gGCList[]).
Bool_t fHasXft
True when XftFonts are used.
void GetFontProperties(FontStruct_t font, Int_t &max_ascent, Int_t &max_descent)
Return some font properties.
Int_t TextWidth(FontStruct_t font, const char *s, Int_t len)
Return length of string in pixels. Size depends on font.
void DeleteFont(FontStruct_t fs)
Explicitly delete font structure obtained with LoadQueryFont().
Int_t fTextAlign
Text alignment (set in SetTextAlign)
Window_t GetCurrentWindow() const
Return current window pointer. Protected method used by TGX11TTF.
Int_t fDepth
Number of color planes.
FontStruct_t LoadQueryFont(const char *font_name)
Load font and query font.
void GetGCValues(GContext_t gc, GCValues_t &gval)
Get current values from graphics context gc.
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.
Bool_t Init(void *display)
Initialize X11 system. Returns kFALSE in case of failure.
virtual void SetTextSize(Float_t textsize)
Set current text size.
RVisual * fVisual
Pointer to visual used by all windows.
virtual Int_t SetTextFont(char *fontname, ETextSetMode mode)
Set text font to specified name.
Bool_t fHasTTFonts
True when TrueType fonts are used.
THashTable implements a hash table to store TObject's.
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.
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
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.
Mask_t fMask
bit mask specifying which fields are valid
ULong_t fForeground
foreground pixel
#define org(otri, vertexptr)