Add rotation to fbdev and vesa
This commit is contained in:
parent
5ec29fe9ea
commit
f7421d8361
|
@ -21,7 +21,7 @@
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.c,v 1.4 2000/05/06 22:17:41 keithp Exp $ */
|
/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.c,v 1.5 2000/09/03 05:11:17 keithp Exp $ */
|
||||||
|
|
||||||
#include "fbdev.h"
|
#include "fbdev.h"
|
||||||
|
|
||||||
|
@ -80,19 +80,14 @@ fbdevCardInit (KdCardInfo *card)
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
fbdevScreenInit (KdScreenInfo *screen)
|
fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv)
|
||||||
{
|
{
|
||||||
FbdevPriv *priv = screen->card->driver;
|
FbdevPriv *priv = screen->card->driver;
|
||||||
Pixel allbits;
|
Pixel allbits;
|
||||||
int depth;
|
int depth;
|
||||||
|
Bool rotate;
|
||||||
|
Bool shadow;
|
||||||
|
|
||||||
screen->width = priv->var.xres;
|
|
||||||
screen->height = priv->var.yres;
|
|
||||||
screen->fb[0].depth = priv->var.bits_per_pixel;
|
|
||||||
screen->fb[0].bitsPerPixel = priv->var.bits_per_pixel;
|
|
||||||
screen->fb[0].byteStride = priv->fix.line_length;
|
|
||||||
screen->fb[0].pixelStride = (priv->fix.line_length * 8 /
|
|
||||||
priv->var.bits_per_pixel);
|
|
||||||
switch (priv->fix.visual) {
|
switch (priv->fix.visual) {
|
||||||
case FB_VISUAL_PSEUDOCOLOR:
|
case FB_VISUAL_PSEUDOCOLOR:
|
||||||
screen->fb[0].visuals = ((1 << StaticGray) |
|
screen->fb[0].visuals = ((1 << StaticGray) |
|
||||||
|
@ -121,13 +116,84 @@ fbdevScreenInit (KdScreenInfo *screen)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
screen->rate = 72;
|
screen->rate = 72;
|
||||||
|
scrpriv->rotate = ((priv->var.xres < priv->var.yres) !=
|
||||||
|
(screen->width < screen->height));
|
||||||
|
screen->fb[0].depth = priv->var.bits_per_pixel;
|
||||||
|
screen->fb[0].bitsPerPixel = priv->var.bits_per_pixel;
|
||||||
|
if (!scrpriv->rotate)
|
||||||
|
{
|
||||||
|
screen->width = priv->var.xres;
|
||||||
|
screen->height = priv->var.yres;
|
||||||
|
screen->fb[0].byteStride = priv->fix.line_length;
|
||||||
|
screen->fb[0].pixelStride = (priv->fix.line_length * 8 /
|
||||||
|
priv->var.bits_per_pixel);
|
||||||
screen->fb[0].frameBuffer = (CARD8 *) (priv->fb);
|
screen->fb[0].frameBuffer = (CARD8 *) (priv->fb);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
screen->width = priv->var.yres;
|
||||||
|
screen->height = priv->var.xres;
|
||||||
|
screen->softCursor = TRUE;
|
||||||
|
return KdShadowScreenInit (screen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool
|
||||||
|
fbdevScreenInit (KdScreenInfo *screen)
|
||||||
|
{
|
||||||
|
FbdevScrPriv *scrpriv;
|
||||||
|
|
||||||
|
scrpriv = xalloc (sizeof (FbdevScrPriv));
|
||||||
|
if (!scrpriv)
|
||||||
|
return FALSE;
|
||||||
|
if (!fbdevScreenInitialize (screen, scrpriv))
|
||||||
|
{
|
||||||
|
xfree (scrpriv);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
screen->driver = scrpriv;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
fbdevWindowLinear (ScreenPtr pScreen,
|
||||||
|
CARD32 row,
|
||||||
|
CARD32 offset,
|
||||||
|
int mode,
|
||||||
|
CARD32 *size)
|
||||||
|
{
|
||||||
|
KdScreenPriv(pScreen);
|
||||||
|
FbdevPriv *priv = pScreenPriv->card->driver;
|
||||||
|
|
||||||
|
if (!pScreenPriv->enabled)
|
||||||
|
return 0;
|
||||||
|
*size = priv->fix.line_length;
|
||||||
|
return (CARD8 *) priv->fb + row * priv->fix.line_length + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
fbdevInitScreen (ScreenPtr pScreen)
|
fbdevInitScreen (ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
|
KdScreenPriv(pScreen);
|
||||||
|
FbdevPriv *priv = pScreenPriv->card->driver;
|
||||||
|
FbdevScrPriv *scrpriv = pScreenPriv->screen->driver;
|
||||||
|
ShadowUpdateProc update;
|
||||||
|
ShadowWindowProc window;
|
||||||
|
|
||||||
|
if (scrpriv->rotate)
|
||||||
|
{
|
||||||
|
window = fbdevWindowLinear;
|
||||||
|
switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
|
||||||
|
case 8:
|
||||||
|
update = shadowUpdateRotate8; break;
|
||||||
|
case 16:
|
||||||
|
update = shadowUpdateRotate16; break;
|
||||||
|
case 32:
|
||||||
|
update = shadowUpdateRotate32; break;
|
||||||
|
}
|
||||||
|
return KdShadowInitScreen (pScreen, update, window);
|
||||||
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,7 +207,9 @@ fbdevEnable (ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
KdScreenPriv(pScreen);
|
KdScreenPriv(pScreen);
|
||||||
FbdevPriv *priv = pScreenPriv->card->driver;
|
FbdevPriv *priv = pScreenPriv->card->driver;
|
||||||
|
FbdevScrPriv *scrpriv = pScreenPriv->screen->driver;
|
||||||
int k;
|
int k;
|
||||||
|
KdMouseMatrix m;
|
||||||
|
|
||||||
priv->var.activate = FB_ACTIVATE_NOW|FB_CHANGE_CMAP_VBL;
|
priv->var.activate = FB_ACTIVATE_NOW|FB_CHANGE_CMAP_VBL;
|
||||||
|
|
||||||
|
@ -152,6 +220,17 @@ fbdevEnable (ScreenPtr pScreen)
|
||||||
perror ("FBIOPUT_VSCREENINFO");
|
perror ("FBIOPUT_VSCREENINFO");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
if (scrpriv->rotate)
|
||||||
|
{
|
||||||
|
m.matrix[0][0] = 0; m.matrix[0][1] = 1; m.matrix[0][2] = 0;
|
||||||
|
m.matrix[1][0] = -1; m.matrix[1][1] = 0; m.matrix[1][2] = pScreen->height - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m.matrix[0][0] = 1; m.matrix[0][1] = 0; m.matrix[0][2] = 0;
|
||||||
|
m.matrix[1][0] = 0; m.matrix[1][1] = 1; m.matrix[1][2] = 0;
|
||||||
|
}
|
||||||
|
KdSetMouseMatrix (&m);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.h,v 1.4 2000/05/06 22:17:42 keithp Exp $ */
|
/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.h,v 1.5 2000/09/03 05:11:17 keithp Exp $ */
|
||||||
|
|
||||||
#ifndef _FBDEV_H_
|
#ifndef _FBDEV_H_
|
||||||
#define _FBDEV_H_
|
#define _FBDEV_H_
|
||||||
|
@ -39,8 +39,13 @@ typedef struct _fbdevPriv {
|
||||||
__u16 blue[256];
|
__u16 blue[256];
|
||||||
int fd;
|
int fd;
|
||||||
char *fb;
|
char *fb;
|
||||||
|
Bool rotate;
|
||||||
} FbdevPriv;
|
} FbdevPriv;
|
||||||
|
|
||||||
|
typedef struct _fbdevScrPriv {
|
||||||
|
Bool rotate;
|
||||||
|
} FbdevScrPriv;
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
fbdevInitialize (KdCardInfo *card, FbdevPriv *priv);
|
fbdevInitialize (KdCardInfo *card, FbdevPriv *priv);
|
||||||
|
|
||||||
|
@ -50,6 +55,9 @@ fbdevCardInit (KdCardInfo *card);
|
||||||
Bool
|
Bool
|
||||||
fbdevScreenInit (KdScreenInfo *screen);
|
fbdevScreenInit (KdScreenInfo *screen);
|
||||||
|
|
||||||
|
Bool
|
||||||
|
fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv);
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
fbdevInitScreen (ScreenPtr pScreen);
|
fbdevInitScreen (ScreenPtr pScreen);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
||||||
XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/trident/Imakefile,v 1.2 2000/08/29 17:20:15 keithp Exp $
|
XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/trident/Imakefile,v 1.3 2000/09/03 05:11:20 keithp Exp $
|
||||||
KDRIVE=..
|
KDRIVE=..
|
||||||
#include "../Kdrive.tmpl"
|
#include "../Kdrive.tmpl"
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ SRCS = trident.c tridentdraw.c tridentcurs.c tridentstub.c
|
||||||
|
|
||||||
OBJS = trident.o tridentdraw.o tridentcurs.o tridentstub.o
|
OBJS = trident.o tridentdraw.o tridentcurs.o tridentstub.o
|
||||||
|
|
||||||
DEFINES = -DVESA
|
DEFINES = -DFBDEV
|
||||||
|
|
||||||
INCLUDES = -I. $(KDINCS) -I$(KDRIVE)/fbdev -I$(KDRIVE)/vesa
|
INCLUDES = -I. $(KDINCS) -I$(KDRIVE)/fbdev -I$(KDRIVE)/vesa
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.c,v 1.7 2000/08/29 17:20:15 keithp Exp $ */
|
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.c,v 1.8 2000/09/03 05:11:20 keithp Exp $ */
|
||||||
|
|
||||||
#include "trident.h"
|
#include "trident.h"
|
||||||
#define extern
|
#define extern
|
||||||
|
@ -74,7 +74,7 @@ tridentScreenInit (KdScreenInfo *screen)
|
||||||
#ifdef VESA
|
#ifdef VESA
|
||||||
if (!vesaScreenInitialize (screen, &tridents->vesa))
|
if (!vesaScreenInitialize (screen, &tridents->vesa))
|
||||||
#else
|
#else
|
||||||
if (!fbdevScreenInit (screen))
|
if (!fbdevScreenInitialize (screen, &tridents->fbdev))
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
xfree (tridents);
|
xfree (tridents);
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.h,v 1.4 2000/08/29 17:20:15 keithp Exp $ */
|
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.h,v 1.5 2000/09/03 05:11:20 keithp Exp $ */
|
||||||
|
|
||||||
#ifndef _TRIDENT_H_
|
#ifndef _TRIDENT_H_
|
||||||
#define _TRIDENT_H_
|
#define _TRIDENT_H_
|
||||||
|
@ -179,6 +179,8 @@ typedef struct _tridentCursor {
|
||||||
typedef struct _tridentScreenInfo {
|
typedef struct _tridentScreenInfo {
|
||||||
#ifdef VESA
|
#ifdef VESA
|
||||||
VesaScreenPrivRec vesa;
|
VesaScreenPrivRec vesa;
|
||||||
|
#else
|
||||||
|
FbdevScrPriv fbdev;
|
||||||
#endif
|
#endif
|
||||||
CARD8 *cursor_base;
|
CARD8 *cursor_base;
|
||||||
CARD8 *screen;
|
CARD8 *screen;
|
||||||
|
|
|
@ -29,6 +29,13 @@ Bool vesa_swap_rgb = FALSE;
|
||||||
Bool vesa_shadow = FALSE;
|
Bool vesa_shadow = FALSE;
|
||||||
Bool vesa_linear_fb = TRUE;
|
Bool vesa_linear_fb = TRUE;
|
||||||
Bool vesa_restore = FALSE;
|
Bool vesa_restore = FALSE;
|
||||||
|
Bool vesa_rotate = FALSE;
|
||||||
|
|
||||||
|
#define VesaPriv(scr) ((VesaScreenPrivPtr) (scr)->driver)
|
||||||
|
|
||||||
|
#define ScreenRotated(scr) (VesaPriv(scr)->rotate)
|
||||||
|
#define vesaWidth(scr,vmib) (ScreenRotated(scr) ? vmib->YResolution : vmib->XResolution)
|
||||||
|
#define vesaHeight(scr,vmib) (ScreenRotated(scr) ? vmib->XResolution : vmib->YResolution)
|
||||||
|
|
||||||
static Bool
|
static Bool
|
||||||
vesaModeSupported(VbeInfoPtr vi, VbeModeInfoBlock *vmib, Bool complain)
|
vesaModeSupported(VbeInfoPtr vi, VbeModeInfoBlock *vmib, Bool complain)
|
||||||
|
@ -224,8 +231,8 @@ Bool
|
||||||
vesaModeGood (KdScreenInfo *screen,
|
vesaModeGood (KdScreenInfo *screen,
|
||||||
VbeModeInfoBlock *a)
|
VbeModeInfoBlock *a)
|
||||||
{
|
{
|
||||||
if (a->XResolution <= screen->width &&
|
if (vesaWidth(screen,a) <= screen->width &&
|
||||||
a->YResolution <= screen->height &&
|
vesaHeight(screen,a) <= screen->height &&
|
||||||
vesaDepth (a) >= screen->fb[0].depth)
|
vesaDepth (a) >= screen->fb[0].depth)
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -239,8 +246,8 @@ vesaSizeError (KdScreenInfo *screen,
|
||||||
VbeModeInfoBlock *a)
|
VbeModeInfoBlock *a)
|
||||||
{
|
{
|
||||||
int xdist, ydist;
|
int xdist, ydist;
|
||||||
xdist = vabs (screen->width - a->XResolution);
|
xdist = vabs (screen->width - vesaWidth(screen,a));
|
||||||
ydist = vabs (screen->height - a->YResolution);
|
ydist = vabs (screen->height - vesaHeight(screen,a));
|
||||||
return xdist * xdist + ydist * ydist;
|
return xdist * xdist + ydist * ydist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,7 +316,12 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr)
|
||||||
VbeModeInfoBlock *vmib;
|
VbeModeInfoBlock *vmib;
|
||||||
Pixel allbits;
|
Pixel allbits;
|
||||||
int depth;
|
int depth;
|
||||||
|
int bpp;
|
||||||
|
|
||||||
|
screen->driver = pscr;
|
||||||
|
pscr->rotate = FALSE;
|
||||||
|
if (screen->width < screen->height)
|
||||||
|
pscr->rotate = TRUE;
|
||||||
pscr->mode = vesaSelectMode (screen);
|
pscr->mode = vesaSelectMode (screen);
|
||||||
if (!pscr->mode)
|
if (!pscr->mode)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -322,13 +334,8 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr)
|
||||||
|
|
||||||
vmib = &pscr->mode->vmib;
|
vmib = &pscr->mode->vmib;
|
||||||
|
|
||||||
screen->width = vmib->XResolution;
|
depth = vesaDepth (vmib);;
|
||||||
screen->height = vmib->YResolution;
|
bpp = vmib->BitsPerPixel;
|
||||||
screen->fb[0].depth = vesaDepth (vmib);
|
|
||||||
screen->fb[0].bitsPerPixel = vmib->BitsPerPixel;
|
|
||||||
screen->fb[0].byteStride = vmib->BytesPerScanLine;
|
|
||||||
screen->fb[0].pixelStride = ((vmib->BytesPerScanLine * 8) /
|
|
||||||
vmib->BitsPerPixel);
|
|
||||||
|
|
||||||
switch (vmib->MemoryModel) {
|
switch (vmib->MemoryModel) {
|
||||||
case 0x06:
|
case 0x06:
|
||||||
|
@ -347,7 +354,6 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr)
|
||||||
depth = 32;
|
depth = 32;
|
||||||
while (depth && !(allbits & (1 << (depth - 1))))
|
while (depth && !(allbits & (1 << (depth - 1))))
|
||||||
depth--;
|
depth--;
|
||||||
screen->fb[0].depth = depth;
|
|
||||||
break;
|
break;
|
||||||
case 0x04:
|
case 0x04:
|
||||||
/* PseudoColor */
|
/* PseudoColor */
|
||||||
|
@ -367,9 +373,12 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr)
|
||||||
screen->fb[0].blueMask = 0x00;
|
screen->fb[0].blueMask = 0x00;
|
||||||
screen->fb[0].greenMask = 0x00;
|
screen->fb[0].greenMask = 0x00;
|
||||||
screen->fb[0].redMask = 0x00;
|
screen->fb[0].redMask = 0x00;
|
||||||
screen->fb[0].depth = 4;
|
bpp = screen->fb[0].bitsPerPixel;
|
||||||
screen->fb[0].bitsPerPixel = 4;
|
if (bpp != 8)
|
||||||
|
bpp = 4;
|
||||||
|
depth = bpp;
|
||||||
pscr->mapping = VESA_PLANAR;
|
pscr->mapping = VESA_PLANAR;
|
||||||
|
pscr->rotate = FALSE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ErrorF("Unsupported VESA MemoryModel 0x%02X\n",
|
ErrorF("Unsupported VESA MemoryModel 0x%02X\n",
|
||||||
|
@ -377,9 +386,20 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
screen->width = vesaWidth(screen, vmib);
|
||||||
|
screen->height = vesaHeight(screen, vmib);
|
||||||
|
screen->fb[0].depth = depth;
|
||||||
|
screen->fb[0].bitsPerPixel = bpp;
|
||||||
|
screen->fb[0].byteStride = vmib->BytesPerScanLine;
|
||||||
|
screen->fb[0].pixelStride = ((vmib->BytesPerScanLine * 8) /
|
||||||
|
vmib->BitsPerPixel);
|
||||||
|
|
||||||
if (pscr->mapping == VESA_LINEAR && !(vmib->ModeAttributes & 0x80))
|
if (pscr->mapping == VESA_LINEAR && !(vmib->ModeAttributes & 0x80))
|
||||||
pscr->mapping = VESA_WINDOWED;
|
pscr->mapping = VESA_WINDOWED;
|
||||||
|
|
||||||
|
if (pscr->rotate)
|
||||||
|
pscr->shadow = TRUE;
|
||||||
|
|
||||||
switch (pscr->mapping) {
|
switch (pscr->mapping) {
|
||||||
case VESA_LINEAR:
|
case VESA_LINEAR:
|
||||||
pscr->fb = VbeMapFramebuffer(priv->vi, vmib);
|
pscr->fb = VbeMapFramebuffer(priv->vi, vmib);
|
||||||
|
@ -397,6 +417,9 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr)
|
||||||
screen->rate = 72;
|
screen->rate = 72;
|
||||||
screen->fb[0].frameBuffer = (CARD8 *)(pscr->fb);
|
screen->fb[0].frameBuffer = (CARD8 *)(pscr->fb);
|
||||||
|
|
||||||
|
if (pscr->rotate)
|
||||||
|
screen->softCursor = TRUE;
|
||||||
|
|
||||||
if (pscr->shadow)
|
if (pscr->shadow)
|
||||||
return KdShadowScreenInit (screen);
|
return KdShadowScreenInit (screen);
|
||||||
|
|
||||||
|
@ -413,7 +436,6 @@ vesaScreenInit(KdScreenInfo *screen)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (!vesaScreenInitialize (screen, pscr))
|
if (!vesaScreenInitialize (screen, pscr))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
screen->driver = pscr;
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,34 +510,54 @@ vesaWindowWindowed (ScreenPtr pScreen,
|
||||||
}
|
}
|
||||||
|
|
||||||
static CARD16 vga16Colors[16][3] = {
|
static CARD16 vga16Colors[16][3] = {
|
||||||
|
#if 0
|
||||||
{ 0, 0, 0, }, /* 0 */
|
{ 0, 0, 0, }, /* 0 */
|
||||||
{ 0x80,0, 0, }, /* 1 */
|
{ 0, 0, 0x80,}, /* 1 */
|
||||||
{ 0, 0x80,0, }, /* 2 */
|
{ 0, 0x80,0, }, /* 2 */
|
||||||
{ 0x80,0x80,0, }, /* 3 */
|
{ 0, 0x80,0x80,}, /* 3 */
|
||||||
{ 0, 0, 0x80,}, /* 4 */
|
{ 0x80,0, 0, }, /* 4 */
|
||||||
{ 0x80,0, 0x80,}, /* 5 */
|
{ 0x80,0, 0x80,}, /* 5 */
|
||||||
{ 0, 0x80,0x80,}, /* 6 */
|
{ 0x80,0x80,0, }, /* 6 */
|
||||||
{ 0x80,0x80,0x80,}, /* 7 */
|
{ 0xC0,0xC0,0xC0,}, /* 7 */
|
||||||
{ 0xC0,0xC0,0xC0,}, /* 8 */
|
{ 0x80,0x80,0x80,}, /* 8 */
|
||||||
{ 0xFF,0, 0 ,}, /* 9 */
|
{ 0, 0, 0xFF,}, /* 9 */
|
||||||
{ 0, 0xFF,0 ,}, /* 10 */
|
{ 0, 0xFF,0 ,}, /* 10 */
|
||||||
{ 0xFF,0xFF,0 ,}, /* 11 */
|
{ 0, 0xFF,0xFF,}, /* 11 */
|
||||||
{ 0 ,0, 0xFF,}, /* 12 */
|
{ 0xFF,0, 0 ,}, /* 12 */
|
||||||
{ 0xFF,0, 0xFF,}, /* 13 */
|
{ 0xFF,0, 0xFF,}, /* 13 */
|
||||||
{ 0, 0xFF,0xFF,}, /* 14 */
|
{ 0xFF,0xFF,0 ,}, /* 14 */
|
||||||
{ 0xFF,0xFF,0xFF,}, /* 15 */
|
{ 0xFF,0xFF,0xFF,}, /* 15 */
|
||||||
|
#else
|
||||||
|
{ 0, 0, 0, }, /* 0 */
|
||||||
|
{ 0, 0, 0xAA,}, /* 1 */
|
||||||
|
{ 0, 0xAA,0, }, /* 2 */
|
||||||
|
{ 0, 0xAA,0xAA,}, /* 3 */
|
||||||
|
{ 0xAA,0, 0, }, /* 4 */
|
||||||
|
{ 0xAA,0, 0xAA,}, /* 5 */
|
||||||
|
{ 0xAA,0x55,0, }, /* 6 */
|
||||||
|
{ 0xAA,0xAA,0xAA,}, /* 7 */
|
||||||
|
{ 0x55,0x55,0x55,}, /* 8 */
|
||||||
|
{ 0x55,0x55,0xFF,}, /* 9 */
|
||||||
|
{ 0x55,0xFF,0x55,}, /* 10 */
|
||||||
|
{ 0x55,0xFF,0xFF,}, /* 11 */
|
||||||
|
{ 0xFF,0x55,0x55,}, /* 12 */
|
||||||
|
{ 0xFF,0x55,0xFF,}, /* 13 */
|
||||||
|
{ 0xFF,0xFF,0x55,}, /* 14 */
|
||||||
|
{ 0xFF,0xFF,0xFF,}, /* 15 */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
vesaCreateColormap16 (ColormapPtr pmap)
|
vesaCreateColormap16 (ColormapPtr pmap)
|
||||||
{
|
{
|
||||||
int i;
|
int i, j;
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
for (i = 0; i < pmap->pVisual->ColormapEntries; i++)
|
||||||
{
|
{
|
||||||
pmap->red[i].co.local.red = (vga16Colors[i][0]<<8)|vga16Colors[i][0];
|
j = i & 0xf;
|
||||||
pmap->red[i].co.local.green = (vga16Colors[i][1]<<8)|vga16Colors[i][1];
|
pmap->red[i].co.local.red = (vga16Colors[j][0]<<8)|vga16Colors[j][0];
|
||||||
pmap->red[i].co.local.blue = (vga16Colors[i][2]<<8)|vga16Colors[i][2];
|
pmap->red[i].co.local.green = (vga16Colors[j][1]<<8)|vga16Colors[j][1];
|
||||||
|
pmap->red[i].co.local.blue = (vga16Colors[j][2]<<8)|vga16Colors[j][2];
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -526,19 +568,58 @@ vesaInitScreen(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
KdScreenPriv(pScreen);
|
KdScreenPriv(pScreen);
|
||||||
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
||||||
|
ShadowUpdateProc update;
|
||||||
|
ShadowWindowProc window;
|
||||||
|
|
||||||
if (pscr->shadow)
|
if (pscr->shadow)
|
||||||
{
|
{
|
||||||
switch (pscr->mapping) {
|
switch (pscr->mapping) {
|
||||||
case VESA_LINEAR:
|
case VESA_LINEAR:
|
||||||
return KdShadowInitScreen (pScreen, shadowUpdatePacked, vesaWindowLinear);
|
update = shadowUpdatePacked;
|
||||||
|
window = vesaWindowLinear;
|
||||||
|
break;
|
||||||
case VESA_WINDOWED:
|
case VESA_WINDOWED:
|
||||||
return KdShadowInitScreen (pScreen, shadowUpdatePacked, vesaWindowWindowed);
|
update = shadowUpdatePacked;
|
||||||
|
window = vesaWindowWindowed;
|
||||||
|
break;
|
||||||
case VESA_PLANAR:
|
case VESA_PLANAR:
|
||||||
pScreen->CreateColormap = vesaCreateColormap16;
|
pScreen->CreateColormap = vesaCreateColormap16;
|
||||||
return KdShadowInitScreen (pScreen, shadowUpdatePlanar4, vesaWindowPlanar);
|
if (pScreenPriv->screen->fb[0].bitsPerPixel == 8)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < pScreen->numVisuals; i++)
|
||||||
|
{
|
||||||
|
if (pScreen->visuals[i].nplanes ==
|
||||||
|
pScreenPriv->screen->fb[0].depth)
|
||||||
|
{
|
||||||
|
pScreen->visuals[i].ColormapEntries = 16;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
update = shadowUpdatePlanar4x8;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
update = shadowUpdatePlanar4;
|
||||||
|
window = vesaWindowPlanar;
|
||||||
|
pscr->rotate = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (pscr->rotate)
|
||||||
|
{
|
||||||
|
switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
|
||||||
|
case 8:
|
||||||
|
update = shadowUpdateRotate8; break;
|
||||||
|
case 16:
|
||||||
|
update = shadowUpdateRotate16; break;
|
||||||
|
case 32:
|
||||||
|
update = shadowUpdateRotate32; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return KdShadowInitScreen (pScreen, update, window);
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -551,14 +632,36 @@ vesaEnable(ScreenPtr pScreen)
|
||||||
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
||||||
int code;
|
int code;
|
||||||
int palette_wait = 0, palette_hi = 0;
|
int palette_wait = 0, palette_hi = 0;
|
||||||
int i=0;
|
int i;
|
||||||
int size;
|
int size;
|
||||||
char *p;
|
char *p;
|
||||||
|
KdMouseMatrix m;
|
||||||
|
|
||||||
code = VbeSetMode(priv->vi, pscr->mode->mode, pscr->mapping == VESA_LINEAR);
|
code = VbeSetMode(priv->vi, pscr->mode->mode, pscr->mapping == VESA_LINEAR);
|
||||||
if(code < 0)
|
if(code < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
{
|
||||||
|
int p;
|
||||||
|
CARD8 scratch[4] = {0x40,0x40,0x40,0};
|
||||||
|
for (p = 0; p < 256; p++)
|
||||||
|
{
|
||||||
|
if (20 <= p && p < 21)
|
||||||
|
{
|
||||||
|
scratch[0] = 255;
|
||||||
|
scratch[1] = 255;
|
||||||
|
scratch[2] = 255;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scratch[0] = 0;
|
||||||
|
scratch[1] = 0;
|
||||||
|
scratch[2] = 0;
|
||||||
|
}
|
||||||
|
VbeSetPalette(priv->vi, p, 1, scratch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(priv->vib->Capabilities[0] & 1)
|
if(priv->vib->Capabilities[0] & 1)
|
||||||
palette_hi = 1;
|
palette_hi = 1;
|
||||||
if(priv->vib->Capabilities[0] & 4)
|
if(priv->vib->Capabilities[0] & 4)
|
||||||
|
@ -571,7 +674,8 @@ vesaEnable(ScreenPtr pScreen)
|
||||||
memcpy (priv->text, pscr->fb, VESA_TEXT_SAVE);
|
memcpy (priv->text, pscr->fb, VESA_TEXT_SAVE);
|
||||||
break;
|
break;
|
||||||
case VESA_WINDOWED:
|
case VESA_WINDOWED:
|
||||||
while(i < VESA_TEXT_SAVE) {
|
for (i = 0; i < VESA_TEXT_SAVE;)
|
||||||
|
{
|
||||||
p = VbeSetWindow(priv->vi, i, VBE_WINDOW_READ, &size);
|
p = VbeSetWindow(priv->vi, i, VBE_WINDOW_READ, &size);
|
||||||
if(!p) {
|
if(!p) {
|
||||||
ErrorF("Couldn't set window for saving VGA font\n");
|
ErrorF("Couldn't set window for saving VGA font\n");
|
||||||
|
@ -593,6 +697,17 @@ vesaEnable(ScreenPtr pScreen)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (pscr->rotate)
|
||||||
|
{
|
||||||
|
m.matrix[0][0] = 0; m.matrix[0][1] = 1; m.matrix[0][2] = 0;
|
||||||
|
m.matrix[1][0] = -1; m.matrix[1][1] = 0; m.matrix[1][2] = pScreen->height - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m.matrix[0][0] = 1; m.matrix[0][1] = 0; m.matrix[0][2] = 0;
|
||||||
|
m.matrix[1][0] = 0; m.matrix[1][1] = 1; m.matrix[1][2] = 0;
|
||||||
|
}
|
||||||
|
KdSetMouseMatrix (&m);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -687,8 +802,8 @@ vesaPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
|
||||||
KdScreenPriv(pScreen);
|
KdScreenPriv(pScreen);
|
||||||
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
||||||
VesaCardPrivPtr priv = pScreenPriv->card->driver;
|
VesaCardPrivPtr priv = pScreenPriv->card->driver;
|
||||||
int i, j, k, start;
|
int p;
|
||||||
CARD8 scratch[4*256];
|
CARD8 scratch[4];
|
||||||
int red, green, blue;
|
int red, green, blue;
|
||||||
|
|
||||||
if (vesa_swap_rgb)
|
if (vesa_swap_rgb)
|
||||||
|
@ -704,27 +819,32 @@ vesaPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
|
||||||
blue = 2;
|
blue = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
i = 0;
|
while (n--)
|
||||||
while(i < n) {
|
{
|
||||||
j = i + 1;
|
scratch[red] = pdefs->red >> 8;
|
||||||
/* For some reason, doing more than one entry at a time breaks */
|
scratch[green] = pdefs->green >> 8;
|
||||||
while(j < n && pdefs[j].pixel == pdefs[j-1].pixel + 1 && j - i < 1)
|
scratch[blue] = pdefs->blue >> 8;
|
||||||
j++;
|
scratch[3] = 0;
|
||||||
for(k=0; k<(j - i); k++) {
|
p = pdefs->pixel;
|
||||||
scratch[k+red] = pdefs[i+k].red >> 8;
|
pdefs++;
|
||||||
scratch[k+green] = pdefs[i+k].green >> 8;
|
|
||||||
scratch[k+blue] = pdefs[i+k].blue >> 8;
|
|
||||||
scratch[k+3] = 0;
|
|
||||||
}
|
|
||||||
start = pdefs[i].pixel;
|
|
||||||
if (pscr->mapping == VESA_PLANAR)
|
if (pscr->mapping == VESA_PLANAR)
|
||||||
{
|
{
|
||||||
for (start = pdefs[i].pixel; start < 256; start += 16)
|
/*
|
||||||
VbeSetPalette(priv->vi, start, j - i, scratch);
|
* VGA modes are strange; this code covers all
|
||||||
|
* possible modes by duplicating the color information
|
||||||
|
* however the attribute registers might be set
|
||||||
|
*/
|
||||||
|
if (p < 16)
|
||||||
|
{
|
||||||
|
VbeSetPalette (priv->vi, p, 1, scratch);
|
||||||
|
if (p >= 8)
|
||||||
|
VbeSetPalette (priv->vi, p+0x30, 1, scratch);
|
||||||
|
else if (p == 6)
|
||||||
|
VbeSetPalette (priv->vi, 0x14, 1, scratch);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
VbeSetPalette(priv->vi, start, j - i, scratch);
|
VbeSetPalette(priv->vi, p, 1, scratch);
|
||||||
i = j;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,7 @@ typedef struct _VesaCardPriv {
|
||||||
typedef struct _VesaScreenPriv {
|
typedef struct _VesaScreenPriv {
|
||||||
VesaModePtr mode;
|
VesaModePtr mode;
|
||||||
Bool shadow;
|
Bool shadow;
|
||||||
|
Bool rotate;
|
||||||
int mapping;
|
int mapping;
|
||||||
void *fb;
|
void *fb;
|
||||||
} VesaScreenPrivRec, *VesaScreenPrivPtr;
|
} VesaScreenPrivRec, *VesaScreenPrivPtr;
|
||||||
|
|
Loading…
Reference in New Issue