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.43 by root, Tue Jan 31 18:36:35 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 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 / 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 / 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 / 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 / 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 c.red = color.g;
604 c.green = color.g;
605 c.blue = color.g;
603 p = (rgba.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask )) 606 c.pixel = (color.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask ))
604 / rxvt_rgba::MAX_CC) << ctz (screen->visual->red_mask ) 607 / rgba::MAX_CC) << ctz (screen->visual->red_mask )
605 | (rgba.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask)) 608 | (color.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask))
606 / rxvt_rgba::MAX_CC) << ctz (screen->visual->green_mask) 609 / rgba::MAX_CC) << ctz (screen->visual->green_mask)
607 | (rgba.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask )) 610 | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask ))
608 / rxvt_rgba::MAX_CC) << ctz (screen->visual->blue_mask ); 611 / rgba::MAX_CC) << ctz (screen->visual->blue_mask );
609 612
610 return true; 613 return true;
611 } 614 }
612 else 615 else
613 { 616 {
614 XColor xc;
615
616 xc.red = rgba.r; 617 c.red = color.r;
617 xc.green = rgba.g; 618 c.green = color.g;
618 xc.blue = rgba.b; 619 c.blue = color.b;
619 620
620 if (XAllocColor (screen->xdisp, screen->cmap, &xc)) 621 if (XAllocColor (screen->xdisp, screen->cmap, &c))
621 {
622 p = xc.pixel;
623 return true; 622 return true;
624 }
625 else 623 else
626 p = (rgba.r + rgba.g + rgba.b) > 128*3 624 c.pixel = (color.r + color.g + color.b) > 128*3
627 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)) 625 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp))
628 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)); 626 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp));
629 } 627 }
630#endif 628#endif
631 629
632 return false; 630 return false;
633} 631}
634 632
635bool 633bool
636rxvt_color::set (rxvt_screen *screen, const char *name) 634rxvt_color::set (rxvt_screen *screen, const char *name)
637{ 635{
638 rxvt_rgba c; 636 rgba c;
639 char eos; 637 char eos;
640 int skip; 638 int skip;
641 639
642 if (1 <= sscanf (name, "[%hx]%n", &c.a, &skip)) 640 if (1 <= sscanf (name, "[%hd]%n", &c.a, &skip))
643 { 641 {
644 switch (skip) 642 printf ("X %d\n", c.a);
645 { 643 c.a = lerp<int, int, int> (0, rgba::MAX_CC, c.a);
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; 644 name += skip;
645 printf ("y %04x\n", c.a);
653 } 646 }
654 else 647 else
655 c.a = rxvt_rgba::MAX_CC; 648 c.a = rgba::MAX_CC;
656 649
657 // parse the non-standard rgba format 650 // parse the non-standard rgba format
658 if (strlen (name) != 4+5*4 || 4 != sscanf (name, "rgba:%hx/%hx/%hx/%hx%c", &c.r, &c.g, &c.b, &c.a, &eos)) 651 if (strlen (name) != 4+5*4 || 4 != sscanf (name, "rgba:%hx/%hx/%hx/%hx%c", &c.r, &c.g, &c.b, &c.a, &eos))
659 { 652 {
660 XColor xc, xc_exact; 653 XColor xc, xc_exact;
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 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
693 XColor *colors = new XColor [screen->visual->map_entries]; 686 XColor *colors = new XColor [screen->visual->map_entries];
694 687
695 for (int i = 0; i < cmap_size; i++) 688 for (int i = 0; i < cmap_size; i++)
696 colors [i].pixel = i; 689 colors [i].pixel = i;
697 690
691 // many kilobytes transfer per colour, but pseudocolor isn't worth
692 // many extra optimisations.
698 XQueryColors (screen->xdisp, screen->cmap, colors, cmap_size); 693 XQueryColors (screen->xdisp, screen->cmap, colors, cmap_size);
699 694
700 int diff = 0x7fffffffUL; 695 int diff = 0x7fffffffUL;
701 XColor *best = colors; 696 XColor *best = colors;
702 697
703 for (int i = 0; i < cmap_size; i++) 698 for (int i = 0; i < cmap_size; i++)
704 { 699 {
705 int d = (squared_diff<int> (rgba.r >> 2, colors [i].red >> 2)) 700 int d = (squared_diff<int> (color.r >> 2, colors [i].red >> 2))
706 + (squared_diff<int> (rgba.g >> 2, colors [i].green >> 2)) 701 + (squared_diff<int> (color.g >> 2, colors [i].green >> 2))
707 + (squared_diff<int> (rgba.b >> 2, colors [i].blue >> 2)); 702 + (squared_diff<int> (color.b >> 2, colors [i].blue >> 2));
708 703
709 if (d < diff) 704 if (d < diff)
710 { 705 {
711 diff = d; 706 diff = d;
712 best = colors + i; 707 best = colors + i;
713 } 708 }
714 } 709 }
715 710
716 //rxvt_warn ("could not allocate %04x %04x %04x, getting %04x %04x %04x instead (%d)\n", 711 //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); 712 // color.r, color.g, color.b, best->red, best->green, best->blue, diff);
718 713
719 got = alloc (screen, rxvt_rgba (best->red, best->green, best->blue)); 714 got = alloc (screen, rgba (best->red, best->green, best->blue));
720 715
721 delete colors; 716 delete colors;
722 } 717 }
723#endif 718#endif
724 719
725 return got; 720 return got;
726} 721}
727 722
728void 723void
729rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba) 724rxvt_color::get (rxvt_screen *screen, rgba &color)
730{ 725{
731#if XFT 726#if XFT
732 rgba.r = c.color.red; 727 color.r = c.color.red;
733 rgba.g = c.color.green; 728 color.g = c.color.green;
734 rgba.b = c.color.blue; 729 color.b = c.color.blue;
735 rgba.a = c.color.alpha; 730 color.a = c.color.alpha;
736#else 731#else
737 XColor c;
738
739 c.pixel = p;
740 XQueryColor (screen->xdisp, screen->cmap, &c);
741
742 rgba.r = c.red; 732 color.r = c.red;
743 rgba.g = c.green; 733 color.g = c.green;
744 rgba.b = c.blue; 734 color.b = c.blue;
745 rgba.a = rxvt_rgba::MAX_CC; 735 color.a = rgba::MAX_CC;
746#endif 736#endif
747} 737}
748 738
749void 739void
750rxvt_color::free (rxvt_screen *screen) 740rxvt_color::free (rxvt_screen *screen)
751{ 741{
752#if XFT 742#if XFT
753 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c); 743 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
754#else 744#else
755 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes); 745 XFreeColors (screen->xdisp, screen->cmap, &c.pixel, 1, AllPlanes);
756#endif 746#endif
757} 747}
758 748
759rxvt_color 749void
760rxvt_color::fade (rxvt_screen *screen, int percent) 750rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to)
761{ 751{
762 rxvt_color faded;
763
764 rxvt_rgba c; 752 rgba c;
765 get (screen, c); 753 get (screen, c);
766 754
767 c.r = lerp (0, c.r, percent); 755 result.set (
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;
781
782 get (screen, c);
783 fadeto.get (screen, fc);
784
785 faded.set (
786 screen, 756 screen,
787 rxvt_rgba ( 757 rgba (
788 lerp (fc.r, c.r, percent), 758 lerp (c.r, to.r, percent),
789 lerp (fc.g, c.g, percent), 759 lerp (c.g, to.g, percent),
790 lerp (fc.b, c.b, percent), 760 lerp (c.b, to.b, percent),
791 lerp (fc.a, c.a, percent) 761 lerp (c.a, to.a, percent)
792 ) 762 )
793 ); 763 );
794
795 return faded;
796} 764}
797 765

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines