2006-11-26 11:13:41 -07:00
|
|
|
/*
|
|
|
|
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
|
|
|
|
*
|
|
|
|
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
|
|
* documentation for any purpose is hereby granted without fee, provided that
|
|
|
|
* the above copyright notice appear in all copies and that both that
|
|
|
|
* copyright notice and this permission notice appear in supporting
|
|
|
|
* documentation, and that the name of Thomas Roell not be used in
|
|
|
|
* advertising or publicity pertaining to distribution of the software without
|
|
|
|
* specific, written prior permission. Thomas Roell makes no representations
|
|
|
|
* about the suitability of this software for any purpose. It is provided
|
|
|
|
* "as is" without express or implied warranty.
|
|
|
|
*
|
|
|
|
* THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
|
|
* EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
|
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
|
|
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
|
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_XORG_CONFIG_H
|
|
|
|
#include <xorg-config.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <X11/X.h>
|
|
|
|
#include <X11/Xproto.h>
|
|
|
|
#include "windowstr.h"
|
|
|
|
#include "compiler.h"
|
|
|
|
#include "mipointer.h"
|
|
|
|
#include "micmap.h"
|
|
|
|
|
|
|
|
#include "xf86.h"
|
|
|
|
#include "vgaHW.h"
|
|
|
|
|
2010-07-27 13:02:24 -06:00
|
|
|
#include <X11/extensions/xf86dgaproto.h>
|
2006-11-26 11:13:41 -07:00
|
|
|
#include "dgaproc.h"
|
|
|
|
|
|
|
|
#define NOMAPYET (ColormapPtr) 0
|
|
|
|
|
|
|
|
int
|
|
|
|
vgaListInstalledColormaps(pScreen, pmaps)
|
2012-06-10 07:21:05 -06:00
|
|
|
ScreenPtr pScreen;
|
|
|
|
Colormap *pmaps;
|
2006-11-26 11:13:41 -07:00
|
|
|
{
|
2012-06-10 07:21:05 -06:00
|
|
|
/* By the time we are processing requests, we can guarantee that there
|
|
|
|
* is always a colormap installed */
|
|
|
|
|
|
|
|
*pmaps = GetInstalledmiColormap(pScreen)->mid;
|
|
|
|
return 1;
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
vgaGetInstalledColormaps(pScreen, pmaps)
|
2012-06-10 07:21:05 -06:00
|
|
|
ScreenPtr pScreen;
|
|
|
|
ColormapPtr *pmaps;
|
2006-11-26 11:13:41 -07:00
|
|
|
{
|
2012-06-10 07:21:05 -06:00
|
|
|
/* By the time we are processing requests, we can guarantee that there
|
|
|
|
* is always a colormap installed */
|
|
|
|
|
|
|
|
*pmaps = GetInstalledmiColormap(pScreen);
|
|
|
|
return 1;
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
int
|
|
|
|
vgaCheckColorMap(ColormapPtr pmap)
|
2006-11-26 11:13:41 -07:00
|
|
|
{
|
2012-06-10 07:21:05 -06:00
|
|
|
return (pmap != GetInstalledmiColormap(pmap->pScreen));
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
vgaStoreColors(pmap, ndef, pdefs)
|
2012-06-10 07:21:05 -06:00
|
|
|
ColormapPtr pmap;
|
|
|
|
int ndef;
|
|
|
|
xColorItem *pdefs;
|
2006-11-26 11:13:41 -07:00
|
|
|
{
|
2012-06-10 07:21:05 -06:00
|
|
|
int i;
|
2006-11-26 11:13:41 -07:00
|
|
|
unsigned char *cmap, *tmp = NULL;
|
2012-06-10 07:21:05 -06:00
|
|
|
xColorItem directDefs[256];
|
|
|
|
Bool new_overscan = FALSE;
|
|
|
|
Bool writeColormap;
|
2006-11-26 11:13:41 -07:00
|
|
|
int scrnIndex = pmap->pScreen->myNum;
|
2013-06-07 11:28:45 -06:00
|
|
|
ScrnInfoPtr scrninfp = xf86ScreenToScrn(pmap->pScreen);
|
2006-11-26 11:13:41 -07:00
|
|
|
vgaHWPtr hwp = VGAHWPTR(scrninfp);
|
2012-06-10 07:21:05 -06:00
|
|
|
|
2006-11-26 11:13:41 -07:00
|
|
|
unsigned char overscan = hwp->ModeReg.Attribute[OVERSCAN];
|
|
|
|
unsigned char tmp_overscan = 0;
|
|
|
|
|
|
|
|
if (vgaCheckColorMap(pmap))
|
|
|
|
return;
|
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
if ((pmap->pVisual->class | DynamicClass) == DirectColor) {
|
|
|
|
ndef = miExpandDirectColors(pmap, ndef, pdefs, directDefs);
|
2006-11-26 11:13:41 -07:00
|
|
|
pdefs = directDefs;
|
|
|
|
}
|
2012-06-10 07:21:05 -06:00
|
|
|
|
2006-11-26 11:13:41 -07:00
|
|
|
writeColormap = scrninfp->vtSema;
|
2013-06-07 11:28:45 -06:00
|
|
|
if (DGAScreenAvailable(pmap->pScreen)) {
|
2012-06-10 07:21:05 -06:00
|
|
|
writeColormap = writeColormap ||
|
|
|
|
(DGAGetDirectMode(scrnIndex) &&
|
|
|
|
!(DGAGetFlags(scrnIndex) & XF86DGADirectColormap)) ||
|
|
|
|
(DGAGetFlags(scrnIndex) & XF86DGAHasColormap);
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (writeColormap)
|
2012-06-10 07:21:05 -06:00
|
|
|
hwp->enablePalette(hwp);
|
|
|
|
|
|
|
|
for (i = 0; i < ndef; i++) {
|
|
|
|
if (pdefs[i].pixel == overscan) {
|
|
|
|
new_overscan = TRUE;
|
|
|
|
}
|
|
|
|
cmap = &(hwp->ModeReg.DAC[pdefs[i].pixel * 3]);
|
|
|
|
if (scrninfp->rgbBits == 8) {
|
|
|
|
cmap[0] = pdefs[i].red >> 8;
|
2006-11-26 11:13:41 -07:00
|
|
|
cmap[1] = pdefs[i].green >> 8;
|
2012-06-10 07:21:05 -06:00
|
|
|
cmap[2] = pdefs[i].blue >> 8;
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
else {
|
2012-06-10 07:21:05 -06:00
|
|
|
cmap[0] = pdefs[i].red >> 10;
|
2006-11-26 11:13:41 -07:00
|
|
|
cmap[1] = pdefs[i].green >> 10;
|
2012-06-10 07:21:05 -06:00
|
|
|
cmap[2] = pdefs[i].blue >> 10;
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
#if 0
|
2012-06-10 07:21:05 -06:00
|
|
|
if (clgd6225Lcd) {
|
|
|
|
/* The LCD doesn't like white */
|
|
|
|
if (cmap[0] == 63)
|
|
|
|
cmap[0] = 62;
|
|
|
|
if (cmap[1] == 63)
|
|
|
|
cmap[1] = 62;
|
|
|
|
if (cmap[2] == 63)
|
|
|
|
cmap[2] = 62;
|
|
|
|
}
|
2006-11-26 11:13:41 -07:00
|
|
|
#endif
|
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
if (writeColormap) {
|
|
|
|
if (hwp->ShowOverscan && i == 255)
|
|
|
|
continue;
|
|
|
|
hwp->writeDacWriteAddr(hwp, pdefs[i].pixel);
|
|
|
|
DACDelay(hwp);
|
|
|
|
hwp->writeDacData(hwp, cmap[0]);
|
|
|
|
DACDelay(hwp);
|
|
|
|
hwp->writeDacData(hwp, cmap[1]);
|
|
|
|
DACDelay(hwp);
|
|
|
|
hwp->writeDacData(hwp, cmap[2]);
|
|
|
|
DACDelay(hwp);
|
|
|
|
}
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
2012-06-10 07:21:05 -06:00
|
|
|
if (new_overscan && !hwp->ShowOverscan) {
|
|
|
|
new_overscan = FALSE;
|
|
|
|
for (i = 0; i < ndef; i++) {
|
|
|
|
if (pdefs[i].pixel == overscan) {
|
|
|
|
if ((pdefs[i].red != 0) ||
|
|
|
|
(pdefs[i].green != 0) || (pdefs[i].blue != 0)) {
|
|
|
|
new_overscan = TRUE;
|
|
|
|
tmp_overscan = overscan;
|
|
|
|
tmp = &(hwp->ModeReg.DAC[pdefs[i].pixel * 3]);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
2012-06-10 07:21:05 -06:00
|
|
|
if (new_overscan) {
|
2006-11-26 11:13:41 -07:00
|
|
|
/*
|
|
|
|
* Find a black pixel, or the nearest match.
|
|
|
|
*/
|
2012-06-10 07:21:05 -06:00
|
|
|
for (i = 255; i >= 0; i--) {
|
|
|
|
cmap = &(hwp->ModeReg.DAC[i * 3]);
|
|
|
|
if ((cmap[0] == 0) && (cmap[1] == 0) && (cmap[2] == 0)) {
|
|
|
|
overscan = i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if ((cmap[0] < tmp[0]) &&
|
|
|
|
(cmap[1] < tmp[1]) && (cmap[2] < tmp[2])) {
|
|
|
|
tmp = cmap;
|
|
|
|
tmp_overscan = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (i < 0) {
|
|
|
|
overscan = tmp_overscan;
|
|
|
|
}
|
|
|
|
hwp->ModeReg.Attribute[OVERSCAN] = overscan;
|
|
|
|
if (writeColormap) {
|
|
|
|
hwp->writeAttr(hwp, OVERSCAN, overscan);
|
|
|
|
}
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (writeColormap)
|
2012-06-10 07:21:05 -06:00
|
|
|
hwp->disablePalette(hwp);
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
vgaInstallColormap(pmap)
|
2012-06-10 07:21:05 -06:00
|
|
|
ColormapPtr pmap;
|
2006-11-26 11:13:41 -07:00
|
|
|
{
|
2012-06-10 07:21:05 -06:00
|
|
|
ColormapPtr oldmap = GetInstalledmiColormap(pmap->pScreen);
|
|
|
|
int entries;
|
|
|
|
Pixel *ppix;
|
|
|
|
xrgb *prgb;
|
|
|
|
xColorItem *defs;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (pmap == oldmap)
|
|
|
|
return;
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
if ((pmap->pVisual->class | DynamicClass) == DirectColor)
|
|
|
|
entries = (pmap->pVisual->redMask |
|
|
|
|
pmap->pVisual->greenMask | pmap->pVisual->blueMask) + 1;
|
|
|
|
else
|
|
|
|
entries = pmap->pVisual->ColormapEntries;
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
ppix = (Pixel *) malloc(entries * sizeof(Pixel));
|
|
|
|
prgb = (xrgb *) malloc(entries * sizeof(xrgb));
|
|
|
|
defs = (xColorItem *) malloc(entries * sizeof(xColorItem));
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
if (oldmap != NOMAPYET)
|
|
|
|
WalkTree(pmap->pScreen, TellLostMap, &oldmap->mid);
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
SetInstalledmiColormap(pmap->pScreen, pmap);
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
for (i = 0; i < entries; i++)
|
|
|
|
ppix[i] = i;
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
QueryColors(pmap, entries, ppix, prgb, serverClient);
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
for (i = 0; i < entries; i++) { /* convert xrgbs to xColorItems */
|
|
|
|
defs[i].pixel = ppix[i];
|
|
|
|
defs[i].red = prgb[i].red;
|
|
|
|
defs[i].green = prgb[i].green;
|
|
|
|
defs[i].blue = prgb[i].blue;
|
|
|
|
defs[i].flags = DoRed | DoGreen | DoBlue;
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
2012-06-10 07:21:05 -06:00
|
|
|
pmap->pScreen->StoreColors(pmap, entries, defs);
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
WalkTree(pmap->pScreen, TellGainedMap, &pmap->mid);
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
free(ppix);
|
|
|
|
free(prgb);
|
|
|
|
free(defs);
|
|
|
|
}
|
2006-11-26 11:13:41 -07:00
|
|
|
|
|
|
|
void
|
|
|
|
vgaUninstallColormap(pmap)
|
2012-06-10 07:21:05 -06:00
|
|
|
ColormapPtr pmap;
|
2006-11-26 11:13:41 -07:00
|
|
|
{
|
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
ColormapPtr defColormap;
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
if (pmap != GetInstalledmiColormap(pmap->pScreen))
|
|
|
|
return;
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
dixLookupResourceByType((pointer *) &defColormap,
|
|
|
|
pmap->pScreen->defColormap, RT_COLORMAP,
|
|
|
|
serverClient, DixInstallAccess);
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
if (defColormap == GetInstalledmiColormap(pmap->pScreen))
|
|
|
|
return;
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2012-06-10 07:21:05 -06:00
|
|
|
(*pmap->pScreen->InstallColormap) (defColormap);
|
|
|
|
}
|
2006-11-26 11:13:41 -07:00
|
|
|
|
|
|
|
void
|
|
|
|
vgaHandleColormaps(ScreenPtr pScreen, ScrnInfoPtr scrnp)
|
|
|
|
{
|
2012-06-10 07:21:05 -06:00
|
|
|
if (scrnp->bitsPerPixel > 1) {
|
|
|
|
if (scrnp->bitsPerPixel <= 8) { /* For 8bpp SVGA and VGA16 */
|
|
|
|
pScreen->InstallColormap = vgaInstallColormap;
|
|
|
|
pScreen->UninstallColormap = vgaUninstallColormap;
|
|
|
|
pScreen->ListInstalledColormaps = vgaListInstalledColormaps;
|
|
|
|
pScreen->StoreColors = vgaStoreColors;
|
|
|
|
}
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
}
|