1 /*
2 * Copyright © 2004 Keith Packard
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of Keith Packard not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission. Keith Packard makes no
11 * representations about the suitability of this software for any purpose. It
12 * is provided "as is" without express or implied warranty.
13 *
14 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
21 */
23 #ifdef HAVE_CONFIG_H
24 #include <kdrive-config.h>
25 #endif
26 #include "fake.h"
28 extern int KdTsPhyScreen;
30 Bool
31 fakeInitialize (KdCardInfo *card, FakePriv *priv)
32 {
33 priv->base = 0;
34 priv->bytes_per_line = 0;
35 return TRUE;
36 }
38 Bool
39 fakeCardInit (KdCardInfo *card)
40 {
41 FakePriv *priv;
43 priv = (FakePriv *) malloc(sizeof (FakePriv));
44 if (!priv)
45 return FALSE;
47 if (!fakeInitialize (card, priv))
48 {
49 free(priv);
50 return FALSE;
51 }
52 card->driver = priv;
54 return TRUE;
55 }
57 Bool
58 fakeScreenInitialize (KdScreenInfo *screen, FakeScrPriv *scrpriv)
59 {
60 if (!screen->width || !screen->height)
61 {
62 screen->width = 1024;
63 screen->height = 768;
64 screen->rate = 72;
65 }
67 if (screen->width <= 0)
68 screen->width = 1;
69 if (screen->height <= 0)
70 screen->height = 1;
72 if (!screen->fb.depth)
73 screen->fb.depth = 16;
75 if (screen->fb.depth <= 8)
76 {
77 screen->fb.visuals = ((1 << StaticGray) |
78 (1 << GrayScale) |
79 (1 << StaticColor) |
80 (1 << PseudoColor) |
81 (1 << TrueColor) |
82 (1 << DirectColor));
83 }
84 else
85 {
86 screen->fb.visuals = (1 << TrueColor);
87 #define Mask(o,l) (((1 << l) - 1) << o)
88 if (screen->fb.depth <= 15)
89 {
90 screen->fb.depth = 15;
91 screen->fb.bitsPerPixel = 16;
92 screen->fb.redMask = Mask (10, 5);
93 screen->fb.greenMask = Mask (5, 5);
94 screen->fb.blueMask = Mask (0, 5);
95 }
96 else if (screen->fb.depth <= 16)
97 {
98 screen->fb.depth = 16;
99 screen->fb.bitsPerPixel = 16;
100 screen->fb.redMask = Mask (11, 5);
101 screen->fb.greenMask = Mask (5, 6);
102 screen->fb.blueMask = Mask (0, 5);
103 }
104 else
105 {
106 screen->fb.depth = 24;
107 screen->fb.bitsPerPixel = 32;
108 screen->fb.redMask = Mask (16, 8);
109 screen->fb.greenMask = Mask (8, 8);
110 screen->fb.blueMask = Mask (0, 8);
111 }
112 }
114 scrpriv->randr = screen->randr;
116 return fakeMapFramebuffer (screen);
117 }
119 Bool
120 fakeScreenInit (KdScreenInfo *screen)
121 {
122 FakeScrPriv *scrpriv;
124 scrpriv = calloc(1, sizeof (FakeScrPriv));
125 if (!scrpriv)
126 return FALSE;
127 screen->driver = scrpriv;
128 if (!fakeScreenInitialize (screen, scrpriv))
129 {
130 screen->driver = 0;
131 free(scrpriv);
132 return FALSE;
133 }
134 return TRUE;
135 }
137 void *
138 fakeWindowLinear (ScreenPtr pScreen,
139 CARD32 row,
140 CARD32 offset,
141 int mode,
142 CARD32 *size,
143 void *closure)
144 {
145 KdScreenPriv(pScreen);
146 FakePriv *priv = pScreenPriv->card->driver;
148 if (!pScreenPriv->enabled)
149 return 0;
150 *size = priv->bytes_per_line;
151 return priv->base + row * priv->bytes_per_line;
152 }
154 Bool
155 fakeMapFramebuffer (KdScreenInfo *screen)
156 {
157 FakeScrPriv *scrpriv = screen->driver;
158 KdPointerMatrix m;
159 FakePriv *priv = screen->card->driver;
161 if (scrpriv->randr != RR_Rotate_0)
162 scrpriv->shadow = TRUE;
163 else
164 scrpriv->shadow = FALSE;
166 KdComputePointerMatrix (&m, scrpriv->randr, screen->width, screen->height);
168 KdSetPointerMatrix (&m);
170 priv->bytes_per_line = ((screen->width * screen->fb.bitsPerPixel + 31) >> 5) << 2;
171 free(priv->base);
172 priv->base = malloc (priv->bytes_per_line * screen->height);
174 if (scrpriv->shadow)
175 {
176 if (!KdShadowFbAlloc (screen, scrpriv->randr & (RR_Rotate_90|RR_Rotate_270)))
177 return FALSE;
178 }
179 else
180 {
181 screen->fb.byteStride = priv->bytes_per_line;
182 screen->fb.pixelStride = (priv->bytes_per_line * 8/
183 screen->fb.bitsPerPixel);
184 screen->fb.frameBuffer = (CARD8 *) (priv->base);
185 }
187 return TRUE;
188 }
190 void
191 fakeSetScreenSizes (ScreenPtr pScreen)
192 {
193 KdScreenPriv(pScreen);
194 KdScreenInfo *screen = pScreenPriv->screen;
195 FakeScrPriv *scrpriv = screen->driver;
197 if (scrpriv->randr & (RR_Rotate_0|RR_Rotate_180))
198 {
199 pScreen->width = screen->width;
200 pScreen->height = screen->height;
201 pScreen->mmWidth = screen->width_mm;
202 pScreen->mmHeight = screen->height_mm;
203 }
204 else
205 {
206 pScreen->width = screen->width;
207 pScreen->height = screen->height;
208 pScreen->mmWidth = screen->height_mm;
209 pScreen->mmHeight = screen->width_mm;
210 }
211 }
213 Bool
214 fakeUnmapFramebuffer (KdScreenInfo *screen)
215 {
216 FakePriv *priv = screen->card->driver;
217 KdShadowFbFree (screen);
218 free(priv->base);
219 priv->base = NULL;
220 return TRUE;
221 }
223 Bool
224 fakeSetShadow (ScreenPtr pScreen)
225 {
226 KdScreenPriv(pScreen);
227 KdScreenInfo *screen = pScreenPriv->screen;
228 FakeScrPriv *scrpriv = screen->driver;
229 ShadowUpdateProc update;
230 ShadowWindowProc window;
232 window = fakeWindowLinear;
233 update = 0;
234 if (scrpriv->randr)
235 update = shadowUpdateRotatePacked;
236 else
237 update = shadowUpdatePacked;
238 return KdShadowSet (pScreen, scrpriv->randr, update, window);
239 }
242 #ifdef RANDR
243 Bool
244 fakeRandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
245 {
246 KdScreenPriv(pScreen);
247 KdScreenInfo *screen = pScreenPriv->screen;
248 FakeScrPriv *scrpriv = screen->driver;
249 RRScreenSizePtr pSize;
250 Rotation randr;
251 int n;
253 *rotations = RR_Rotate_All|RR_Reflect_All;
255 for (n = 0; n < pScreen->numDepths; n++)
256 if (pScreen->allowedDepths[n].numVids)
257 break;
258 if (n == pScreen->numDepths)
259 return FALSE;
261 pSize = RRRegisterSize (pScreen,
262 screen->width,
263 screen->height,
264 screen->width_mm,
265 screen->height_mm);
267 randr = KdSubRotation (scrpriv->randr, screen->randr);
269 RRSetCurrentConfig (pScreen, randr, 0, pSize);
271 return TRUE;
272 }
274 Bool
275 fakeRandRSetConfig (ScreenPtr pScreen,
276 Rotation randr,
277 int rate,
278 RRScreenSizePtr pSize)
279 {
280 KdScreenPriv(pScreen);
281 KdScreenInfo *screen = pScreenPriv->screen;
282 FakeScrPriv *scrpriv = screen->driver;
283 Bool wasEnabled = pScreenPriv->enabled;
284 FakeScrPriv oldscr;
285 int oldwidth;
286 int oldheight;
287 int oldmmwidth;
288 int oldmmheight;
289 int newwidth, newheight;
291 if (screen->randr & (RR_Rotate_0|RR_Rotate_180))
292 {
293 newwidth = pSize->width;
294 newheight = pSize->height;
295 }
296 else
297 {
298 newwidth = pSize->height;
299 newheight = pSize->width;
300 }
302 if (wasEnabled)
303 KdDisableScreen (pScreen);
305 oldscr = *scrpriv;
307 oldwidth = screen->width;
308 oldheight = screen->height;
309 oldmmwidth = pScreen->mmWidth;
310 oldmmheight = pScreen->mmHeight;
312 /*
313 * Set new configuration
314 */
316 scrpriv->randr = KdAddRotation (screen->randr, randr);
318 fakeUnmapFramebuffer (screen);
320 if (!fakeMapFramebuffer (screen))
321 goto bail4;
323 KdShadowUnset (screen->pScreen);
325 if (!fakeSetShadow (screen->pScreen))
326 goto bail4;
328 fakeSetScreenSizes (screen->pScreen);
330 /*
331 * Set frame buffer mapping
332 */
333 (*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap (pScreen),
334 pScreen->width,
335 pScreen->height,
336 screen->fb.depth,
337 screen->fb.bitsPerPixel,
338 screen->fb.byteStride,
339 screen->fb.frameBuffer);
341 /* set the subpixel order */
343 KdSetSubpixelOrder (pScreen, scrpriv->randr);
344 if (wasEnabled)
345 KdEnableScreen (pScreen);
347 return TRUE;
349 bail4:
350 fakeUnmapFramebuffer (screen);
351 *scrpriv = oldscr;
352 (void) fakeMapFramebuffer (screen);
353 pScreen->width = oldwidth;
354 pScreen->height = oldheight;
355 pScreen->mmWidth = oldmmwidth;
356 pScreen->mmHeight = oldmmheight;
358 if (wasEnabled)
359 KdEnableScreen (pScreen);
360 return FALSE;
361 }
363 Bool
364 fakeRandRInit (ScreenPtr pScreen)
365 {
366 rrScrPrivPtr pScrPriv;
368 if (!RRScreenInit (pScreen))
369 return FALSE;
371 pScrPriv = rrGetScrPriv(pScreen);
372 pScrPriv->rrGetInfo = fakeRandRGetInfo;
373 pScrPriv->rrSetConfig = fakeRandRSetConfig;
374 return TRUE;
375 }
376 #endif
378 Bool
379 fakeCreateColormap (ColormapPtr pmap)
380 {
381 return fbInitializeColormap (pmap);
382 }
384 Bool
385 fakeInitScreen (ScreenPtr pScreen)
386 {
387 #ifdef TOUCHSCREEN
388 KdTsPhyScreen = pScreen->myNum;
389 #endif
391 pScreen->CreateColormap = fakeCreateColormap;
392 return TRUE;
393 }
395 Bool
396 fakeFinishInitScreen (ScreenPtr pScreen)
397 {
398 if (!shadowSetup (pScreen))
399 return FALSE;
401 #ifdef RANDR
402 if (!fakeRandRInit (pScreen))
403 return FALSE;
404 #endif
406 return TRUE;
407 }
410 Bool
411 fakeCreateResources (ScreenPtr pScreen)
412 {
413 return fakeSetShadow (pScreen);
414 }
416 void
417 fakePreserve (KdCardInfo *card)
418 {
419 }
421 Bool
422 fakeEnable (ScreenPtr pScreen)
423 {
424 return TRUE;
425 }
427 Bool
428 fakeDPMS (ScreenPtr pScreen, int mode)
429 {
430 return TRUE;
431 }
433 void
434 fakeDisable (ScreenPtr pScreen)
435 {
436 }
438 void
439 fakeRestore (KdCardInfo *card)
440 {
441 }
443 void
444 fakeScreenFini (KdScreenInfo *screen)
445 {
446 }
448 void
449 fakeCardFini (KdCardInfo *card)
450 {
451 FakePriv *priv = card->driver;
453 free (priv->base);
454 free(priv);
455 }
457 void
458 fakeGetColors (ScreenPtr pScreen, int n, xColorItem *pdefs)
459 {
460 while (n--)
461 {
462 pdefs->red = 0;
463 pdefs->green = 0;
464 pdefs->blue = 0;
465 pdefs++;
466 }
467 }
469 void
470 fakePutColors (ScreenPtr pScreen, int n, xColorItem *pdefs)
471 {
472 }