You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tqt3/src/kernel/qtaddons_x11.cpp

145 lines
4.1 KiB

/*
* $XFree86: xc/lib/Xft/xftname.c,v 1.10 2001/03/30 18:50:18 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include "qt_x11_p.h"
#if !defined(TQT_NO_XFTFREETYPE) && !defined(QT_XFT2)
#include <X11/Xft/Xft.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
extern bool tqt_use_xrender; // defined in qapplication_x11.cpp
extern "C" {
#define XFT_DRAW_N_SRC 2
struct _XftDraw {
Display *dpy;
Drawable drawable;
Visual *visual;
Colormap colormap;
Region clip;
Bool core_set;
Bool render_set;
Bool render_able;
struct {
Picture pict;
struct {
Picture pict;
XRenderColor color;
} src[XFT_DRAW_N_SRC];
} render;
struct {
GC draw_gc;
unsigned long fg;
Font font;
} core;
};
Picture XftDrawPicture( XftDraw *draw )
{
if ( ! draw ) return 0;
if ( ! draw->render_set ) {
// force the RENDER Picture to be created...
XftColor color;
color.color.red = color.color.green = color.color.blue = color.color.alpha =
color.pixel = 0;
XftDrawRect( draw, &color, -100, -100, 1, 1 );
}
return draw->render.pict;
}
XftDraw *XftDrawCreateAlpha( Display *display,
Pixmap pixmap,
int depth )
{
// taken from Xft 1 sources, see copyright above
XftDraw *draw;
draw = (XftDraw *) malloc (sizeof (XftDraw));
if (!draw)
return 0;
draw->dpy = display;
draw->drawable = pixmap;
draw->visual = 0;
draw->colormap = 0;
draw->core_set = False;
draw->clip = 0;
// TQt addition - go ahead and create the render picture now
draw->render_set = True;
draw->render_able = False;
if ( tqt_use_xrender ) {
draw->render_able = True;
XRenderPictFormat *format = 0;
XRenderPictFormat req;
unsigned long mask = PictFormatType | PictFormatDepth | PictFormatAlphaMask;
req.type = PictTypeDirect;
req.depth = depth;
req.direct.alphaMask = 0xff;
format = XRenderFindFormat(draw->dpy, mask, &req, 0);
if (format) {
draw->render.pict =
XRenderCreatePicture(draw->dpy, draw->drawable, format, 0, 0);
}
// to keep Xft from trying to free zero pixmaps/pictures, we need to create
// 2 more pictures (that are identical to draw->render.pict) :/
draw->render.src[0].pict =
XRenderCreatePicture( draw->dpy, draw->drawable, format, 0, 0 );
draw->render.src[1].pict =
XRenderCreatePicture( draw->dpy, draw->drawable, format, 0, 0 );
}
return draw;
}
void XftDrawSetClipRectangles(XftDraw *draw, int xoff, int yoff, XRectangle *rects, int count)
{
if (!draw) return;
Picture pict = XftDrawPicture(draw);
XRenderSetPictureClipRectangles(draw->dpy, pict, xoff, yoff, rects, count);
}
void XftDrawSetSubwindowMode(XftDraw *draw, int mode)
{
if (!draw) return;
Picture pict = XftDrawPicture(draw);
XRenderPictureAttributes pattr;
pattr.subwindow_mode = mode;
XRenderChangePicture(draw->dpy, pict, CPSubwindowMode, &pattr);
}
} // extern "C"
#endif // !TQT_NO_XFTFREETYPE && !QT_XFT2