ReactOS 0.4.15-dev-7942-gd23573b
pointer.c File Reference
#include <vgaddi.h>
Include dependency graph for pointer.c:

Go to the source code of this file.

Functions

static VOID VGADDI_HideCursor (PPDEV ppdev)
 
static VOID VGADDI_ShowCursor (PPDEV ppdev, PRECTL prcl)
 
VOID VGADDI_BltPointerToVGA (IN LONG StartX, IN LONG StartY, IN ULONG SizeX, IN ULONG SizeY, IN PUCHAR MaskBits, IN ULONG MaskPitch, IN ULONG MaskOp)
 
BOOL InitPointer (PPDEV ppdev)
 
VOID APIENTRY DrvMovePointer (IN SURFOBJ *pso, IN LONG x, IN LONG y, IN PRECTL prcl)
 
ULONG APIENTRY DrvSetPointerShape (IN SURFOBJ *pso, IN SURFOBJ *psoMask, IN SURFOBJ *psoColor, IN XLATEOBJ *pxlo, IN LONG xHot, IN LONG yHot, IN LONG x, IN LONG y, IN PRECTL prcl, IN ULONG fl)
 
static VOID FASTCALL VGADDI_ComputePointerRect (IN PPDEV ppdev, IN LONG X, IN LONG Y, IN PRECTL Rect)
 

Function Documentation

◆ DrvMovePointer()

VOID APIENTRY DrvMovePointer ( IN SURFOBJ pso,
IN LONG  x,
IN LONG  y,
IN PRECTL  prcl 
)

Definition at line 175 of file pointer.c.

180{
181 PPDEV ppdev = (PPDEV)pso->dhpdev;
182
183 VGADDI_HideCursor(ppdev);
184
185 if(x != -1)
186 {
187 ppdev->pPointerAttributes->Column = x;
188 ppdev->pPointerAttributes->Row = y;
189
190 VGADDI_ShowCursor(ppdev, prcl);
191 }
192}
struct _PDEV * PPDEV
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
Definition: framebuf.h:34
PVIDEO_POINTER_ATTRIBUTES pPointerAttributes
Definition: vgaddi.h:117
static VOID VGADDI_HideCursor(PPDEV ppdev)
Definition: pointer.c:298
static VOID VGADDI_ShowCursor(PPDEV ppdev, PRECTL prcl)
Definition: pointer.c:322
_In_ HANDLE _In_ SURFOBJ * pso
Definition: winddi.h:3665
_In_ ULONG _In_ CLIPOBJ _In_ RECTL * prcl
Definition: winddi.h:3531

◆ DrvSetPointerShape()

ULONG APIENTRY DrvSetPointerShape ( IN SURFOBJ pso,
IN SURFOBJ psoMask,
IN SURFOBJ psoColor,
IN XLATEOBJ pxlo,
IN LONG  xHot,
IN LONG  yHot,
IN LONG  x,
IN LONG  y,
IN PRECTL  prcl,
IN ULONG  fl 
)

Definition at line 196 of file pointer.c.

