diff options
Diffstat (limited to 'hw/kdrive/src/kshadow.c')
-rw-r--r-- | hw/kdrive/src/kshadow.c | 52 |
1 files changed, 41 insertions, 11 deletions
diff --git a/hw/kdrive/src/kshadow.c b/hw/kdrive/src/kshadow.c index 9642bab30..f4b593f26 100644 --- a/hw/kdrive/src/kshadow.c +++ b/hw/kdrive/src/kshadow.c @@ -28,29 +28,59 @@ #include "kdrive.h" Bool -KdShadowScreenInit (KdScreenInfo *screen) +KdShadowFbAlloc (KdScreenInfo *screen, int fb, Bool rotate) { + int paddedWidth; void *buf; + int width = rotate ? screen->height : screen->width; + int height = rotate ? screen->width : screen->height; + int bpp = screen->fb[fb].bitsPerPixel; - buf = shadowAlloc (screen->width, screen->height, screen->fb[0].bitsPerPixel); + /* use fb computation for width */ + paddedWidth = ((width * bpp + FB_MASK) >> FB_SHIFT) * sizeof (FbBits); + buf = xalloc (paddedWidth * height); if (!buf) return FALSE; - screen->fb[0].frameBuffer = buf; - screen->fb[0].byteStride = BitmapBytePad (screen->width * screen->fb[0].bitsPerPixel); - screen->fb[0].pixelStride = screen->fb[0].byteStride * 8 / screen->fb[0].bitsPerPixel; - screen->dumb = TRUE; + if (screen->fb[fb].shadow) + xfree (screen->fb[fb].frameBuffer); + screen->fb[fb].shadow = TRUE; + screen->fb[fb].frameBuffer = buf; + screen->fb[fb].byteStride = paddedWidth; + screen->fb[fb].pixelStride = paddedWidth * 8 / bpp; return TRUE; } +void +KdShadowFbFree (KdScreenInfo *screen, int fb) +{ + if (screen->fb[fb].shadow) + { + xfree (screen->fb[fb].frameBuffer); + screen->fb[fb].frameBuffer = 0; + screen->fb[fb].shadow = FALSE; + } +} + Bool -KdShadowInitScreen (ScreenPtr pScreen, ShadowUpdateProc update, ShadowWindowProc window) +KdShadowSet (ScreenPtr pScreen, int randr, ShadowUpdateProc update, ShadowWindowProc window) { - return shadowInit (pScreen, update, window); + KdScreenPriv(pScreen); + KdScreenInfo *screen = pScreenPriv->screen; + int fb; + + for (fb = 0; fb < KD_MAX_FB && screen->fb[fb].depth; fb++) + { + if (screen->fb[fb].shadow) + return shadowSet (pScreen, (*pScreen->GetScreenPixmap) (pScreen), + update, window, randr, 0); + else + shadowUnset (pScreen); + } + return TRUE; } void -KdShadowScreenFini (KdScreenInfo *screen) +KdShadowUnset (ScreenPtr pScreen) { - if (screen->fb[0].frameBuffer) - xfree (screen->fb[0].frameBuffer); + shadowUnset (pScreen); } |