From f4092abdf94af6a99aff944d6264bc1284e8bdd4 Mon Sep 17 00:00:00 2001 From: Reinhard Tartler Date: Mon, 10 Oct 2011 17:43:39 +0200 Subject: Imported nx-X11-3.1.0-1.tar.gz Summary: Imported nx-X11-3.1.0-1.tar.gz Keywords: Imported nx-X11-3.1.0-1.tar.gz into Git repository --- nx-X11/programs/Xserver/hw/sun/sunCursor.c | 281 +++++++++++++++++++++++++++++ 1 file changed, 281 insertions(+) create mode 100644 nx-X11/programs/Xserver/hw/sun/sunCursor.c (limited to 'nx-X11/programs/Xserver/hw/sun/sunCursor.c') diff --git a/nx-X11/programs/Xserver/hw/sun/sunCursor.c b/nx-X11/programs/Xserver/hw/sun/sunCursor.c new file mode 100644 index 000000000..2d653c753 --- /dev/null +++ b/nx-X11/programs/Xserver/hw/sun/sunCursor.c @@ -0,0 +1,281 @@ +/* $Xorg: sunCursor.c,v 1.4 2001/02/09 02:04:43 xorgcvs Exp $ */ +/* + +Copyright 1988 Sun Microsystems, Inc. +Copyright 1993, 1998 The Open Group + +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. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ +/* $XFree86: xc/programs/Xserver/hw/sun/sunCursor.c,v 3.5 2001/12/14 19:59:43 dawes Exp $ */ + +/*- + * sunCursor.c -- + * Functions for maintaining the Sun software cursor... + * + */ + +#define NEED_EVENTS +#include "sun.h" +#include "cfb.h" +#include "mfb.h" + +#ifdef FBIOGCURMAX /* has hardware cursor kernel support */ + +#define GetCursorPrivate(s) (&(GetScreenPrivate(s)->hardwareCursor)) +#define SetupCursor(s) sunCursorPtr pCurPriv = GetCursorPrivate(s) + +static void sunLoadCursor(); + +static Bool +sunRealizeCursor (pScreen, pCursor) + ScreenPtr pScreen; + CursorPtr pCursor; +{ + SetupCursor(pScreen); + int x, y; + + /* miRecolorCursor does this */ + if (pCurPriv->pCursor == pCursor) + { + miPointerPosition (&x, &y); + sunLoadCursor (pScreen, pCursor, x, y); + } + return TRUE; +} + +static Bool +sunUnrealizeCursor (pScreen, pCursor) + ScreenPtr pScreen; + CursorPtr pCursor; +{ + return TRUE; +} + +static void +sunCursorRepad (pScreen, bits, src_bits, dst_bits, ptSrc, w, h) + ScreenPtr pScreen; + CursorBitsPtr bits; + unsigned char *src_bits, *dst_bits; + DDXPointPtr ptSrc; + int w, h; +{ + PixmapPtr src, dst; + BoxRec box; + RegionRec rgnDst; + + if (!(src = GetScratchPixmapHeader(pScreen, bits->width, bits->height, + /*bpp*/ 1, /*depth*/ 1, + PixmapBytePad(bits->width,1), src_bits))) + return; + if (!(dst = GetScratchPixmapHeader(pScreen, w, h, /*bpp*/ 1, /*depth*/ 1, + PixmapBytePad(w,1), dst_bits))) + { + FreeScratchPixmapHeader(src); + return; + } + box.x1 = 0; + box.y1 = 0; + box.x2 = w; + box.y2 = h; + REGION_INIT(pScreen, &rgnDst, &box, 1); + mfbDoBitblt(&src->drawable, &dst->drawable, GXcopy, &rgnDst, ptSrc); + REGION_UNINIT(pScreen, &rgnDst); + FreeScratchPixmapHeader(src); + FreeScratchPixmapHeader(dst); +} + +static void +sunLoadCursor (pScreen, pCursor, x, y) + ScreenPtr pScreen; + CursorPtr pCursor; + int x, y; +{ + SetupCursor(pScreen); + struct fbcursor fbcursor; + int w, h; + unsigned char r[2], g[2], b[2]; + DDXPointRec ptSrc; + unsigned char source_temp[1024], mask_temp[1024]; + + fbcursor.set = FB_CUR_SETALL; + fbcursor.enable = 1; + fbcursor.pos.x = x; + fbcursor.pos.y = y; + fbcursor.hot.x = pCursor->bits->xhot; + fbcursor.hot.y = pCursor->bits->yhot; + r[0] = pCursor->backRed >> 8; + g[0] = pCursor->backGreen >> 8; + b[0] = pCursor->backBlue >> 8; + r[1] = pCursor->foreRed >> 8; + g[1] = pCursor->foreGreen >> 8; + b[1] = pCursor->foreBlue >> 8; + fbcursor.cmap.index = 0; + fbcursor.cmap.count = 2; + fbcursor.cmap.red = r; + fbcursor.cmap.green = g; + fbcursor.cmap.blue = b; + fbcursor.image = (char *) pCursor->bits->source; + fbcursor.mask = (char *) pCursor->bits->mask; + w = pCursor->bits->width; + h = pCursor->bits->height; + if (w > pCurPriv->width || h > pCurPriv->height) { + ptSrc.x = 0; + ptSrc.y = 0; + if (w > pCurPriv->width) + w = pCurPriv->width; + if (h > pCurPriv->height) + h = pCurPriv->height; + sunCursorRepad (pScreen, pCursor->bits, pCursor->bits->source, + source_temp, &ptSrc, w, h); + sunCursorRepad (pScreen, pCursor->bits, pCursor->bits->mask, + mask_temp, &ptSrc, w, h); + fbcursor.image = (char *) source_temp; + fbcursor.mask = (char *) mask_temp; + } + fbcursor.size.x = w; + fbcursor.size.y = h; +#ifndef Lynx + (void) ioctl (sunFbs[pScreen->myNum].fd, FBIOSCURSOR, &fbcursor); +#else + (void) sunIoctl (&sunFbs[pScreen->myNum], FBIOSCURSOR, &fbcursor); +#endif +} + +static void +sunSetCursor (pScreen, pCursor, x, y) + ScreenPtr pScreen; + CursorPtr pCursor; + int x, y; +{ + SetupCursor(pScreen); + + if (pCursor) + sunLoadCursor (pScreen, pCursor, x, y); + else + sunDisableCursor (pScreen); + pCurPriv->pCursor = pCursor; +} + +static void +sunMoveCursor (pScreen, x, y) + ScreenPtr pScreen; + int x, y; +{ + struct fbcurpos pos; + + pos.x = x; + pos.y = y; +#ifndef Lynx + ioctl (sunFbs[pScreen->myNum].fd, FBIOSCURPOS, &pos); +#else + sunIoctl (&sunFbs[pScreen->myNum], FBIOSCURPOS, &pos); +#endif +} + +miPointerSpriteFuncRec sunPointerSpriteFuncs = { + sunRealizeCursor, + sunUnrealizeCursor, + sunSetCursor, + sunMoveCursor, +}; + +static void +sunQueryBestSize (class, pwidth, pheight, pScreen) + int class; + unsigned short *pwidth, *pheight; + ScreenPtr pScreen; +{ + SetupCursor (pScreen); + + switch (class) + { + case CursorShape: + if (*pwidth > pCurPriv->width) + *pwidth = pCurPriv->width; + if (*pheight > pCurPriv->height) + *pheight = pCurPriv->height; + if (*pwidth > pScreen->width) + *pwidth = pScreen->width; + if (*pheight > pScreen->height) + *pheight = pScreen->height; + break; + default: + mfbQueryBestSize (class, pwidth, pheight, pScreen); + break; + } +} + +extern miPointerScreenFuncRec sunPointerScreenFuncs; + +#endif + +Bool sunCursorInitialize ( + ScreenPtr pScreen) +{ +#ifdef FBIOGCURMAX + SetupCursor (pScreen); + struct fbcurpos maxsize; + + pCurPriv->has_cursor = FALSE; +#ifndef Lynx + if (ioctl (sunFbs[pScreen->myNum].fd, FBIOGCURMAX, &maxsize) == -1) +#else + if (sunIoctl (&sunFbs[pScreen->myNum], FBIOGCURMAX, &maxsize) == -1) +#endif + return FALSE; + pCurPriv->width = maxsize.x; + pCurPriv->height= maxsize.y; + pScreen->QueryBestSize = sunQueryBestSize; + miPointerInitialize (pScreen, + &sunPointerSpriteFuncs, + &sunPointerScreenFuncs, + FALSE); + pCurPriv->has_cursor = TRUE; + pCurPriv->pCursor = NULL; + return TRUE; +#else + return FALSE; +#endif +} + +void sunDisableCursor ( + ScreenPtr pScreen) +{ +#ifdef FBIOGCURMAX + SetupCursor (pScreen); + struct fbcursor fbcursor; + + if (pCurPriv->has_cursor) + { + fbcursor.set = FB_CUR_SETCUR; + fbcursor.enable = 0; +#ifndef Lynx + (void) ioctl (sunFbs[pScreen->myNum].fd, FBIOSCURSOR, &fbcursor); +#else + (void) sunIoctl (&sunFbs[pScreen->myNum], FBIOSCURSOR, &fbcursor); +#endif + pCurPriv->pCursor = NULL; + } +#endif +} -- cgit v1.2.3