fb: Remove fbcmap.c (bug 5436)
This is obsolete since a240c039c4.
Updated fb.h to mention that the functions come from fbcmap_mi.c now.
Dropped fbcmap.c from the makefile.
Signed-off-by: Jesse Adkins <jesserayadkins@gmail.com>
Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
			
			
This commit is contained in:
		
							parent
							
								
									23e329b564
								
							
						
					
					
						commit
						84e8de1271
					
				| 
						 | 
					@ -55,4 +55,4 @@ libfb_la_SOURCES = 	\
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libwfb_la_SOURCES = $(libfb_la_SOURCES)
 | 
					libwfb_la_SOURCES = $(libfb_la_SOURCES)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EXTRA_DIST = fbcmap.c fbcmap_mi.c
 | 
					EXTRA_DIST = fbcmap_mi.c
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								fb/fb.h
								
								
								
								
							
							
						
						
									
										2
									
								
								fb/fb.h
								
								
								
								
							| 
						 | 
					@ -1262,7 +1262,7 @@ fbBltPlane (FbBits	    *src,
 | 
				
			||||||
	    Pixel	    planeMask);
 | 
						    Pixel	    planeMask);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * fbcmap.c
 | 
					 * fbcmap_mi.c
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
extern _X_EXPORT int
 | 
					extern _X_EXPORT int
 | 
				
			||||||
fbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps);
 | 
					fbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										586
									
								
								fb/fbcmap.c
								
								
								
								
							
							
						
						
									
										586
									
								
								fb/fbcmap.c
								
								
								
								
							| 
						 | 
					@ -1,586 +0,0 @@
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright © 1987 Sun Microsystems, Inc.  All rights reserved.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
					 | 
				
			||||||
 * copy of this software and associated documentation files (the "Software"),
 | 
					 | 
				
			||||||
 * to deal in the Software without restriction, including without limitation
 | 
					 | 
				
			||||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
					 | 
				
			||||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
					 | 
				
			||||||
 * Software is furnished to do so, subject to the following conditions:
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The above copyright notice and this permission notice (including the next
 | 
					 | 
				
			||||||
 * paragraph) shall be included in all copies or substantial portions of the
 | 
					 | 
				
			||||||
 * Software.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
					 | 
				
			||||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
					 | 
				
			||||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
					 | 
				
			||||||
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
					 | 
				
			||||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
					 | 
				
			||||||
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | 
					 | 
				
			||||||
 * DEALINGS IN THE SOFTWARE.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef HAVE_DIX_CONFIG_H
 | 
					 | 
				
			||||||
#include <dix-config.h>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <X11/X.h>
 | 
					 | 
				
			||||||
#include <X11/Xproto.h>
 | 
					 | 
				
			||||||
#include "scrnintstr.h"
 | 
					 | 
				
			||||||
#include "colormapst.h"
 | 
					 | 
				
			||||||
#include "resource.h"
 | 
					 | 
				
			||||||
#include "fb.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef XFree86Server
 | 
					 | 
				
			||||||
#error "You should be compiling fbcmap_mi.c instead of fbcmap.c!"
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static DevPrivateKeyRec cmapScrPrivateKeyRec;
 | 
					 | 
				
			||||||
#define cmapScrPrivateKey (&cmapScrPrivateKeyRec)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define GetInstalledColormap(s) ((ColormapPtr) dixLookupPrivate(&(s)->devPrivates, cmapScrPrivateKey))
 | 
					 | 
				
			||||||
#define SetInstalledColormap(s,c) (dixSetPrivate(&(s)->devPrivates, cmapScrPrivateKey, c))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int
 | 
					 | 
				
			||||||
fbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    /* By the time we are processing requests, we can guarantee that there
 | 
					 | 
				
			||||||
     * is always a colormap installed */
 | 
					 | 
				
			||||||
    *pmaps = GetInstalledColormap(pScreen)->mid;
 | 
					 | 
				
			||||||
    return 1;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
