… | |
… | |
603 | XRenderPictFormat *format; |
603 | XRenderPictFormat *format; |
604 | |
604 | |
605 | // FUCKING Xft gets it wrong, of course, so work around it |
605 | // FUCKING Xft gets it wrong, of course, so work around it |
606 | // transparency users should eat shit and die, and then |
606 | // transparency users should eat shit and die, and then |
607 | // XRenderQueryPictIndexValues themselves plenty. |
607 | // XRenderQueryPictIndexValues themselves plenty. |
608 | if (screen->visual->c_class == TrueColor |
608 | if ((screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor) |
609 | && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual))) |
609 | && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual))) |
610 | { |
610 | { |
611 | // the fun lies in doing everything manually... |
611 | // the fun lies in doing everything manually... |
612 | c.color.red = rgba.r; |
612 | c.color.red = rgba.r; |
613 | c.color.green = rgba.g; |
613 | c.color.green = rgba.g; |
… | |
… | |
633 | return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c); |
633 | return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c); |
634 | } |
634 | } |
635 | |
635 | |
636 | return false; |
636 | return false; |
637 | #else |
637 | #else |
638 | if (screen->visual->c_class == TrueColor) |
638 | if (screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor) |
639 | { |
639 | { |
640 | p = ((rgba.r * ((1 << screen->visual->bits_per_rgb) - 1) |
640 | p = (rgba.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask )) |
641 | / rxvt_rgba::MAX_CC) << ctz (screen->visual->red_mask )) |
641 | / rxvt_rgba::MAX_CC) << ctz (screen->visual->red_mask ) |
642 | | ((rgba.g * ((1 << screen->visual->bits_per_rgb) - 1) |
642 | | (rgba.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask)) |
643 | / rxvt_rgba::MAX_CC) << ctz (screen->visual->green_mask)) |
643 | / rxvt_rgba::MAX_CC) << ctz (screen->visual->green_mask) |
644 | | ((rgba.b * ((1 << screen->visual->bits_per_rgb) - 1) |
644 | | (rgba.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask )) |
645 | / rxvt_rgba::MAX_CC) << ctz (screen->visual->blue_mask )); |
645 | / rxvt_rgba::MAX_CC) << ctz (screen->visual->blue_mask ); |
646 | |
646 | |
647 | return true; |
647 | return true; |
648 | } |
648 | } |
649 | else |
649 | else |
650 | { |
650 | { |