1/*
2	Copyright 2010 Haiku, Inc.  All rights reserved.
3	Distributed under the terms of the MIT license.
4
5	Authors:
6	Gerald Zajac 2010
7*/
8
9
10#include "accelerant.h"
11#include "3dfx.h"
12
13#include <string.h>
14
15
16
17void
18TDFX_ShowCursor(bool bShow)
19{
20	// Turn cursor on/off.
21
22	uint32 config = INREG32(VIDEO_PROC_CONFIG);
23	if (bShow)
24		config |= CURSOR_ENABLE;
25	else
26		config &= ~CURSOR_ENABLE;
27
28	TDFX_WaitForFifo(1);
29	OUTREG32(VIDEO_PROC_CONFIG, config);
30}
31
32
33void
34TDFX_SetCursorPosition(int x, int y)
35{
36	TDFX_WaitForFifo(1);
37	OUTREG32(HW_CURSOR_LOC, ((y + 63) << 16) | (x + 63));
38}
39
40
41bool
42TDFX_LoadCursorImage(int width, int height, uint8* andMask, uint8* xorMask)
43{
44	SharedInfo& si = *gInfo.sharedInfo;
45
46	if (andMask == NULL || xorMask == NULL)
47		return false;
48
49	uint64* fbCursor64 = (uint64*)((addr_t)si.videoMemAddr + si.cursorOffset);
50
51	// Initialize the hardware cursor as completely transparent.
52
53	for (int i = 0; i < CURSOR_BYTES; i += 16) {
54		*fbCursor64++ = ~0;		// and bits
55		*fbCursor64++ = 0;		// xor bits
56	}
57
58	// Now load the AND & XOR masks for the cursor image into the cursor
59	// buffer.  Note that a particular bit in these masks will have the
60	// following effect upon the corresponding cursor pixel:
61	//	AND  XOR	Result
62	//	 0    0		 White pixel
63	//	 0    1		 Black pixel
64	//	 1    0		 Screen color (for transparency)
65	//	 1    1		 Reverse screen color to black or white
66
67	uint8* fbCursor = (uint8*)((addr_t)si.videoMemAddr + si.cursorOffset);
68
69	for (int row = 0; row < height; row++) {
70		for (int colByte = 0; colByte < width / 8; colByte++) {
71			fbCursor[row * 16 + colByte] = *andMask++;
72			fbCursor[row * 16 + colByte + 8] = *xorMask++;
73		}
74	}
75
76	// Set the cursor colors which are white background and black foreground.
77
78	TDFX_WaitForFifo(2);
79	OUTREG32(HW_CURSOR_COLOR0, 0xffffff);
80	OUTREG32(HW_CURSOR_COLOR1, 0);
81
82	return true;
83}
84