| File: | hw/xnest/Color.c |
| Location: | line 224, column 30 |
| Description: | Call to 'malloc' has an allocation size of 0 bytes |
| 1 | /* | |||
| 2 | ||||
| 3 | Copyright 1993 by Davor Matic | |||
| 4 | ||||
| 5 | Permission to use, copy, modify, distribute, and sell this software | |||
| 6 | and its documentation for any purpose is hereby granted without fee, | |||
| 7 | provided that the above copyright notice appear in all copies and that | |||
| 8 | both that copyright notice and this permission notice appear in | |||
| 9 | supporting documentation. Davor Matic makes no representations about | |||
| 10 | the suitability of this software for any purpose. It is provided "as | |||
| 11 | is" without express or implied warranty. | |||
| 12 | ||||
| 13 | */ | |||
| 14 | ||||
| 15 | #ifdef HAVE_XNEST_CONFIG_H1 | |||
| 16 | #include <xnest-config.h> | |||
| 17 | #endif | |||
| 18 | ||||
| 19 | #include <X11/X.h> | |||
| 20 | #include <X11/Xproto.h> | |||
| 21 | #include "scrnintstr.h" | |||
| 22 | #include "window.h" | |||
| 23 | #include "windowstr.h" | |||
| 24 | #include "colormapst.h" | |||
| 25 | #include "resource.h" | |||
| 26 | ||||
| 27 | #include "Xnest.h" | |||
| 28 | ||||
| 29 | #include "Display.h" | |||
| 30 | #include "Screen.h" | |||
| 31 | #include "Color.h" | |||
| 32 | #include "Visual.h" | |||
| 33 | #include "XNWindow.h" | |||
| 34 | #include "Args.h" | |||
| 35 | ||||
| 36 | DevPrivateKeyRec xnestColormapPrivateKeyRec; | |||
| 37 | ||||
| 38 | static DevPrivateKeyRec cmapScrPrivateKeyRec; | |||
| 39 | ||||
| 40 | #define cmapScrPrivateKey(&cmapScrPrivateKeyRec) (&cmapScrPrivateKeyRec) | |||
| 41 | ||||
| 42 | #define GetInstalledColormap(s)((ColormapPtr) dixLookupPrivate(&(s)->devPrivates, (& cmapScrPrivateKeyRec))) ((ColormapPtr) dixLookupPrivate(&(s)->devPrivates, cmapScrPrivateKey(&cmapScrPrivateKeyRec))) | |||
| 43 | #define SetInstalledColormap(s,c)(dixSetPrivate(&(s)->devPrivates, (&cmapScrPrivateKeyRec ), c)) (dixSetPrivate(&(s)->devPrivates, cmapScrPrivateKey(&cmapScrPrivateKeyRec), c)) | |||
| 44 | ||||
| 45 | Boolint | |||
| 46 | xnestCreateColormap(ColormapPtr pCmap) | |||
| 47 | { | |||
| 48 | VisualPtr pVisual; | |||
| 49 | XColor *colors; | |||
| 50 | int i, ncolors; | |||
| 51 | Pixel red, green, blue; | |||
| 52 | Pixel redInc, greenInc, blueInc; | |||
| 53 | ||||
| 54 | pVisual = pCmap->pVisual; | |||
| 55 | ncolors = pVisual->ColormapEntries; | |||
| 56 | ||||
| 57 | xnestColormapPriv(pCmap)((xnestPrivColormap *) dixLookupPrivate(&(pCmap)->devPrivates , &xnestColormapPrivateKeyRec))->colormap = | |||
| 58 | XCreateColormap(xnestDisplay, | |||
| 59 | xnestDefaultWindows[pCmap->pScreen->myNum], | |||
| 60 | xnestVisual(pVisual), | |||
| 61 | (pVisual->class & DynamicClass1) ? AllocAll1 : AllocNone0); | |||
| 62 | ||||
| 63 | switch (pVisual->class) { | |||
| 64 | case StaticGray0: /* read only */ | |||
| 65 | colors = (XColor *) malloc(ncolors * sizeof(XColor)); | |||
| 66 | for (i = 0; i < ncolors; i++) | |||
| 67 | colors[i].pixel = i; | |||
| 68 | XQueryColors(xnestDisplay, xnestColormap(pCmap)(((xnestPrivColormap *) dixLookupPrivate(&(pCmap)->devPrivates , &xnestColormapPrivateKeyRec))->colormap), colors, ncolors); | |||
| 69 | for (i = 0; i < ncolors; i++) { | |||
| 70 | pCmap->red[i].co.local.red = colors[i].red; | |||
| 71 | pCmap->red[i].co.local.green = colors[i].red; | |||
| 72 | pCmap->red[i].co.local.blue = colors[i].red; | |||
| 73 | } | |||
| 74 | free(colors); | |||
| 75 | break; | |||
| 76 | ||||
| 77 | case StaticColor2: /* read only */ | |||
| 78 | colors = (XColor *) malloc(ncolors * sizeof(XColor)); | |||
| 79 | for (i = 0; i < ncolors; i++) | |||
| 80 | colors[i].pixel = i; | |||
| 81 | XQueryColors(xnestDisplay, xnestColormap(pCmap)(((xnestPrivColormap *) dixLookupPrivate(&(pCmap)->devPrivates , &xnestColormapPrivateKeyRec))->colormap), colors, ncolors); | |||
| 82 | for (i = 0; i < ncolors; i++) { | |||
| 83 | pCmap->red[i].co.local.red = colors[i].red; | |||
| 84 | pCmap->red[i].co.local.green = colors[i].green; | |||
| 85 | pCmap->red[i].co.local.blue = colors[i].blue; | |||
| 86 | } | |||
| 87 | free(colors); | |||
| 88 | break; | |||
| 89 | ||||
| 90 | case TrueColor4: /* read only */ | |||
| 91 | colors = (XColor *) malloc(ncolors * sizeof(XColor)); | |||
| 92 | red = green = blue = 0L; | |||
| 93 | redInc = lowbit(pVisual->redMask)((pVisual->redMask) & (~(pVisual->redMask) + 1)); | |||
| 94 | greenInc = lowbit(pVisual->greenMask)((pVisual->greenMask) & (~(pVisual->greenMask) + 1) ); | |||
| 95 | blueInc = lowbit(pVisual->blueMask)((pVisual->blueMask) & (~(pVisual->blueMask) + 1)); | |||
| 96 | for (i = 0; i < ncolors; i++) { | |||
| 97 | colors[i].pixel = red | green | blue; | |||
| 98 | red += redInc; | |||
| 99 | if (red > pVisual->redMask) | |||
| 100 | red = 0L; | |||
| 101 | green += greenInc; | |||
| 102 | if (green > pVisual->greenMask) | |||
| 103 | green = 0L; | |||
| 104 | blue += blueInc; | |||
| 105 | if (blue > pVisual->blueMask) | |||
| 106 | blue = 0L; | |||
| 107 | } | |||
| 108 | XQueryColors(xnestDisplay, xnestColormap(pCmap)(((xnestPrivColormap *) dixLookupPrivate(&(pCmap)->devPrivates , &xnestColormapPrivateKeyRec))->colormap), colors, ncolors); | |||
| 109 | for (i = 0; i < ncolors; i++) { | |||
| 110 | pCmap->red[i].co.local.red = colors[i].red; | |||
| 111 | pCmap->green[i].co.local.green = colors[i].green; | |||
| 112 | pCmap->blue[i].co.local.blue = colors[i].blue; | |||
| 113 | } | |||
| 114 | free(colors); | |||
| 115 | break; | |||
| 116 | ||||
| 117 | case GrayScale1: /* read and write */ | |||
| 118 | break; | |||
| 119 | ||||
| 120 | case PseudoColor3: /* read and write */ | |||
| 121 | break; | |||
| 122 | ||||
| 123 | case DirectColor5: /* read and write */ | |||
| 124 | break; | |||
| 125 | } | |||
| 126 | ||||
| 127 | return True1; | |||
| 128 | } | |||
| 129 | ||||
| 130 | void | |||
| 131 | xnestDestroyColormap(ColormapPtr pCmap) | |||
| 132 | { | |||
| 133 | XFreeColormap(xnestDisplay, xnestColormap(pCmap)(((xnestPrivColormap *) dixLookupPrivate(&(pCmap)->devPrivates , &xnestColormapPrivateKeyRec))->colormap)); | |||
| 134 | } | |||
| 135 | ||||
| 136 | #define SEARCH_PREDICATE((((xnestPrivWin *) dixLookupPrivate(&(pWin)->devPrivates , (&xnestWindowPrivateKeyRec)))->window) != 0L && ((pWin)->drawable.class == 2 ? 0L : ((pWin)->optional ? (pWin)->optional->colormap : FindWindowWithOptional(pWin )->optional->colormap)) == icws->cmapIDs[i]) \ | |||
| 137 | (xnestWindow(pWin)(((xnestPrivWin *) dixLookupPrivate(&(pWin)->devPrivates , (&xnestWindowPrivateKeyRec)))->window) != None0L && wColormap(pWin)((pWin)->drawable.class == 2 ? 0L : ((pWin)->optional ? (pWin)->optional->colormap : FindWindowWithOptional(pWin )->optional->colormap)) == icws->cmapIDs[i]) | |||
| 138 | ||||
| 139 | static int | |||
| 140 | xnestCountInstalledColormapWindows(WindowPtr pWin, void *ptr) | |||
| 141 | { | |||
| 142 | xnestInstalledColormapWindows *icws = (xnestInstalledColormapWindows *) ptr; | |||
| 143 | int i; | |||
| 144 | ||||
| 145 | for (i = 0; i < icws->numCmapIDs; i++) | |||
| 146 | if (SEARCH_PREDICATE((((xnestPrivWin *) dixLookupPrivate(&(pWin)->devPrivates , (&xnestWindowPrivateKeyRec)))->window) != 0L && ((pWin)->drawable.class == 2 ? 0L : ((pWin)->optional ? (pWin)->optional->colormap : FindWindowWithOptional(pWin )->optional->colormap)) == icws->cmapIDs[i])) { | |||
| 147 | icws->numWindows++; | |||
| 148 | return WT_DONTWALKCHILDREN2; | |||
| 149 | } | |||
| 150 | ||||
| 151 | return WT_WALKCHILDREN1; | |||
| 152 | } | |||
| 153 | ||||
| 154 | static int | |||
| 155 | xnestGetInstalledColormapWindows(WindowPtr pWin, void *ptr) | |||
| 156 | { | |||
| 157 | xnestInstalledColormapWindows *icws = (xnestInstalledColormapWindows *) ptr; | |||
| 158 | int i; | |||
| 159 | ||||
| 160 | for (i = 0; i < icws->numCmapIDs; i++) | |||
| 161 | if (SEARCH_PREDICATE((((xnestPrivWin *) dixLookupPrivate(&(pWin)->devPrivates , (&xnestWindowPrivateKeyRec)))->window) != 0L && ((pWin)->drawable.class == 2 ? 0L : ((pWin)->optional ? (pWin)->optional->colormap : FindWindowWithOptional(pWin )->optional->colormap)) == icws->cmapIDs[i])) { | |||
| 162 | icws->windows[icws->index++] = xnestWindow(pWin)(((xnestPrivWin *) dixLookupPrivate(&(pWin)->devPrivates , (&xnestWindowPrivateKeyRec)))->window); | |||
| 163 | return WT_DONTWALKCHILDREN2; | |||
| 164 | } | |||
| 165 | ||||
| 166 | return WT_WALKCHILDREN1; | |||
| 167 | } | |||
| 168 | ||||
| 169 | static Window *xnestOldInstalledColormapWindows = NULL((void*)0); | |||
| 170 | static int xnestNumOldInstalledColormapWindows = 0; | |||
| 171 | ||||
| 172 | static Boolint | |||
| 173 | xnestSameInstalledColormapWindows(Window *windows, int numWindows) | |||
| 174 | { | |||
| 175 | if (xnestNumOldInstalledColormapWindows != numWindows) | |||
| 176 | return False0; | |||
| 177 | ||||
| 178 | if (xnestOldInstalledColormapWindows == windows) | |||
| 179 | return True1; | |||
| 180 | ||||
| 181 | if (xnestOldInstalledColormapWindows == NULL((void*)0) || windows == NULL((void*)0)) | |||
| 182 | return False0; | |||
| 183 | ||||
| 184 | if (memcmp(xnestOldInstalledColormapWindows, windows, | |||
| 185 | numWindows * sizeof(Window))) | |||
| 186 | return False0; | |||
| 187 | ||||
| 188 | return True1; | |||
| 189 | } | |||
| 190 | ||||
| 191 | void | |||
| 192 | xnestSetInstalledColormapWindows(ScreenPtr pScreen) | |||
| 193 | { | |||
| 194 | xnestInstalledColormapWindows icws; | |||
| 195 | int numWindows; | |||
| 196 | ||||
| 197 | icws.cmapIDs = (Colormap *) malloc(pScreen->maxInstalledCmaps * | |||
| 198 | sizeof(Colormap)); | |||
| 199 | icws.numCmapIDs = xnestListInstalledColormaps(pScreen, icws.cmapIDs); | |||
| 200 | icws.numWindows = 0; | |||
| 201 | WalkTree(pScreen, xnestCountInstalledColormapWindows, (void *) &icws); | |||
| 202 | if (icws.numWindows) { | |||
| 203 | icws.windows = | |||
| 204 | (Window *) malloc((icws.numWindows + 1) * sizeof(Window)); | |||
| 205 | icws.index = 0; | |||
| 206 | WalkTree(pScreen, xnestGetInstalledColormapWindows, (void *) &icws); | |||
| 207 | icws.windows[icws.numWindows] = xnestDefaultWindows[pScreen->myNum]; | |||
| 208 | numWindows = icws.numWindows + 1; | |||
| 209 | } | |||
| 210 | else { | |||
| 211 | icws.windows = NULL((void*)0); | |||
| 212 | numWindows = 0; | |||
| 213 | } | |||
| 214 | ||||
| 215 | free(icws.cmapIDs); | |||
| 216 | ||||
| 217 | if (!xnestSameInstalledColormapWindows(icws.windows, icws.numWindows)) { | |||
| 218 | free(xnestOldInstalledColormapWindows); | |||
| 219 | ||||
| 220 | #ifdef _XSERVER64 | |||
| 221 | { | |||
| 222 | int i; | |||
| 223 | Window64 *windows = | |||
| 224 | (Window64 *) malloc(numWindows * sizeof(Window64)); | |||
| ||||
| 225 | ||||
| 226 | for (i = 0; i < numWindows; ++i) | |||
| 227 | windows[i] = icws.windows[i]; | |||
| 228 | XSetWMColormapWindows(xnestDisplay, | |||
| 229 | xnestDefaultWindows[pScreen->myNum], windows, | |||
| 230 | numWindows); | |||
| 231 | free(windows); | |||
| 232 | } | |||
| 233 | #else | |||
| 234 | XSetWMColormapWindows(xnestDisplay, xnestDefaultWindows[pScreen->myNum], | |||
| 235 | icws.windows, numWindows); | |||
| 236 | #endif | |||
| 237 | ||||
| 238 | xnestOldInstalledColormapWindows = icws.windows; | |||
| 239 | xnestNumOldInstalledColormapWindows = icws.numWindows; | |||
| 240 | ||||
| 241 | #ifdef DUMB_WINDOW_MANAGERS | |||
| 242 | /* | |||
| 243 | This code is for dumb window managers. | |||
| 244 | This will only work with default local visual colormaps. | |||
| 245 | */ | |||
| 246 | if (icws.numWindows) { | |||
| 247 | WindowPtr pWin; | |||
| 248 | Visual *visual; | |||
| 249 | ColormapPtr pCmap; | |||
| 250 | ||||
| 251 | pWin = xnestWindowPtr(icws.windows[0]); | |||
| 252 | visual = xnestVisualFromID(pScreen, wVisual(pWin)((pWin)->optional ? (pWin)->optional->visual : FindWindowWithOptional (pWin)->optional->visual)); | |||
| 253 | ||||
| 254 | if (visual == xnestDefaultVisual(pScreen)xnestVisualFromID((pScreen), (pScreen)->rootVisual)) | |||
| 255 | dixLookupResourceByType((void **) &pCmap, wColormap(pWin)((pWin)->drawable.class == 2 ? 0L : ((pWin)->optional ? (pWin)->optional->colormap : FindWindowWithOptional(pWin )->optional->colormap)), | |||
| 256 | RT_COLORMAP((RESTYPE)6), serverClient, | |||
| 257 | DixUseAccess(1<<24)); | |||
| 258 | else | |||
| 259 | dixLookupResourceByType((void **) &pCmap, | |||
| 260 | pScreen->defColormap, RT_COLORMAP((RESTYPE)6), | |||
| 261 | serverClient, DixUseAccess(1<<24)); | |||
| 262 | ||||
| 263 | XSetWindowColormap(xnestDisplay, | |||
| 264 | xnestDefaultWindows[pScreen->myNum], | |||
| 265 | xnestColormap(pCmap)(((xnestPrivColormap *) dixLookupPrivate(&(pCmap)->devPrivates , &xnestColormapPrivateKeyRec))->colormap)); | |||
| 266 | } | |||
| 267 | #endif /* DUMB_WINDOW_MANAGERS */ | |||
| 268 | } | |||
| 269 | else | |||
| 270 | free(icws.windows); | |||
| 271 | } | |||
| 272 | ||||
| 273 | void | |||
| 274 | xnestSetScreenSaverColormapWindow(ScreenPtr pScreen) | |||
| 275 | { | |||
| 276 | free(xnestOldInstalledColormapWindows); | |||
| 277 | ||||
| 278 | #ifdef _XSERVER64 | |||
| 279 | { | |||
| 280 | Window64 window; | |||
| 281 | ||||
| 282 | window = xnestScreenSaverWindows[pScreen->myNum]; | |||
| 283 | XSetWMColormapWindows(xnestDisplay, xnestDefaultWindows[pScreen->myNum], | |||
| 284 | &window, 1); | |||
| 285 | xnestScreenSaverWindows[pScreen->myNum] = window; | |||
| 286 | } | |||
| 287 | #else | |||
| 288 | XSetWMColormapWindows(xnestDisplay, xnestDefaultWindows[pScreen->myNum], | |||
| 289 | &xnestScreenSaverWindows[pScreen->myNum], 1); | |||
| 290 | #endif /* _XSERVER64 */ | |||
| 291 | ||||
| 292 | xnestOldInstalledColormapWindows = NULL((void*)0); | |||
| 293 | xnestNumOldInstalledColormapWindows = 0; | |||
| 294 | ||||
| 295 | xnestDirectUninstallColormaps(pScreen); | |||
| 296 | } | |||
| 297 | ||||
| 298 | void | |||
| 299 | xnestDirectInstallColormaps(ScreenPtr pScreen) | |||
| 300 | { | |||
| 301 | int i, n; | |||
| 302 | Colormap pCmapIDs[MAXCMAPS1]; | |||
| 303 | ||||
| 304 | if (!xnestDoDirectColormaps) | |||
| 305 | return; | |||
| 306 | ||||
| 307 | n = (*pScreen->ListInstalledColormaps) (pScreen, pCmapIDs); | |||
| 308 | ||||
| 309 | for (i = 0; i < n; i++) { | |||
| 310 | ColormapPtr pCmap; | |||
| 311 | ||||
| 312 | dixLookupResourceByType((void **) &pCmap, pCmapIDs[i], RT_COLORMAP((RESTYPE)6), | |||
| 313 | serverClient, DixInstallAccess(1<<20)); | |||
| 314 | if (pCmap) | |||
| 315 | XInstallColormap(xnestDisplay, xnestColormap(pCmap)(((xnestPrivColormap *) dixLookupPrivate(&(pCmap)->devPrivates , &xnestColormapPrivateKeyRec))->colormap)); | |||
| 316 | } | |||
| 317 | } | |||
| 318 | ||||
| 319 | void | |||
| 320 | xnestDirectUninstallColormaps(ScreenPtr pScreen) | |||
| 321 | { | |||
| 322 | int i, n; | |||
| 323 | Colormap pCmapIDs[MAXCMAPS1]; | |||
| 324 | ||||
| 325 | if (!xnestDoDirectColormaps) | |||
| 326 | return; | |||
| 327 | ||||
| 328 | n = (*pScreen->ListInstalledColormaps) (pScreen, pCmapIDs); | |||
| 329 | ||||
| 330 | for (i = 0; i < n; i++) { | |||
| 331 | ColormapPtr pCmap; | |||
| 332 | ||||
| 333 | dixLookupResourceByType((void **) &pCmap, pCmapIDs[i], RT_COLORMAP((RESTYPE)6), | |||
| 334 | serverClient, DixUninstallAccess(1<<21)); | |||
| 335 | if (pCmap) | |||
| 336 | XUninstallColormap(xnestDisplay, xnestColormap(pCmap)(((xnestPrivColormap *) dixLookupPrivate(&(pCmap)->devPrivates , &xnestColormapPrivateKeyRec))->colormap)); | |||
| 337 | } | |||
| 338 | } | |||
| 339 | ||||
| 340 | void | |||
| 341 | xnestInstallColormap(ColormapPtr pCmap) | |||
| 342 | { | |||
| 343 | ColormapPtr pOldCmap = GetInstalledColormap(pCmap->pScreen)((ColormapPtr) dixLookupPrivate(&(pCmap->pScreen)-> devPrivates, (&cmapScrPrivateKeyRec))); | |||
| 344 | ||||
| 345 | if (pCmap != pOldCmap) { | |||
| ||||
| 346 | xnestDirectUninstallColormaps(pCmap->pScreen); | |||
| 347 | ||||
| 348 | /* Uninstall pInstalledMap. Notify all interested parties. */ | |||
| 349 | if (pOldCmap != (ColormapPtr) None0L) | |||
| 350 | WalkTree(pCmap->pScreen, TellLostMap, (void *) &pOldCmap->mid); | |||
| 351 | ||||
| 352 | SetInstalledColormap(pCmap->pScreen, pCmap)(dixSetPrivate(&(pCmap->pScreen)->devPrivates, (& cmapScrPrivateKeyRec), pCmap)); | |||
| 353 | WalkTree(pCmap->pScreen, TellGainedMap, (void *) &pCmap->mid); | |||
| 354 | ||||
| 355 | xnestSetInstalledColormapWindows(pCmap->pScreen); | |||
| 356 | xnestDirectInstallColormaps(pCmap->pScreen); | |||
| 357 | } | |||
| 358 | } | |||
| 359 | ||||
| 360 | void | |||
| 361 | xnestUninstallColormap(ColormapPtr pCmap) | |||
| 362 | { | |||
| 363 | ColormapPtr pCurCmap = GetInstalledColormap(pCmap->pScreen)((ColormapPtr) dixLookupPrivate(&(pCmap->pScreen)-> devPrivates, (&cmapScrPrivateKeyRec))); | |||
| 364 | ||||
| 365 | if (pCmap == pCurCmap) { | |||
| 366 | if (pCmap->mid != pCmap->pScreen->defColormap) { | |||
| 367 | dixLookupResourceByType((void **) &pCurCmap, | |||
| 368 | pCmap->pScreen->defColormap, | |||
| 369 | RT_COLORMAP((RESTYPE)6), | |||
| 370 | serverClient, DixInstallAccess(1<<20)); | |||
| 371 | (*pCmap->pScreen->InstallColormap) (pCurCmap); | |||
| 372 | } | |||
| 373 | } | |||
| 374 | } | |||
| 375 | ||||
| 376 | static Boolint xnestInstalledDefaultColormap = False0; | |||
| 377 | ||||
| 378 | int | |||
| 379 | xnestListInstalledColormaps(ScreenPtr pScreen, Colormap * pCmapIDs) | |||
| 380 | { | |||
| 381 | if (xnestInstalledDefaultColormap) { | |||
| 382 | *pCmapIDs = GetInstalledColormap(pScreen)((ColormapPtr) dixLookupPrivate(&(pScreen)->devPrivates , (&cmapScrPrivateKeyRec)))->mid; | |||
| 383 | return 1; | |||
| 384 | } | |||
| 385 | else | |||
| 386 | return 0; | |||
| 387 | } | |||
| 388 | ||||
| 389 | void | |||
| 390 | xnestStoreColors(ColormapPtr pCmap, int nColors, xColorItem * pColors) | |||
| 391 | { | |||
| 392 | if (pCmap->pVisual->class & DynamicClass1) | |||
| 393 | #ifdef _XSERVER64 | |||
| 394 | { | |||
| 395 | int i; | |||
| 396 | XColor *pColors64 = (XColor *) malloc(nColors * sizeof(XColor)); | |||
| 397 | ||||
| 398 | for (i = 0; i < nColors; ++i) { | |||
| 399 | pColors64[i].pixel = pColors[i].pixel; | |||
| 400 | pColors64[i].red = pColors[i].red; | |||
| 401 | pColors64[i].green = pColors[i].green; | |||
| 402 | pColors64[i].blue = pColors[i].blue; | |||
| 403 | pColors64[i].flags = pColors[i].flags; | |||
| 404 | } | |||
| 405 | XStoreColors(xnestDisplay, xnestColormap(pCmap)(((xnestPrivColormap *) dixLookupPrivate(&(pCmap)->devPrivates , &xnestColormapPrivateKeyRec))->colormap), pColors64, nColors); | |||
| 406 | free(pColors64); | |||
| 407 | } | |||
| 408 | #else | |||
| 409 | XStoreColors(xnestDisplay, xnestColormap(pCmap)(((xnestPrivColormap *) dixLookupPrivate(&(pCmap)->devPrivates , &xnestColormapPrivateKeyRec))->colormap), | |||
| 410 | (XColor *) pColors, nColors); | |||
| 411 | #endif | |||
| 412 | } | |||
| 413 | ||||
| 414 | void | |||
| 415 | xnestResolveColor(unsigned short *pRed, unsigned short *pGreen, | |||
| 416 | unsigned short *pBlue, VisualPtr pVisual) | |||
| 417 | { | |||
| 418 | int shift; | |||
| 419 | unsigned int lim; | |||
| 420 | ||||
| 421 | shift = 16 - pVisual->bitsPerRGBValue; | |||
| 422 | lim = (1 << pVisual->bitsPerRGBValue) - 1; | |||
| 423 | ||||
| 424 | if ((pVisual->class == PseudoColor3) || (pVisual->class == DirectColor5)) { | |||
| 425 | /* rescale to rgb bits */ | |||
| 426 | *pRed = ((*pRed >> shift) * 65535) / lim; | |||
| 427 | *pGreen = ((*pGreen >> shift) * 65535) / lim; | |||
| 428 | *pBlue = ((*pBlue >> shift) * 65535) / lim; | |||
| 429 | } | |||
| 430 | else if (pVisual->class == GrayScale1) { | |||
| 431 | /* rescale to gray then rgb bits */ | |||
| 432 | *pRed = (30L * *pRed + 59L * *pGreen + 11L * *pBlue) / 100; | |||
| 433 | *pBlue = *pGreen = *pRed = ((*pRed >> shift) * 65535) / lim; | |||
| 434 | } | |||
| 435 | else if (pVisual->class == StaticGray0) { | |||
| 436 | unsigned int limg; | |||
| 437 | ||||
| 438 | limg = pVisual->ColormapEntries - 1; | |||
| 439 | /* rescale to gray then [0..limg] then [0..65535] then rgb bits */ | |||
| 440 | *pRed = (30L * *pRed + 59L * *pGreen + 11L * *pBlue) / 100; | |||
| 441 | *pRed = ((((*pRed * (limg + 1))) >> 16) * 65535) / limg; | |||
| 442 | *pBlue = *pGreen = *pRed = ((*pRed >> shift) * 65535) / lim; | |||
| 443 | } | |||
| 444 | else { | |||
| 445 | unsigned limr, limg, limb; | |||
| 446 | ||||
| 447 | limr = pVisual->redMask >> pVisual->offsetRed; | |||
| 448 | limg = pVisual->greenMask >> pVisual->offsetGreen; | |||
| 449 | limb = pVisual->blueMask >> pVisual->offsetBlue; | |||
| 450 | /* rescale to [0..limN] then [0..65535] then rgb bits */ | |||
| 451 | *pRed = ((((((*pRed * (limr + 1)) >> 16) * | |||
| 452 | 65535) / limr) >> shift) * 65535) / lim; | |||
| 453 | *pGreen = ((((((*pGreen * (limg + 1)) >> 16) * | |||
| 454 | 65535) / limg) >> shift) * 65535) / lim; | |||
| 455 | *pBlue = ((((((*pBlue * (limb + 1)) >> 16) * | |||
| 456 | 65535) / limb) >> shift) * 65535) / lim; | |||
| 457 | } | |||
| 458 | } | |||
| 459 | ||||
| 460 | Boolint | |||
| 461 | xnestCreateDefaultColormap(ScreenPtr pScreen) | |||
| 462 | { | |||
| 463 | VisualPtr pVisual; | |||
| 464 | ColormapPtr pCmap; | |||
| 465 | unsigned short zero = 0, ones = 0xFFFF; | |||
| 466 | Pixel wp, bp; | |||
| 467 | ||||
| 468 | if (!dixRegisterPrivateKey(&cmapScrPrivateKeyRec, PRIVATE_SCREEN, 0)) | |||
| 469 | return FALSE0; | |||
| 470 | ||||
| 471 | for (pVisual = pScreen->visuals; | |||
| 472 | pVisual->vid != pScreen->rootVisual; pVisual++); | |||
| 473 | ||||
| 474 | if (CreateColormap(pScreen->defColormap, pScreen, pVisual, &pCmap, | |||
| 475 | (pVisual->class & DynamicClass1) ? AllocNone0 : AllocAll1, | |||
| 476 | 0) | |||
| 477 | != Success0) | |||
| 478 | return False0; | |||
| 479 | ||||
| 480 | wp = pScreen->whitePixel; | |||
| 481 | bp = pScreen->blackPixel; | |||
| 482 | if ((AllocColor(pCmap, &ones, &ones, &ones, &wp, 0) != | |||
| 483 | Success0) || | |||
| 484 | (AllocColor(pCmap, &zero, &zero, &zero, &bp, 0) != Success0)) | |||
| 485 | return FALSE0; | |||
| 486 | pScreen->whitePixel = wp; | |||
| 487 | pScreen->blackPixel = bp; | |||
| 488 | (*pScreen->InstallColormap) (pCmap); | |||
| 489 | ||||
| 490 | xnestInstalledDefaultColormap = True1; | |||
| 491 | ||||
| 492 | return True1; | |||
| 493 | } |