ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/rxvttoolkit.C
(Generate patch)

Comparing rxvt-unicode/src/rxvttoolkit.C (file contents):
Revision 1.39 by root, Tue Jan 31 00:25:16 2006 UTC vs.
Revision 1.41 by root, Tue Jan 31 16:43:55 2006 UTC

560refcache<rxvt_display> displays; 560refcache<rxvt_display> displays;
561 561
562///////////////////////////////////////////////////////////////////////////// 562/////////////////////////////////////////////////////////////////////////////
563 563
564bool 564bool
565rxvt_color::alloc (rxvt_screen *screen, rxvt_rgba rgba) 565rxvt_color::alloc (rxvt_screen *screen, const rxvt_rgba &color)
566{ 566{
567#if XFT 567#if XFT
568 XRenderPictFormat *format; 568 XRenderPictFormat *format;
569 569
570 // FUCKING Xft gets it wrong, of course, so work around it 570 // FUCKING Xft gets it wrong, of course, so work around it
572 // XRenderQueryPictIndexValues themselves plenty. 572 // XRenderQueryPictIndexValues themselves plenty.
573 if ((screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor) 573 if ((screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor)
574 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual))) 574 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual)))
575 { 575 {
576 // the fun lies in doing everything manually... 576 // the fun lies in doing everything manually...
577 c.color.red = rgba.r; 577 c.color.red = color.r;
578 c.color.green = rgba.g; 578 c.color.green = color.g;
579 c.color.blue = rgba.b; 579 c.color.blue = color.b;
580 c.color.alpha = rgba.a; 580 c.color.alpha = color.a;
581 581
582 c.pixel = ((rgba.r * format->direct.redMask / rxvt_rgba::MAX_CC) << format->direct.red ) 582 c.pixel = ((color.r * format->direct.redMask / rxvt_rgba::MAX_CC) << format->direct.red )
583 | ((rgba.g * format->direct.greenMask / rxvt_rgba::MAX_CC) << format->direct.green) 583 | ((color.g * format->direct.greenMask / rxvt_rgba::MAX_CC) << format->direct.green)
584 | ((rgba.b * format->direct.blueMask / rxvt_rgba::MAX_CC) << format->direct.blue ) 584 | ((color.b * format->direct.blueMask / rxvt_rgba::MAX_CC) << format->direct.blue )
585 | ((rgba.a * format->direct.alphaMask / rxvt_rgba::MAX_CC) << format->direct.alpha); 585 | ((color.a * format->direct.alphaMask / rxvt_rgba::MAX_CC) << format->direct.alpha);
586 586
587 return true; 587 return true;
588 } 588 }
589 else 589 else
590 { 590 {
591 XRenderColor d; 591 XRenderColor d;
592 592
593 d.red = rgba.r; 593 d.red = color.r;
594 d.green = rgba.g; 594 d.green = color.g;
595 d.blue = rgba.b; 595 d.blue = color.b;
596 d.alpha = rgba.a; 596 d.alpha = color.a;
597 597
598 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c); 598 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c);
599 } 599 }
600#else 600#else
601 if (screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor) 601 if (screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor)
602 { 602 {
603 p = (rgba.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask )) 603 p = (color.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask ))
604 / rxvt_rgba::MAX_CC) << ctz (screen->visual->red_mask ) 604 / rxvt_rgba::MAX_CC) << ctz (screen->visual->red_mask )
605 | (rgba.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask)) 605 | (color.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask))
606 / rxvt_rgba::MAX_CC) << ctz (screen->visual->green_mask) 606 / rxvt_rgba::MAX_CC) << ctz (screen->visual->green_mask)
607 | (rgba.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask )) 607 | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask ))
608 / rxvt_rgba::MAX_CC) << ctz (screen->visual->blue_mask ); 608 / rxvt_rgba::MAX_CC) << ctz (screen->visual->blue_mask );
609 609
610 return true; 610 return true;
611 } 611 }
612 else 612 else
613 { 613 {
614 XColor xc; 614 XColor xc;
615 615
616 xc.red = rgba.r; 616 xc.red = color.r;
617 xc.green = rgba.g; 617 xc.green = color.g;
618 xc.blue = rgba.b; 618 xc.blue = color.b;
619 619
620 if (XAllocColor (screen->xdisp, screen->cmap, &xc)) 620 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
621 { 621 {
622 p = xc.pixel; 622 p = xc.pixel;
623 return true; 623 return true;
624 } 624 }
625 else 625 else
626 p = (rgba.r + rgba.g + rgba.b) > 128*3 626 p = (color.r + color.g + color.b) > 128*3
627 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)) 627 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp))
628 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)); 628 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp));
629 } 629 }
630#endif 630#endif
631 631
637{ 637{
638 rxvt_rgba c; 638 rxvt_rgba c;
639 char eos; 639 char eos;
640 int skip; 640 int skip;
641 641
642 if (1 <= sscanf (name, "[%hx]%n", &c.a, &skip)) 642 if (1 <= sscanf (name, "[%hd]%n", &c.a, &skip))
643 { 643 {
644 switch (skip) 644 c.a = lerp<int, int, int> (0, rxvt_rgba::MAX_CC, c.a);
645 {
646 case 2 + 1: c.a *= rxvt_rgba::MAX_CC / 0x000f; break;
647 case 2 + 2: c.a *= rxvt_rgba::MAX_CC / 0x00ff; break;
648 case 2 + 3: c.a *= rxvt_rgba::MAX_CC / 0x0fff; break;
649 case 2 + 4: c.a *= rxvt_rgba::MAX_CC / 0xffff; break;
650 }
651
652 name += skip; 645 name += skip;
653 } 646 }
654 else 647 else
655 c.a = rxvt_rgba::MAX_CC; 648 c.a = rxvt_rgba::MAX_CC;
656 649
677 670
678 return set (screen, c); 671 return set (screen, c);
679} 672}
680 673
681bool 674bool
682rxvt_color::set (rxvt_screen *screen, rxvt_rgba rgba) 675rxvt_color::set (rxvt_screen *screen, const rxvt_rgba &color)
683{ 676{
684 bool got = alloc (screen, rgba); 677 bool got = alloc (screen, color);
685 678
686#if !ENABLE_MINIMAL 679#if !ENABLE_MINIMAL
687 int cmap_size = screen->visual->map_entries; 680 int cmap_size = screen->visual->map_entries;
688 681
689 if (!got 682 if (!got
700 int diff = 0x7fffffffUL; 693 int diff = 0x7fffffffUL;
701 XColor *best = colors; 694 XColor *best = colors;
702 695
703 for (int i = 0; i < cmap_size; i++) 696 for (int i = 0; i < cmap_size; i++)
704 { 697 {
705 int d = (squared_diff<int> (rgba.r >> 2, colors [i].red >> 2)) 698 int d = (squared_diff<int> (color.r >> 2, colors [i].red >> 2))
706 + (squared_diff<int> (rgba.g >> 2, colors [i].green >> 2)) 699 + (squared_diff<int> (color.g >> 2, colors [i].green >> 2))
707 + (squared_diff<int> (rgba.b >> 2, colors [i].blue >> 2)); 700 + (squared_diff<int> (color.b >> 2, colors [i].blue >> 2));
708 701
709 if (d < diff) 702 if (d < diff)
710 { 703 {
711 diff = d; 704 diff = d;
712 best = colors + i; 705 best = colors + i;
713 } 706 }
714 } 707 }
715 708
716 //rxvt_warn ("could not allocate %04x %04x %04x, getting %04x %04x %04x instead (%d)\n", 709 //rxvt_warn ("could not allocate %04x %04x %04x, getting %04x %04x %04x instead (%d)\n",
717 // rgba.r, rgba.g, rgba.b, best->red, best->green, best->blue, diff); 710 // color.r, color.g, color.b, best->red, best->green, best->blue, diff);
718 711
719 got = alloc (screen, rxvt_rgba (best->red, best->green, best->blue)); 712 got = alloc (screen, rxvt_rgba (best->red, best->green, best->blue));
720 713
721 delete colors; 714 delete colors;
722 } 715 }
724 717
725 return got; 718 return got;
726} 719}
727 720
728void 721void
729rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba) 722rxvt_color::get (rxvt_screen *screen, rxvt_rgba &color)
730{ 723{
731#if XFT 724#if XFT
732 rgba.r = c.color.red; 725 color.r = c.color.red;
733 rgba.g = c.color.green; 726 color.g = c.color.green;
734 rgba.b = c.color.blue; 727 color.b = c.color.blue;
735 rgba.a = c.color.alpha; 728 color.a = c.color.alpha;
736#else 729#else
737 XColor c; 730 XColor c;
738 731
739 c.pixel = p; 732 c.pixel = p;
740 XQueryColor (screen->xdisp, screen->cmap, &c); 733 XQueryColor (screen->xdisp, screen->cmap, &c);
741 734
742 rgba.r = c.red; 735 color.r = c.red;
743 rgba.g = c.green; 736 color.g = c.green;
744 rgba.b = c.blue; 737 color.b = c.blue;
745 rgba.a = rxvt_rgba::MAX_CC; 738 color.a = rxvt_rgba::MAX_CC;
746#endif 739#endif
747} 740}
748 741
749void 742void
750rxvt_color::free (rxvt_screen *screen) 743rxvt_color::free (rxvt_screen *screen)
755 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes); 748 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes);
756#endif 749#endif
757} 750}
758 751
759rxvt_color 752rxvt_color
760rxvt_color::fade (rxvt_screen *screen, int percent) 753rxvt_color::fade (rxvt_screen *screen, int percent, const rxvt_rgba &to)
761{ 754{
762 rxvt_color faded;
763
764 rxvt_rgba c; 755 rxvt_rgba c;
765 get (screen, c); 756 get (screen, c);
766 757
767 c.r = lerp (0, c.r, percent);
768 c.g = lerp (0, c.g, percent);
769 c.b = lerp (0, c.b, percent);
770
771 faded.set (screen, c);
772
773 return faded;
774}
775
776rxvt_color
777rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
778{
779 rxvt_rgba c, fc;
780 rxvt_color faded; 758 rxvt_color faded;
781
782 get (screen, c);
783 fadeto.get (screen, fc);
784
785 faded.set ( 759 faded.set (
786 screen, 760 screen,
787 rxvt_rgba ( 761 rxvt_rgba (
788 lerp (fc.r, c.r, percent), 762 lerp (to.r, c.r, percent),
789 lerp (fc.g, c.g, percent), 763 lerp (to.g, c.g, percent),
790 lerp (fc.b, c.b, percent), 764 lerp (to.b, c.b, percent),
791 lerp (fc.a, c.a, percent) 765 lerp (to.a, c.a, percent)
792 ) 766 )
793 ); 767 );
794 768
795 return faded; 769 return faded;
796} 770}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines