summaryrefslogtreecommitdiffstats
path: root/src/kernel/qtaddons_x11.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/qtaddons_x11.cpp')
-rw-r--r--src/kernel/qtaddons_x11.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/kernel/qtaddons_x11.cpp b/src/kernel/qtaddons_x11.cpp
new file mode 100644
index 000000000..40d7e595d
--- /dev/null
+++ b/src/kernel/qtaddons_x11.cpp
@@ -0,0 +1,144 @@
+/*
+ * $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
+ * CONSETQUENTIAL 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(QT_NO_XFTFREETYPE) && !defined(QT_XFT2)
+
+#include <X11/Xft/Xft.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+extern bool qt_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 ( qt_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 // !QT_NO_XFTFREETYPE && !QT_XFT2