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)
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();
267 const Int_t maxdots = 50000;
269 dots =
Int_t(source->width * source->rows);
270 dots = dots > maxdots ? maxdots : 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;
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 <= 8 ? 8 : (depth <= 16 ? 16 : 32), 0);
489 xim->data = (
char *)
malloc(xim->bytes_per_line *
h);
490 memset(xim->data, 0, xim->bytes_per_line *
h);
496 Error(
"DrawText",
"error getting Graphics Context");
499 XGetGCValues((Display*)
fDisplay, *gc, GCForeground | GCBackground, &values);
506 Error(
"DrawText",
"error getting background image");
511 Int_t xo = 0, yo = 0;
512 if (
x1 < 0) xo = -
x1;
513 if (y1 < 0) yo = -y1;
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);
525 XAddPixel(xim, values.background);
526 bg = values.background;
532 if (FT_Glyph_To_Bitmap(&glyph->
fImage,
534 : ft_render_mode_mono,
536 FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyph->
fImage;
537 FT_Bitmap* source = &bitmap->bitmap;
540 bx = bitmap->left+Xoff;
541 by =
h - bitmap->top-Yoff;
548 if (gc) XPutImage((Display*)
fDisplay, cws, *gc, xim, 0, 0,
x1, y1, w,
h);
609 TXftFontData *data = fXftFontHash->FindByName(font_name);
618 data =
new TXftFontData(0, xftfont, font_name);
619 fXftFontHash->AddFont(data);
634 TXftFontData *data = fXftFontHash->FindByFont(fs);
637 fXftFontHash->FreeFont(data);
650 TXftFontData *gcdata = fXftFontHash->FindByGC(gc);
651 if (gcdata) fXftFontHash->FreeFont(gcdata);
676 TXftFontData *data = fXftFontHash->FindByGC(gc);
692 TXftFontData *gcdata = fXftFontHash->FindByGC(gc);
693 TXftFontData *fontdata = fXftFontHash->FindByFont(font);
696 gcdata->fXftFont = (XftFont *)font;
699 TXftFontData *data =
new TXftFontData(gc, (XftFont *)font, fontdata->GetName());
700 fXftFontHash->AddFont(data);
713 TXftFontData *data = fXftFontHash->FindByFont(font);
717 XftFont *xftfont = data->fXftFont;
720 XGlyphInfo glyph_info;
721 XftTextExtents8((Display *)
fDisplay, xftfont, (XftChar8 *)s, len, &glyph_info);
722 return glyph_info.xOff;
737 TXftFontData *data = fXftFontHash->FindByFont(font);
744 XftFont *xftfont = data->fXftFont;
751 max_ascent = xftfont->ascent;
752 max_descent = xftfont->descent;
774 if (!
text || (len < 1) || !
text[0]) {
787 TXftFontData *data = fXftFontHash->FindByGC(gc);
795 xftfont = data->fXftFont;
810 &
width, &height, &bwidth, &depth);
817 memset(&xcolor, 0,
sizeof(xcolor));
831 xftcolor.color.red = xcolor.red;
832 xftcolor.color.green = xcolor.green;
833 xftcolor.color.blue = xcolor.blue;
834 xftcolor.color.alpha = 0xffff;
837 XftDrawString8(xftdraw, &xftcolor, xftfont,
x,
y, (XftChar8 *)
text, len);
840 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
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.
Mask_t fMask
bit mask specifying which fields are valid
ULong_t fForeground
foreground pixel
#define org(otri, vertexptr)