1 /************************************************************
2 Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.
3
4 All Rights Reserved
5
6 Permission to use, copy, modify, and distribute this
7 software and its documentation for any purpose and without
8 fee is hereby granted, provided that the above copyright no-
9 tice appear in all copies and that both that copyright no-
10 tice and this permission notice appear in supporting docu-
11 mentation, and that the names of Sun or X Consortium
12 not be used in advertising or publicity pertaining to
13 distribution of the software without specific prior
14 written permission. Sun and X Consortium make no
15 representations about the suitability of this software for
16 any purpose. It is provided "as is" without any express or
17 implied warranty.
18
19 SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
20 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
21 NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE LI-
22 ABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
23 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
24 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
25 OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
26 THE USE OR PERFORMANCE OF THIS SOFTWARE.
27
28 ********************************************************/
29 /* $XConsortium: cfbscrinit.c,v 5.32 94/04/17 20:29:00 dpw Exp $ */
30
31 #include "X.h"
32 #include "Xmd.h"
33 #include "servermd.h"
34 #include "scrnintstr.h"
35 #include "pixmapstr.h"
36 #include "resource.h"
37 #include "colormap.h"
38 #include "colormapst.h"
39 #include "cfb.h"
40 #include "mi.h"
41 #include "mistruct.h"
42 #include "dix.h"
43 #include "cfbmskbits.h"
44 #include "mibstore.h"
45
46
47 miBSFuncRec cfbBSFuncRec = {
48 cfbSaveAreas,
49 cfbRestoreAreas,
50 (void (*)()) 0,
51 (PixmapPtr (*)()) 0,
52 (PixmapPtr (*)()) 0,
53 };
54
55 Bool
cfbCloseScreen(index,pScreen)56 cfbCloseScreen (index, pScreen)
57 int index;
58 ScreenPtr pScreen;
59 {
60 int d;
61 DepthPtr depths = pScreen->allowedDepths;
62
63 for (d = 0; d < pScreen->numDepths; d++)
64 xfree (depths[d].vids);
65 xfree (depths);
66 xfree (pScreen->visuals);
67 #ifdef CFB_NEED_SCREEN_PRIVATE
68 xfree (pScreen->devPrivates[cfbScreenPrivateIndex].ptr);
69 #else
70 xfree (pScreen->devPrivate);
71 #endif
72 return TRUE;
73 }
74
75 Bool
cfbSetupScreen(pScreen,pbits,xsize,ysize,dpix,dpiy,width)76 cfbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width)
77 register ScreenPtr pScreen;
78 pointer pbits; /* pointer to screen bitmap */
79 int xsize, ysize; /* in pixels */
80 int dpix, dpiy; /* dots per inch */
81 int width; /* pixel width of frame buffer */
82 {
83 int i;
84 extern RegionPtr (*cfbPuntCopyPlane)();
85
86 if (!cfbAllocatePrivates(pScreen, (int *) 0, (int *) 0))
87 return FALSE;
88 pScreen->defColormap = FakeClientID(0);
89 /* let CreateDefColormap do whatever it wants for pixels */
90 pScreen->blackPixel = pScreen->whitePixel = (Pixel) 0;
91 pScreen->QueryBestSize = mfbQueryBestSize;
92 /* SaveScreen */
93 pScreen->GetImage = cfbGetImage;
94 pScreen->GetSpans = cfbGetSpans;
95 pScreen->CreateWindow = cfbCreateWindow;
96 pScreen->DestroyWindow = cfbDestroyWindow;
97 pScreen->PositionWindow = cfbPositionWindow;
98 pScreen->ChangeWindowAttributes = cfbChangeWindowAttributes;
99 pScreen->RealizeWindow = cfbMapWindow;
100 pScreen->UnrealizeWindow = cfbUnmapWindow;
101 pScreen->PaintWindowBackground = cfbPaintWindow;
102 pScreen->PaintWindowBorder = cfbPaintWindow;
103 pScreen->CopyWindow = cfbCopyWindow;
104 pScreen->CreatePixmap = cfbCreatePixmap;
105 pScreen->DestroyPixmap = cfbDestroyPixmap;
106 pScreen->RealizeFont = mfbRealizeFont;
107 pScreen->UnrealizeFont = mfbUnrealizeFont;
108 pScreen->CreateGC = cfbCreateGC;
109 pScreen->CreateColormap = cfbInitializeColormap;
110 pScreen->DestroyColormap = (void (*)())NoopDDA;
111 #ifdef STATIC_COLOR
112 pScreen->InstallColormap = cfbInstallColormap;
113 pScreen->UninstallColormap = cfbUninstallColormap;
114 pScreen->ListInstalledColormaps = cfbListInstalledColormaps;
115 pScreen->StoreColors = (void (*)())NoopDDA;
116 #endif
117 pScreen->ResolveColor = cfbResolveColor;
118 pScreen->BitmapToRegion = mfbPixmapToRegion;
119
120 mfbRegisterCopyPlaneProc (pScreen, cfbCopyPlane);
121 return TRUE;
122 }
123
124 #ifdef CFB_NEED_SCREEN_PRIVATE
125 Bool
cfbCreateScreenResources(pScreen)126 cfbCreateScreenResources(pScreen)
127 ScreenPtr pScreen;
128 {
129 Bool retval;
130
131 pointer oldDevPrivate = pScreen->devPrivate;
132 pScreen->devPrivate = pScreen->devPrivates[cfbScreenPrivateIndex].ptr;
133 retval = miCreateScreenResources(pScreen);
134 pScreen->devPrivates[cfbScreenPrivateIndex].ptr = pScreen->devPrivate;
135 pScreen->devPrivate = oldDevPrivate;
136 return retval;
137 }
138 #endif
139
cfbFinishScreenInit(pScreen,pbits,xsize,ysize,dpix,dpiy,width)140 cfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width)
141 register ScreenPtr pScreen;
142 pointer pbits; /* pointer to screen bitmap */
143 int xsize, ysize; /* in pixels */
144 int dpix, dpiy; /* dots per inch */
145 int width; /* pixel width of frame buffer */
146 {
147 int i, j;
148 #ifdef CFB_NEED_SCREEN_PRIVATE
149 pointer oldDevPrivate;
150 #endif
151 VisualPtr visuals;
152 DepthPtr depths;
153 int nvisuals;
154 int ndepths;
155 int rootdepth;
156 VisualID defaultVisual;
157
158 rootdepth = 0;
159 if (!cfbInitVisuals (&visuals, &depths, &nvisuals, &ndepths, &rootdepth,
160 &defaultVisual,((unsigned long)1<<(PSZ-1)), 8))
161 return FALSE;
162 #ifdef CFB_NEED_SCREEN_PRIVATE
163 oldDevPrivate = pScreen->devPrivate;
164 #endif
165 if (! miScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width,
166 rootdepth, ndepths, depths,
167 defaultVisual, nvisuals, visuals,
168 (miBSFuncPtr) 0))
169 return FALSE;
170 /* overwrite miCloseScreen with our own */
171 pScreen->CloseScreen = cfbCloseScreen;
172 /* init backing store here so we can overwrite CloseScreen without stepping
173 * on the backing store wrapped version */
174 miInitializeBackingStore (pScreen, &cfbBSFuncRec);
175 #ifdef CFB_NEED_SCREEN_PRIVATE
176 pScreen->CreateScreenResources = cfbCreateScreenResources;
177 pScreen->devPrivates[cfbScreenPrivateIndex].ptr = pScreen->devPrivate;
178 pScreen->devPrivate = oldDevPrivate;
179 #endif
180 return TRUE;
181 }
182
183 /* dts * (inch/dot) * (25.4 mm / inch) = mm */
184 Bool
cfbScreenInit(pScreen,pbits,xsize,ysize,dpix,dpiy,width)185 cfbScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width)
186 register ScreenPtr pScreen;
187 pointer pbits; /* pointer to screen bitmap */
188 int xsize, ysize; /* in pixels */
189 int dpix, dpiy; /* dots per inch */
190 int width; /* pixel width of frame buffer */
191 {
192 if (!cfbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width))
193 return FALSE;
194 return cfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width);
195 }
196