summaryrefslogtreecommitdiff
path: root/xc/lib/Xft/xftdraw.c
diff options
context:
space:
mode:
authordawes <dawes>2000-12-21 19:50:54 +0000
committerdawes <dawes>2000-12-21 19:50:54 +0000
commitd1f23866b00997b86835d361a8535afdb67781ed (patch)
tree1f13e7020be9bf68647272eeff6177faebebbc38 /xc/lib/Xft/xftdraw.c
parentaf99ec742a547b33b528b5915053c590399d8a37 (diff)
XFree86 4.0.2 merge
Diffstat (limited to 'xc/lib/Xft/xftdraw.c')
-rw-r--r--xc/lib/Xft/xftdraw.c197
1 files changed, 179 insertions, 18 deletions
diff --git a/xc/lib/Xft/xftdraw.c b/xc/lib/Xft/xftdraw.c
index daeb09488..7ec5290f1 100644
--- a/xc/lib/Xft/xftdraw.c
+++ b/xc/lib/Xft/xftdraw.c
@@ -1,5 +1,5 @@
/*
- * $XFree86: xc/lib/Xft/xftdraw.c,v 1.4 2000/12/01 21:32:01 keithp Exp $
+ * $XFree86: xc/lib/Xft/xftdraw.c,v 1.10 2000/12/15 17:12:52 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
@@ -24,6 +24,7 @@
#include <stdlib.h>
#include "xftint.h"
+#include <X11/Xutil.h>
XftDraw *
XftDrawCreate (Display *dpy,
@@ -43,9 +44,92 @@ XftDrawCreate (Display *dpy,
draw->core_set = False;
draw->render_set = False;
draw->render_able = False;
+ draw->clip = 0;
return draw;
}
+XftDraw *
+XftDrawCreateBitmap (Display *dpy,
+ Pixmap bitmap)
+{
+ XftDraw *draw;
+
+ draw = (XftDraw *) malloc (sizeof (XftDraw));
+ if (!draw)
+ return 0;
+ draw->dpy = dpy;
+ draw->drawable = (Drawable) bitmap;
+ draw->visual = 0;
+ draw->colormap = 0;
+ draw->core_set = False;
+ draw->render_set = False;
+ draw->render_able = False;
+ draw->clip = 0;
+ return draw;
+}
+
+static XRenderPictFormat *
+_XftDrawFormat (XftDraw *draw)
+{
+ if (draw->visual == 0)
+ {
+ XRenderPictFormat pf;
+
+ pf.type = PictTypeDirect;
+ pf.depth = 1;
+ pf.direct.alpha = 0;
+ pf.direct.alphaMask = 1;
+ return XRenderFindFormat (draw->dpy,
+ (PictFormatType|
+ PictFormatDepth|
+ PictFormatAlpha|
+ PictFormatAlphaMask),
+ &pf,
+ 0);
+ }
+ else
+ return XRenderFindVisualFormat (draw->dpy, draw->visual);
+}
+
+static XRenderPictFormat *
+_XftDrawFgFormat (XftDraw *draw)
+{
+ XRenderPictFormat pf;
+
+ if (draw->visual == 0)
+ {
+ pf.type = PictTypeDirect;
+ pf.depth = 1;
+ pf.direct.alpha = 0;
+ pf.direct.alphaMask = 1;
+ return XRenderFindFormat (draw->dpy,
+ (PictFormatType|
+ PictFormatDepth|
+ PictFormatAlpha|
+ PictFormatAlphaMask),
+ &pf,
+ 0);
+ }
+ else
+ {
+ pf.type = PictTypeDirect;
+ pf.depth = 32;
+ pf.direct.redMask = 0xff;
+ pf.direct.greenMask = 0xff;
+ pf.direct.blueMask = 0xff;
+ pf.direct.alphaMask = 0xff;
+ return XRenderFindFormat (draw->dpy,
+ (PictFormatType|
+ PictFormatDepth|
+ PictFormatRedMask|
+ PictFormatGreenMask|
+ PictFormatBlueMask|
+ PictFormatAlphaMask),
+ &pf,
+ 0);
+ }
+}
+
void
XftDrawChange (XftDraw *draw,
Drawable drawable)
@@ -73,6 +157,8 @@ XftDrawDestroy (XftDraw *draw)
}
if (draw->core_set)
XFreeGC (draw->dpy, draw->core.draw_gc);
+ if (draw->clip)
+ XDestroyRegion (draw->clip);
free (draw);
}
@@ -84,18 +170,13 @@ XftDrawRenderPrepare (XftDraw *draw,
if (!draw->render_set)
{
XRenderPictFormat *format;
- XRenderPictFormat pf, *pix_format;
+ XRenderPictFormat *pix_format;
XRenderPictureAttributes pa;
draw->render_set = True;
draw->render_able = False;
- format = XRenderFindVisualFormat (draw->dpy, draw->visual);
- pf.depth = 32;
- pf.type = PictTypeDirect;
- pix_format = XRenderFindFormat (draw->dpy,
- PictFormatType|PictFormatDepth,
- &pf,
- 0);
+ format = _XftDrawFormat (draw);
+ pix_format = _XftDrawFgFormat (draw);
if (format && pix_format)
{
draw->render_able = True;
@@ -110,6 +191,9 @@ XftDrawRenderPrepare (XftDraw *draw,
pix_format,
CPRepeat, &pa);
draw->render.fg_color.red = ~color->color.red;
+ if (draw->clip)
+ XRenderSetPictureClipRegion (draw->dpy, draw->render.pict,
+ draw->clip);
}
}
if (!draw->render_able)
@@ -128,22 +212,37 @@ XftDrawCorePrepare (XftDraw *draw,
XftColor *color,
XftFont *font)
{
- XGCValues gcv;
if (!draw->core_set)
{
+ XGCValues gcv;
+ unsigned long mask;
draw->core_set = True;
draw->core.fg = color->pixel;
gcv.foreground = draw->core.fg;
+ mask = GCForeground;
+ if (font)
+ {
+ draw->core.font = font->u.core.font->fid;
+ gcv.font = draw->core.font;
+ mask |= GCFont;
+ }
draw->core.draw_gc = XCreateGC (draw->dpy, draw->drawable,
- GCForeground, &gcv);
-
+ mask, &gcv);
+ if (draw->clip)
+ XSetRegion (draw->dpy, draw->core.draw_gc, draw->clip);
}
if (draw->core.fg != color->pixel)
- XSetForeground (draw->dpy, draw->core.draw_gc, color->pixel);
- if (font && gcv.font != font->u.core.font->fid)
- XSetFont (draw->dpy, draw->core.draw_gc, font->u.core.font->fid);
+ {
+ draw->core.fg = color->pixel;
+ XSetForeground (draw->dpy, draw->core.draw_gc, draw->core.fg);
+ }
+ if (font && draw->core.font != font->u.core.font->fid)
+ {
+ draw->core.font = font->u.core.font->fid;
+ XSetFont (draw->dpy, draw->core.draw_gc, draw->core.font);
+ }
return True;
}
@@ -153,7 +252,7 @@ XftDrawString8 (XftDraw *draw,
XftFont *font,
int x,
int y,
- unsigned char *string,
+ XftChar8 *string,
int len)
{
if (font->core)
@@ -162,11 +261,13 @@ XftDrawString8 (XftDraw *draw,
XDrawString (draw->dpy, draw->drawable, draw->core.draw_gc, x, y,
(char *) string, len);
}
+#ifdef FREETYPE2
else if (XftDrawRenderPrepare (draw, color, font))
{
XftRenderString8 (draw->dpy, draw->render.fg_pict, font->u.ft.font,
draw->render.pict, 0, 0, x, y, string, len);
}
+#endif
}
#define N16LOCAL 256
@@ -177,7 +278,7 @@ XftDrawString16 (XftDraw *draw,
XftFont *font,
int x,
int y,
- unsigned short *string,
+ XftChar16 *string,
int len)
{
if (font->core)
@@ -192,11 +293,13 @@ XftDrawString16 (XftDraw *draw,
if (xc != xcloc)
free (xc);
}
+#ifdef FREETYPE2
else if (XftDrawRenderPrepare (draw, color, font))
{
XftRenderString16 (draw->dpy, draw->render.fg_pict, font->u.ft.font,
draw->render.pict, 0, 0, x, y, string, len);
}
+#endif
}
void
@@ -205,7 +308,7 @@ XftDrawString32 (XftDraw *draw,
XftFont *font,
int x,
int y,
- unsigned int *string,
+ XftChar32 *string,
int len)
{
if (font->core)
@@ -220,11 +323,13 @@ XftDrawString32 (XftDraw *draw,
if (xc != xcloc)
free (xc);
}
+#ifdef FREETYPE2
else if (XftDrawRenderPrepare (draw, color, font))
{
XftRenderString32 (draw->dpy, draw->render.fg_pict, font->u.ft.font,
draw->render.pict, 0, 0, x, y, string, len);
}
+#endif
}
void
@@ -247,3 +352,59 @@ XftDrawRect (XftDraw *draw,
x, y, width, height);
}
}
+
+Bool
+XftDrawSetClip (XftDraw *draw,
+ Region r)
+{
+ Region n = 0;
+
+ if (!r && !draw->clip)
+ return True;
+
+ if (r)
+ {
+ n = XCreateRegion ();
+ if (n)
+ {
+ if (!XUnionRegion (n, r, n))
+ {
+ XDestroyRegion (n);
+ return False;
+ }
+ }
+ }
+ if (draw->clip)
+ {
+ XDestroyRegion (draw->clip);
+ }
+ draw->clip = n;
+ if (draw->render_able)
+ {
+ XRenderPictureAttributes pa;
+ if (n)
+ {
+ XRenderSetPictureClipRegion (draw->dpy, draw->render.pict, n);
+ }
+ else
+ {
+ pa.clip_mask = None;
+ XRenderChangePicture (draw->dpy, draw->render.pict,
+ CPClipMask, &pa);
+ }
+ }
+ if (draw->core_set)
+ {
+ XGCValues gv;
+
+ if (n)
+ XSetRegion (draw->dpy, draw->core.draw_gc, n);
+ else
+ {
+ gv.clip_mask = None;
+ XChangeGC (draw->dpy, draw->core.draw_gc,
+ GCClipMask, &gv);
+ }
+ }
+ return True;
+}