192 lines
6.8 KiB
Plaintext
192 lines
6.8 KiB
Plaintext
|
CURSOR.NOTES
|
||
|
|
||
|
This file describes how to add hardware cursor support to a chipset
|
||
|
driver. Though the cursor support itself is in the ramdac module,
|
||
|
cursor management is separate from the rest of the module.
|
||
|
|
||
|
|
||
|
1) CURSOR INITIALIZATION AND SHUTDOWN
|
||
|
|
||
|
All relevant prototypes and defines are in xf86Cursor.h.
|
||
|
|
||
|
To initialize the cursor, the driver should allocate an
|
||
|
xf86CursorInfoRec via xf86CreateCursorInfoRec(), fill it out as described
|
||
|
later in this document and pass it to xf86InitCursor(). xf86InitCursor()
|
||
|
must be called _after_ the software cursor initialization (usually
|
||
|
miDCInitialize).
|
||
|
|
||
|
When shutting down, the driver should free the xf86CursorInfoRec
|
||
|
structure in its CloseScreen function via xf86DestroyCursorInfoRec().
|
||
|
|
||
|
|
||
|
2) FILLING OUT THE xf86CursorInfoRec
|
||
|
|
||
|
The driver informs the ramdac module of it's hardware cursor capablities by
|
||
|
filling out an xf86CursorInfoRec structure and passing it to xf86InitCursor().
|
||
|
The xf86CursorInfoRec contains the following function pointers:
|
||
|
|
||
|
|
||
|
/**** These functions are required ****/
|
||
|
|
||
|
void ShowCursor(ScrnInfoPtr pScrn)
|
||
|
|
||
|
ShowCursor should display the current cursor.
|
||
|
|
||
|
void HideCursor(ScrnInfoPtr pScrn)
|
||
|
|
||
|
HideCursor should hide the current cursor.
|
||
|
|
||
|
void SetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
|
||
|
|
||
|
Set the cursor position to (x,y). X and/or y may be negative
|
||
|
indicating that the cursor image is partially offscreen on
|
||
|
the left and/or top edges of the screen. It is up to the
|
||
|
driver to trap for this and deal with that situation.
|
||
|
|
||
|
void SetCursorColors(ScrnInfoPtr pScrn, int bg, int fg)
|
||
|
|
||
|
Set the cursor foreground and background colors. In 8bpp, fg and
|
||
|
bg are indicies into the current colormap unless the
|
||
|
HARDWARE_CURSOR_TRUECOLOR_AT_8BPP flag is set. In that case
|
||
|
and in all other bpps the fg and bg are in 8-8-8 RGB format.
|
||
|
|
||
|
void LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *bits)
|
||
|
|
||
|
LoadCursorImage is how the hardware cursor bits computed by the
|
||
|
RealizeCursor function will be passed to the driver when the cursor
|
||
|
shape needs to be changed.
|
||
|
|
||
|
|
||
|
/**** These functions are optional ****/
|
||
|
|
||
|
|
||
|
unsigned char* RealizeCursor(xf86CursorInfoPtr infoPtr, CursorPtr pCurs)
|
||
|
|
||
|
If RealizeCursor is not provided by the driver, one will be provided
|
||
|
for you based on the Flags field described below. The driver must
|
||
|
provide this function if the hardware cursor format is not one of
|
||
|
the common ones supported by this module.
|
||
|
|
||
|
|
||
|
Bool UseHWCursor(ScreenPtr pScreen, CursorPtr pCurs)
|
||
|
|
||
|
If the driver is unable to use a hardware cursor for reasons
|
||
|
other than the cursor being larger than the maximum specified
|
||
|
in the MaxWidth or MaxHeight field below, it can supply the
|
||
|
UseHWCursor function. If UseHWCursor is provided by the driver,
|
||
|
it will be called whenever the cursor shape changes or the video
|
||
|
mode changes. This is useful for when the hardware cursor cannot
|
||
|
be used in interlaced or doublescan modes.
|
||
|
|
||
|
|
||
|
/**** The following fields are required ****/
|
||
|
|
||
|
MaxWidth
|
||
|
MaxHeight
|
||
|
|
||
|
These indicate the largest sized cursor that can be a hardware
|
||
|
cursor. It will fall back to a software cursor when a cursor
|
||
|
exceeding this size needs to be used.
|
||
|
|
||
|
|
||
|
Flags
|
||
|
|
||
|
/* Color related flags */
|
||
|
|
||
|
HARDWARE_CURSOR_TRUECOLOR_AT_8BPP
|
||
|
|
||
|
This indicates that the colors passed to the SetCursorColors
|
||
|
function should not be in 8-8-8 RGB format in 8bpp but rather,
|
||
|
they should be the pixel values from the current colormap.
|
||
|
|
||
|
|
||
|
/* Cursor data loading flags */
|
||
|
|
||
|
HARDWARE_CURSOR_SHOW_TRANSPARENT
|
||
|
|
||
|
The HideCursor entry will normally be called instead of displaying a
|
||
|
completely transparent cursor, or when a switch to a software cursor
|
||
|
needs to occur. This flag prevents this behaviour, thus causing the
|
||
|
LoadCursorImage entry to be called with transparent cursor data.
|
||
|
NOTE: If you use this flag and provide your own RealizeCursor() entry,
|
||
|
ensure this entry returns transparent cursor data when called
|
||
|
with a NULL pCurs parameter.
|
||
|
|
||
|
HARDWARE_CURSOR_UPDATE_UNHIDDEN
|
||
|
|
||
|
This flag prevents the HideCursor call that would normally occur just before
|
||
|
the LoadCursorImage entry is to be called to load a new hardware cursor
|
||
|
image.
|
||
|
|
||
|
|
||
|
/* Cursor data packing flags */
|
||
|
|
||
|
Hardware cursor data consists of two pieces, a source and a mask.
|
||
|
The mask is a bitmap indicating which parts of the cursor are
|
||
|
transparent and which parts are drawn. The source is a bitmap
|
||
|
indicating which parts of the non-transparent portion of the the
|
||
|
cursor should be painted in the foreground color and which should
|
||
|
be painted in the background color.
|
||
|
|
||
|
HARDWARE_CURSOR_INVERT_MASK
|
||
|
|
||
|
By default, set bits indicate the opaque part of the mask bitmap
|
||
|
and clear bits indicate the transparent part. If your hardware
|
||
|
wants this the opposite way, this flag will invert the mask.
|
||
|
|
||
|
HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK
|
||
|
|
||
|
By default, RealizeCursor will store the source first and then
|
||
|
the mask. If the hardware needs this order reversed then this
|
||
|
flag should be set.
|
||
|
|
||
|
HARDWARE_CURSOR_AND_SOURCE_WITH_MASK
|
||
|
|
||
|
This flag will have the module logical AND the source with the mask to make
|
||
|
sure there are no source bits set if the corresponding mask bits
|
||
|
aren't set. Some hardware will not care if source bits are set where
|
||
|
there are supposed to be transparent areas, but some hardware will
|
||
|
interpret this as a third cursor color or similar. That type of
|
||
|
hardware will need this flag set.
|
||
|
|
||
|
HARDWARE_CURSOR_BIT_ORDER_MSBFIRST
|
||
|
|
||
|
By default, it is assumed that the least significant bit in each byte
|
||
|
corresponds to the leftmost pixel on the screen. If your hardware
|
||
|
has this reversed you should set this flag.
|
||
|
|
||
|
HARDWARE_CURSOR_NIBBLE_SWAPPED
|
||
|
|
||
|
If your hardware requires byte swapping of the hardware cursor, enable
|
||
|
this option.
|
||
|
|
||
|
|
||
|
/* Source-Mask interleaving flags */
|
||
|
|
||
|
By default the source and mask data are inlined (source first unless
|
||
|
the HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK flag is set). Some hardware
|
||
|
will require the source and mask to be interleaved, that is, X number
|
||
|
of source bits should packed and then X number of mask bits repeating
|
||
|
until the entire pattern is stored. The following flags describe the
|
||
|
bit interleave.
|
||
|
|
||
|
HARDWARE_CURSOR_SOURCE_MASK_NOT_INTERLEAVED
|
||
|
|
||
|
This one is the default.
|
||
|
|
||
|
The following are for interleaved cursors.
|
||
|
|
||
|
HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1
|
||
|
HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_8
|
||
|
HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_16
|
||
|
HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32
|
||
|
HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64
|
||
|
|
||
|
And once again, if your hardware requires something different than
|
||
|
these packing styles, your driver can supply its own RealizeCursor
|
||
|
function.
|
||
|
|
||
|
|
||
|
|
||
|
$XFree86: xc/programs/Xserver/hw/xfree86/ramdac/CURSOR.NOTES,v 1.4tsi Exp $
|