summaryrefslogtreecommitdiff
path: root/src/lx_cursor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lx_cursor.c')
-rw-r--r--src/lx_cursor.c196
1 files changed, 30 insertions, 166 deletions
diff --git a/src/lx_cursor.c b/src/lx_cursor.c
index f97c271..64ea9c9 100644
--- a/src/lx_cursor.c
+++ b/src/lx_cursor.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2003-2007 Advanced Micro Devices, Inc.
+/* Copyright (c) 2003-2008 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
@@ -28,193 +28,57 @@
#endif
#include "xf86.h"
-#include "xf86_OSproc.h"
-#include "xf86Pci.h"
-#include "xf86PciInfo.h"
+#include "xf86i2c.h"
+#include "xf86Crtc.h"
#include "geode.h"
-/* Forward declarations of the functions */
-static void LXSetCursorColors(ScrnInfoPtr pScrni, int bg, int fg);
-static void LXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y);
-static Bool LXUseHWCursor(ScreenPtr pScrn, CursorPtr pCurs);
-extern void LXSetVideoPosition(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);
-
Bool
-LXHWCursorInit(ScreenPtr pScrn)
+LXCursorInit(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 |
+ return xf86_cursors_init(pScrn, 32, 32,
HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
- HARDWARE_CURSOR_SOURCE_MASK_NOT_INTERLEAVED;
-
- infoPtr->SetCursorColors = LXSetCursorColors;
- infoPtr->SetCursorPosition = LXSetCursorPosition;
- infoPtr->LoadCursorImage = LXLoadCursorImage;
- infoPtr->HideCursor = LXHideCursor;
- infoPtr->ShowCursor = LXShowCursor;
- infoPtr->UseHWCursor = LXUseHWCursor;
-
- return (xf86InitCursor(pScrn, infoPtr));
+ HARDWARE_CURSOR_INVERT_MASK |
+ HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
+ HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32);
}
-static void
-LXSetCursorColors(ScrnInfoPtr pScrni, int bg, int fg)
+static int
+_getrow(unsigned char *src, int stride, int x, int y)
{
- vg_set_mono_cursor_colors(bg, fg);
+ x = ((x & ~31) << 1) | (x & 31);
+ src += y * stride;
+ return (src[x >> 3] >> (x & 7)) & 1;
}
-static void
-LXSetCursorPosition(ScrnInfoPtr pScrni, int x, int y)
+static int
+_getmask(unsigned char *src, int stride, int x, int y)
{
- GeodeRec *pGeode = GEODEPTR(pScrni);
- int savex, savey;
- int newX, newY;
- int hsx, hsy;
-
- /* 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;
- hsx = 31;
- hsy = 31;
- break;
-
- case RR_Rotate_270:
- newX = savey;
- newY = pScrni->pScreen->width - savex;
- hsx = 31;
- hsy = 0;
- break;
-
- case RR_Rotate_180:
- newX = pScrni->pScreen->width - savex;
- newY = pScrni->pScreen->height - savey;
- hsx = 0;
- hsy = 0;
- break;
-
- case RR_Rotate_90:
- newX = pScrni->pScreen->height - savey;
- newY = savex;
- hsx = 0;
- hsy = 31;
- break;
- }
-
- newX -= pScrni->frameX0;
- newY -= pScrni->frameY0;
-
- {
- VG_PANNING_COORDINATES panning;
-
- vg_set_cursor_position(newX + hsx, newY + hsy, &panning);
- }
-
- vg_set_cursor_enable(1);
-
- /* FIXME: Adjust for video panning? */
+ x = ((x & ~31) << 1) | (1 << 5) | (x & 31);
+ src += y * stride;
+ return (src[x >> 3] >> (x & 7)) & 1;
}
void
LXLoadCursorImage(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;
- }
+ unsigned long andMask[32], xorMask[32];
+ int y, x;
- 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_270:
- newX = y;
- newY = 31 - x;
- break;
- case RR_Rotate_180:
- newX = 31 - x;
- newY = 31 - y;
- break;
- case RR_Rotate_90:
- newX = 31 - y;
- newY = x;
- break;
- }
+ for (y = 0; y < 32; y++) {
+ andMask[y] = (src) ? 0 : ~0;
+ xorMask[y] = 0;
+ }
- i = 7 - i;
- n = 31 - newX;
- andMask[newY] |= (((mskb >> i) & 1) << n);
- xorMask[newY] |= (((rowb >> i) & 1) << n);
+ if (src != NULL) {
+ for (y = 0; y < 32; y++) {
+ for (x = 0; x < 32; x++) {
+ xorMask[y] |= _getrow(src, 8, x, y) << (31 - x);
+ andMask[y] |= _getmask(src, 8, x, y) << (31 - x);
}
}
- } else {
- for (y = 32; --y >= 0;) {
- andMask[y] = ~0;
- xorMask[y] = 0;
- }
}
vg_set_mono_cursor_shape32(pGeode->CursorStartOffset, &andMask[0],
- &xorMask[0], 31, 31);
-}
-
-void
-LXHideCursor(ScrnInfoPtr pScrni)
-{
- vg_set_cursor_enable(0);
-}
-
-void
-LXShowCursor(ScrnInfoPtr pScrni)
-{
- vg_set_cursor_enable(1);
-}
-
-static Bool
-LXUseHWCursor(ScreenPtr pScrn, CursorPtr pCurs)
-{
- ScrnInfoPtr pScrni = XF86SCRNINFO(pScrn);
- GeodeRec *pGeode = GEODEPTR(pScrni);
-
- return pGeode->HWCursor;
+ &xorMask[0], 32, 32);
}