diff -ru ../xc/programs/Xserver/hw/xfree86/fbdevhw/fbdevhw.c xc/programs/Xserver/hw/xfree86/fbdevhw/fbdevhw.c --- ../xc/programs/Xserver/hw/xfree86/fbdevhw/fbdevhw.c Mon Jul 3 09:04:53 2000 +++ xc/programs/Xserver/hw/xfree86/fbdevhw/fbdevhw.c Mon Aug 21 12:01:10 2000 @@ -419,6 +419,13 @@ } int +fbdevHWGetLineLength(ScrnInfoPtr pScrn) +{ + fbdevHWPtr fPtr = FBDEVHWPTR(pScrn); + return fPtr->fix.line_length; +} + +int fbdevHWGetType(ScrnInfoPtr pScrn) { fbdevHWPtr fPtr = FBDEVHWPTR(pScrn); diff -ru ../xc/programs/Xserver/hw/xfree86/fbdevhw/fbdevhw.h xc/programs/Xserver/hw/xfree86/fbdevhw/fbdevhw.h --- ../xc/programs/Xserver/hw/xfree86/fbdevhw/fbdevhw.h Sun May 28 01:32:00 2000 +++ xc/programs/Xserver/hw/xfree86/fbdevhw/fbdevhw.h Mon Aug 21 11:57:01 2000 @@ -14,6 +14,7 @@ char* fbdevHWGetName(ScrnInfoPtr pScrn); int fbdevHWGetDepth(ScrnInfoPtr pScrn); +int fbdevHWGetLineLength(ScrnInfoPtr pScrn); int fbdevHWGetType(ScrnInfoPtr pScrn); int fbdevHWGetVidmem(ScrnInfoPtr pScrn); diff -ru ../xc/programs/Xserver/hw/xfree86/drivers/fbdev/fbdev.c xc/programs/Xserver/hw/xfree86/drivers/fbdev/fbdev.c --- ../xc/programs/Xserver/hw/xfree86/drivers/fbdev/fbdev.c Sun Jun 18 16:23:22 2000 +++ xc/programs/Xserver/hw/xfree86/drivers/fbdev/fbdev.c Mon Aug 21 14:36:29 2000 @@ -138,6 +138,7 @@ "fbdevHWGetName", "fbdevHWGetDepth", + "fbdevHWGetLineLength", "fbdevHWGetVidmem", /* colormap */ @@ -426,7 +427,14 @@ if (NULL == pScrn->modes) fbdevHWUseBuildinMode(pScrn); pScrn->currentMode = pScrn->modes; - pScrn->displayWidth = pScrn->virtualX; /* FIXME: might be wrong */ + + if (fPtr->shadowFB) + pScrn->displayWidth = pScrn->virtualX; /* ShadowFB handles this correctly */ + else + /* FIXME: this doesn't work for all cases, e.g. when each scanline + has a padding which is independent from the depth (controlfb) */ + pScrn->displayWidth = fbdevHWGetLineLength(pScrn)/(fbdevHWGetDepth(pScrn) >> 3); + xf86PrintModes(pScrn); /* Set display resolution */ @@ -512,7 +520,7 @@ unsigned char *src, *dst; Bpp = pScrn->bitsPerPixel >> 3; - FBPitch = pScrn->displayWidth * Bpp; + FBPitch = fbdevHWGetLineLength(pScrn); while(num--) { width = (pbox->x2 - pbox->x1) * Bpp;