diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-07-14 12:35:19 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-07-14 12:35:19 +0100 |
commit | 5d9da3decff06015d03413713714552095dfa616 (patch) | |
tree | 919ea5600eaaeee40d653022c6726f63f74674ec | |
parent | cd4b2d843b2a8c06ba78c15ff65763b5bdf54dc6 (diff) |
Excise DRM-Xr
I've since incorporated (nearly) all the features from cairo-drm into
xf86-video-intel, making this experiment defunct.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | boilerplate/Makefile.win32.features | 12 | ||||
-rw-r--r-- | build/configure.ac.features | 1 | ||||
-rw-r--r-- | configure.ac | 13 | ||||
-rw-r--r-- | src/Makefile.sources | 5 | ||||
-rw-r--r-- | src/Makefile.win32.features | 16 | ||||
-rw-r--r-- | src/cairo-drm-xr.h | 66 | ||||
-rw-r--r-- | src/drm/cairo-drm-xr.c | 2378 |
7 files changed, 0 insertions, 2491 deletions
diff --git a/boilerplate/Makefile.win32.features b/boilerplate/Makefile.win32.features index d0b184d2..14263a83 100644 --- a/boilerplate/Makefile.win32.features +++ b/boilerplate/Makefile.win32.features @@ -199,18 +199,6 @@ enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_drm_cxx_sources) enabled_cairo_boilerplate_sources += $(cairo_boilerplate_drm_sources) endif -unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_drm_xr_headers) -all_cairo_boilerplate_headers += $(cairo_boilerplate_drm_xr_headers) -all_cairo_boilerplate_private += $(cairo_boilerplate_drm_xr_private) -all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_drm_xr_cxx_sources) -all_cairo_boilerplate_sources += $(cairo_boilerplate_drm_xr_sources) -ifeq ($(CAIRO_HAS_DRM_XR_FUNCTIONS),1) -enabled_cairo_boilerplate_headers += $(cairo_boilerplate_drm_xr_headers) -enabled_cairo_boilerplate_private += $(cairo_boilerplate_drm_xr_private) -enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_drm_xr_cxx_sources) -enabled_cairo_boilerplate_sources += $(cairo_boilerplate_drm_xr_sources) -endif - unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_gallium_headers) all_cairo_boilerplate_headers += $(cairo_boilerplate_gallium_headers) all_cairo_boilerplate_private += $(cairo_boilerplate_gallium_private) diff --git a/build/configure.ac.features b/build/configure.ac.features index b4185a0c..352003b8 100644 --- a/build/configure.ac.features +++ b/build/configure.ac.features @@ -402,7 +402,6 @@ AC_DEFUN([CAIRO_REPORT], echo " X11-xcb functions: $use_xlib_xcb" echo " XCB-drm functions: $use_xcb_drm" echo " XCB-shm functions: $use_xcb_shm" - echo " DRM-Xr functions: $use_drm_xr" echo "" echo "The following features and utilities:" echo " cairo-trace: $use_trace" diff --git a/configure.ac b/configure.ac index 66877917..60960078 100644 --- a/configure.ac +++ b/configure.ac @@ -242,19 +242,6 @@ CAIRO_ENABLE_SURFACE_BACKEND(drm, DRM, no, [ use_drm="no (requires $drm_REQUIRES, udev is available from git://git.kernel.org/pub/scm/linux/hotplug/udev.git)"]) ]) -CAIRO_ENABLE_FUNCTIONS(drm_xr, DRM Xr (DDX), no, [ - if test "x$use_drm" = "xyes"; then - drm_xr_REQUIRES="xorg-server >= 1.6 xproto xextproto >= 7.0.99.1 renderproto x11" - PKG_CHECK_MODULES(drm_xr, $drm_xr_REQUIRES, , - [AC_MSG_RESULT(no) - use_drm_xr="no (requires $drm_xr)"]) - drm_xr_CFLAGS=`echo "$drm_xr_CFLAGS" | $SED -e 's/-fvisibility=hidden//g'` - else - use_drm_xr="no (requires --enable-drm)" - fi -]) -AM_CONDITIONAL(BUILD_DRM_XR, test "x$use_drm_xr" = "xyes") - CAIRO_ENABLE_SURFACE_BACKEND(gallium, Gallium3D, no, [ if test "x$use_drm" = "xyes"; then AC_ARG_WITH([gallium], diff --git a/src/Makefile.sources b/src/Makefile.sources index c7a0540c..966e03d9 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -364,11 +364,6 @@ cairo_drm_sources = drm/cairo-drm.c \ drm/cairo-drm-radeon-surface.c cairo_gallium_sources = drm/cairo-drm-gallium-surface.c -cairo_drm_xr_headers = cairo-drm-xr.h -cairo_drm_xr_sources = \ - drm/cairo-drm-xr.c \ - $(NULL) - cairo_script_headers = cairo-script.h cairo_script_sources = cairo-script-surface.c diff --git a/src/Makefile.win32.features b/src/Makefile.win32.features index d7cc77ed..d36bacfd 100644 --- a/src/Makefile.win32.features +++ b/src/Makefile.win32.features @@ -261,22 +261,6 @@ ifeq ($(CAIRO_HAS_DRM_SURFACE),1) enabled_cairo_pkgconf += cairo-drm.pc endif -unsupported_cairo_headers += $(cairo_drm_xr_headers) -all_cairo_headers += $(cairo_drm_xr_headers) -all_cairo_private += $(cairo_drm_xr_private) -all_cairo_cxx_sources += $(cairo_drm_xr_cxx_sources) -all_cairo_sources += $(cairo_drm_xr_sources) -ifeq ($(CAIRO_HAS_DRM_XR_FUNCTIONS),1) -enabled_cairo_headers += $(cairo_drm_xr_headers) -enabled_cairo_private += $(cairo_drm_xr_private) -enabled_cairo_cxx_sources += $(cairo_drm_xr_cxx_sources) -enabled_cairo_sources += $(cairo_drm_xr_sources) -endif -all_cairo_pkgconf += cairo-drm-xr.pc -ifeq ($(CAIRO_HAS_DRM_XR_FUNCTIONS),1) -enabled_cairo_pkgconf += cairo-drm-xr.pc -endif - unsupported_cairo_headers += $(cairo_gallium_headers) all_cairo_headers += $(cairo_gallium_headers) all_cairo_private += $(cairo_gallium_private) diff --git a/src/cairo-drm-xr.h b/src/cairo-drm-xr.h deleted file mode 100644 index d135924d..00000000 --- a/src/cairo-drm-xr.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Cairo - a vector graphics library with display and print output - * - * Copyright © 2010 Intel Coropration - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Chris Wilson. - */ - -#ifndef CAIRO_DRM_XR_H -#define CAIRO_DRM_XR_H - -#include "cairo.h" - -#if CAIRO_HAS_DRM_XR_FUNCTIONS - -CAIRO_BEGIN_DECLS - -typedef struct _xr_screen xr_screen_t; - -cairo_public xr_screen_t * -cairo_drm_xr_enable (ScreenPtr screen, int fd); - -cairo_public void -cairo_drm_xr_pixmap_link_bo (xr_screen_t *xr, - PixmapPtr pixmap, - uint32_t name, - cairo_format_t format, - int width, - int height, - int stride); - -cairo_public void -cairo_drm_xr_pixmap_unlink_bo (xr_screen_t *xr, - PixmapPtr pixmap); - -CAIRO_END_DECLS - -#else /* CAIRO_HAS_DRM_XR_FUNCTIOSN */ -# error Cairo was not compiled with support for the DRM Xr DDX functions -#endif /* CAIRO_HAS_DRM_XR_FUNCTIOSN */ - -#endif /* CAIRO_DRM_XR_H */ diff --git a/src/drm/cairo-drm-xr.c b/src/drm/cairo-drm-xr.c deleted file mode 100644 index 49d17280..00000000 --- a/src/drm/cairo-drm-xr.c +++ /dev/null @@ -1,2378 +0,0 @@ -/* cairo - a vector graphics library with display and print output - * - * Copyright © 2010 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - * The Original Code is the cairo graphics library. - * - * The Initial Developer of the Original Code is Intel Corporation - * - * Contributor(s): - * Chris Wilson <chris@chris-wilson.co.uk> - */ - -/* - * Implement an X Acceleration Architecture using the cairo-drm - * backends. - */ - -#include "cairoint.h" -#include "cairo-drm-private.h" - -#ifdef HAVE_DIX_CONFIG_H -#include <dix-config.h> -#else -#include <xorg-server.h> -#endif - -#include "xf86.h" -#include "gcstruct.h" -#include "scrnintstr.h" -#include "pixmapstr.h" -#include "windowstr.h" -#include "picturestr.h" -#include "mi.h" -#include "fb.h" -#ifdef MITSHM -#include <X11/extensions/shm.h> -#endif -#ifdef RENDER -#include "fbpict.h" -#include "glyphstr.h" -#endif - -#include "cairo-drm-xr.h" - -struct _xr_screen { - cairo_device_t *device; - - CreateGCProcPtr SavedCreateGC; - CloseScreenProcPtr SavedCloseScreen; - GetImageProcPtr SavedGetImage; - GetSpansProcPtr SavedGetSpans; - CreatePixmapProcPtr SavedCreatePixmap; - DestroyPixmapProcPtr SavedDestroyPixmap; - CopyWindowProcPtr SavedCopyWindow; - ChangeWindowAttributesProcPtr SavedChangeWindowAttributes; - BitmapToRegionProcPtr SavedBitmapToRegion; - -#ifdef RENDER - CompositeProcPtr SavedComposite; - GlyphsProcPtr SavedGlyphs; - CompositeRectsProcPtr SavedCompositeRects; - TrapezoidsProcPtr SavedTrapezoids; - TrianglesProcPtr SavedTriangles; - TriStripProcPtr SavedTriStrip; - TriFanProcPtr SavedTriFan; - AddTrianglesProcPtr SavedAddTriangles; - AddTrapsProcPtr SavedAddTraps; - - RealizeGlyphProcPtr SavedRealizeGlyph; - UnrealizeGlyphProcPtr SavedUnrealizeGlyph; -#endif -}; - -struct xr_access_gc { - cairo_surface_t *stipple; - cairo_surface_t *tile; -}; - -struct xr_access_window { - cairo_surface_t *background; - cairo_surface_t *border; -}; - -static int xr_screen_index; -static int xr_pixmap_index; - -static inline xr_screen_t * -xr_get_screen (ScreenPtr screen) -{ - return dixLookupPrivate (&screen->devPrivates, &xr_screen_index); -} - -static inline PixmapPtr -xr_drawable_get_pixmap (DrawablePtr drawable) -{ - if (drawable->type == DRAWABLE_WINDOW) - return drawable->pScreen->GetWindowPixmap ((WindowPtr) drawable); - else - return (PixmapPtr) drawable; -} - -static inline cairo_drm_surface_t * -xr_pixmap_get_drm_surface (PixmapPtr pixmap) -{ - return dixLookupPrivate (&pixmap->devPrivates, &xr_pixmap_index); -} - -static cairo_drm_surface_t * -xr_drawable_get_drm_surface (DrawablePtr drawable) -{ - return xr_pixmap_get_drm_surface (xr_drawable_get_pixmap (drawable)); -} - -static cairo_format_t -xr_format_for_depth (int depth) -{ - switch (depth) { - case 1: - return CAIRO_FORMAT_A1; - case 8: - return CAIRO_FORMAT_A8; - case 16: - return CAIRO_FORMAT_RGB16_565; - case 24: - return CAIRO_FORMAT_RGB24; - default: - case 32: - return CAIRO_FORMAT_ARGB32; - } -} - -static cairo_surface_t * -xr_pixmap_get_surface (PixmapPtr pixmap) -{ - cairo_drm_surface_t *drm; - - drm = xr_pixmap_get_drm_surface (pixmap); - if (drm != NULL) - return cairo_surface_reference (&drm->base); - - return cairo_image_surface_create_for_data (pixmap->devPrivate.ptr, - xr_format_for_depth (pixmap->drawable.depth), - pixmap->drawable.width, - pixmap->drawable.height, - pixmap->devKind); -} - -static cairo_surface_t * -xr_drawable_get_surface (DrawablePtr drawable) -{ - return xr_pixmap_get_surface (xr_drawable_get_pixmap (drawable)); -} - -static cairo_bool_t -xr_prepare_access (DrawablePtr drawable, - cairo_surface_t **image) -{ - PixmapPtr pixmap; - cairo_drm_surface_t *drm; - - *image = NULL; - - pixmap = xr_drawable_get_pixmap (drawable); - drm = xr_pixmap_get_drm_surface (pixmap); - if (drm == NULL) - return TRUE; - - *image = cairo_drm_surface_map_to_image (&drm->base); - if ((*image)->status) - return FALSE; - - pixmap->devPrivate.ptr = - ((cairo_image_surface_t *) *image)->data; - - return TRUE; -} - -static void -xr_finish_access (DrawablePtr drawable, - cairo_surface_t *image) -{ - if (image != NULL) { - cairo_drm_surface_unmap (&xr_drawable_get_drm_surface (drawable)->base, - image); - } -} - -static cairo_bool_t -xr_prepare_access_gc (GCPtr gc, - struct xr_access_gc *local) -{ - local->stipple = NULL; - local->tile = NULL; - - if (gc->stipple) { - if (! xr_prepare_access (&gc->stipple->drawable, &local->stipple)) - return FALSE; - } - - if (gc->fillStyle == FillTiled) { - if (! xr_prepare_access (&gc->tile.pixmap->drawable, - &local->tile)) - { - if (local->stipple) { - xr_finish_access (&gc->stipple->drawable, - local->stipple); - } - - return FALSE; - } - } - - return TRUE; -} - -static void -xr_finish_access_gc (GCPtr gc, - struct xr_access_gc *local) -{ - if (local->tile) { - xr_finish_access(&gc->tile.pixmap->drawable, - local->tile); - } - - if (local->stipple) { - xr_finish_access(&gc->stipple->drawable, - local->stipple); - } -} - -static void -xr_fill_spans (DrawablePtr drawable, - GCPtr gc, - int nspans, - DDXPointPtr ppt, - int *pwidth, - int fSorted) -{ - cairo_surface_t *image; - struct xr_access_gc access_gc; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - if (xr_prepare_access_gc (gc, &access_gc)) { - fbFillSpans (drawable, gc, - nspans, ppt, pwidth, - fSorted); - xr_finish_access_gc(gc, &access_gc); - } - xr_finish_access (drawable, image); - } -} - -static void -xr_set_spans (DrawablePtr drawable, - GCPtr gc, - char *psrc, - DDXPointPtr ppt, - int *pwidth, - int nspans, - int fSorted) -{ - cairo_surface_t *image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - fbSetSpans (drawable, gc, psrc, ppt, pwidth, nspans, fSorted); - xr_finish_access (drawable, image); - } -} - -#define XR_PM_IS_SOLID(_pDrawable, _pm) \ - (((_pm) & FbFullMask((_pDrawable)->depth)) == \ - FbFullMask((_pDrawable)->depth)) - -static cairo_clip_t * -xr_gc_get_clip (GCPtr gc, int xoff, int yoff) -{ - return NULL; -} - -static cairo_bool_t -xr_do_put_image (DrawablePtr drawable, - GCPtr gc, - int depth, - int x, int y, - int width, int height, - int format, - char *bits, int src_stride) -{ - cairo_surface_t *surface; - cairo_clip_t *clip; - cairo_surface_t *image; - cairo_surface_pattern_t pattern; - cairo_status_t status; - cairo_path_fixed_t path; - cairo_fixed_t x1, y1, x2, y2; - - if (format != ZPixmap || drawable->bitsPerPixel < 8) - return FALSE; - - if (! XR_PM_IS_SOLID (drawable, gc->planemask) || gc->alu != GXcopy) - return FALSE; - - clip = xr_gc_get_clip (gc, drawable->x, drawable->y); - x1 = _cairo_fixed_from_int (x + drawable->x); - y1 = _cairo_fixed_from_int (y + drawable->y); - x2 = x1 + _cairo_fixed_from_int (width); - y2 = y1 + _cairo_fixed_from_int (height); - _cairo_path_fixed_init (&path); - if (_cairo_path_fixed_move_to (&path, x1, y1) || - _cairo_path_fixed_line_to (&path, x2, y1) || - _cairo_path_fixed_line_to (&path, x2, y2) || - _cairo_path_fixed_line_to (&path, x1, y2) || - _cairo_path_fixed_close_path (&path)) - { - goto err_path; - } - - image = cairo_image_surface_create_for_data ((uint8_t *) bits, - xr_format_for_depth (depth), - width, height, src_stride); - _cairo_pattern_init_for_surface (&pattern, image); - cairo_surface_destroy (image); - pattern.base.filter = CAIRO_FILTER_NEAREST; - cairo_matrix_init_translate (&pattern.base.matrix, - -x - drawable->x, - -y - drawable->x); - - surface = xr_drawable_get_surface (drawable); - status = _cairo_surface_fill (surface, - CAIRO_OPERATOR_SOURCE, - &pattern.base, - &path, - CAIRO_FILL_RULE_WINDING, - CAIRO_ANTIALIAS_DEFAULT, - CAIRO_GSTATE_TOLERANCE_DEFAULT, - clip); - cairo_surface_destroy (surface); - _cairo_pattern_fini (&pattern.base); -err_path: - _cairo_path_fixed_fini (&path); - - (void) status; - return TRUE; -} - -static void -xr_put_image(DrawablePtr drawable, - GCPtr gc, int depth, - int x, int y, - int w, int h, - int leftPad, - int format, - char *bits) -{ - if (! xr_do_put_image (drawable, - gc, - depth, - x, y, w, h, - format, - bits, - PixmapBytePad (w, drawable->depth))) - { - cairo_surface_t *image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - fbPutImage (drawable, gc, depth, - x, y, w, h, - leftPad, format, bits); - xr_finish_access (drawable, image); - } - } -} - -static void -xr_pattern_init_for_drawable (cairo_surface_pattern_t *pattern, - DrawablePtr drawable) -{ - cairo_surface_t *surface; - - surface = xr_drawable_get_surface (drawable); - _cairo_pattern_init_for_surface (pattern, surface); - cairo_surface_destroy (surface); - - pattern->base.filter = CAIRO_FILTER_NEAREST; - pattern->base.extend = CAIRO_EXTEND_NONE; - cairo_matrix_init_translate (&pattern->base.matrix, - drawable->x, - drawable->y); -} - -static RegionPtr -xr_copy_area (DrawablePtr src, - DrawablePtr dst, - GCPtr gc, - int src_x, int src_y, - int width, int height, - int dst_x, int dst_y) -{ - cairo_surface_pattern_t pattern; - cairo_clip_t *clip; - cairo_surface_t *surface; - cairo_status_t status; - cairo_path_fixed_t path; - cairo_fixed_t x1, x2, y1, y2; - - xr_pattern_init_for_drawable (&pattern, src); - cairo_matrix_translate (&pattern.base.matrix, - src->x + src_x - dst_x - dst->x, - src->y + src_y - dst_y - dst->y); - - clip = xr_gc_get_clip (gc, dst->x, dst->y); - surface = xr_drawable_get_surface (dst); - - x1 = _cairo_fixed_from_int (dst_x + dst->x); - y1 = _cairo_fixed_from_int (dst_y + dst->y); - x2 = x1 + _cairo_fixed_from_int (width); - y2 = y1 + _cairo_fixed_from_int (height); - _cairo_path_fixed_init (&path); - if (_cairo_path_fixed_move_to (&path, x1, y1) || - _cairo_path_fixed_line_to (&path, x2, y1) || - _cairo_path_fixed_line_to (&path, x2, y2) || - _cairo_path_fixed_line_to (&path, x1, y2) || - _cairo_path_fixed_close_path (&path)) - { - goto err_path; - } - - status = _cairo_surface_fill (surface, - CAIRO_OPERATOR_SOURCE, - &pattern.base, - &path, - CAIRO_FILL_RULE_WINDING, - CAIRO_ANTIALIAS_DEFAULT, - CAIRO_GSTATE_TOLERANCE_DEFAULT, - clip); - (void) status; - -err_path: - _cairo_path_fixed_fini (&path); - _cairo_pattern_fini (&pattern.base); - cairo_surface_destroy (surface); - - return miGetCompositeClip (gc); -} - -static RegionPtr -xr_copy_plane (DrawablePtr src, - DrawablePtr dst, - GCPtr gc, - int src_x, int src_y, - int w, int h, - int dst_x, int dst_y, - unsigned long bitPlane) -{ - RegionPtr ret = NULL; - cairo_surface_t *src_image, *dst_image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (dst, &dst_image)) { - if (xr_prepare_access (src, &src_image)) { - ret = fbCopyPlane (src, dst, gc, - src_x, src_y, - w, h, - dst_x, dst_y, - bitPlane); - xr_finish_access (src, src_image); - } - xr_finish_access (dst, dst_image); - } - return ret; -} - -static void -xr_poly_point (DrawablePtr drawable, - GCPtr gc, - int mode, - int npt, - DDXPointPtr ppt) -{ - cairo_surface_t *image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - fbPolyPoint (drawable, gc, mode, npt, ppt); - xr_finish_access (drawable, image); - } -} - -static void -xr_poly_line (DrawablePtr drawable, - GCPtr gc, - int mode, - int npt, - DDXPointPtr ppt) -{ - cairo_surface_t *image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - fbPolyLine (drawable, gc, mode, npt, ppt); - xr_finish_access (drawable, image); - } -} - -static void -xr_poly_segment (DrawablePtr drawable, - GCPtr gc, - int nseg, - xSegment *pSeg) -{ - cairo_surface_t *image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - fbPolySegment (drawable, gc, nseg, pSeg); - xr_finish_access (drawable, image); - } -} - -static void -xr_poly_rectangle (DrawablePtr drawable, - GCPtr gc, - int nrect, - xRectangle *pRects) -{ - cairo_surface_t *image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - fbPolyRectangle (drawable, gc, nrect, pRects); - xr_finish_access (drawable, image); - } -} - -static void -xr_poly_arc (DrawablePtr drawable, - GCPtr gc, - int narcs, - xArc *pArcs) -{ - cairo_surface_t *image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - fbPolyArc (drawable, gc, narcs, pArcs); - xr_finish_access (drawable, image); - } -} - -static void -xr_poly_fill (DrawablePtr drawable, - GCPtr gc, - int shape, - int mode, - int count, - DDXPointPtr pPts) -{ - cairo_surface_t *image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - fbFillPolygon (drawable, gc, shape, mode, count, pPts); - xr_finish_access (drawable, image); - } -} - -static void -xr_poly_fill_rect_fallback (DrawablePtr drawable, - GCPtr gc, - int nrect, - xRectangle *prect) -{ - cairo_surface_t *image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - miPolyFillRect (drawable, gc, nrect, prect); - xr_finish_access (drawable, image); - } -} - - -static void -xr_poly_fill_rect (DrawablePtr drawable, - GCPtr gc, - int nrect, - xRectangle *rect) -{ - cairo_clip_t *clip; - cairo_surface_t *surface; - cairo_status_t status; - int n; - - if (gc->alu != GXcopy && gc->alu != GXclear) { - xr_poly_fill_rect_fallback (drawable, gc, nrect, rect); - return; - } - - if (gc->fillStyle != FillSolid && - !(gc->tileIsPixel && gc->fillStyle == FillTiled)) - { - xr_poly_fill_rect_fallback (drawable, gc, nrect, rect); - return; - } - - surface = xr_drawable_get_surface (drawable); - clip = xr_gc_get_clip (gc, drawable->x, drawable->y); - if (clip == NULL && nrect == 1 && - rect->x <= 0 && - rect->y <= 0 && - rect->width >= drawable->width && - rect->height >= drawable->height && - (gc->alu == GXclear || (gc->fgPixel & 0x00ffffff) == 0)) - { - status = _cairo_surface_paint (surface, - CAIRO_OPERATOR_CLEAR, - &_cairo_pattern_clear.base, - NULL); - } - else - { - cairo_path_fixed_t path; - cairo_fixed_t x_off, y_off; - cairo_solid_pattern_t pattern; - cairo_color_t color; - - x_off = _cairo_fixed_from_int (drawable->x); - y_off = _cairo_fixed_from_int (drawable->y); - _cairo_path_fixed_init (&path); - for (n = 0; n < nrect; n++) { - cairo_fixed_t x1 = x_off + _cairo_fixed_from_int (rect[n].x); - cairo_fixed_t x2 = x1 + _cairo_fixed_from_int (rect[n].width); - cairo_fixed_t y1 = y_off + _cairo_fixed_from_int (rect[n].y); - cairo_fixed_t y2 = y1 + _cairo_fixed_from_int (rect[n].height); - - if (_cairo_path_fixed_move_to (&path, x1, y1) || - _cairo_path_fixed_line_to (&path, x2, y1) || - _cairo_path_fixed_line_to (&path, x2, y2) || - _cairo_path_fixed_line_to (&path, x1, y2) || - _cairo_path_fixed_close_path (&path)) - { - goto err_path; - } - } - - _cairo_color_init_rgba (&color, - ((gc->fgPixel & 0x00ff0000) >> 16) / 255., - ((gc->fgPixel & 0x0000ff00) >> 8) / 255., - ((gc->fgPixel & 0x000000ff) >> 0) / 255., - 1.0); - _cairo_pattern_init_solid (&pattern, &color, CAIRO_CONTENT_COLOR); - - status = _cairo_surface_fill (surface, - gc->alu == GXcopy ? CAIRO_OPERATOR_SOURCE : CAIRO_OPERATOR_CLEAR, - &pattern.base, - &path, - CAIRO_FILL_RULE_WINDING, - 1., - CAIRO_ANTIALIAS_DEFAULT, - clip); -err_path: - _cairo_path_fixed_fini (&path); - } - - cairo_surface_destroy (surface); - (void) status; -} - -static void -xr_poly_fill_arc (DrawablePtr drawable, - GCPtr gc, - int narc, - xArc *arc) -{ - cairo_surface_t *image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - miPolyFillArc (drawable, gc, narc, arc); - xr_finish_access (drawable, image); - } -} - -static void -xr_image_glyph_blt (DrawablePtr drawable, GCPtr gc, - int x, int y, unsigned int nglyph, - CharInfoPtr * ppci, pointer pglyphBase) -{ - cairo_surface_t *image; - struct xr_access_gc local_gc; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - if (xr_prepare_access_gc (gc, &local_gc)) { - fbImageGlyphBlt (drawable, gc, - x, y, - nglyph, - ppci, - pglyphBase); - xr_finish_access_gc (gc, &local_gc); - } - xr_finish_access (drawable, image); - } -} - -static void -xr_poly_glyph_blt (DrawablePtr drawable, - GCPtr gc, - int x, int y, - unsigned int nglyph, - CharInfoPtr *ppci, - pointer pglyphBase) -{ - cairo_surface_t *image; - struct xr_access_gc local_gc; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - if (xr_prepare_access_gc (gc, &local_gc)) { - fbPolyGlyphBlt (drawable, gc, - x, y, - nglyph, - ppci, - pglyphBase); - xr_finish_access_gc (gc, &local_gc); - } - xr_finish_access (drawable, image); - } -} - -static void -xr_push_pixels (GCPtr gc, - PixmapPtr src, - DrawablePtr dst, - int w, int h, int x, int y) -{ - cairo_surface_t *src_image, *dst_image; - struct xr_access_gc local_gc; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (dst, &dst_image)) { - if (xr_prepare_access (&src->drawable, &src_image)) { - if (xr_prepare_access_gc (gc, &local_gc)) { - fbPushPixels (gc, src, dst, - w, h, x, y); - xr_finish_access_gc (gc, &local_gc); - } - xr_finish_access (&src->drawable, src_image); - } - xr_finish_access (dst, dst_image); - } -} - -static void -xr_validate_gc (GCPtr gc, - unsigned long changes, - DrawablePtr drawable) -{ - static const GCOps xr_ops = { - xr_fill_spans, - xr_set_spans, - xr_put_image, - xr_copy_area, - xr_copy_plane, - xr_poly_point, - xr_poly_line, - xr_poly_segment, - xr_poly_rectangle, - xr_poly_arc, - xr_poly_fill, - xr_poly_fill_rect, - xr_poly_fill_arc, - miPolyText8, - miPolyText16, - miImageText8, - miImageText16, - xr_image_glyph_blt, - xr_poly_glyph_blt, - xr_push_pixels, - }; - - /* fbValidateGC will do direct access to pixmaps if the tiling has - * changed. Preempt fbValidateGC by doing its work and masking the - * change out, so that we can do the prepare/finish access. - */ -#ifdef FB_24_32BIT - if (changes & GCTile && fbGetRotatedPixmap (gc)) { - gc->pScreen->DestroyPixmap (fbGetRotatedPixmap (gc)); - fbGetRotatedPixmap (gc) = 0; - } - - if (gc->fillStyle == FillTiled) { - PixmapPtr old; - - old = gc->tile.pixmap; - if (old->drawable.bitsPerPixel != drawable->bitsPerPixel) { - PixmapPtr new = fbGetRotatedPixmap (gc); - if (new == NULL || - new->drawable.bitsPerPixel != drawable->bitsPerPixel) - { - cairo_surface_t *image; - - if (new) - gc->pScreen->DestroyPixmap (new); - - /* fb24_32ReformatTile will do direct access - * of a newly-allocated pixmap. This isn't a - * problem yet, since we don't put pixmaps in - * FB until at least one accelerated UXA op. - */ - if (xr_prepare_access (&old->drawable, &image)) { - new = fb24_32ReformatTile (old, - drawable->bitsPerPixel); - xr_finish_access (&old->drawable, image); - } - } - - if (new) { - fbGetRotatedPixmap (gc) = old; - gc->tile.pixmap = new; - changes |= GCTile; - } - } - } -#endif - - if (changes & GCTile) { - if (! gc->tileIsPixel && - FbEvenTile (gc->tile.pixmap->drawable.width * - drawable->bitsPerPixel)) - { - cairo_surface_t *image; - - if (xr_prepare_access (&gc->tile.pixmap->drawable, - &image)) - { - fbPadPixmap(gc->tile.pixmap); - xr_finish_access(&gc->tile.pixmap->drawable, image); - } - } - - /* Mask out the GCTile change notification, now that we've - * done FB's job for it. - */ - changes &= ~GCTile; - } - - if (changes & GCStipple && gc->stipple) { - cairo_surface_t *image; - - /* We can't inline stipple handling like we do for GCTile - * because it sets fbgc privates. - */ - if (xr_prepare_access (&gc->stipple->drawable, &image)) { - fbValidateGC (gc, changes, drawable); - xr_finish_access (&gc->stipple->drawable, image); - } - } else { - fbValidateGC(gc, changes, drawable); - } - - gc->ops = (GCOps *) & xr_ops; -} - -static void -xr_change_gc (GCPtr gc, unsigned long mask) -{ -} - -static void -xr_copy_gc (GCPtr src, unsigned long changes, GCPtr dst) -{ -} - -static void -xr_destroy_gc (GCPtr gc) -{ - miDestroyGC (gc); -} - -static void -xr_destroy_clip (GCPtr gc) -{ - miDestroyClip (gc); -} - -static void -xr_change_clip (GCPtr gc, int type, pointer value, int nrects) -{ - xr_destroy_clip (gc); - - miChangeClip (gc, type, value, nrects); -} - -static void -xr_copy_clip (GCPtr dst, GCPtr src) -{ - miCopyClip (dst, src); -} - -static int xr_create_gc (GCPtr gc) -{ - static GCFuncs funcs = { - xr_validate_gc, - xr_change_gc, - xr_copy_gc, - xr_destroy_gc, - xr_change_clip, - xr_destroy_clip, - xr_copy_clip, - }; - - if (! fbCreateGC (gc)) - return FALSE; - - gc->funcs = &funcs; - return TRUE; -} - -static void -xr_get_image (DrawablePtr drawable, - int x, int y, int w, int h, - unsigned int format, unsigned long planeMask, - char *d) -{ - cairo_surface_t *image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - fbGetImage (drawable, x, y, w, h, format, planeMask, d); - xr_finish_access (drawable, image); - } -} - -static void -xr_get_spans (DrawablePtr drawable, - int wMax, - DDXPointPtr ppt, - int *pwidth, - int nspans, - char *pdstStart) -{ - cairo_surface_t *image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (drawable, &image)) { - fbGetSpans (drawable, wMax, ppt, pwidth, nspans, pdstStart); - xr_finish_access (drawable, image); - } -} - -static void -xr_copy_window (WindowPtr win, - DDXPointRec origin, - RegionPtr src_region) -{ - //ErrorF ("fallback: %s\n", __FUNCTION__); -#if 0 - RegionRec dst_region; - PixmapPtr pixmap; - int dx, dy; - - dx = origin.x - win->drawable.x; - dy = origin.y - win->drawable.y; - REGION_TRANSLATE (win->drawable.pScreen, src_region, -dx, -dy); - - REGION_INIT (win->drawable.pScreen, &dst_region, NullBox, 0); - - REGION_INTERSECT (win->drawable.pScreen, - &dst_region, &win->borderClip, - src_region); - pixmap = win->drawable.pScreen->GetWindowPixmap (win); -#ifdef COMPOSITE - if (pixmap->screen_x || pixmap->screen_y) - REGION_TRANSLATE (win->drawable.pScreen, &dst_region, - -pixmap->screen_x, -pixmap->screen_y); -#endif - - miCopyRegion (&pixmap->drawable, &pixmap->drawable, - NULL, &dst_region, dx, dy, - xr_copy_n_to_n, 0, NULL); - - REGION_UNINIT (win->drawable.pScreen, &dst_region); -#endif -} - -static cairo_bool_t -xr_prepare_access_window (WindowPtr win, - struct xr_access_window *local) -{ - local->background = NULL; - local->border = NULL; - - if (win->backgroundState == BackgroundPixmap) { - if (! xr_prepare_access (&win->background.pixmap->drawable, - &local->background)) - { - return FALSE; - } - } - - if (win->borderIsPixel == FALSE) { - if (! xr_prepare_access (&win->border.pixmap->drawable, - &local->border)) - { - if (local->background) { - xr_finish_access (&win->background.pixmap->drawable, - local->background); - } - return FALSE; - } - } - return TRUE; -} - -static void -xr_finish_access_window (WindowPtr win, - struct xr_access_window *local) -{ - if (local->background) { - xr_finish_access (&win->background.pixmap->drawable, - local->background); - } - - if (local->border) { - xr_finish_access (&win->border.pixmap->drawable, - local->border); - } -} - -static Bool -xr_change_window_attributes (WindowPtr win, - unsigned long mask) -{ - Bool ret = FALSE; - struct xr_access_window local; - - if (xr_prepare_access_window (win, &local)) { - ret = fbChangeWindowAttributes (win, mask); - xr_finish_access_window (win, &local); - } - - return ret; -} - -static RegionPtr -xr_bitmap_to_region (PixmapPtr pPix) -{ - RegionPtr ret = NULL; - cairo_surface_t *image; - - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (&pPix->drawable, &image)) { - ret = fbPixmapToRegion (pPix); - xr_finish_access (&pPix->drawable, image); - } - - return ret; -} - -static void -_color_from_pixel (cairo_color_t *color, uint32_t pixel) -{ - color->alpha_short = (pixel & 0xff000000 >> 24); - color->alpha_short |= color->alpha_short << 8; - - if (color->alpha_short == 0) { - color->red_short = color->green_short = color->blue_short = 0; - color->alpha = color->red = color->green = color->blue = 0.; - return; - } - - color->red_short = (pixel & 0x00ff0000 >> 16); - color->red_short |= color->red_short << 8; - - color->green_short = (pixel & 0x0000ff00 >> 8); - color->green_short |= color->green_short << 8; - - color->blue_short = (pixel & 0x000000ff >> 0); - color->blue_short |= color->blue_short << 8; - - color->alpha = color->alpha_short / (double) 0xffff; - color->red = color->red_short / (double) 0xffff / color->alpha; - color->green = color->green_short / (double) 0xffff / color->alpha; - color->blue = color->blue_short / (double) 0xffff / color->alpha; -} - -static uint32_t -_pixmap_first_pixel (PixmapPtr pixmap) -{ - cairo_surface_t *image; - uint32_t pixel; - void *fb; - - if (! xr_prepare_access (&pixmap->drawable, &image)) - return 0; - - fb = pixmap->devPrivate.ptr; - switch (pixmap->drawable.bitsPerPixel) { - case 32: - pixel = *(uint32_t *) fb; - break; - case 16: - pixel = *(uint16_t *) fb; - break; - default: - pixel = *(CARD8 *) fb; - break; - } - xr_finish_access (&pixmap->drawable, image); - - return pixel; -} - -static cairo_bool_t -_rgba_from_pixel (uint32_t pixel, - uint16_t *red, - uint16_t *green, - uint16_t *blue, - uint16_t *alpha, - uint32_t format) -{ - int rbits, bbits, gbits, abits; - int rshift, bshift, gshift, ashift; - - rbits = PICT_FORMAT_R(format); - gbits = PICT_FORMAT_G(format); - bbits = PICT_FORMAT_B(format); - abits = PICT_FORMAT_A(format); - - if (PICT_FORMAT_TYPE(format) == PICT_TYPE_A) { - rshift = gshift = bshift = ashift = 0; - } else if (PICT_FORMAT_TYPE(format) == PICT_TYPE_ARGB) { - bshift = 0; - gshift = bbits; - rshift = gshift + gbits; - ashift = rshift + rbits; - } else if (PICT_FORMAT_TYPE(format) == PICT_TYPE_ABGR) { - rshift = 0; - gshift = rbits; - bshift = gshift + gbits; - ashift = bshift + bbits; - } else { - return FALSE; - } - - if (rbits) { - *red = ((pixel >> rshift) & ((1 << rbits) - 1)) << (16 - rbits); - while (rbits < 16) { - *red |= *red >> rbits; - rbits <<= 1; - } - } else - *red = 0; - - if (gbits) { - *green = ((pixel >> gshift) & ((1 << gbits) - 1)) << (16 - gbits); - while (gbits < 16) { - *green |= *green >> gbits; - gbits <<= 1; - } - } else - *green = 0; - - if (bbits) { - *blue = ((pixel >> bshift) & ((1 << bbits) - 1)) << (16 - bbits); - while (bbits < 16) { - *blue |= *blue >> bbits; - bbits <<= 1; - } - } else - *blue = 0; - - if (abits) { - *alpha = - ((pixel >> ashift) & ((1 << abits) - 1)) << (16 - abits); - while (abits < 16) { - *alpha |= *alpha >> abits; - abits <<= 1; - } - } else - *alpha = 0xffff; - - return TRUE; -} - -static cairo_bool_t -_color_from_pixmap (PixmapPtr pixmap, - uint32_t src_format, - cairo_color_t *color) -{ - uint32_t pixel = _pixmap_first_pixel(pixmap); - if (! _rgba_from_pixel (pixel, - &color->red_short, - &color->green_short, - &color->blue_short, - &color->alpha_short, - src_format)) - { - return FALSE; - } - - if (color->alpha_short == 0) { - color->red_short = color->green_short = color->blue_short = 0; - color->alpha = color->red = color->green = color->blue = 0.; - return TRUE; - } - - color->alpha = color->alpha_short / (double) 0xffff; - color->red = color->red_short / (double) 0xffff / color->alpha; - color->green = color->green_short / (double) 0xffff / color->alpha; - color->blue = color->blue_short / (double) 0xffff / color->alpha; - return TRUE; -} - -static cairo_bool_t -xr_pattern_init_for_picture (cairo_pattern_union_t *pattern, - PicturePtr picture) -{ - cairo_color_t color; - - if (picture->pSourcePict) { - SourcePict *source = picture->pSourcePict; - switch (source->type) { - case SourcePictTypeSolidFill: - _color_from_pixel (&color, source->solidFill.color); - _cairo_pattern_init_solid (&pattern->solid, - &color, - CAIRO_CONTENT_COLOR_ALPHA); - break; - default: - return FALSE; - } - } else if (picture->pDrawable) { - cairo_surface_t *surface; - - if (picture->alphaMap) - return FALSE; - - if (picture->pDrawable->width == 1 && - picture->pDrawable->height == 1 && - picture->repeat == 1) - { - if (! _color_from_pixmap ((PixmapPtr) picture->pDrawable, - picture->format, - &color)) - goto use_surface; - - _cairo_pattern_init_solid (&pattern->solid, - &color, - CAIRO_CONTENT_COLOR_ALPHA); - } - else - { -use_surface: - surface = xr_drawable_get_surface (picture->pDrawable); - _cairo_pattern_init_for_surface (&pattern->surface, - surface); - cairo_surface_destroy (surface); - } - } else { - return FALSE; - } - - if (! picture->repeat) { - pattern->base.extend = CAIRO_EXTEND_NONE; - } else switch (picture->repeatType) { - case RepeatNormal: - pattern->base.extend = CAIRO_EXTEND_REPEAT; - break; - case RepeatPad: - pattern->base.extend = CAIRO_EXTEND_PAD; - break; - case RepeatReflect: - pattern->base.extend = CAIRO_EXTEND_REFLECT; - break; - default: - goto fail; - } - - switch (picture->filter) { - case PictFilterNearest: - pattern->base.filter = CAIRO_FILTER_NEAREST; - break; - case PictFilterBilinear: - pattern->base.filter = CAIRO_FILTER_BILINEAR; - break; - case PictFilterFast: - pattern->base.filter = CAIRO_FILTER_FAST; - break; - case PictFilterGood: - pattern->base.filter = CAIRO_FILTER_GOOD; - break; - case PictFilterBest: - pattern->base.filter = CAIRO_FILTER_BEST; - break; - default: - goto fail; - } - - return TRUE; - -fail: - _cairo_pattern_fini (&pattern->base); - return FALSE; -} - -static cairo_bool_t -_render_operator (CARD8 render_op, cairo_operator_t *op) -{ - switch (render_op) { - case PictOpClear: *op = CAIRO_OPERATOR_CLEAR; break; - case PictOpSrc: *op = CAIRO_OPERATOR_SOURCE; break; - case PictOpOver: *op = CAIRO_OPERATOR_OVER; break; - case PictOpIn: *op = CAIRO_OPERATOR_IN; break; - case PictOpOut: *op = CAIRO_OPERATOR_OUT; break; - case PictOpAtop: *op = CAIRO_OPERATOR_ATOP; break; - case PictOpDst: *op = CAIRO_OPERATOR_DEST; break; - case PictOpOverReverse: *op = CAIRO_OPERATOR_DEST_OVER; break; - case PictOpInReverse: *op = CAIRO_OPERATOR_DEST_IN; break; - case PictOpOutReverse: *op = CAIRO_OPERATOR_DEST_OUT; break; - case PictOpAtopReverse: *op = CAIRO_OPERATOR_DEST_ATOP; break; - case PictOpXor: *op = CAIRO_OPERATOR_XOR; break; - case PictOpAdd: *op = CAIRO_OPERATOR_ADD; break; - case PictOpSaturate: *op = CAIRO_OPERATOR_SATURATE; break; - case PictOpMultiply: *op = CAIRO_OPERATOR_MULTIPLY; break; - case PictOpScreen: *op = CAIRO_OPERATOR_SCREEN; break; - case PictOpOverlay: *op = CAIRO_OPERATOR_OVERLAY; break; - case PictOpDarken: *op = CAIRO_OPERATOR_DARKEN; break; - case PictOpLighten: *op = CAIRO_OPERATOR_LIGHTEN; break; - case PictOpColorDodge: *op = CAIRO_OPERATOR_COLOR_DODGE; break; - case PictOpColorBurn: *op = CAIRO_OPERATOR_COLOR_BURN; break; - case PictOpHardLight: *op = CAIRO_OPERATOR_HARD_LIGHT; break; - case PictOpSoftLight: *op = CAIRO_OPERATOR_SOFT_LIGHT; break; - case PictOpDifference: *op = CAIRO_OPERATOR_DIFFERENCE; break; - case PictOpExclusion: *op = CAIRO_OPERATOR_EXCLUSION; break; - case PictOpHSLHue: *op = CAIRO_OPERATOR_HSL_HUE; break; - case PictOpHSLSaturation: *op = CAIRO_OPERATOR_HSL_SATURATION; break; - case PictOpHSLColor: *op = CAIRO_OPERATOR_HSL_COLOR; break; - case PictOpHSLLuminosity: *op = CAIRO_OPERATOR_HSL_LUMINOSITY; break; - - default: return FALSE; - } - - return TRUE; -} - -static void -xr_picture_get_clip (PicturePtr picture, - cairo_clip_t *clip) -{ - cairo_status_t status; - - _cairo_clip_init (clip); - - if (picture->pCompositeClip) { - cairo_path_fixed_t path; - BoxPtr pbox; - int nbox; - - nbox = REGION_NUM_RECTS (picture->pCompositeClip); - pbox = REGION_RECTS (picture->pCompositeClip); - _cairo_path_fixed_init (&path); - while (nbox--) { - if (_cairo_path_fixed_move_to (&path, - _cairo_fixed_from_int (pbox->x1), - _cairo_fixed_from_int (pbox->y1)) || - _cairo_path_fixed_line_to (&path, - _cairo_fixed_from_int (pbox->x2), - _cairo_fixed_from_int (pbox->y1)) || - _cairo_path_fixed_line_to (&path, - _cairo_fixed_from_int (pbox->x2), - _cairo_fixed_from_int (pbox->y2)) || - _cairo_path_fixed_line_to (&path, - _cairo_fixed_from_int (pbox->x1), - _cairo_fixed_from_int (pbox->y2)) || - _cairo_path_fixed_close_path (&path)) - { - goto err_path; - } - } - - status = _cairo_clip_clip (clip, - &path, - CAIRO_FILL_RULE_WINDING, - 1.0, - CAIRO_ANTIALIAS_DEFAULT); - -err_path: - _cairo_path_fixed_fini (&path); - } - - (void) status; -} - -static void -xr_composite (CARD8 render_op, - PicturePtr pSrc, - PicturePtr pMask, - PicturePtr pDst, - INT16 xSrc, INT16 ySrc, - INT16 xMask, INT16 yMask, - INT16 xDst, INT16 yDst, - CARD16 width, CARD16 height) -{ - cairo_pattern_union_t source, mask; - cairo_operator_t op; - cairo_surface_t *surface; - cairo_clip_t clip; - cairo_rectangle_int_t rect; - cairo_bool_t mask_is_clipped = FALSE, source_is_clipped = FALSE; - cairo_status_t status; - - if (! _render_operator (render_op, &op)) - goto fallback; - - if (! xr_pattern_init_for_picture (&source, pSrc)) - goto fallback; - - cairo_matrix_translate (&source.base.matrix, - xSrc - xDst, ySrc - yDst); - - if (pMask) { - if (! xr_pattern_init_for_picture (&mask, pMask)) { - _cairo_pattern_fini (&source.base); - goto fallback; - } - - cairo_matrix_translate (&mask.base.matrix, - xMask - xDst, yMask - yDst); - } - - xr_picture_get_clip (pDst, &clip); - rect.x = xDst; - rect.y = yDst; - rect.width = width; - rect.height = height; - status = _cairo_clip_rectangle (&clip, &rect); - -#if 0 - { - cairo_clip_t clip_source; - - xr_picture_get_clip (pSrc, &clip_source); - if (clip_source.path != NULL) { - _cairo_clip_apply_clip (&clip, &clip_source); - source_is_clipped = TRUE; - } - _cairo_clip_fini (&clip_source); - } - if (pMask) { - cairo_clip_t clip_mask; - - xr_picture_get_clip (pMask, &clip_mask); - if (clip_mask.path != NULL) { - _cairo_clip_apply_clip (&clip, &clip_mask); - mask_is_clipped = TRUE; - } - _cairo_clip_fini (&clip_mask); - } -#endif - - surface = xr_drawable_get_surface (pDst->pDrawable); - if (! clip.all_clipped) { - if (pMask) { - status = _cairo_surface_mask (surface, op, - &source.base, - &mask.base, - &clip); - } else { - status = _cairo_surface_paint (surface, op, - &source.base, - &clip); - } - } - -#if 0 - if (source_is_clipped) { - /* clear areas in dst where source was clipped */ - cairo_surface_t *surface; - cairo_clip_t clip_source; - - if (pMask) { - cairo_clip_t clip_mask; - - xr_picture_get_clip (pMask, &clip_mask); - if (clip_mask.path != NULL) { - _cairo_clip_apply_clip (&local_clip, &clip_mask); - mask_is_clipped = TRUE; - } - _cairo_clip_fini (&clip_mask); - } - - xr_picture_get_inverse_clip (pSrc, &clip_source); - _cairo_clip_apply_clip (&clip_source, &clip); - - if (pMask) { - status = _cairo_surface_mask (surface, - CAIRO_OPERATOR_CLEAR, - &_cairo_pattern_clear.base, - &mask.base, - &clip_source); - } else { - status = _cairo_surface_paint (surface, - CAIRO_OPERATOR_CLEAR, - &_cairo_pattern_clear.base, - &clip_source); - } - _cairo_clip_fini (&clip_source); - } - - if (mask_is_clipped && ! _cairo_operator_bounded_by_mask (op)) { - /* clear areas in dst where mask was clipped */ - cairo_surface_t *surface; - cairo_clip_t clip_mask; - - xr_picture_get_inverse_clip (pMask, &clip_mask); - _cairo_clip_apply_clip (&clip, &clip_mask); - _cairo_clip_fini (&clip_mask); - - status = _cairo_surface_paint (surface, - CAIRO_OPERATOR_CLEAR, - &_cairo_pattern_clear.base, - &clip); - } -#endif - - cairo_surface_destroy (surface); - _cairo_clip_fini (&clip); - - if (pMask) - _cairo_pattern_fini (&mask.base); - _cairo_pattern_fini (&source.base); - - return; - -fallback: - { - cairo_surface_t *dst_image, *src_image, *mask_image; - //ErrorF ("fallback: %s\n", __FUNCTION__); - if (xr_prepare_access (pDst->pDrawable, &dst_image)) { - if (pSrc->pDrawable == NULL || - xr_prepare_access (pSrc->pDrawable, &src_image)) - { - if (pMask == NULL || pMask->pDrawable == NULL || - xr_prepare_access (pMask->pDrawable, &mask_image)) - { - fbComposite (op, pSrc, pMask, pDst, - xSrc, ySrc, - xMask, yMask, - xDst, yDst, - width, height); - if (pMask && pMask->pDrawable) - xr_finish_access (pMask->pDrawable, mask_image); - } - if (pSrc->pDrawable) - xr_finish_access (pSrc->pDrawable, src_image); - } - xr_finish_access (pDst->pDrawable, dst_image); - } - } -} - -static void -xr_glyphs (CARD8 op, - PicturePtr pSrc, - PicturePtr pDst, - PictFormatPtr maskFormat, - INT16 xSrc, INT16 ySrc, - int nlist, - GlyphListPtr list, - GlyphPtr *glyphs) -{ -} - -static cairo_bool_t -xr_do_fill (cairo_operator_t op, - PicturePtr pSrc, - PicturePtr pDst, - int src_x, - int src_y, - cairo_path_fixed_t *path) -{ - cairo_pattern_union_t source; - cairo_clip_t clip; - cairo_surface_t *surface; - cairo_status_t status; - - if (! xr_pattern_init_for_picture (&source, pSrc)) - return FALSE; - - cairo_matrix_translate (&source.base.matrix, src_x, src_y); - - surface = xr_drawable_get_surface (pDst->pDrawable); - xr_picture_get_clip (pDst, &clip); - status = _cairo_surface_fill (surface, op, &source.base, path, - CAIRO_FILL_RULE_WINDING, - pDst->polyEdge == PolyEdgeSharp ? CAIRO_ANTIALIAS_NONE : CAIRO_ANTIALIAS_DEFAULT, - CAIRO_GSTATE_TOLERANCE_DEFAULT, - clip.path ? &clip : NULL); - _cairo_clip_fini (&clip); - cairo_surface_destroy (surface); - _cairo_pattern_fini (&source.base); - - return TRUE; -} - -static void -xr_composite_rects (CARD8 render_op, - PicturePtr picture, - xRenderColor *xColor, - int nrect, - xRectangle *rect) -{ - cairo_operator_t op; - cairo_clip_t clip; - cairo_surface_t *surface; - cairo_status_t status; - - if (! _render_operator (render_op, &op)) - goto fallback; - - surface = xr_drawable_get_surface (picture->pDrawable); - xr_picture_get_clip (picture, &clip); - if (clip.path == NULL && nrect == 1 && - rect->x <= 0 && - rect->y <= 0 && - rect->width >= picture->pDrawable->width && - rect->height >= picture->pDrawable->height && - (op == CAIRO_OPERATOR_CLEAR || (op == CAIRO_OPERATOR_SOURCE && xColor->alpha <= 0x00ff))) - { - status = _cairo_surface_paint (surface, - CAIRO_OPERATOR_CLEAR, - &_cairo_pattern_clear.base, - NULL); - } - else - { - cairo_path_fixed_t path; - cairo_fixed_t x_off, y_off; - cairo_solid_pattern_t pattern; - cairo_color_t color; - int n; - - x_off = _cairo_fixed_from_int (picture->pDrawable->x); - y_off = _cairo_fixed_from_int (picture->pDrawable->y); - _cairo_path_fixed_init (&path); - for (n = 0; n < nrect; n++) { - cairo_fixed_t x1 = x_off + _cairo_fixed_from_int (rect[n].x); - cairo_fixed_t x2 = x1 + _cairo_fixed_from_int (rect[n].width); - cairo_fixed_t y1 = y_off + _cairo_fixed_from_int (rect[n].y); - cairo_fixed_t y2 = y1 + _cairo_fixed_from_int (rect[n].height); - - if (_cairo_path_fixed_move_to (&path, x1, y1) || - _cairo_path_fixed_line_to (&path, x2, y1) || - _cairo_path_fixed_line_to (&path, x2, y2) || - _cairo_path_fixed_line_to (&path, x1, y2) || - _cairo_path_fixed_close_path (&path)) - { - goto err_path; - } - } - - color.red_short = xColor->red; - color.green_short = xColor->green; - color.blue_short = xColor->blue; - color.alpha_short = xColor->alpha; - if (color.alpha_short <= 0x00ff) { - color.red_short = color.green_short = color.blue_short = 0; - color.alpha = color.red = color.green = color.blue = 0.; - } else { - color.alpha = color.alpha_short / (double) 0xffff; - color.red = color.red_short / (double) 0xffff / color.alpha; - color.green = color.green_short / (double) 0xffff / color.alpha; - color.blue = color.blue_short / (double) 0xffff / color.alpha; - } - _cairo_pattern_init_solid (&pattern, &color, CAIRO_CONTENT_COLOR); - - status = _cairo_surface_fill (surface, op, - &pattern.base, - &path, - CAIRO_FILL_RULE_WINDING, - 1., - CAIRO_ANTIALIAS_DEFAULT, - clip.path ? &clip : NULL); -err_path: - _cairo_path_fixed_fini (&path); - } - - cairo_surface_destroy (surface); - _cairo_clip_fini (&clip); - - (void) status; - return; - -fallback: - //ErrorF ("fallback: %s\n", __FUNCTION__); -#if 0 - { - cairo_surface_t *dst_image, *src_image; - if (xr_prepare_access (pDst->pDrawable, &dst_image)) { - if (pSrc->pDrawable == NULL || - xr_prepare_access (pSrc->pDrawable, &src_image)) - { - fbTrapezoids (op, pSrc, pDst, - maskFormat, - xSrc, ySrc, - ntrap, traps); - if (pSrc->pDrawable) - xr_finish_access (pSrc->pDrawable, src_image); - } - xr_finish_access (pDst->pDrawable, dst_image); - } - } -#endif - return; -} - -static void -xr_trapezoids (CARD8 render_op, - PicturePtr pSrc, - PicturePtr pDst, - PictFormatPtr maskFormat, - INT16 xSrc, - INT16 ySrc, - int ntrap, - xTrapezoid *traps) -{ - cairo_path_fixed_t path; - cairo_operator_t op; - int src_x, src_y; - - if (! _render_operator (render_op, &op)) - goto fallback; - - src_x = xSrc - (traps->left.p1.x >> 16); - src_y = ySrc - (traps->left.p1.y >> 16); - - _cairo_path_fixed_init (&path); - while (ntrap--) { - if (traps->bottom > traps->top) { - cairo_fixed_t x1, x2; - cairo_fixed_t y1, y2; - - if (traps->left.p1.y != traps->top) { - double x; - - x = _cairo_fixed_16_16_to_double (traps->left.p1.x) + - _cairo_fixed_16_16_to_double (traps->left.p1.x - traps->left.p2.x) * - _cairo_fixed_16_16_to_double (traps->top - traps->left.p2.y) / - _cairo_fixed_16_16_to_double (traps->left.p1.y - traps->left.p2.y); - - x1 = _cairo_fixed_from_double (x); - } else { - x1 = _cairo_fixed_from_16_16 (traps->left.p1.x); - } - - if (traps->right.p1.y != traps->top) { - double x; - - x = _cairo_fixed_16_16_to_double (traps->right.p1.x) + - _cairo_fixed_16_16_to_double (traps->right.p1.x - traps->right.p2.x) * - _cairo_fixed_16_16_to_double (traps->top - traps->right.p2.y) / - _cairo_fixed_16_16_to_double (traps->right.p1.y - traps->right.p2.y); - - x2 = _cairo_fixed_from_double (x); - } else { - x2 = _cairo_fixed_from_16_16 (traps->left.p2.x); - } - - y1 = _cairo_fixed_from_16_16 (traps->top); - y2 = _cairo_fixed_from_16_16 (traps->bottom); - - if (_cairo_path_fixed_move_to (&path, x1, y1) || - _cairo_path_fixed_line_to (&path, x2, y1) || - _cairo_path_fixed_line_to (&path, x2, y2) || - _cairo_path_fixed_line_to (&path, x1, y2) || - _cairo_path_fixed_close_path (&path)) - { - goto err_path; - } - } - - traps++; - } - - if (! xr_do_fill (op, pSrc, pDst, src_x, src_y, &path)) { - _cairo_path_fixed_fini (&path); - goto fallback; - } - -err_path: - _cairo_path_fixed_fini (&path); - - return; - -fallback: - //ErrorF ("fallback: %s\n", __FUNCTION__); -#if 0 - { - cairo_surface_t *dst_image, *src_image; - if (xr_prepare_access (pDst->pDrawable, &dst_image)) { - if (pSrc->pDrawable == NULL || - xr_prepare_access (pSrc->pDrawable, &src_image)) - { - fbTrapezoids (op, pSrc, pDst, - maskFormat, - xSrc, ySrc, - ntrap, traps); - if (pSrc->pDrawable) - xr_finish_access (pSrc->pDrawable, src_image); - } - xr_finish_access (pDst->pDrawable, dst_image); - } - } -#endif - return; -} - -static void -xr_triangles (CARD8 render_op, - PicturePtr pSrc, - PicturePtr pDst, - PictFormatPtr maskFormat, - INT16 xSrc, - INT16 ySrc, - int ntriangles, - xTriangle *triangles) -{ - cairo_path_fixed_t path; - cairo_operator_t op; - int src_x, src_y; - - if (! _render_operator (render_op, &op)) - goto fallback; - - src_x = xSrc - (triangles->p1.x >> 16); - src_y = ySrc - (triangles->p1.y >> 16); - - _cairo_path_fixed_init (&path); - while (ntriangles--) { - if (_cairo_path_fixed_move_to (&path, - _cairo_fixed_from_16_16 (triangles->p1.x), - _cairo_fixed_from_16_16 (triangles->p1.y)) || - _cairo_path_fixed_line_to (&path, - _cairo_fixed_from_16_16 (triangles->p2.x), - _cairo_fixed_from_16_16 (triangles->p2.y)) || - _cairo_path_fixed_line_to (&path, - _cairo_fixed_from_16_16 (triangles->p3.x), - _cairo_fixed_from_16_16 (triangles->p3.y)) || - _cairo_path_fixed_close_path (&path)) - { - goto err_path; - } - - triangles++; - } - - if (! xr_do_fill (op, pSrc, pDst, src_x, src_y, &path)) { - _cairo_path_fixed_fini (&path); - goto fallback; - } - -err_path: - _cairo_path_fixed_fini (&path); - - return; - -fallback: - //ErrorF ("fallback: %s\n", __FUNCTION__); -#if 0 - { - cairo_surface_t *dst_image, *src_image; - if (xr_prepare_access (pDst->pDrawable, &dst_image)) { - if (pSrc->pDrawable == NULL || - xr_prepare_access (pSrc->pDrawable, &src_image)) - { - fbTriangles (op, pSrc, pDst, - maskFormat, - xSrc, ySrc, - ntriangles, triangles); - if (pSrc->pDrawable) - xr_finish_access (pSrc->pDrawable, src_image); - } - xr_finish_access (pDst->pDrawable, dst_image); - } - } -#endif - return; -} - -static void -xr_tristrip (CARD8 op, - PicturePtr pSrc, - PicturePtr pDst, - PictFormatPtr maskFormat, - INT16 xSrc, - INT16 ySrc, - int npoints, - xPointFixed *points) -{ - //ErrorF ("fallback: %s\n", __FUNCTION__); -#if 0 - { - cairo_surface_t *dst_image, *src_image; - if (xr_prepare_access (pDst->pDrawable, &dst_image)) { - if (pSrc->pDrawable == NULL || - xr_prepare_access (pSrc->pDrawable, &src_image)) - { - fbTriStrip (op, pSrc, pDst, - maskFormat, - xSrc, ySrc, - npoints, points); - if (pSrc->pDrawable) - xr_finish_access (pSrc->pDrawable, src_image); - } - xr_finish_access (pDst->pDrawable, dst_image); - } - } -#endif -} - -static void -xr_trifan (CARD8 render_op, - PicturePtr pSrc, - PicturePtr pDst, - PictFormatPtr maskFormat, - INT16 xSrc, - INT16 ySrc, - int npoints, - xPointFixed *points) -{ - cairo_path_fixed_t path; - cairo_operator_t op; - int src_x, src_y; - - if (! _render_operator (render_op, &op)) - goto fallback; - - src_x = xSrc - (points->x >> 16); - src_y = ySrc - (points->y >> 16); - - _cairo_path_fixed_init (&path); - points++; - while (--npoints) { - if (_cairo_path_fixed_line_to (&path, - _cairo_fixed_from_16_16 (points->x), - _cairo_fixed_from_16_16 (points->y))) - { - goto err_path; - } - - points++; - } - if (_cairo_path_fixed_close_path (&path)) - goto err_path; - - if (! xr_do_fill (op, pSrc, pDst, src_x, src_y, &path)) { - _cairo_path_fixed_fini (&path); - goto fallback; - } - -err_path: - _cairo_path_fixed_fini (&path); - - return; - -fallback: - //ErrorF ("fallback: %s\n", __FUNCTION__); -#if 0 - { - cairo_surface_t *dst_image, *src_image; - if (xr_prepare_access (pDst->pDrawable, &dst_image)) { - if (pSrc->pDrawable == NULL || - xr_prepare_access (pSrc->pDrawable, &src_image)) - { - fbTriFan (op, pSrc, pDst, - maskFormat, - xSrc, ySrc, - npoints, points); - if (pSrc->pDrawable) - xr_finish_access (pSrc->pDrawable, src_image); - } - xr_finish_access (pDst->pDrawable, dst_image); - } - } -#endif - return; -} - -static void -xr_add_triangles (PicturePtr picture, - INT16 x_off, INT16 y_off, - int ntriangle, xTriangle *triangles) -{ - cairo_path_fixed_t path; - cairo_clip_t clip; - cairo_surface_t *surface; - cairo_status_t status; - int x, y; - - x = _cairo_fixed_from_int (x_off); - y = _cairo_fixed_from_int (y_off); - - _cairo_path_fixed_init (&path); - while (ntriangle--) { - if (_cairo_path_fixed_move_to (&path, - x + _cairo_fixed_from_16_16 (triangles->p1.x), - y + _cairo_fixed_from_16_16 (triangles->p1.y)) || - _cairo_path_fixed_line_to (&path, - x + _cairo_fixed_from_16_16 (triangles->p2.x), - y + _cairo_fixed_from_16_16 (triangles->p2.y)) || - _cairo_path_fixed_line_to (&path, - x + _cairo_fixed_from_16_16 (triangles->p3.x), - y + _cairo_fixed_from_16_16 (triangles->p3.y)) || - _cairo_path_fixed_close_path (&path)) - { - goto err_path; - } - - triangles++; - } - - surface = xr_drawable_get_surface (picture->pDrawable); - xr_picture_get_clip (picture, &clip); - status = _cairo_surface_fill (surface, - CAIRO_OPERATOR_ADD, - &_cairo_pattern_white.base, - &path, - CAIRO_FILL_RULE_WINDING, - picture->polyEdge == PolyEdgeSharp ? CAIRO_ANTIALIAS_NONE : CAIRO_ANTIALIAS_DEFAULT, - CAIRO_GSTATE_TOLERANCE_DEFAULT, - clip.path ? &clip : NULL); - _cairo_clip_fini (&clip); - cairo_surface_destroy (surface); - -err_path: - _cairo_path_fixed_fini (&path); -} - -static void -xr_add_traps (PicturePtr picture, - INT16 x_off, INT16 y_off, - int ntrap, xTrap * traps) -{ - cairo_path_fixed_t path; - cairo_clip_t clip; - cairo_surface_t *surface; - cairo_status_t status; - int x, y; - - x = _cairo_fixed_from_int (x_off); - y = _cairo_fixed_from_int (y_off); - - _cairo_path_fixed_init (&path); - while (ntrap--) { - if (_cairo_path_fixed_move_to (&path, - x + _cairo_fixed_from_16_16 (traps->top.l), - y + _cairo_fixed_from_16_16 (traps->top.y)) || - _cairo_path_fixed_line_to (&path, - x + _cairo_fixed_from_16_16 (traps->top.r), - y + _cairo_fixed_from_16_16 (traps->top.y)) || - _cairo_path_fixed_line_to (&path, - x + _cairo_fixed_from_16_16 (traps->bot.r), - y + _cairo_fixed_from_16_16 (traps->bot.y)) || - _cairo_path_fixed_move_to (&path, - x + _cairo_fixed_from_16_16 (traps->bot.l), - y + _cairo_fixed_from_16_16 (traps->bot.y)) || - _cairo_path_fixed_close_path (&path)) - { - goto err_path; - } - - traps++; - } - - surface = xr_drawable_get_surface (picture->pDrawable); - xr_picture_get_clip (picture, &clip); - status = _cairo_surface_fill (surface, - CAIRO_OPERATOR_ADD, - &_cairo_pattern_white.base, - &path, - CAIRO_FILL_RULE_WINDING, - picture->polyEdge == PolyEdgeSharp ? CAIRO_ANTIALIAS_NONE : CAIRO_ANTIALIAS_DEFAULT, - CAIRO_GSTATE_TOLERANCE_DEFAULT, - clip.path ? &clip : NULL); - _cairo_clip_fini (&clip); - cairo_surface_destroy (surface); - -err_path: - _cairo_path_fixed_fini (&path); -} - -static Bool -xr_realize_glyph (ScreenPtr screen, GlyphPtr glyph) -{ - return TRUE; -} - -static void -xr_unrealize_glyph (ScreenPtr screen, GlyphPtr glyph) -{ -} - -static PixmapPtr -xr_create_pixmap (ScreenPtr screen, - int w, int h, int depth, - unsigned usage) -{ - xr_screen_t *xr = xr_get_screen (screen); - PixmapPtr pixmap; - - if (w > 32767 || h > 32767) - return NullPixmap; - - if (usage == CREATE_PIXMAP_USAGE_GLYPH_PICTURE) - return fbCreatePixmap (screen, w, h, depth, usage); - - if (w && h) { - cairo_surface_t *surface; - cairo_format_t format; - - format = xr_format_for_depth (depth); - surface = cairo_drm_surface_create (xr->device, format, w, h); - if (unlikely (surface->status)) - goto fallback; - - pixmap = fbCreatePixmap (screen, 0, 0, depth, usage); - screen->ModifyPixmapHeader (pixmap, w, h, 0, 0, - cairo_drm_surface_get_stride (surface), - NULL); - dixSetPrivate (&pixmap->devPrivates, &xr_pixmap_index, surface); - } else { -fallback: - pixmap = fbCreatePixmap (screen, w, h, depth, usage); - } - - return pixmap; -} - -static Bool -xr_destroy_pixmap (PixmapPtr pixmap) -{ - if (pixmap->refcnt == 1) - cairo_surface_destroy (&xr_pixmap_get_drm_surface (pixmap)->base); - - fbDestroyPixmap(pixmap); - return TRUE; -} - -static Bool -xr_close_screen (int i, ScreenPtr screen) -{ - xr_screen_t *xr = xr_get_screen(screen); - - screen->CreateGC = xr->SavedCreateGC; - screen->CloseScreen = xr->SavedCloseScreen; - screen->GetImage = xr->SavedGetImage; - screen->GetSpans = xr->SavedGetSpans; - screen->CreatePixmap = xr->SavedCreatePixmap; - screen->DestroyPixmap = xr->SavedDestroyPixmap; - screen->CopyWindow = xr->SavedCopyWindow; - screen->ChangeWindowAttributes = - xr->SavedChangeWindowAttributes; - screen->BitmapToRegion = xr->SavedBitmapToRegion; -#ifdef RENDER - { - PictureScreenPtr ps = GetPictureScreenIfSet(screen); - if (ps) { - ps->Composite = xr->SavedComposite; - ps->Glyphs = xr->SavedGlyphs; - ps->CompositeRects = xr->SavedCompositeRects; - ps->Trapezoids = xr->SavedTrapezoids; - ps->Triangles = xr->SavedTriangles; - ps->TriStrip = xr->SavedTriStrip; - ps->TriFan = xr->SavedTriFan; - ps->AddTriangles = xr->SavedAddTriangles; - ps->AddTraps = xr->SavedAddTraps; - ps->RealizeGlyph = xr->SavedRealizeGlyph; - ps->UnrealizeGlyph = xr->SavedUnrealizeGlyph; - } - } -#endif - - cairo_device_destroy (xr->device); - xfree (xr); - - return screen->CloseScreen (i, screen); -} - -static void -xr_block_handler (void *data, OSTimePtr timeout, void *last_select_mask) -{ - xr_screen_t *xr = data; - - cairo_device_flush (xr->device); - cairo_drm_device_throttle (xr->device); -} - -static void -xr_wakeup_handler (void *data, int result, void *last_select_mask) -{ -} - -xr_screen_t * -cairo_drm_xr_enable (ScreenPtr screen, int fd) -{ - xr_screen_t *xr; - cairo_device_t *device; - - device = cairo_drm_device_get_for_fd (fd); - if (device == NULL) - return NULL; - - xr = malloc (sizeof (*xr)); - if (unlikely (xr == NULL)) - goto cleanup_device; - - xr->device = device; - dixSetPrivate (&screen->devPrivates, - &xr_screen_index, - xr); - - if (! dixRequestPrivate(&xr_pixmap_index, 0)) - goto cleanup_driver; - - if (! RegisterBlockAndWakeupHandlers (xr_block_handler, - xr_wakeup_handler, - xr)) - { - goto cleanup_driver; - } - - /* wrap the screen interfaces */ - xr->SavedCloseScreen = screen->CloseScreen; - screen->CloseScreen = xr_close_screen; - - xr->SavedCreateGC = screen->CreateGC; - screen->CreateGC = xr_create_gc; - - xr->SavedGetImage = screen->GetImage; - screen->GetImage = xr_get_image; - - xr->SavedGetSpans = screen->GetSpans; - screen->GetSpans = xr_get_spans; - - xr->SavedCopyWindow = screen->CopyWindow; - screen->CopyWindow = xr_copy_window; - - xr->SavedChangeWindowAttributes = - screen->ChangeWindowAttributes; - screen->ChangeWindowAttributes = xr_change_window_attributes; - - xr->SavedBitmapToRegion = screen->BitmapToRegion; - screen->BitmapToRegion = xr_bitmap_to_region; - -#ifdef RENDER - { - PictureScreenPtr ps = GetPictureScreenIfSet(screen); - if (ps) { - xr->SavedComposite = ps->Composite; - ps->Composite = xr_composite; - - xr->SavedGlyphs = ps->Glyphs; - ps->Glyphs = xr_glyphs; - - xr->SavedCompositeRects = ps->CompositeRects; - ps->CompositeRects = xr_composite_rects; - - xr->SavedTrapezoids = ps->Trapezoids; - ps->Trapezoids = xr_trapezoids; - - xr->SavedTriangles = ps->Triangles; - ps->Triangles = xr_triangles; - - xr->SavedTriStrip = ps->TriStrip; - ps->TriStrip = xr_tristrip; - - xr->SavedTriFan = ps->TriFan; - ps->TriFan = xr_trifan; - - xr->SavedAddTriangles = ps->AddTriangles; - ps->AddTriangles = xr_add_triangles; - - xr->SavedAddTraps = ps->AddTraps; - ps->AddTraps = xr_add_traps; - - xr->SavedRealizeGlyph = ps->RealizeGlyph; - ps->RealizeGlyph = xr_realize_glyph; - - xr->SavedUnrealizeGlyph = ps->UnrealizeGlyph; - ps->UnrealizeGlyph = xr_unrealize_glyph; - } - } -#endif - -#ifdef MITSHM -#if 0 - /* Re-register with the MI funcs, which don't allow shared pixmaps. - * Shared pixmaps are almost always a performance loss for us, but this - * still allows for SHM PutImage. - */ - { - static ShmFuncs xr_shm_funcs = { NULL, NULL }; - ShmRegisterFuncs (screen, &xr_shm_funcs); - } -#endif -#endif - - screen->CreatePixmap = xr_create_pixmap; - screen->DestroyPixmap = xr_destroy_pixmap; - - LogMessage (X_INFO, - "XR(%d): Driver registered support.\n", screen->myNum); - - return xr; - -cleanup_driver: - free (xr); -cleanup_device: - cairo_device_destroy (device); - return NULL; -} - -void -cairo_drm_xr_pixmap_link_bo (xr_screen_t *xr, - PixmapPtr pixmap, - uint32_t name, - cairo_format_t format, - int width, - int height, - int stride) -{ - cairo_surface_t *surface; - - cairo_surface_destroy (dixLookupPrivate (&pixmap->devPrivates, - &xr_pixmap_index)); - - surface = cairo_drm_surface_create_for_name (xr->device, name, format, - width, height, stride); - dixSetPrivate (&pixmap->devPrivates, &xr_pixmap_index, surface); -} - -void -cairo_drm_xr_pixmap_unlink_bo (xr_screen_t *xr, - PixmapPtr pixmap) -{ - cairo_surface_destroy (dixLookupPrivate (&pixmap->devPrivates, - &xr_pixmap_index)); - - dixSetPrivate (&pixmap->devPrivates, &xr_pixmap_index, NULL); -} |