static void sSetXRRegion() { if(UpdateRegionXR) { XRenderSetPictureClipRegion(sXDisplay(),XPict,ClipStack[ClipIndex]); UpdateRegionXR = sFALSE; } }
Bool apc_gp_set_region( Handle self, Handle rgn) { DEFXX; Region region; PRegionSysData r; if ( PObject( self)-> options. optInDrawInfo) return false; if ( !XF_IN_PAINT(XX)) return false; if (rgn == nilHandle) { Rect r; r. left = 0; r. bottom = 0; r. right = XX-> size. x - 1; r. top = XX-> size. y - 1; return apc_gp_set_clip_rect( self, r); } r = GET_REGION(rgn); XClipBox( r-> region, &XX-> clip_rect); XX-> clip_rect. y += XX-> size. y - r-> height; XX-> clip_mask_extent. x = XX-> clip_rect. width; XX-> clip_mask_extent. y = XX-> clip_rect. height; if ( XX-> clip_rect. width == 0 || XX-> clip_rect. height == 0) { Rect r; r. left = -1; r. bottom = -1; r. right = -1; r. top = -1; return apc_gp_set_clip_rect( self, r); } region = XCreateRegion(); XUnionRegion( region, r-> region, region); /* offset region if drawable is buffered */ XOffsetRegion( region, XX-> btransform. x, XX-> size.y - r-> height - XX-> btransform. y); /* otherwise ( and only otherwise ), and if there's a X11 clipping, intersect the region with it. X11 clipping must not mix with the buffer clipping */ if (( !XX-> udrawable || XX-> udrawable == XX-> gdrawable) && XX-> paint_region) XIntersectRegion( region, XX-> paint_region, region); XSetRegion( DISP, XX-> gc, region); if ( XX-> flags. kill_current_region) XDestroyRegion( XX-> current_region); XX-> flags. kill_current_region = 1; XX-> current_region = region; XX-> flags. xft_clip = 0; #ifdef USE_XFT if ( XX-> xft_drawable) prima_xft_update_region( self); #endif #ifdef HAVE_X11_EXTENSIONS_XRENDER_H if ( XX-> argb_picture ) XRenderSetPictureClipRegion(DISP, XX->argb_picture, region); #endif return true; }
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; }
Bool apc_gp_set_clip_rect( Handle self, Rect clipRect) { DEFXX; Region region; XRectangle r; if ( !XF_IN_PAINT(XX)) return false; SORT( clipRect. left, clipRect. right); SORT( clipRect. bottom, clipRect. top); r. x = clipRect. left; r. y = REVERT( clipRect. top); r. width = clipRect. right - clipRect. left+1; r. height = clipRect. top - clipRect. bottom+1; XX-> clip_rect = r; XX-> clip_mask_extent. x = r. width; XX-> clip_mask_extent. y = r. height; region = XCreateRegion(); XUnionRectWithRegion( &r, region, region); if ( XX-> paint_region) XIntersectRegion( region, XX-> paint_region, region); if ( XX-> btransform. x != 0 || XX-> btransform. y != 0) { XOffsetRegion( region, XX-> btransform. x, -XX-> btransform. y); } XSetRegion( DISP, XX-> gc, region); if ( XX-> flags. kill_current_region) XDestroyRegion( XX-> current_region); XX-> flags. kill_current_region = 1; XX-> current_region = region; XX-> flags. xft_clip = 0; #ifdef USE_XFT if ( XX-> xft_drawable) prima_xft_update_region( self); #endif #ifdef HAVE_X11_EXTENSIONS_XRENDER_H if ( XX-> argb_picture ) XRenderSetPictureClipRegion(DISP, XX->argb_picture, region); #endif return true; }
Bool XftDrawRenderPrepare (XftDraw *draw, XftColor *color, XftFont *font, int src) { if (!draw->render_set) { XRenderPictFormat *format; XRenderPictFormat *pix_format; XRenderPictureAttributes pa; int n; Pixmap pix; draw->render_set = True; draw->render_able = False; format = _XftDrawFormat (draw); pix_format = _XftDrawFgFormat (draw); if (format && pix_format) { draw->render_able = True; draw->render.pict = XRenderCreatePicture (draw->dpy, draw->drawable, format, 0, 0); for (n = 0; n < XFT_DRAW_N_SRC; n++) { pix = XCreatePixmap (draw->dpy, draw->drawable, 1, 1, pix_format->depth); pa.repeat = True; draw->render.src[n].pict = XRenderCreatePicture (draw->dpy, pix, pix_format, CPRepeat, &pa); XFreePixmap (draw->dpy, pix); draw->render.src[n].color = color->color; XRenderFillRectangle (draw->dpy, PictOpSrc, draw->render.src[n].pict, &color->color, 0, 0, 1, 1); } if (draw->clip) XRenderSetPictureClipRegion (draw->dpy, draw->render.pict, draw->clip); } } if (!draw->render_able) return False; if (memcmp (&color->color, &draw->render.src[src].color, sizeof (XRenderColor))) { if (_XftFontDebug () & XFT_DBG_DRAW) { printf ("Switching to color %04x,%04x,%04x,%04x\n", color->color.alpha, color->color.red, color->color.green, color->color.blue); } XRenderFillRectangle (draw->dpy, PictOpSrc, draw->render.src[src].pict, &color->color, 0, 0, 1, 1); draw->render.src[src].color = color->color; } return True; }