* Sync to trunk HEAD (r53473).
[reactos.git] / drivers / video / displays / framebufacc / enable.c
1 /*
2 * ReactOS Generic Framebuffer display driver
3 *
4 * Copyright (C) 2004 Filip Navara
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21 #include "framebufacc.h"
22
23 static DRVFN DrvFunctionTable[] =
24 {
25 {INDEX_DrvEnablePDEV, (PFN)DrvEnablePDEV},
26 {INDEX_DrvCompletePDEV, (PFN)DrvCompletePDEV},
27 {INDEX_DrvDisablePDEV, (PFN)DrvDisablePDEV},
28 {INDEX_DrvEnableSurface, (PFN)DrvEnableSurface},
29 {INDEX_DrvDisableSurface, (PFN)DrvDisableSurface},
30 {INDEX_DrvAssertMode, (PFN)DrvAssertMode},
31 {INDEX_DrvGetModes, (PFN)DrvGetModes},
32 {INDEX_DrvSetPalette, (PFN)DrvSetPalette},
33 {INDEX_DrvSetPointerShape, (PFN)DrvSetPointerShape},
34 {INDEX_DrvMovePointer, (PFN)DrvMovePointer}
35
36 };
37
38 /*
39 * DrvEnableDriver
40 *
41 * Initial driver entry point exported by the driver DLL. It fills in a
42 * DRVENABLEDATA structure with the driver's DDI version number and the
43 * calling addresses of all DDI functions supported by the driver.
44 *
45 * Status
46 * @implemented
47 */
48
49 BOOL APIENTRY
50 DrvEnableDriver(
51 ULONG iEngineVersion,
52 ULONG cj,
53 PDRVENABLEDATA pded)
54 {
55 if (cj >= sizeof(DRVENABLEDATA))
56 {
57 pded->c = sizeof(DrvFunctionTable) / sizeof(DRVFN);
58 pded->pdrvfn = DrvFunctionTable;
59 pded->iDriverVersion = DDI_DRIVER_VERSION_NT5;
60 return TRUE;
61 }
62 else
63 {
64 return FALSE;
65 }
66 }
67
68 /*
69 * DrvEnablePDEV
70 *
71 * Returns a description of the physical device's characteristics to GDI.
72 *
73 * Status
74 * @implemented
75 */
76
77 DHPDEV APIENTRY
78 DrvEnablePDEV(
79 IN DEVMODEW *pdm,
80 IN LPWSTR pwszLogAddress,
81 IN ULONG cPat,
82 OUT HSURF *phsurfPatterns,
83 IN ULONG cjCaps,
84 OUT ULONG *pdevcaps,
85 IN ULONG cjDevInfo,
86 OUT DEVINFO *pdi,
87 IN HDEV hdev,
88 IN LPWSTR pwszDeviceName,
89 IN HANDLE hDriver)
90 {
91 PPDEV ppdev;
92 GDIINFO GdiInfo;
93 DEVINFO DevInfo;
94 ULONG returnedDataLength = 0;
95
96 ppdev = EngAllocMem(FL_ZERO_MEMORY, sizeof(PDEV), ALLOC_TAG);
97 if (ppdev == NULL)
98 {
99 return NULL;
100 }
101
102 ppdev->hDriver = hDriver;
103
104 if (!IntInitScreenInfo(ppdev, pdm, &GdiInfo, &DevInfo))
105 {
106 EngFreeMem(ppdev);
107 return NULL;
108 }
109
110 /* hw mouse pointer */
111
112 ppdev->pPointerAttributes = NULL;
113 ppdev->PointerAttributesSize = 0;
114
115 /* Test see if the driver support hw mouse or not */
116 if (!EngDeviceIoControl(ppdev->hDriver,
117 IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES,
118 NULL,
119 sizeof(PVIDEO_MODE),
120 &ppdev->PointerCapabilities,
121 sizeof(VIDEO_POINTER_CAPABILITIES),
122 &returnedDataLength))
123 {
124 /* Test see if we got a hw mouse or not */
125 if ( (ppdev->PointerCapabilities.Flags & VIDEO_MODE_MONO_POINTER) ||
126 (ppdev->PointerCapabilities.Flags & VIDEO_MODE_COLOR_POINTER) )
127 {
128 /* determent the hw mouse mode */
129 if (!(ppdev->PointerCapabilities.Flags & VIDEO_MODE_ASYNC_POINTER))
130 {
131 DevInfo.flGraphicsCaps &= ~GCAPS_ASYNCMOVE;
132 }
133 else
134 {
135 DevInfo.flGraphicsCaps |= GCAPS_ASYNCMOVE;
136 }
137 }
138 }
139
140 /* setup paletted */
141 if (!IntInitDefaultPalette(ppdev, &DevInfo))
142 {
143 EngFreeMem(ppdev);
144 return NULL;
145 }
146
147 memcpy(pdi, &DevInfo, min(sizeof(DEVINFO), cjDevInfo));
148 memcpy(pdevcaps, &GdiInfo, min(sizeof(GDIINFO), cjCaps));
149
150 return (DHPDEV)ppdev;
151 }
152
153 /*
154 * DrvCompletePDEV
155 *
156 * Stores the GDI handle (hdev) of the physical device in dhpdev. The driver
157 * should retain this handle for use when calling GDI services.
158 *
159 * Status
160 * @implemented
161 */
162
163 VOID APIENTRY
164 DrvCompletePDEV(
165 IN DHPDEV dhpdev,
166 IN HDEV hdev)
167 {
168 ((PPDEV)dhpdev)->hDevEng = hdev;
169 }
170
171 /*
172 * DrvDisablePDEV
173 *
174 * Release the resources allocated in DrvEnablePDEV. If a surface has been
175 * enabled DrvDisableSurface will have already been called.
176 *
177 * Status
178 * @implemented
179 */
180
181 VOID APIENTRY
182 DrvDisablePDEV(
183 IN DHPDEV dhpdev)
184 {
185 if (((PPDEV)dhpdev)->DefaultPalette)
186 {
187 EngDeletePalette(((PPDEV)dhpdev)->DefaultPalette);
188 }
189
190 if (((PPDEV)dhpdev)->PaletteEntries != NULL)
191 {
192 EngFreeMem(((PPDEV)dhpdev)->PaletteEntries);
193 }
194
195 EngFreeMem(dhpdev);
196 }