fbInstallColormap(ColormapPtr pmap)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ColormapPtr oldpmap = GetInstalledColormap(pmap->pScreen);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if(pmap != oldpmap)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	/* Uninstall pInstalledMap. No hardware changes required, just
 | 
					 | 
				
			||||||
	 * notify all interested parties. */
 | 
					 | 
				
			||||||
	if(oldpmap != (ColormapPtr)None)
 | 
					 | 
				
			||||||
	    WalkTree(pmap->pScreen, TellLostMap, (char *)&oldpmap->mid);
 | 
					 | 
				
			||||||
	/* Install pmap */
 | 
					 | 
				
			||||||
	SetInstalledColormap(pmap->pScreen, pmap);
 | 
					 | 
				
			||||||
	WalkTree(pmap->pScreen, TellGainedMap, (char *)&pmap->mid);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
fbUninstallColormap(ColormapPtr pmap)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ColormapPtr curpmap = GetInstalledColormap(pmap->pScreen);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if(pmap == curpmap)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	if (pmap->mid != pmap->pScreen->defColormap)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	    dixLookupResourceByType((pointer *)&curpmap,
 | 
					 | 
				
			||||||
				    pmap->pScreen->defColormap,
 | 
					 | 
				
			||||||
				    RT_COLORMAP,
 | 
					 | 
				
			||||||
				    serverClient, DixInstallAccess);
 | 
					 | 
				
			||||||
	    (*pmap->pScreen->InstallColormap)(curpmap);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
fbResolveColor(unsigned short	*pred, 
 | 
					 | 
				
			||||||
	       unsigned short	*pgreen, 
 | 
					 | 
				
			||||||
	       unsigned short	*pblue,
 | 
					 | 
				
			||||||
	       VisualPtr	pVisual)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int shift = 16 - pVisual->bitsPerRGBValue;
 | 
					 | 
				
			||||||
    unsigned lim = (1 << pVisual->bitsPerRGBValue) - 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if ((pVisual->class | DynamicClass) == GrayScale)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	/* rescale to gray then rgb bits */
 | 
					 | 
				
			||||||
	*pred = (30L * *pred + 59L * *pgreen + 11L * *pblue) / 100;
 | 
					 | 
				
			||||||
	*pblue = *pgreen = *pred = ((*pred >> shift) * 65535) / lim;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	/* rescale to rgb bits */
 | 
					 | 
				
			||||||
	*pred = ((*pred >> shift) * 65535) / lim;
 | 
					 | 
				
			||||||
	*pgreen = ((*pgreen >> shift) * 65535) / lim;
 | 
					 | 
				
			||||||
	*pblue = ((*pblue >> shift) * 65535) / lim;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Bool
 | 
					 | 
				
			||||||
