diff options
Diffstat (limited to 'src/gx_cursor.c')
-rw-r--r-- | src/gx_cursor.c | 335 |
1 files changed, 335 insertions, 0 deletions
diff --git a/src/gx_cursor.c b/src/gx_cursor.c new file mode 100644 index 0000000..bec7fde --- /dev/null +++ b/src/gx_cursor.c @@ -0,0 +1,335 @@ +/* Copyright (c) 2003-2006 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * 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 + * AUTHORS OR COPYRIGHT HOLDERS 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. + * + * Neither the name of the Advanced Micro Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * */ + +/* + * File Contents: Xfree cursor implementation routines for geode HWcursor + * init.setting cursor color,image etc. are done here. + * + * Project: Geode Xfree Frame buffer device driver. + * */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Pci.h" +#include "xf86PciInfo.h" +#include "geode.h" + +/* Forward declarations of the functions */ +static void GXSetCursorColors(ScrnInfoPtr pScrni, int bg, int fg); +static void GXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y); +static Bool GXUseHWCursor(ScreenPtr pScrn, CursorPtr pCurs); +extern void GXSetVideoPosition(int x, int y, int width, int height, + short src_w, short src_h, short drw_w, + short drw_h, int id, int offset, ScrnInfoPtr pScrn); + +/*---------------------------------------------------------------------------- + * GXHWCursorInit. + * + * Description :This function sets the cursor information by probing the + * hardware. + * + * Parameters. + * pScrn :Screeen pointer structure. + * + * Returns :TRUE on success and FALSE on Failure + * + * Comments :Geode supports the hardware_cursor,no need to enable SW + * cursor. + *---------------------------------------------------------------------------- + */ +Bool +GXHWCursorInit(ScreenPtr pScrn) +{ + ScrnInfoPtr pScrni = xf86Screens[pScrn->myNum]; + GeodeRec *pGeode = GEODEPTR(pScrni); + xf86CursorInfoPtr infoPtr; + + infoPtr = xf86CreateCursorInfoRec(); + if (!infoPtr) + return FALSE; + /* the geode structure is intiallized with the cursor infoRec */ + pGeode->CursorInfo = infoPtr; + infoPtr->MaxWidth = 32; + infoPtr->MaxHeight = 32; + /* seeting up the cursor flags */ + infoPtr->Flags = HARDWARE_CURSOR_BIT_ORDER_MSBFIRST | + HARDWARE_CURSOR_TRUECOLOR_AT_8BPP | + HARDWARE_CURSOR_SOURCE_MASK_NOT_INTERLEAVED; + /* cursor info ptr is intiallized with the values obtained from + * * durnago calls + */ + infoPtr->SetCursorColors = GXSetCursorColors; + infoPtr->SetCursorPosition = GXSetCursorPosition; + infoPtr->LoadCursorImage = GXLoadCursorImage; + infoPtr->HideCursor = GXHideCursor; + infoPtr->ShowCursor = GXShowCursor; + infoPtr->UseHWCursor = GXUseHWCursor; + return (xf86InitCursor(pScrn, infoPtr)); +} + +/*---------------------------------------------------------------------------- + * GXSetCursorColors. + * + * Description :This function sets the cursor foreground and background + * colors + * Parameters: + * pScrn: Screeen pointer structure. + * bg: Specifies the color value of cursor background color. + * fg: Specifies the color value of cursor foreground color. + * + * Returns: none. + * + * Comments: The integer color value passed by this function is + * converted into * RGB value by the gfx_set_color routines. + *---------------------------------------------------------------------------- + */ +static void +GXSetCursorColors(ScrnInfoPtr pScrni, int bg, int fg) +{ + GFX(set_cursor_colors(bg, fg)); +} + +/*---------------------------------------------------------------------------- + * GXSetCursorPosition. + * + * Description :This function sets the cursor co -ordinates and enable the + * cursor. + * + * Parameters: + * pScrn: Screeen pointer structure. + * x: Specifies the x-cordinates of the cursor. + * y: Specifies the y co-ordinate of the cursor. + * + * Returns: none. + * + *---------------------------------------------------------------------------- + */ +static void +GXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y) +{ + static unsigned long panOffset = 0; + GeodeRec *pGeode = GEODEPTR(pScrni); + int savex, savey; + int newX, newY; + + /* Adjust xf86HWCursor messing about */ + + savex = x + pScrni->frameX0; + savey = y + pScrni->frameY0; + + switch(pGeode->rotation) { + default: + ErrorF("%s:%d invalid rotation %d\n", __func__, __LINE__, pGeode->rotation); + case RR_Rotate_0: + newX = savex; newY = savey; + break; + + case RR_Rotate_90: + newX = savey; + newY = pScrni->pScreen->width - savex; + break; + + case RR_Rotate_180: + newX = pScrni->pScreen->width - savex; + newY = pScrni->pScreen->height - savey; + break; + + case RR_Rotate_270: + newX = pScrni->pScreen->height - savey; + newY = savex; + break; + } + + newX += pScrni->frameX0; + newY += pScrni->frameY0; + + //ErrorF("Turned (%d,%d) into (%d,%d)\n", x,y,newX, newY); + + if (newX < -31) + newX = -31; + if (newY < -31) + newY = -31; + + gfx_set_cursor_position(pGeode->CursorStartOffset, newX + 31, newY + 31, + 31, 31); + gfx_set_cursor_enable(1); + + if ((pGeode->OverlayON) && (pGeode->Panel)) { + pGeode->PrevDisplayOffset = gfx_get_display_offset(); + if (pGeode->PrevDisplayOffset != panOffset) { + GXSetVideoPosition(pGeode->video_x, pGeode->video_y, + pGeode->video_w, pGeode->video_h, + pGeode->video_srcw, pGeode->video_srch, + pGeode->video_dstw, pGeode->video_dsth, + pGeode->video_id, pGeode->video_offset, + pGeode->video_scrnptr); + panOffset = pGeode->PrevDisplayOffset; + } + } +} + +/*---------------------------------------------------------------------------- + * GXLoadCursorImage + * + * Description: This function loads the 32x32 cursor pattern.The shape + * and color is set by AND and XOR masking of arrays of 32 + * DWORD. + * Parameters: + * pScrn: Screeen pointer structure. + * src: Specifies cursor data. + * + * Returns: none + * + *---------------------------------------------------------------------------- + */ +void +GXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src) +{ + int i, n, x, y, newX, newY; + unsigned long andMask[32], xorMask[32]; + GeodeRec *pGeode = GEODEPTR(pScrni); + unsigned long mskb, rowb; + unsigned char *rowp = &src[0]; + unsigned char *mskp = &src[128]; + + if (src != NULL) { + mskb = rowb = 0; + for (y = 32; --y >= 0;) + andMask[y] = xorMask[y] = 0; + for (y = 0; y < 32; ++y) { + for (x = 0; x < 32; ++x) { + if ((i = x & 7) == 0) { + rowb = (*rowp & *mskp); + mskb = ~(*mskp); + ++rowp; + ++mskp; + } + + switch(pGeode->rotation) { + default: + ErrorF("%s:%d invalid rotation %d\n", __func__, __LINE__, + pGeode->rotation); + case RR_Rotate_0: + newX = x; + newY = y; + break; + case RR_Rotate_90: + newX = y; + newY = 31 - x; + break; + case RR_Rotate_180: + newX = 31 - x; + newY = 31 - y; + break; + case RR_Rotate_270: + newX = 31 - y; + newY = x; + break; + } + + i = 7 - i; + n = 31 - newX; + andMask[newY] |= (((mskb >> i) & 1) << n); + xorMask[newY] |= (((rowb >> i) & 1) << n); + } + } + } else { + for (y = 32; --y >= 0;) { + andMask[y] = ~0; + xorMask[y] = 0; + } + } + + gfx_set_cursor_shape32(pGeode->CursorStartOffset, &andMask[0], + &xorMask[0]); +} + +/*---------------------------------------------------------------------------- + * GXHideCursor. + * + * Description: This function will disable the cursor. + * + * Parameters: + * pScrn: Handles to the Screeen pointer structure. + * + * Returns: none. + * + * Comments: gfx_set_cursor enable function is hardcoded to disable + * the cursor. + *---------------------------------------------------------------------------- + */ +void +GXHideCursor(ScrnInfoPtr pScrni) +{ + gfx_set_cursor_enable(0); +} + +/*---------------------------------------------------------------------------- + * GXShowCursor + * + * Description :This function will enable the cursor. + * + * Parameters: + * pScrn :Handles to the Screeen pointer structure. + * + * Returns :none + * + * Comments :gfx_set_cursor enable function is hardcoded to enable the + * cursor + *---------------------------------------------------------------------------- + */ +void +GXShowCursor(ScrnInfoPtr pScrni) +{ + GFX(set_cursor_enable(1)); +} + +/*---------------------------------------------------------------------------- + * GXUseHwCursor. + * + * Description :This function will sets the hardware cursor flag in + * pscreen structure. + * + * Parameters. + * pScrn :Handles to the Screeen pointer structure. + * + * Returns :none + * + * Comments :none + * + *---------------------------------------------------------------------------- + */ +static Bool +GXUseHWCursor(ScreenPtr pScrn, CursorPtr pCurs) +{ + ScrnInfoPtr pScrni = XF86SCRNINFO(pScrn); + GeodeRec *pGeode = GEODEPTR(pScrni); + + return pGeode->HWCursor; +} |