207{
208 PPDEV ppdev = (PPDEV)pso->dhpdev;
209 ULONG NewWidth, NewHeight;
210 PUCHAR Src, Dest;
211 ULONG i;
212
213 if (!psoMask)
214 return SPS_DECLINE;
215
216 /* Hide the cursor */
217 VGADDI_HideCursor(ppdev);
218
219 NewWidth = abs(psoMask->lDelta) << 3;
220 NewHeight = (psoMask->cjBits / abs(psoMask->lDelta)) / 2;
221
222 /* Reallocate the space for the cursor if necessary. */
223 if (ppdev->pPointerAttributes->Width != NewWidth ||
224 ppdev->pPointerAttributes->Height != NewHeight)
225 {
226 ULONG PointerAttributesSize;
227 PVIDEO_POINTER_ATTRIBUTES NewPointerAttributes;
228 ULONG SavedMemSize;
229
230 /* Determine the size of the pointer attributes */
231 PointerAttributesSize = sizeof(VIDEO_POINTER_ATTRIBUTES) +
232 ((NewWidth * NewHeight * 2) >> 3);
233
234 /* Allocate memory for pointer attributes */
235 NewPointerAttributes = EngAllocMem(0, PointerAttributesSize, ALLOC_TAG);
236 *NewPointerAttributes = *ppdev->pPointerAttributes;
237 NewPointerAttributes->Width = NewWidth;
238 NewPointerAttributes->Height = NewHeight;
239 NewPointerAttributes->WidthInBytes = NewWidth >> 3;
241 ppdev->pPointerAttributes = NewPointerAttributes;
242
243 /* Reallocate the space for the saved bits. */
245 SavedMemSize = ((((NewWidth + 7) & ~0x7) + 16) * NewHeight) >> 3;
246 ppdev->ImageBehindCursor = VGADDI_AllocSavedScreenBits(SavedMemSize);
247 }
248
249 Src = (PUCHAR)psoMask->pvScan0;
250 /* Copy the new cursor in. */
251 for (i = 0; i < (NewHeight * 2); i++)
252 {
253 Dest = (PUCHAR)ppdev->pPointerAttributes->Pixels;
254 if (i >= NewHeight)
255 Dest += (((NewHeight * 3) - i - 1) * (NewWidth >> 3));
256 else
257 Dest += ((NewHeight - i - 1) * (NewWidth >> 3));
258 memcpy(Dest, Src, NewWidth >> 3);
259 Src += psoMask->lDelta;
260 }
261
262 /* Set the new cursor position */
263 ppdev->xyHotSpot.x = xHot;
264 ppdev->xyHotSpot.y = yHot;
265
266 if(x != -1)
267 {
268 ppdev->pPointerAttributes->Column = x;
269 ppdev->pPointerAttributes->Row = y;
270
271 /* show the cursor */
272 VGADDI_ShowCursor(ppdev, prcl);
273 }
274
276}
#define ALLOC_TAG
Definition: btrfs_drv.h:87
#define abs(i)
Definition: fconv.c:206
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
if(dx< 0)
Definition: linetemp.h:194
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define for
Definition: utility.h:88
struct _VIDEO_POINTER_ATTRIBUTES VIDEO_POINTER_ATTRIBUTES
PSAVED_SCREEN_BITS VGADDI_AllocSavedScreenBits(ULONG Size)
Definition: offscreen.c:121
VOID VGADDI_FreeSavedScreenBits(PSAVED_SCREEN_BITS SavedBits)
Definition: offscreen.c:87
#define EngFreeMem
Definition: polytest.cpp:56
void * EngAllocMem(int zero, unsigned long size, int tag=0)
Definition: polytest.cpp:70
PSAVED_SCREEN_BITS ImageBehindCursor
Definition: vgaddi.h:118
XYPAIR xyHotSpot
Definition: vgaddi.h:114
USHORT x
Definition: vgaddi.h:85
USHORT y
Definition: vgaddi.h:86
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
_In_opt_ SURFOBJ _In_opt_ SURFOBJ _In_ XLATEOBJ _In_ LONG xHot
Definition: winddi.h:4052
_In_opt_ SURFOBJ _In_opt_ SURFOBJ _In_ XLATEOBJ _In_ LONG _In_ LONG yHot
Definition: winddi.h:4053
#define SPS_ACCEPT_NOEXCLUDE
Definition: winddi.h:4030
_In_opt_ SURFOBJ _In_opt_ SURFOBJ * psoMask
Definition: winddi.h:3434
#define SPS_DECLINE
Definition: winddi.h:4029

◆ InitPointer()

BOOL InitPointer ( PPDEV  ppdev)

Definition at line 143 of file pointer.c.

144{
145 ULONG CursorWidth = 32, CursorHeight = 32;
146 ULONG PointerAttributesSize;
147 ULONG SavedMemSize;
148
149 ppdev->xyHotSpot.x = 0;
150 ppdev->xyHotSpot.y = 0;
151
152 /* Determine the size of the pointer attributes */
153 PointerAttributesSize = sizeof(VIDEO_POINTER_ATTRIBUTES) +
154 ((CursorWidth * CursorHeight * 2) >> 3);
155
156 /* Allocate memory for pointer attributes */
157 ppdev->pPointerAttributes = EngAllocMem(0, PointerAttributesSize, ALLOC_TAG);
158
159 ppdev->pPointerAttributes->Flags = 0; /* FIXME: Do this right */
160 ppdev->pPointerAttributes->Width = CursorWidth;
161 ppdev->pPointerAttributes->Height = CursorHeight;
162 ppdev->pPointerAttributes->WidthInBytes = CursorWidth >> 3;
163 ppdev->pPointerAttributes->Enable = 0;
164 ppdev->pPointerAttributes->Column = 0;
165 ppdev->pPointerAttributes->Row = 0;
166
167 /* Allocate memory for the pixels behind the cursor */
168 SavedMemSize = ((((CursorWidth + 7) & ~0x7) + 16) * CursorHeight) >> 3;
169 ppdev->ImageBehindCursor = VGADDI_AllocSavedScreenBits(SavedMemSize);
170
171 return TRUE;
172}
#define TRUE
Definition: types.h:120

Referenced by DrvAssertMode(), and DrvEnableSurface().

◆ VGADDI_BltPointerToVGA()

VOID VGADDI_BltPointerToVGA ( IN LONG  StartX,
IN LONG  StartY,
IN ULONG  SizeX,
IN ULONG  SizeY,
IN PUCHAR  MaskBits,
IN ULONG  MaskPitch,
IN ULONG  MaskOp 
)

Definition at line 21 of file pointer.c.

29{
30 ULONG DestX, EndX, DestY, EndY;
31 UCHAR Mask;
32 PUCHAR Video;
33 PUCHAR Src;
34 UCHAR SrcValue;
35 ULONG i, j;
36 ULONG Left;
38 LONG Bits;
39
40 DestX = StartX < 0 ? 0 : StartX;
41 DestY = StartY < 0 ? 0 : StartY;
42 EndX = StartX + SizeX;
43 EndY = StartY + SizeY;
44
45 /* Set write mode zero. */
48
49 /* Select raster op. */
52
53 if ((DestX % 8) != 0)
54 {
55 /* Disable writes to pixels outside of the destination rectangle. */
56 Mask = (1 << (8 - (DestX % 8))) - 1;
57 if ((EndX - DestX) < (8 - (DestX % 8)))
58 {
59 Mask &= ~((1 << (8 - (EndX % 8))) - 1);
60 }
63
64 /* Write the mask. */
65 Video = (PUCHAR)vidmem + DestY * 80 + (DestX >> 3);
66 Src = MaskBits + (SizeY - (DestY - StartY)) * MaskPitch;
67 for (i = DestY; i < EndY; i++, Video += 80)
68 {
69 Src -= MaskPitch;
70 SrcValue = (*Src) >> (DestX % 8);
72 WRITE_REGISTER_UCHAR(Video, SrcValue);
73 }
74 }
75
76 /* Enable writes to all pixels. */
79
80 /* Have we finished. */
81 if ((EndX - DestX) < (8 - (DestX % 8)))
82 return;
83
84 /* Fill any whole rows of eight pixels. */
85 Left = (DestX + 7) & ~0x7;
86 Length = (EndX >> 3) - (Left >> 3);
87 Bits = StartX;
88 while (Bits < 0)
89 Bits += 8;
90 Bits = Bits % 8;
91 for (i = DestY; i < EndY; i++)
92 {
93 Video = (PUCHAR)vidmem + i * 80 + (Left >> 3);
94 Src = MaskBits + (EndY - i - 1) * MaskPitch + ((DestX - StartX) >> 3);
95 for (j = 0; j < Length; j++, Video++, Src++)
96 {
97 if (Bits != 0)
98 {
99 SrcValue = (Src[0] << (8 - Bits));
100 SrcValue |= (Src[1] >> Bits);
101 }
102 else
103 {
104 SrcValue = Src[0];
105 }
107 WRITE_REGISTER_UCHAR(Video, SrcValue);
108 }
109 }
110
111 /* Fill any pixels on the right which don't fall into a complete row. */
112 if ((EndX % 8) != 0)
113 {
114 /* Disable writes to pixels outside the destination rectangle. */
115 Mask = ~((1 << (8 - (EndX % 8))) - 1);
118
119 Video = (PUCHAR)vidmem + DestY * 80 + (EndX >> 3);
120 Src = MaskBits + (SizeY - (DestY - StartY)) * MaskPitch + (SizeX >> 3) - 1;
121 for (i = DestY; i < EndY; i++, Video += 80)
122 {
123 Src -= MaskPitch;
124 SrcValue = (Src[0] << (8 - Bits));
126 WRITE_REGISTER_UCHAR(Video, SrcValue);
127 }
128
129 /* Restore the default write masks. */
132 }
133
134 /* Set write mode two. */
137
138 /* Select raster op replace. */
141}
#define VOID
Definition: acefi.h:82
#define GRA_D
Definition: vgavideo.h:60
#define GRA_I
Definition: vgavideo.h:59
unsigned int Mask
Definition: fpcontrol.c:82
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define WRITE_PORT_UCHAR(p, d)
Definition: pc98vid.h:21
long LONG
Definition: pedump.c:60
PBYTE vidmem
Definition: vgavideo.c:18
NTKERNELAPI VOID NTAPI WRITE_REGISTER_UCHAR(IN PUCHAR Register, IN UCHAR Value)
NTKERNELAPI UCHAR NTAPI READ_REGISTER_UCHAR(IN PUCHAR Register)
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by VGADDI_ShowCursor().

◆ VGADDI_ComputePointerRect()

static VOID FASTCALL VGADDI_ComputePointerRect ( IN PPDEV  ppdev,
IN LONG  X,
IN LONG  Y,
IN PRECTL  Rect 
)
static

