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

Comparing rxvt-unicode/src/xpm.C (file contents):
Revision 1.66 by sasha, Mon Aug 13 22:41:34 2007 UTC vs.
Revision 1.70 by sasha, Thu Aug 16 21:26:20 2007 UTC

84 } 84 }
85# endif 85# endif
86# ifdef ENABLE_TRANSPARENCY 86# ifdef ENABLE_TRANSPARENCY
87 if (flags & isTransparent) 87 if (flags & isTransparent)
88 return true; 88 return true;
89# endif
90 return false;
91}
92
93bool bgPixmap_t::need_client_side_rendering ()
94{
95# ifdef HAVE_AFTERIMAGE
96 if (original_asim != NULL)
97 return true;
98#endif
99# ifdef ENABLE_TRANSPARENCY
100 if (flags & isTransparent)
101 {
102 if ((flags & blurNeeded)
103 || ((flags & tintNeeded) && !(flags & tintServerSide)))
104 return true;
105 }
89# endif 106# endif
90 return false; 107 return false;
91} 108}
92 109
93# ifdef XPM_BACKGROUND 110# ifdef XPM_BACKGROUND
597 if (v_blurRadius != vr) 614 if (v_blurRadius != vr)
598 { 615 {
599 ++changed; 616 ++changed;
600 v_blurRadius = vr; 617 v_blurRadius = vr;
601 } 618 }
619 if (v_blurRadius == 0 && h_blurRadius == 0)
620 flags &= ~blurNeeded;
621 else
622 flags |= blurNeeded;
602 return (changed>0); 623 return (changed>0);
603} 624}
604 625
605static inline unsigned long 626static inline unsigned long
606compute_tint_shade_flags (rxvt_color *tint, int shade) 627compute_tint_shade_flags (rxvt_color *tint, int shade)
848 } 869 }
849 return false; 870 return false;
850} 871}
851# endif /* ENABLE_TRANSPARENCY */ 872# endif /* ENABLE_TRANSPARENCY */
852 873
874# ifndef HAVE_AFTERIMAGE
875static void ShadeXImage(rxvt_term *term, XImage* srcImage, int shade, int rm, int gm, int bm);
876#endif
877
878
853bool 879bool
854bgPixmap_t::render () 880bgPixmap_t::render ()
855{ 881{
856 unsigned long background_flags = 0; 882 unsigned long background_flags = 0;
857 883
864 { 890 {
865 /* we need to re-generate transparency pixmap in that case ! */ 891 /* we need to re-generate transparency pixmap in that case ! */
866 background_flags = make_transparency_pixmap (); 892 background_flags = make_transparency_pixmap ();
867 if (background_flags == 0) 893 if (background_flags == 0)
868 return false; 894 return false;
895 else if ((background_flags & transpTransformations) == (flags & transpTransformations)
896 && pmap_depth == target->depth)
897 flags = flags & ~isInvalid;
869 } 898 }
870# endif 899# endif
871 900
872 XImage *result = NULL; 901 XImage *result = NULL;
873# ifdef HAVE_AFTERIMAGE 902# ifdef HAVE_AFTERIMAGE
883 { 912 {
884 ShadingInfo as_shade; 913 ShadingInfo as_shade;
885 as_shade.shading = (shade == 0) ? 100 : shade; 914 as_shade.shading = (shade == 0) ? 100 : shade;
886 915
887 rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC); 916 rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC);
917 if (flags & tintSet)
888 tint.get (c); 918 tint.get (c);
889 as_shade.tintColor.red = c.r; 919 as_shade.tintColor.red = c.r;
890 as_shade.tintColor.green = c.g; 920 as_shade.tintColor.green = c.g;
891 as_shade.tintColor.blue = c.b; 921 as_shade.tintColor.blue = c.b;
892 922
893 as_tint = shading2tint32 (&as_shade); 923 as_tint = shading2tint32 (&as_shade);
894 } 924 }
925
926 if (!(background_flags & transpPmapBlured) && (flags & blurNeeded) && background != NULL)
927 {
928 ASImage* tmp = blur_asimage_gauss (target->asv, background, h_blurRadius, v_blurRadius, 0xFFFFFFFF,
929 (original_asim == NULL || tint == TINT_LEAVE_SAME)?ASA_XImage:ASA_ASImage,
930 100, ASIMAGE_QUALITY_DEFAULT);
931 if (tmp)
932 {
933 destroy_asimage (&background);
934 background = tmp;
935 }
936 }
937
895 if (render_asim (background, as_tint)) 938 if (render_asim (background, as_tint))
896 flags = flags & ~isInvalid; 939 flags = flags & ~isInvalid;
897 if (background) 940 if (background)
898 destroy_asimage (&background); 941 destroy_asimage (&background);
899 } 942 }
900 else if (background_flags && pmap_depth != target->depth) 943 else if (background_flags && pmap_depth != target->depth)
901 { 944 {
902 result = XGetImage (target->dpy, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, ZPixmap); 945 result = XGetImage (target->dpy, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, ZPixmap);
903 } 946 }
904# else /* our own client-side tinting */ 947# else /* our own client-side tinting */
905 if (background_flags && 948 if (background_flags && (flags & isInvalid))
906 (!(background_flags & transpPmapTinted) && (flags & tintNeeded)) || pmap_depth != target->depth)
907 { 949 {
908 result = XGetImage (target->dpy, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, ZPixmap); 950 result = XGetImage (target->dpy, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, ZPixmap);
909 success = False;
910 if (result != NULL && !(background_flags & transpPmapTinted) && (flags & tintNeeded)) 951 if (result != NULL && !(background_flags & transpPmapTinted) && (flags & tintNeeded))
911 { 952 {
912 rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC); 953 rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC);
954 if (flags & tintSet)
913 tint.get (c); 955 tint.get (c);
914 ShadeXImage (this, result, shade, c.r, c.g, c.b); 956 ShadeXImage (target, result, shade, c.r, c.g, c.b);
915 } 957 }
916 } 958 }
917# endif 959# endif
918 if (result != NULL) 960 if (result != NULL)
919 { 961 {
1021 { 1063 {
1022 target->scrollBar.setIdle (); 1064 target->scrollBar.setIdle ();
1023 target->scrollbar_show (0); 1065 target->scrollbar_show (0);
1024 } 1066 }
1025#endif 1067#endif
1068 /* Is that really neccessary? we did a XClearArea to generate Expose events alreday ! */
1026 target->want_refresh = target->want_full_refresh = 1; 1069 target->want_refresh = target->want_full_refresh = 1;
1070 /* TODO: why do we need a flush here ??? It causes segfault on resize ! */
1027 target->flush (); 1071// target->flush ();
1028 } 1072 }
1029} 1073}
1030#endif /* HAVE_BG_PIXMAP */ 1074#endif /* HAVE_BG_PIXMAP */
1031 1075
1032 1076
1033void 1077void
1034rxvt_term::get_window_origin (int &x, int &y) 1078rxvt_term::get_window_origin (int &x, int &y)
1035{ 1079{
1036 Window cr; 1080 Window cr;
1037 XTranslateCoordinates (dpy, parent[0], display->root, 0, 0, &x, &y, &cr); 1081 XTranslateCoordinates (dpy, parent[0], display->root, 0, 0, &x, &y, &cr);
1082/* fprintf( stderr, "origin is %+d%+d\n", x, y);*/
1038} 1083}
1039 1084
1040Pixmap 1085Pixmap
1041rxvt_term::get_pixmap_property (int prop_id) 1086rxvt_term::get_pixmap_property (int prop_id)
1042{ 1087{
1075 unsigned int upper_lim_r, upper_lim_g, upper_lim_b; 1120 unsigned int upper_lim_r, upper_lim_g, upper_lim_b;
1076 int i; 1121 int i;
1077 1122
1078 Visual *visual = term->visual; 1123 Visual *visual = term->visual;
1079 1124
1080 if( visual->c_class != TrueColor || srcImage->format != ZPixmap ) return ; 1125 if (visual->c_class != TrueColor || srcImage->format != ZPixmap) return ;
1081 1126
1127 if (shade == 0)
1128 shade = 100;
1129
1082 /* for convenience */ 1130 /* for convenience */
1083 mask_r = visual->red_mask; 1131 mask_r = visual->red_mask;
1084 mask_g = visual->green_mask; 1132 mask_g = visual->green_mask;
1085 mask_b = visual->blue_mask; 1133 mask_b = visual->blue_mask;
1086 1134
1295/* 1343/*
1296 * Check our parents are still who we think they are. 1344 * Check our parents are still who we think they are.
1297 * Do transparency updates if required 1345 * Do transparency updates if required
1298 */ 1346 */
1299int 1347int
1300rxvt_term::check_our_parents () 1348rxvt_term::update_background ()
1301{ 1349{
1302 check_our_parents_ev.stop (); 1350 bgPixmap.invalidate();
1303 check_our_parents_ev.start (NOW + .1); 1351 /* no chance of real time refresh if we are blurring ! */
1352 if (bgPixmap.invalid_since + 0.5 < NOW && !(bgPixmap.flags & bgPixmap_t::blurNeeded))
1353 bgPixmap.render();
1354 else
1355 {
1356 update_background_ev.stop ();
1357 if (!bgPixmap.need_client_side_rendering())
1358 update_background_ev.start (NOW + .05);
1359 else if (bgPixmap.flags & bgPixmap_t::blurNeeded)
1360 update_background_ev.start (NOW + .2); /* very slow !!! */
1361 else
1362 update_background_ev.start (NOW + .07);
1363 }
1304 return 0; 1364 return 0;
1305} 1365}
1306 1366
1367void
1368rxvt_term::update_background_cb (time_watcher &w)
1369{
1370 bgPixmap.render ();
1371}
1372#endif /* HAVE_BG_PIXMAP */
1373
1374
1375#if 0 /* replaced by a bgPixmap_t::render() - leve here temporarily for reference */
1307void 1376void
1308rxvt_term::check_our_parents_cb (time_watcher &w) 1377rxvt_term::check_our_parents_cb (time_watcher &w)
1309{ 1378{
1310#if 0 /* replaced by a bgPixmap_t::render() - leve here temporarily for reference */
1311 1379
1312 int i, aformat, rootdepth; 1380 int i, aformat, rootdepth;
1313 unsigned long nitems, bytes_after; 1381 unsigned long nitems, bytes_after;
1314 Atom atype; 1382 Atom atype;
1315 unsigned char *prop = NULL; 1383 unsigned char *prop = NULL;
1513 want_refresh = want_full_refresh = 1; 1581 want_refresh = want_full_refresh = 1;
1514 if (am_pixmap_trans) 1582 if (am_pixmap_trans)
1515 flush (); 1583 flush ();
1516 } 1584 }
1517 } 1585 }
1586}
1518#endif 1587#endif
1519}
1520#endif

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines