84 uint mask = VisualScreenMask;
87 if (visual_class != -1) {
88 rvi.c_class = visual_class;
89 mask |= VisualClassMask;
91 if (visual_id != -1) {
92 rvi.visualid = visual_id;
96 Visual *visual = DefaultVisual(display, screen);
97 *defaultVisual =
true;
98 *depth = DefaultDepth(display, screen);
100 vi = XGetVisualInfo(display, mask, &rvi, &count);
103 for (
int x = 0; x < count; ++x) {
104 if (vi[x].depth > vi[best].depth)
107 if (best >= 0 && best <= count && vi[best].visualid != XVisualIDFromVisual(visual)) {
108 visual = vi[best].visual;
109 *defaultVisual = (visual == DefaultVisual(display, screen));
110 *depth = vi[best].depth;
123 int q_colors = (((1u << d
->depth) > 256u) ? 256u : (1u << d
->depth));
125 memset(queried, 0,
sizeof(queried));
126 for (
int x = 0; x < q_colors; ++x)
127 queried[x].pixel = x;
128 XQueryColors(display, d
->colormap, queried, q_colors);
130 d->colors.resize(q_colors);
131 for (
int x = 0; x < q_colors; ++x) {
132 if (queried[x].red == 0
133 && queried[x].green == 0
134 && queried[x].blue == 0
135 && queried[x].pixel != BlackPixel(display, screen)) {
140 d->colors[x] = QColor::fromRgbF(queried[x].red /
float(USHRT_MAX),
141 queried[x].green /
float(USHRT_MAX),
142 queried[x].blue /
float(USHRT_MAX));
146 Q_ASSERT(d->pixels.size());
147 for (
int x = 0; x < d->pixels.size(); ++x) {
148 if (d->pixels.at(x) != -1)
164 int mindist = INT_MAX, best = -1;
165 for (
int y = 0; y < q_colors; ++y) {
166 int r = qRed(rgb) - (queried[y].red >> 8);
167 int g = qGreen(rgb) - (queried[y].green >> 8);
168 int b = qBlue(rgb) - (queried[y].blue >> 8);
169 int dist = (r * r) + (g * g) + (b * b);
170 if (dist < mindist) {
176 Q_ASSERT(best >= 0 && best < q_colors);
179 xcolor.red = queried[best].red;
180 xcolor.green = queried[best].green;
181 xcolor.blue = queried[best].blue;
182 xcolor.pixel = queried[best].pixel;
184 if (XAllocColor(display, d
->colormap, &xcolor)) {
185 d->pixels[x] = xcolor.pixel;
188 d->pixels[x] = (qGray(rgb) < 127
189 ? BlackPixel(display, screen)
190 : WhitePixel(display, screen));
256 if (d
->visual->c_class != DirectColor || !ownColormap)
261 QVarLengthArray<XColor, 768> colorTable(d->r_max + d->g_max + d->b_max);
264 for (
int r = 0; r < d
->r_max; ++r) {
265 colorTable[i].red = r << 8 | r;
266 colorTable[i].pixel = r << d->r_shift;
267 colorTable[i].flags = DoRed;
271 for (
int g = 0; g < d
->g_max; ++g) {
272 colorTable[i].green = g << 8 | g;
273 colorTable[i].pixel = g << d->g_shift;
274 colorTable[i].flags = DoGreen;
278 for (
int b = 0; b < d
->b_max; ++b) {
279 colorTable[i].blue = (b << 8 | b);
280 colorTable[i].pixel = b << d->b_shift;
281 colorTable[i].flags = DoBlue;
285 XStoreColors(
X11->display, d->colormap, colorTable.data(), colorTable.count());
293 const int screens = ScreenCount(display);
297 for (
int i = 0; i < screens; ++i) {
301 bool use_stdcmap =
false;
305 d
->depth = DefaultDepth(display, i);
308 d
->visual = DefaultVisual(display, i);
311 Visual *argbVisual =
nullptr;
324 XStandardColormap *stdcmap =
nullptr;
327#if QT_CONFIG(xrender)
328 if (X11->use_xrender) {
333 templ.c_class = TrueColor;
334 XVisualInfo *xvi = XGetVisualInfo(X11->display, VisualScreenMask |
336 VisualClassMask, &templ, &nvi);
337 for (
int idx = 0; idx < nvi; ++idx) {
338 XRenderPictFormat *format = XRenderFindVisualFormat(X11->display,
340 if (format->type == PictTypeDirect && format->direct.alphaMask) {
341 argbVisual = xvi[idx].visual;
348 if (XGetRGBColormaps(display, RootWindow(display, i),
349 &stdcmap, &ncmaps, XA_RGB_DEFAULT_MAP)) {
351 for (
int c = 0; c < ncmaps; ++c) {
352 if (!stdcmap[c].red_max ||
353 !stdcmap[c].green_max ||
354 !stdcmap[c].blue_max ||
355 !stdcmap[c].red_mult ||
356 !stdcmap[c].green_mult ||
357 !stdcmap[c].blue_mult)
361 proto.visualid = stdcmap[c].visualid;
365 XVisualInfo *vi = XGetVisualInfo(display, VisualIDMask | VisualScreenMask,
371 d
->mode = ((vi[0].visual->c_class < StaticColor)
373 : ((vi[0].visual->c_class < TrueColor)
383 d
->r_max = stdcmap[c].red_max + 1;
384 d
->g_max = stdcmap[c].green_max + 1;
385 d
->b_max = stdcmap[c].blue_max + 1;
389 d->r_shift = lowest_bit(d
->visual->red_mask);
390 d->g_shift = lowest_bit(d
->visual->green_mask);
391 d->b_shift = lowest_bit(d
->visual->blue_mask);
418 if (color_count != 0)
420 else if (d
->visual->map_entries > 65000)
422 else if (d
->visual->map_entries > 4000)
424 else if (d
->visual->map_entries > 250)
433 d->r_max = right_align(d->visual->red_mask) + 1;
434 d->g_max = right_align(d->visual->green_mask) + 1;
435 d->b_max = right_align(d->visual->blue_mask) + 1;
442 if (color_count != 0)
444 else if (d
->visual->map_entries > 65000)
446 else if (d
->visual->map_entries > 4000)
448 else if (d
->visual->map_entries > 250)
458 d->r_max = right_align(d->visual->red_mask) + 1;
459 d->g_max = right_align(d->visual->green_mask) + 1;
460 d->b_max = right_align(d->visual->blue_mask) + 1;
462 d->r_shift = lowest_bit(d
->visual->red_mask);
463 d->g_shift = lowest_bit(d
->visual->green_mask);
464 d->b_shift = lowest_bit(d
->visual->blue_mask);
469 bool ownColormap =
false;
474 }
else if ((!use_stdcmap
476 || d
->visual != DefaultVisual(display, i)))
477 || d
->visual->c_class == DirectColor) {
480 XCreateColormap(display, RootWindow(display, i), d
->visual,
481 d
->visual->c_class == DirectColor ? AllocAll : AllocNone);
508 X11->argbColormaps[i] = XCreateColormap(display, RootWindow(display, i), argbVisual, AllocNone);