17d5957dfSAxel Dörfler /*
21c34b9b1SAxel Dörfler * Copyright 2006-2008, Haiku, Inc. All Rights Reserved.
37d5957dfSAxel Dörfler * Distributed under the terms of the MIT License.
47d5957dfSAxel Dörfler *
57d5957dfSAxel Dörfler * Authors:
67d5957dfSAxel Dörfler * Axel Dörfler, axeld@pinc-software.de
77d5957dfSAxel Dörfler */
87d5957dfSAxel Dörfler
97d5957dfSAxel Dörfler
107d5957dfSAxel Dörfler #include "accelerant_protos.h"
117d5957dfSAxel Dörfler #include "accelerant.h"
127d5957dfSAxel Dörfler
137d5957dfSAxel Dörfler #include <string.h>
147d5957dfSAxel Dörfler
157d5957dfSAxel Dörfler
167d5957dfSAxel Dörfler status_t
intel_set_cursor_shape(uint16 width,uint16 height,uint16 hotX,uint16 hotY,uint8 * andMask,uint8 * xorMask)177d5957dfSAxel Dörfler intel_set_cursor_shape(uint16 width, uint16 height, uint16 hotX, uint16 hotY,
187d5957dfSAxel Dörfler uint8* andMask, uint8* xorMask)
197d5957dfSAxel Dörfler {
207d5957dfSAxel Dörfler if (width > 64 || height > 64)
217d5957dfSAxel Dörfler return B_BAD_VALUE;
227d5957dfSAxel Dörfler
237d5957dfSAxel Dörfler write32(INTEL_CURSOR_CONTROL, 0);
247d5957dfSAxel Dörfler // disable cursor
257d5957dfSAxel Dörfler
26*c788baedSMichael Lotz // In two-color mode, the data is ordered as follows (always 64 bit per
27*c788baedSMichael Lotz // line):
287d5957dfSAxel Dörfler // plane 1: line 0 (AND mask)
297d5957dfSAxel Dörfler // plane 0: line 0 (XOR mask)
307d5957dfSAxel Dörfler // plane 1: line 1 (AND mask)
317d5957dfSAxel Dörfler // ...
327d5957dfSAxel Dörfler //
337d5957dfSAxel Dörfler // If the planes add to the value 0x2, the corresponding pixel is
347d5957dfSAxel Dörfler // transparent, for 0x3 it inverts the background, so only the first
357d5957dfSAxel Dörfler // two palette entries will be used (since we're using the 2 color mode).
367d5957dfSAxel Dörfler
371c34b9b1SAxel Dörfler uint8* data = gInfo->shared_info->cursor_memory;
387d5957dfSAxel Dörfler uint8 byteWidth = (width + 7) / 8;
397d5957dfSAxel Dörfler
407d5957dfSAxel Dörfler for (int32 y = 0; y < height; y++) {
417d5957dfSAxel Dörfler for (int32 x = 0; x < byteWidth; x++) {
427d5957dfSAxel Dörfler data[16 * y + x] = andMask[byteWidth * y + x];
437d5957dfSAxel Dörfler data[16 * y + x + 8] = xorMask[byteWidth * y + x];
447d5957dfSAxel Dörfler }
457d5957dfSAxel Dörfler }
467d5957dfSAxel Dörfler
477d5957dfSAxel Dörfler // set palette entries to white/black
487d5957dfSAxel Dörfler write32(INTEL_CURSOR_PALETTE + 0, 0x00ffffff);
497d5957dfSAxel Dörfler write32(INTEL_CURSOR_PALETTE + 4, 0);
507d5957dfSAxel Dörfler
517d5957dfSAxel Dörfler gInfo->shared_info->cursor_format = CURSOR_FORMAT_2_COLORS;
527d5957dfSAxel Dörfler
53*c788baedSMichael Lotz write32(INTEL_CURSOR_CONTROL,
54*c788baedSMichael Lotz CURSOR_ENABLED | gInfo->shared_info->cursor_format);
559d281026SPhilippe Houdoin write32(INTEL_CURSOR_SIZE, height << 12 | width);
5628eeacfdSPhilippe Houdoin
57*c788baedSMichael Lotz write32(INTEL_CURSOR_BASE,
58*c788baedSMichael Lotz (uint32)gInfo->shared_info->physical_graphics_memory
597d5957dfSAxel Dörfler + gInfo->shared_info->cursor_buffer_offset);
607d5957dfSAxel Dörfler
617d5957dfSAxel Dörfler // changing the hot point changes the cursor position, too
627d5957dfSAxel Dörfler
637d5957dfSAxel Dörfler if (hotX != gInfo->shared_info->cursor_hot_x
647d5957dfSAxel Dörfler || hotY != gInfo->shared_info->cursor_hot_y) {
657d5957dfSAxel Dörfler int32 x = read32(INTEL_CURSOR_POSITION);
667d5957dfSAxel Dörfler int32 y = x >> 16;
677d5957dfSAxel Dörfler x &= 0xffff;
687d5957dfSAxel Dörfler
697d5957dfSAxel Dörfler if (x & CURSOR_POSITION_NEGATIVE)
707d5957dfSAxel Dörfler x = -(x & CURSOR_POSITION_MASK);
717d5957dfSAxel Dörfler if (y & CURSOR_POSITION_NEGATIVE)
727d5957dfSAxel Dörfler y = -(y & CURSOR_POSITION_MASK);
737d5957dfSAxel Dörfler
747d5957dfSAxel Dörfler x += gInfo->shared_info->cursor_hot_x;
757d5957dfSAxel Dörfler y += gInfo->shared_info->cursor_hot_y;
767d5957dfSAxel Dörfler
777d5957dfSAxel Dörfler gInfo->shared_info->cursor_hot_x = hotX;
787d5957dfSAxel Dörfler gInfo->shared_info->cursor_hot_y = hotY;
797d5957dfSAxel Dörfler
807d5957dfSAxel Dörfler intel_move_cursor(x, y);
817d5957dfSAxel Dörfler }
827d5957dfSAxel Dörfler
837d5957dfSAxel Dörfler return B_OK;
847d5957dfSAxel Dörfler }
857d5957dfSAxel Dörfler
867d5957dfSAxel Dörfler
877d5957dfSAxel Dörfler void
intel_move_cursor(uint16 _x,uint16 _y)887d5957dfSAxel Dörfler intel_move_cursor(uint16 _x, uint16 _y)
897d5957dfSAxel Dörfler {
907d5957dfSAxel Dörfler int32 x = (int32)_x - gInfo->shared_info->cursor_hot_x;
917d5957dfSAxel Dörfler int32 y = (int32)_y - gInfo->shared_info->cursor_hot_x;
927d5957dfSAxel Dörfler
937d5957dfSAxel Dörfler if (x < 0)
947d5957dfSAxel Dörfler x = -x | CURSOR_POSITION_NEGATIVE;
957d5957dfSAxel Dörfler if (y < 0)
967d5957dfSAxel Dörfler y = -y | CURSOR_POSITION_NEGATIVE;
977d5957dfSAxel Dörfler
987d5957dfSAxel Dörfler write32(INTEL_CURSOR_POSITION, (y << 16) | x);
997d5957dfSAxel Dörfler }
1007d5957dfSAxel Dörfler
1017d5957dfSAxel Dörfler
1027d5957dfSAxel Dörfler void
intel_show_cursor(bool isVisible)1037d5957dfSAxel Dörfler intel_show_cursor(bool isVisible)
1047d5957dfSAxel Dörfler {
1057d5957dfSAxel Dörfler if (gInfo->shared_info->cursor_visible == isVisible)
1067d5957dfSAxel Dörfler return;
1077d5957dfSAxel Dörfler
1087d5957dfSAxel Dörfler write32(INTEL_CURSOR_CONTROL, (isVisible ? CURSOR_ENABLED : 0)
1097d5957dfSAxel Dörfler | gInfo->shared_info->cursor_format);
110*c788baedSMichael Lotz write32(INTEL_CURSOR_BASE,
111*c788baedSMichael Lotz (uint32)gInfo->shared_info->physical_graphics_memory
1127d5957dfSAxel Dörfler + gInfo->shared_info->cursor_buffer_offset);
1137d5957dfSAxel Dörfler
1147d5957dfSAxel Dörfler gInfo->shared_info->cursor_visible = isVisible;
1157d5957dfSAxel Dörfler }
1167d5957dfSAxel Dörfler
117