fbInitializeColormap(ColormapPtr pmap)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    register unsigned i;
 | 
					 | 
				
			||||||
    register VisualPtr pVisual;
 | 
					 | 
				
			||||||
    unsigned lim, maxent, shift;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pVisual = pmap->pVisual;
 | 
					 | 
				
			||||||
    lim = (1 << pVisual->bitsPerRGBValue) - 1;
 | 
					 | 
				
			||||||
    shift = 16 - pVisual->bitsPerRGBValue;
 | 
					 | 
				
			||||||
    maxent = pVisual->ColormapEntries - 1;
 | 
					 | 
				
			||||||
    if (pVisual->class == TrueColor)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	unsigned limr, limg, limb;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	limr = pVisual->redMask >> pVisual->offsetRed;
 | 
					 | 
				
			||||||
	limg = pVisual->greenMask >> pVisual->offsetGreen;
 | 
					 | 
				
			||||||
	limb = pVisual->blueMask >> pVisual->offsetBlue;
 | 
					 | 
				
			||||||
	for(i = 0; i <= maxent; i++)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	    /* rescale to [0..65535] then rgb bits */
 | 
					 | 
				
			||||||
	    pmap->red[i].co.local.red =
 | 
					 | 
				
			||||||
		((((i * 65535) / limr) >> shift) * 65535) / lim;
 | 
					 | 
				
			||||||
	    pmap->green[i].co.local.green =
 | 
					 | 
				
			||||||
		((((i * 65535) / limg) >> shift) * 65535) / lim;
 | 
					 | 
				
			||||||
	    pmap->blue[i].co.local.blue =
 | 
					 | 
				
			||||||
		((((i * 65535) / limb) >> shift) * 65535) / lim;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else if (pVisual->class == StaticColor)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	unsigned	n;
 | 
					 | 
				
			||||||
	unsigned	r, g, b;
 | 
					 | 
				
			||||||
	unsigned	red, green, blue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for (n = 0; n*n*n < pVisual->ColormapEntries; n++)
 | 
					 | 
				
			||||||
	    ;
 | 
					 | 
				
			||||||
	n--;
 | 
					 | 
				
			||||||
	i = 0;
 | 
					 | 
				
			||||||
	for (r = 0; r < n; r++)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	    red = (((r * 65535 / (n - 1)) >> shift) * 65535) / lim;
 | 
					 | 
				
			||||||
	    for (g = 0; g < n; g++)
 | 
					 | 
				
			||||||
	    {
 | 
					 | 
				
			||||||
		green = (((g * 65535 / (n - 1)) >> shift) * 65535) / lim;
 | 
					 | 
				
			||||||
		for (b = 0; b < n; b++)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
		    blue = (((b * 65535 / (n - 1)) >> shift) * 65535) / lim;
 | 
					 | 
				
			||||||
		    pmap->red[i].co.local.red = red;
 | 
					 | 
				
			||||||
		    pmap->red[i].co.local.green = green;
 | 
					 | 
				
			||||||
		    pmap->red[i].co.local.blue = blue;
 | 
					 | 
				
			||||||
		    i++;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	n = pVisual->ColormapEntries - i;
 | 
					 | 
				
			||||||
	for (r = 0; r < n; r++)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	    red = (((r * 65535 / (n - 1)) >> shift) * 65535) / lim;
 | 
					 | 
				
			||||||
	    pmap->red[i].co.local.red = red;
 | 
					 | 
				
			||||||
	    pmap->red[i].co.local.green = red;
 | 
					 | 
				
			||||||
	    pmap->red[i].co.local.blue = red;
 | 
					 | 
				
			||||||
	    i++;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else if (pVisual->class == StaticGray)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	for(i = 0; i <= maxent; i++)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	    /* rescale to [0..65535] then rgb bits */
 | 
					 | 
				
			||||||
	    pmap->red[i].co.local.red = ((((i * 65535) / maxent) >> shift)
 | 
					 | 
				
			||||||
					 * 65535) / lim;
 | 
					 | 
				
			||||||
	    pmap->red[i].co.local.green = pmap->red[i].co.local.red;
 | 
					 | 
				
			||||||
	    pmap->red[i].co.local.blue = pmap->red[i].co.local.red;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return TRUE;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* When simulating DirectColor on PseudoColor hardware, multiple
 | 
					 | 
				
			||||||
   entries of the colormap must be updated
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define AddElement(mask) { \
 | 
					 | 
				
			||||||
    pixel = red | green | blue; \
 | 
					 | 
				
			||||||
    for (i = 0; i < nresult; i++) \
 | 
					 | 
				
			||||||
  	if (outdefs[i].pixel == pixel) \
 | 
					 | 
				
			||||||
    	    break; \
 | 
					 | 
				
			||||||
    if (i == nresult) \
 | 
					 | 
				
			||||||
    { \
 | 
					 | 
				
			||||||
   	nresult++; \
 | 
					 | 
				
			||||||
	outdefs[i].pixel = pixel; \
 | 
					 | 
				
			||||||
	outdefs[i].flags = 0; \
 | 
					 | 
				
			||||||
    } \
 | 
					 | 
				
			||||||
    outdefs[i].flags |= (mask); \
 | 
					 | 
				
			||||||
    outdefs[i].red = pmap->red[red >> pVisual->offsetRed].co.local.red; \
 | 
					 | 
				
			||||||
    outdefs[i].green = pmap->green[green >> pVisual->offsetGreen].co.local.green; \
 | 
					 | 
				
			||||||
    outdefs[i].blue = pmap->blue[blue >> pVisual->offsetBlue].co.local.blue; \
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int
 | 
					 | 
				
			||||||
fbExpandDirectColors (ColormapPtr   pmap, 
 | 
					 | 
				
			||||||
		      int	    ndef,
 | 
					 | 
				
			||||||
		      xColorItem    *indefs,
 | 
					 | 
				
			||||||
		      xColorItem    *outdefs)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    register int    red, green, blue;
 | 
					 | 
				
			||||||
    int		    maxred, maxgreen, maxblue;
 | 
					 | 
				
			||||||
    int		    stepred, stepgreen, stepblue;
 | 
					 | 
				
			||||||
    VisualPtr	    pVisual;
 | 
					 | 
				
			||||||
    register int    pixel;
 | 
					 | 
				
			||||||
    register int    nresult;
 | 
					 | 
				
			||||||
    register int    i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pVisual = pmap->pVisual;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    stepred = 1 << pVisual->offsetRed;
 | 
					 | 
				
			||||||
    stepgreen = 1 << pVisual->offsetGreen;
 | 
					 | 
				
			||||||
    stepblue = 1 << pVisual->offsetBlue;
 | 
					 | 
				
			||||||
    maxred = pVisual->redMask;
 | 
					 | 
				
			||||||
    maxgreen = pVisual->greenMask;
 | 
					 | 
				
			||||||
    maxblue = pVisual->blueMask;
 | 
					 | 
				
			||||||
    nresult = 0;
 | 
					 | 
				
			||||||
    for (;ndef--; indefs++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	if (indefs->flags & DoRed)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	    red = indefs->pixel & pVisual->redMask;
 | 
					 | 
				
			||||||
    	    for (green = 0; green <= maxgreen; green += stepgreen)
 | 
					 | 
				
			||||||
    	    {
 | 
					 | 
				
			||||||
	    	for (blue = 0; blue <= maxblue; blue += stepblue)
 | 
					 | 
				
			||||||
	    	{
 | 
					 | 
				
			||||||
		    AddElement (DoRed)
 | 
					 | 
				
			||||||
	    	}
 | 
					 | 
				
			||||||
    	    }
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (indefs->flags & DoGreen)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	    green = indefs->pixel & pVisual->greenMask;
 | 
					 | 
				
			||||||
    	    for (red = 0; red <= maxred; red += stepred)
 | 
					 | 
				
			||||||
    	    {
 | 
					 | 
				
			||||||
	    	for (blue = 0; blue <= maxblue; blue += stepblue)
 | 
					 | 
				
			||||||
	    	{
 | 
					 | 
				
			||||||
		    AddElement (DoGreen)
 | 
					 | 
				
			||||||
	    	}
 | 
					 | 
				
			||||||
    	    }
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (indefs->flags & DoBlue)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	    blue = indefs->pixel & pVisual->blueMask;
 | 
					 | 
				
			||||||
    	    for (red = 0; red <= maxred; red += stepred)
 | 
					 | 
				
			||||||
    	    {
 | 
					 | 
				
			||||||
	    	for (green = 0; green <= maxgreen; green += stepgreen)
 | 
					 | 
				
			||||||
	    	{
 | 
					 | 
				
			||||||
		    AddElement (DoBlue)
 | 
					 | 
				
			||||||
	    	}
 | 
					 | 
				
			||||||
    	    }
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return nresult;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Bool
 | 
					 | 
				
			||||||
fbCreateDefColormap(ScreenPtr pScreen)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    unsigned short	zero = 0, ones = 0xFFFF;
 | 
					 | 
				
			||||||
    VisualPtr	pVisual;
 | 
					 | 
				
			||||||
    ColormapPtr	cmap;
 | 
					 | 
				
			||||||
    Pixel wp, bp;
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    for (pVisual = pScreen->visuals;
 | 
					 | 
				
			||||||
	 pVisual->vid != pScreen->rootVisual;
 | 
					 | 
				
			||||||
	 pVisual++)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (CreateColormap(pScreen->defColormap, pScreen, pVisual, &cmap,
 | 
					 | 
				
			||||||
		       (pVisual->class & DynamicClass) ? AllocNone : AllocAll,
 | 
					 | 
				
			||||||
		       0)
 | 
					 | 
				
			||||||
	!= Success)
 | 
					 | 
				
			||||||
	return FALSE;
 | 
					 | 
				
			||||||
    wp = pScreen->whitePixel;
 | 
					 | 
				
			||||||
    bp = pScreen->blackPixel;
 | 
					 | 
				
			||||||
    if ((AllocColor(cmap, &ones, &ones, &ones, &wp, 0) !=
 | 
					 | 
				
			||||||
       	   Success) ||
 | 
					 | 
				
			||||||
    	(AllocColor(cmap, &zero, &zero, &zero, &bp, 0) !=
 | 
					 | 
				
			||||||
       	   Success))
 | 
					 | 
				
			||||||
    	return FALSE;
 | 
					 | 
				
			||||||
    pScreen->whitePixel = wp;
 | 
					 | 
				
			||||||
    pScreen->blackPixel = bp;
 | 
					 | 
				
			||||||
    (*pScreen->InstallColormap)(cmap);
 | 
					 | 
				
			||||||
    return TRUE;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern int defaultColorVisualClass;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define _RZ(d) ((d + 2) / 3)
 | 
					 | 
				
			||||||
#define _RS(d) 0
 | 
					 | 
				
			||||||
#define _RM(d) ((1 << _RZ(d)) - 1)
 | 
					 | 
				
			||||||
#define _GZ(d) ((d - _RZ(d) + 1) / 2)
 | 
					 | 
				
			||||||
#define _GS(d) _RZ(d)
 | 
					 | 
				
			||||||
#define _GM(d) (((1 << _GZ(d)) - 1) << _GS(d))
 | 
					 | 
				
			||||||
#define _BZ(d) (d - _RZ(d) - _GZ(d))
 | 
					 | 
				
			||||||
#define _BS(d) (_RZ(d) + _GZ(d))
 | 
					 | 
				
			||||||
#define _BM(d) (((1 << _BZ(d)) - 1) << _BS(d))
 | 
					 | 
				
			||||||
#define _CE(d) (1 << _RZ(d))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MAX_PSEUDO_DEPTH    10	    /* largest DAC size I know */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define StaticGrayMask	(1 << StaticGray)
 | 
					 | 
				
			||||||
#define GrayScaleMask	(1 << GrayScale)
 | 
					 | 
				
			||||||
#define StaticColorMask	(1 << StaticColor)
 | 
					 | 
				
			||||||
#define PseudoColorMask	(1 << PseudoColor)
 | 
					 | 
				
			||||||
#define TrueColorMask	(1 << TrueColor)
 | 
					 | 
				
			||||||
#define DirectColorMask (1 << DirectColor)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define ALL_VISUALS	(StaticGrayMask|\
 | 
					 | 
				
			||||||
			 GrayScaleMask|\
 | 
					 | 
				
			||||||
			 StaticColorMask|\
 | 
					 | 
				
			||||||
			 PseudoColorMask|\
 | 
					 | 
				
			||||||
			 TrueColorMask|\
 | 
					 | 
				
			||||||
			 DirectColorMask)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define LARGE_VISUALS	(TrueColorMask|\
 | 
					 | 
				
			||||||
			 DirectColorMask)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _fbVisuals {
 | 
					 | 
				
			||||||
    struct _fbVisuals	*next;
 | 
					 | 
				
			||||||
    int			depth;
 | 
					 | 
				
			||||||
    int			bitsPerRGB;
 | 
					 | 
				
			||||||
    int			visuals;
 | 
					 | 
				
			||||||
    int			count;
 | 
					 | 
				
			||||||
    Pixel		redMask, greenMask, blueMask;
 | 
					 | 
				
			||||||
} fbVisualsRec, *fbVisualsPtr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const int  fbVisualPriority[] = {
 | 
					 | 
				
			||||||
    PseudoColor, DirectColor, GrayScale, StaticColor, TrueColor, StaticGray
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define NUM_PRIORITY	6
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static fbVisualsPtr	fbVisuals;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int
 | 
					 | 
				
			||||||
popCount (int i)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int	count;
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    count = (i >> 1) & 033333333333;
 | 
					 | 
				
			||||||
    count = i - count - ((count >> 1) & 033333333333);
 | 
					 | 
				
			||||||
    count = (((count + (count >> 3)) & 030707070707) % 077);	/* HAKMEM 169 */
 | 
					 | 
				
			||||||
    return count;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Distance to least significant one bit
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static int
 | 
					 | 
				
			||||||
maskShift (Pixel p)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int	s;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!p) return 0;
 | 
					 | 
				
			||||||
    s = 0;
 | 
					 | 
				
			||||||
    while (!(p & 1))
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	s++;
 | 
					 | 
				
			||||||
	p >>= 1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return s;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Bool
 | 
					 | 
				
			||||||
fbSetVisualTypesAndMasks (int depth, int visuals, int bitsPerRGB,
 | 
					 | 
				
			||||||
			  Pixel redMask, Pixel greenMask, Pixel blueMask)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    fbVisualsPtr   new, *prev, v;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    new = (fbVisualsPtr) malloc(sizeof *new);
 | 
					 | 
				
			||||||
    if (!new)
 | 
					 | 
				
			||||||
	return FALSE;
 | 
					 | 
				
			||||||
    if (!redMask || !greenMask || !blueMask)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	redMask = _RM(depth);
 | 
					 | 
				
			||||||
	greenMask = _GM(depth);
 | 
					 | 
				
			||||||
	blueMask = _BM(depth);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    new->next = 0;
 | 
					 | 
				
			||||||
    new->depth = depth;
 | 
					 | 
				
			||||||
    new->visuals = visuals;
 | 
					 | 
				
			||||||
    new->bitsPerRGB = bitsPerRGB;
 | 
					 | 
				
			||||||
    new->redMask = redMask;
 | 
					 | 
				
			||||||
    new->greenMask = greenMask;
 | 
					 | 
				
			||||||
    new->blueMask = blueMask;
 | 
					 | 
				
			||||||
    new->count = popCount (visuals);
 | 
					 | 
				
			||||||
    for (prev = &fbVisuals; (v = *prev); prev = &v->next);
 | 
					 | 
				
			||||||
    *prev = new;
 | 
					 | 
				
			||||||
    return TRUE;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Bool
 | 
					 | 
				
			||||||
fbHasVisualTypes (int depth)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    fbVisualsPtr    v;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (v = fbVisuals; v; v = v->next)
 | 
					 | 
				
			||||||
	if (v->depth == depth)
 | 
					 | 
				
			||||||
	    return TRUE;
 | 
					 | 
				
			||||||
    return FALSE;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Bool
 | 
					 | 
				
			||||||
fbSetVisualTypes (int depth, int visuals, int bitsPerRGB)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return fbSetVisualTypesAndMasks (depth, visuals, bitsPerRGB,
 | 
					 | 
				
			||||||
				     _RM(depth), _GM(depth), _BM(depth));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Given a list of formats for a screen, create a list
 | 
					 | 
				
			||||||
 * of visuals and depths for the screen which coorespond to
 | 
					 | 
				
			||||||
 * the set which can be used with this version of fb.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Bool
 | 
					 | 
				
			||||||
fbInitVisuals (VisualPtr    *visualp, 
 | 
					 | 
				
			||||||
	       DepthPtr	    *depthp,
 | 
					 | 
				
			||||||
	       int	    *nvisualp,
 | 
					 | 
				
			||||||
	       int	    *ndepthp,
 | 
					 | 
				
			||||||
	       int	    *rootDepthp,
 | 
					 | 
				
			||||||
	       VisualID	    *defaultVisp,
 | 
					 | 
				
			||||||
	       unsigned long	sizes,
 | 
					 | 
				
			||||||
	       int	    bitsPerRGB)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int		i, j = 0, k;
 | 
					 | 
				
			||||||
    VisualPtr	visual;
 | 
					 | 
				
			||||||
    DepthPtr	depth;
 | 
					 | 
				
			||||||
    VisualID	*vid;
 | 
					 | 
				
			||||||
    int		d, b;
 | 
					 | 
				
			||||||
    int		f;
 | 
					 | 
				
			||||||
    int		ndepth, nvisual;
 | 
					 | 
				
			||||||
    int		nvtype;
 | 
					 | 
				
			||||||
    int		vtype;
 | 
					 | 
				
			||||||
    fbVisualsPtr   visuals, nextVisuals;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* none specified, we'll guess from pixmap formats */
 | 
					 | 
				
			||||||
    if (!fbVisuals) 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
    	for (f = 0; f < screenInfo.numPixmapFormats; f++) 
 | 
					 | 
				
			||||||
    	{
 | 
					 | 
				
			||||||
	    d = screenInfo.formats[f].depth;
 | 
					 | 
				
			||||||
	    b = screenInfo.formats[f].bitsPerPixel;
 | 
					 | 
				
			||||||
	    if (sizes & (1 << (b - 1)))
 | 
					 | 
				
			||||||
	    {
 | 
					 | 
				
			||||||
	    	if (d > MAX_PSEUDO_DEPTH)
 | 
					 | 
				
			||||||
		    vtype = LARGE_VISUALS;
 | 
					 | 
				
			||||||
	    	else if (d == 1)
 | 
					 | 
				
			||||||
		    vtype = StaticGrayMask;
 | 
					 | 
				
			||||||
		else
 | 
					 | 
				
			||||||
		    vtype = ALL_VISUALS;
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    else
 | 
					 | 
				
			||||||
		vtype = 0;
 | 
					 | 
				
			||||||
	    if (!fbSetVisualTypes (d, vtype, bitsPerRGB))
 | 
					 | 
				
			||||||
		return FALSE;
 | 
					 | 
				
			||||||
    	}
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    nvisual = 0;
 | 
					 | 
				
			||||||
    ndepth = 0;
 | 
					 | 
				
			||||||
    for (visuals = fbVisuals; visuals; visuals = nextVisuals) 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	nextVisuals = visuals->next;
 | 
					 | 
				
			||||||
	ndepth++;
 | 
					 | 
				
			||||||
	nvisual += visuals->count;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    depth = (DepthPtr) malloc(ndepth * sizeof (DepthRec));
 | 
					 | 
				
			||||||
    visual = (VisualPtr) malloc(nvisual * sizeof (VisualRec));
 | 
					 | 
				
			||||||
    if (!depth || !visual)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	free(depth);
 | 
					 | 
				
			||||||
	free(visual);
 | 
					 | 
				
			||||||
	return FALSE;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    *depthp = depth;
 | 
					 | 
				
			||||||
    *visualp = visual;
 | 
					 | 
				
			||||||
    *ndepthp = ndepth;
 | 
					 | 
				
			||||||
    *nvisualp = nvisual;
 | 
					 | 
				
			||||||
    for (visuals = fbVisuals; visuals; visuals = nextVisuals) 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	nextVisuals = visuals->next;
 | 
					 | 
				
			||||||
	d = visuals->depth;
 | 
					 | 
				
			||||||
	vtype = visuals->visuals;
 | 
					 | 
				
			||||||
	nvtype = visuals->count;
 | 
					 | 
				
			||||||
	vid = NULL;
 | 
					 | 
				
			||||||
	if (nvtype)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	    vid = (VisualID *) malloc(nvtype * sizeof (VisualID));
 | 
					 | 
				
			||||||
	    if (!vid)
 | 
					 | 
				
			||||||
		return FALSE;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	depth->depth = d;
 | 
					 | 
				
			||||||
	depth->numVids = nvtype;
 | 
					 | 
				
			||||||
	depth->vids = vid;
 | 
					 | 
				
			||||||
	depth++;
 | 
					 | 
				
			||||||
	for (i = 0; i < NUM_PRIORITY; i++) {
 | 
					 | 
				
			||||||
	    if (! (vtype & (1 << fbVisualPriority[i])))
 | 
					 | 
				
			||||||
		continue;
 | 
					 | 
				
			||||||
	    visual->class = fbVisualPriority[i];
 | 
					 | 
				
			||||||
	    visual->bitsPerRGBValue = visuals->bitsPerRGB;
 | 
					 | 
				
			||||||
	    visual->ColormapEntries = 1 << d;
 | 
					 | 
				
			||||||
	    visual->nplanes = d;
 | 
					 | 
				
			||||||
	    visual->vid = *vid = FakeClientID (0);
 | 
					 | 
				
			||||||
	    switch (visual->class) {
 | 
					 | 
				
			||||||
	    case PseudoColor:
 | 
					 | 
				
			||||||
	    case GrayScale:
 | 
					 | 
				
			||||||
	    case StaticGray:
 | 
					 | 
				
			||||||
	    case StaticColor:
 | 
					 | 
				
			||||||
		visual->redMask = 0;
 | 
					 | 
				
			||||||
		visual->greenMask =  0;
 | 
					 | 
				
			||||||
		visual->blueMask =  0;
 | 
					 | 
				
			||||||
		visual->offsetRed  =  0;
 | 
					 | 
				
			||||||
		visual->offsetGreen = 0;
 | 
					 | 
				
			||||||
		visual->offsetBlue =  0;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	    case DirectColor:
 | 
					 | 
				
			||||||
	    case TrueColor:
 | 
					 | 
				
			||||||
		visual->ColormapEntries = _CE(d);
 | 
					 | 
				
			||||||
		visual->redMask =  visuals->redMask;
 | 
					 | 
				
			||||||
		visual->greenMask =  visuals->greenMask;
 | 
					 | 
				
			||||||
		visual->blueMask =  visuals->blueMask;
 | 
					 | 
				
			||||||
		visual->offsetRed  =  maskShift (visuals->redMask);
 | 
					 | 
				
			||||||
		visual->offsetGreen = maskShift (visuals->greenMask);
 | 
					 | 
				
			||||||
		visual->offsetBlue =  maskShift (visuals->blueMask);
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	    vid++;
 | 
					 | 
				
			||||||
	    visual++;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	free(visuals);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    fbVisuals = NULL;
 | 
					 | 
				
			||||||
    visual = *visualp;
 | 
					 | 
				
			||||||
    depth = *depthp;
 | 
					 | 
				
			||||||
    for (i = 0; i < ndepth; i++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	if (*rootDepthp && *rootDepthp != depth[i].depth)
 | 
					 | 
				
			||||||
	    continue;
 | 
					 | 
				
			||||||
	for (j = 0; j < depth[i].numVids; j++)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	    for (k = 0; k < nvisual; k++)
 | 
					 | 
				
			||||||
		if (visual[k].vid == depth[i].vids[j])
 | 
					 | 
				
			||||||
		    break;
 | 
					 | 
				
			||||||
	    if (k == nvisual)
 | 
					 | 
				
			||||||
		continue;
 | 
					 | 
				
			||||||
	    if (defaultColorVisualClass < 0 ||
 | 
					 | 
				
			||||||
		visual[k].class == defaultColorVisualClass)
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (j != depth[i].numVids)
 | 
					 | 
				
			||||||
	    break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (i == ndepth) {
 | 
					 | 
				
			||||||
	for (i = 0; i < ndepth; i++)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	    if (depth[i].numVids)
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (i == ndepth)
 | 
					 | 
				
			||||||
	    return FALSE;
 | 
					 | 
				
			||||||
	j = 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    *rootDepthp = depth[i].depth;
 | 
					 | 
				
			||||||
    *defaultVisp = depth[i].vids[j];
 | 
					 | 
				
			||||||
    return TRUE;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in New Issue