diff options
author | dawes <dawes> | 2000-12-21 19:50:54 +0000 |
---|---|---|
committer | dawes <dawes> | 2000-12-21 19:50:54 +0000 |
commit | d1f23866b00997b86835d361a8535afdb67781ed (patch) | |
tree | 1f13e7020be9bf68647272eeff6177faebebbc38 /xc/lib/Xft/xftdraw.c | |
parent | af99ec742a547b33b528b5915053c590399d8a37 (diff) |
XFree86 4.0.2 merge
Diffstat (limited to 'xc/lib/Xft/xftdraw.c')
-rw-r--r-- | xc/lib/Xft/xftdraw.c | 197 |
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; +} |