… | |
… | |
543 | rxvt_rgba r; |
543 | rxvt_rgba r; |
544 | char eos; |
544 | char eos; |
545 | int mult; |
545 | int mult; |
546 | |
546 | |
547 | if ( l == 1+4*1 && 4 == sscanf (name, "#%1hx%1hx%1hx%1hx%c", &r.a, &r.r, &r.g, &r.b, &eos)) |
547 | if ( l == 1+4*1 && 4 == sscanf (name, "#%1hx%1hx%1hx%1hx%c", &r.a, &r.r, &r.g, &r.b, &eos)) |
548 | mult = 0x1111; |
548 | mult = rxvt_rgba::MAX_CC / 0x000f; |
549 | else if (l == 1+4*2 && 4 == sscanf (name, "#%2hx%2hx%2hx%2hx%c", &r.a, &r.r, &r.g, &r.b, &eos)) |
549 | else if (l == 1+4*2 && 4 == sscanf (name, "#%2hx%2hx%2hx%2hx%c", &r.a, &r.r, &r.g, &r.b, &eos)) |
550 | mult = 0x0101; |
550 | mult = rxvt_rgba::MAX_CC / 0x00ff; |
551 | else if (l == 1+4*4 && 4 == sscanf (name, "#%4hx%4hx%4hx%4hx%c", &r.a, &r.r, &r.g, &r.b, &eos)) |
551 | else if (l == 1+4*4 && 4 == sscanf (name, "#%4hx%4hx%4hx%4hx%c", &r.a, &r.r, &r.g, &r.b, &eos)) |
552 | mult = 0x0001; |
552 | mult = rxvt_rgba::MAX_CC / 0xffff; |
|
|
553 | else if (l == 4+5*4 && 4 == sscanf (name, "rgba:%hx/%hx/%hx/%hx%c", &r.r, &r.g, &r.b, &r.a, &eos)) |
|
|
554 | mult = rxvt_rgba::MAX_CC / 0xffff; |
553 | else |
555 | else |
554 | return XftColorAllocName (screen->xdisp, screen->visual, screen->cmap, name, &c); |
556 | return XftColorAllocName (screen->xdisp, screen->visual, screen->cmap, name, &c); |
555 | |
557 | |
556 | r.r *= mult; r.g *= mult; r.b *= mult; r.a *= mult; |
558 | r.r *= mult; r.g *= mult; r.b *= mult; r.a *= mult; |
557 | return set (screen, r); |
559 | return set (screen, r); |
… | |
… | |
574 | d.red = rgba.r; |
576 | d.red = rgba.r; |
575 | d.green = rgba.g; |
577 | d.green = rgba.g; |
576 | d.blue = rgba.b; |
578 | d.blue = rgba.b; |
577 | d.alpha = rgba.a; |
579 | d.alpha = rgba.a; |
578 | |
580 | |
579 | return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c); |
581 | if (XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c)) |
|
|
582 | { |
|
|
583 | // FUCKING Xft gets it wrong, of course, fix it for the common case |
|
|
584 | // transparency users should eat shit and die, and then |
|
|
585 | // XRenderQueryPictIndexValues themselves plenty. |
|
|
586 | if (screen->depth == 32 && screen->visual->c_class == TrueColor) |
|
|
587 | if ((screen->visual->red_mask | screen->visual->green_mask | screen->visual->blue_mask) == 0x00ffffffUL) |
|
|
588 | c.pixel = c.pixel & 0x00ffffffUL | ((rgba.a >> 8) << 24); |
|
|
589 | else if ((screen->visual->red_mask | screen->visual->green_mask | screen->visual->blue_mask) == 0xffffff00UL) |
|
|
590 | c.pixel = c.pixel & 0xffffff00UL | (rgba.a >> 8); |
|
|
591 | |
|
|
592 | return true; |
|
|
593 | } |
|
|
594 | |
|
|
595 | return false; |
580 | #else |
596 | #else |
581 | XColor xc; |
597 | XColor xc; |
582 | |
598 | |
583 | xc.red = rgba.r; |
599 | xc.red = rgba.r; |
584 | xc.green = rgba.g; |
600 | xc.green = rgba.g; |