Definition at line 279 of file pointer.c.

284{
285 ULONG SizeX, SizeY;
286
287 SizeX = min(((X + (LONG)ppdev->pPointerAttributes->Width) + 7) & ~0x7, ppdev->sizeSurf.cx);
288 SizeX -= (X & ~0x7);
289 SizeY = min((LONG)ppdev->pPointerAttributes->Height, ppdev->sizeSurf.cy - Y);
290
291 Rect->left = max(X, 0) & ~0x7;
292 Rect->top = max(Y, 0);
293 Rect->right = Rect->left + SizeX;
294 Rect->bottom = Rect->top + SizeY;
295}
#define Y(I)
#define min(a, b)
Definition: monoChain.cc:55
#define max(a, b)
Definition: svc.c:63

Referenced by VGADDI_HideCursor(), and VGADDI_ShowCursor().

◆ VGADDI_HideCursor()

static VOID VGADDI_HideCursor ( PPDEV  ppdev)
static

Definition at line 298 of file pointer.c.

299{
300 if(ppdev->pPointerAttributes->Enable)
301 {
302 LONG cx, cy;
303 RECTL Rect;
304
305 ppdev->pPointerAttributes->Enable = 0;
306
307 cx = ppdev->pPointerAttributes->Column - ppdev->xyHotSpot.x;
308 cy = ppdev->pPointerAttributes->Row - ppdev->xyHotSpot.y;
309
311
312 /* Display what was behind cursor */
314 Rect.top,
315 ppdev->ImageBehindCursor,
316 Rect.right - Rect.left,
317 Rect.bottom - Rect.top);
318 }
319}
VOID VGADDI_BltFromSavedScreenBits(IN ULONG DestX, IN ULONG DestY, IN PSAVED_SCREEN_BITS Src, IN ULONG SizeX, IN ULONG SizeY)
Definition: offscreen.c:20
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
static VOID FASTCALL VGADDI_ComputePointerRect(IN PPDEV ppdev, IN LONG X, IN LONG Y, IN PRECTL Rect)
Definition: pointer.c:279

Referenced by DrvMovePointer(), and DrvSetPointerShape().

◆ VGADDI_ShowCursor()

static VOID VGADDI_ShowCursor ( PPDEV  ppdev,
PRECTL  prcl 
)
static

Definition at line 322 of file pointer.c.

323{
324 LONG cx, cy;
325 PUCHAR AndMask, XorMask;
326 ULONG SizeX, SizeY;
327 RECTL Rect;
328
329 if(ppdev->pPointerAttributes->Enable)
330 return;
331
332 /* Mark the cursor as currently displayed. */
333 ppdev->pPointerAttributes->Enable = 1;
334
335 cx = ppdev->pPointerAttributes->Column - ppdev->xyHotSpot.x;
336 cy = ppdev->pPointerAttributes->Row - ppdev->xyHotSpot.y;
337
338 /* Capture pixels behind the cursor */
340
342 Rect.left,
343 Rect.top,
344 Rect.right - Rect.left,
345 Rect.bottom - Rect.top);
346
347 /* Display the cursor. */
348 SizeX = min((LONG)ppdev->pPointerAttributes->Width, ppdev->sizeSurf.cx - cx);
349 SizeY = min((LONG)ppdev->pPointerAttributes->Height, ppdev->sizeSurf.cy - cy);
350 AndMask = ppdev->pPointerAttributes->Pixels +
351 (ppdev->pPointerAttributes->Height - SizeY) * ppdev->pPointerAttributes->WidthInBytes;
353 cy,
354 SizeX,
355 SizeY,
356 AndMask,
358 VGA_AND);
359 XorMask = AndMask +
363 cy,
364 SizeX,
365 SizeY,
366 XorMask,
368 VGA_XOR);
369
370 if (NULL != prcl)
371 *prcl = Rect;
372}
#define VGA_AND
Definition: vgavideo.h:8
#define VGA_XOR
Definition: vgavideo.h:10
#define NULL
Definition: types.h:112
VOID VGADDI_BltToSavedScreenBits(IN PSAVED_SCREEN_BITS Dest, IN ULONG SourceX, IN ULONG SourceY, IN ULONG SizeX, IN ULONG SizeY)
Definition: offscreen.c:53
SIZEL sizeSurf
Definition: vgaddi.h:136
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
VOID VGADDI_BltPointerToVGA(IN LONG StartX, IN LONG StartY, IN ULONG SizeX, IN ULONG SizeY, IN PUCHAR MaskBits, IN ULONG MaskPitch, IN ULONG MaskOp)
Definition: pointer.c:21

Referenced by DrvMovePointer(), and DrvSetPointerShape().