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

Comparing rxvt-unicode/src/background.C (file contents):
Revision 1.107 by sf-exg, Mon Nov 1 14:29:33 2010 UTC vs.
Revision 1.112 by sf-exg, Sat Nov 6 17:16:15 2010 UTC

23 *---------------------------------------------------------------------*/ 23 *---------------------------------------------------------------------*/
24 24
25#include <cmath> 25#include <cmath>
26#include "../config.h" /* NECESSARY */ 26#include "../config.h" /* NECESSARY */
27#include "rxvt.h" /* NECESSARY */ 27#include "rxvt.h" /* NECESSARY */
28
29#if XRENDER
30# include <X11/extensions/Xrender.h>
31#endif
28 32
29#define DO_TIMING_TEST 0 33#define DO_TIMING_TEST 0
30 34
31#if DO_TIMING_TEST 35#if DO_TIMING_TEST
32# include <sys/time.h> 36# include <sys/time.h>
250} 254}
251 255
252bool 256bool
253bgPixmap_t::set_geometry (const char *geom) 257bgPixmap_t::set_geometry (const char *geom)
254{ 258{
259 bool changed = false;
255 int geom_flags = 0, changed = 0; 260 int geom_flags = 0;
256 int x = 0, y = 0; 261 int x = 0, y = 0;
257 unsigned int w = 0, h = 0; 262 unsigned int w = 0, h = 0;
258 unsigned int n; 263 unsigned int n;
259 unsigned long new_flags = (flags & (~geometryFlags)); 264 unsigned long new_flags = (flags & (~geometryFlags));
260 const char *p; 265 const char *p;
416 421
417 while (*ops != ':' && *ops != '\0') ++ops; 422 while (*ops != ':' && *ops != '\0') ++ops;
418 } /* done parsing ops */ 423 } /* done parsing ops */
419 } 424 }
420 425
421 if (check_set_scale_value (geom_flags, WidthValue, h_scale, w)) ++changed; 426 if (check_set_scale_value (geom_flags, WidthValue, h_scale, w)) changed = true;
422 if (check_set_scale_value (geom_flags, HeightValue, v_scale, h)) ++changed; 427 if (check_set_scale_value (geom_flags, HeightValue, v_scale, h)) changed = true;
423 if (check_set_align_value (geom_flags, XValue, h_align, x)) ++changed; 428 if (check_set_align_value (geom_flags, XValue, h_align, x)) changed = true;
424 if (check_set_align_value (geom_flags, YValue, v_align, y)) ++changed; 429 if (check_set_align_value (geom_flags, YValue, v_align, y)) changed = true;
425 } 430 }
426 431
427 if (new_flags != flags) 432 if (new_flags != flags)
428 { 433 {
429 flags = new_flags; 434 flags = new_flags;
430 changed++; 435 changed = true;
431 } 436 }
432 437
433 return (changed > 0); 438 return changed;
434} 439}
435 440
436void 441void
437bgPixmap_t::get_image_geometry (int image_width, int image_height, int &w, int &h, int &x, int &y) 442bgPixmap_t::get_image_geometry (int image_width, int image_height, int &w, int &h, int &x, int &y)
438{ 443{
729 return false; 734 return false;
730 735
731 if (!pixbuf) 736 if (!pixbuf)
732 return false; 737 return false;
733 738
734#if !XRENDER
735 if (background_flags) 739 if (background_flags
740 && !(flags & HAS_RENDER))
736 return false; 741 return false;
737#endif
738 742
739 GdkPixbuf *result; 743 GdkPixbuf *result;
740 744
741 int image_width = gdk_pixbuf_get_width (pixbuf); 745 int image_width = gdk_pixbuf_get_width (pixbuf);
742 int image_height = gdk_pixbuf_get_height (pixbuf); 746 int image_height = gdk_pixbuf_get_height (pixbuf);
968} 972}
969 973
970bool 974bool
971bgPixmap_t::set_blur_radius (const char *geom) 975bgPixmap_t::set_blur_radius (const char *geom)
972{ 976{
973 int changed = 0; 977 bool changed = false;
974 unsigned int hr, vr; 978 unsigned int hr, vr;
975 int junk; 979 int junk;
976 int geom_flags = XParseGeometry (geom, &junk, &junk, &hr, &vr); 980 int geom_flags = XParseGeometry (geom, &junk, &junk, &hr, &vr);
977 981
978 if (!(geom_flags & WidthValue)) 982 if (!(geom_flags & WidthValue))
983 min_it (hr, 128); 987 min_it (hr, 128);
984 min_it (vr, 128); 988 min_it (vr, 128);
985 989
986 if (h_blurRadius != hr) 990 if (h_blurRadius != hr)
987 { 991 {
988 ++changed; 992 changed = true;
989 h_blurRadius = hr; 993 h_blurRadius = hr;
990 } 994 }
991 995
992 if (v_blurRadius != vr) 996 if (v_blurRadius != vr)
993 { 997 {
994 ++changed; 998 changed = true;
995 v_blurRadius = vr; 999 v_blurRadius = vr;
996 } 1000 }
997 1001
998 if (v_blurRadius == 0 && h_blurRadius == 0) 1002 if (v_blurRadius == 0 && h_blurRadius == 0)
999 flags &= ~blurNeeded; 1003 flags &= ~blurNeeded;
1000 else 1004 else
1001 flags |= blurNeeded; 1005 flags |= blurNeeded;
1002 1006
1003#if XRENDER
1004 XFilters *filters = XRenderQueryFilters (target->dpy, target->vt);
1005 if (filters)
1006 {
1007 for (int i = 0; i < filters->nfilter; i++)
1008 if (!strcmp (filters->filter[i], FilterConvolution))
1009 flags |= bgPixmap_t::blurServerSide;
1010
1011 XFree (filters);
1012 }
1013#endif
1014
1015 return (changed > 0); 1007 return changed;
1016} 1008}
1017 1009
1018static inline unsigned long 1010static inline unsigned long
1019compute_tint_shade_flags (rxvt_color *tint, int shade) 1011compute_tint_shade_flags (rxvt_color *tint, int shade)
1020{ 1012{
1039 { 1031 {
1040 if ((c.r > 0x000700 || c.g > 0x000700 || c.b > 0x000700) 1032 if ((c.r > 0x000700 || c.g > 0x000700 || c.b > 0x000700)
1041 && (c.r < 0x00f700 || c.g < 0x00f700 || c.b < 0x00f700)) 1033 && (c.r < 0x00f700 || c.g < 0x00f700 || c.b < 0x00f700))
1042 { 1034 {
1043 flags |= bgPixmap_t::tintNeeded; 1035 flags |= bgPixmap_t::tintNeeded;
1044 }
1045 }
1046
1047 if (flags & bgPixmap_t::tintNeeded)
1048 {
1049 if (flags & bgPixmap_t::tintWholesome)
1050 flags |= bgPixmap_t::tintServerSide;
1051 else
1052 {
1053#if XRENDER
1054 flags |= bgPixmap_t::tintServerSide;
1055#endif
1056 } 1036 }
1057 } 1037 }
1058 1038
1059 return flags; 1039 return flags;
1060} 1040}
1336 Pixmap recoded_root_pmap = root_pixmap; 1316 Pixmap recoded_root_pmap = root_pixmap;
1337 1317
1338 if (root_pixmap != None && root_depth != target->depth) 1318 if (root_pixmap != None && root_depth != target->depth)
1339 { 1319 {
1340#if XRENDER 1320#if XRENDER
1321 if (flags & HAS_RENDER)
1322 {
1341 XRenderPictureAttributes pa; 1323 XRenderPictureAttributes pa;
1342 1324
1343 XRenderPictFormat *src_format = XRenderFindVisualFormat (dpy, DefaultVisual (dpy, screen)); 1325 XRenderPictFormat *src_format = XRenderFindVisualFormat (dpy, DefaultVisual (dpy, screen));
1344 Picture src = XRenderCreatePicture (dpy, root_pixmap, src_format, 0, &pa); 1326 Picture src = XRenderCreatePicture (dpy, root_pixmap, src_format, 0, &pa);
1345 1327
1346 recoded_root_pmap = XCreatePixmap (dpy, target->vt, root_pmap_width, root_pmap_height, target->depth); 1328 recoded_root_pmap = XCreatePixmap (dpy, target->vt, root_pmap_width, root_pmap_height, target->depth);
1347 XRenderPictFormat *dst_format = XRenderFindVisualFormat (dpy, target->visual); 1329 XRenderPictFormat *dst_format = XRenderFindVisualFormat (dpy, target->visual);
1348 Picture dst = XRenderCreatePicture (dpy, recoded_root_pmap, dst_format, 0, &pa); 1330 Picture dst = XRenderCreatePicture (dpy, recoded_root_pmap, dst_format, 0, &pa);
1349 1331
1350 if (src && dst) 1332 if (src && dst)
1351 XRenderComposite (dpy, PictOpSrc, src, None, dst, 0, 0, 0, 0, 0, 0, root_pmap_width, root_pmap_height); 1333 XRenderComposite (dpy, PictOpSrc, src, None, dst, 0, 0, 0, 0, 0, 0, root_pmap_width, root_pmap_height);
1334 else
1335 {
1336 XFreePixmap (dpy, recoded_root_pmap);
1337 root_pixmap = None;
1338 }
1339
1340 XRenderFreePicture (dpy, src);
1341 XRenderFreePicture (dpy, dst);
1342 }
1352 else 1343 else
1353 { 1344#endif
1354 XFreePixmap (dpy, recoded_root_pmap);
1355 root_pixmap = None;
1356 }
1357
1358 XRenderFreePicture (dpy, src);
1359 XRenderFreePicture (dpy, dst);
1360#else
1361 root_pixmap = None; 1345 root_pixmap = None;
1362#endif
1363 } 1346 }
1364 1347
1365 if (root_pixmap == None) 1348 if (root_pixmap == None)
1366 return 0; 1349 return 0;
1367 1350
1391 if (tiled_root_pmap != None) 1374 if (tiled_root_pmap != None)
1392 { 1375 {
1393 if (!need_client_side_rendering ()) 1376 if (!need_client_side_rendering ())
1394 { 1377 {
1395 if ((flags & blurNeeded) 1378 if ((flags & blurNeeded)
1396 && (flags & blurServerSide)) 1379 && (flags & HAS_RENDER_CONV))
1397 { 1380 {
1398 if (blur_pixmap (tiled_root_pmap, target->visual, window_width, window_height)) 1381 if (blur_pixmap (tiled_root_pmap, target->visual, window_width, window_height))
1399 result |= transpPmapBlurred; 1382 result |= transpPmapBlurred;
1400 } 1383 }
1401 if ((flags & tintNeeded) 1384 if ((flags & tintNeeded)
1402 && (flags & tintServerSide)) 1385 && (flags & (tintWholesome | HAS_RENDER)))
1403 { 1386 {
1404 if (tint_pixmap (tiled_root_pmap, target->visual, window_width, window_height)) 1387 if (tint_pixmap (tiled_root_pmap, target->visual, window_width, window_height))
1405 result |= transpPmapTinted; 1388 result |= transpPmapTinted;
1406 } 1389 }
1407 } /* server side rendering completed */ 1390 } /* server side rendering completed */
1430 1413
1431 root_pixmap = new_root_pixmap; 1414 root_pixmap = new_root_pixmap;
1432} 1415}
1433# endif /* ENABLE_TRANSPARENCY */ 1416# endif /* ENABLE_TRANSPARENCY */
1434 1417
1435# ifndef HAVE_AFTERIMAGE 1418#if defined(ENABLE_TRANSPARENCY) && !defined(HAVE_AFTERIMAGE)
1436static void ShadeXImage(Visual *visual, XImage *srcImage, int shade, int rm, int gm, int bm); 1419static void ShadeXImage(Visual *visual, XImage *srcImage, int shade, int rm, int gm, int bm);
1437# endif 1420# endif
1438 1421
1439bool 1422bool
1440bgPixmap_t::render () 1423bgPixmap_t::render ()
1464 if (render_image (background_flags)) 1447 if (render_image (background_flags))
1465 flags = flags & ~isInvalid; 1448 flags = flags & ~isInvalid;
1466 } 1449 }
1467# endif 1450# endif
1468 1451
1452# if defined(ENABLE_TRANSPARENCY) && !defined(HAVE_AFTERIMAGE)
1469 XImage *result = NULL; 1453 XImage *result = NULL;
1470 1454
1471 if (background_flags && (flags & isInvalid)) 1455 if (background_flags && (flags & isInvalid))
1472 { 1456 {
1473 result = XGetImage (target->dpy, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, ZPixmap); 1457 result = XGetImage (target->dpy, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, ZPixmap);
1474 } 1458 }
1475 1459
1476 if (result) 1460 if (result)
1477 { 1461 {
1478# if !defined(HAVE_AFTERIMAGE) && !XRENDER
1479 /* our own client-side tinting */ 1462 /* our own client-side tinting */
1480 if (!(background_flags & transpPmapTinted) && (flags & tintNeeded)) 1463 if (!(background_flags & transpPmapTinted) && (flags & tintNeeded))
1481 { 1464 {
1482 rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC); 1465 rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC);
1483 if (flags & tintSet) 1466 if (flags & tintSet)
1484 tint.get (c); 1467 tint.get (c);
1485 ShadeXImage (DefaultVisual (target->dpy, target->display->screen), result, shade, c.r, c.g, c.b); 1468 ShadeXImage (DefaultVisual (target->dpy, target->display->screen), result, shade, c.r, c.g, c.b);
1486 } 1469 }
1487# endif
1488 1470
1489 GC gc = XCreateGC (target->dpy, target->vt, 0UL, NULL); 1471 GC gc = XCreateGC (target->dpy, target->vt, 0UL, NULL);
1490 1472
1491 if (gc) 1473 if (gc)
1492 { 1474 {
1496 flags = flags & ~isInvalid; 1478 flags = flags & ~isInvalid;
1497 } 1479 }
1498 1480
1499 XDestroyImage (result); 1481 XDestroyImage (result);
1500 } 1482 }
1483# endif
1501 1484
1502 if (flags & isInvalid) 1485 if (flags & isInvalid)
1503 { 1486 {
1504 if (pixmap != None) 1487 if (pixmap != None)
1505 { 1488 {
1517 1500
1518void 1501void
1519bgPixmap_t::set_target (rxvt_term *new_target) 1502bgPixmap_t::set_target (rxvt_term *new_target)
1520{ 1503{
1521 target = new_target; 1504 target = new_target;
1505
1506 flags &= ~(HAS_RENDER | HAS_RENDER_CONV);
1507#if XRENDER
1508 int major, minor;
1509 if (XRenderQueryVersion (target->dpy, &major, &minor))
1510 flags |= HAS_RENDER;
1511 XFilters *filters = XRenderQueryFilters (target->dpy, target->vt);
1512 if (filters)
1513 {
1514 for (int i = 0; i < filters->nfilter; i++)
1515 if (!strcmp (filters->filter[i], FilterConvolution))
1516 flags |= HAS_RENDER_CONV;
1517
1518 XFree (filters);
1519 }
1520#endif
1522} 1521}
1523 1522
1524void 1523void
1525bgPixmap_t::apply () 1524bgPixmap_t::apply ()
1526{ 1525{
1575 flags |= hasChanged; 1574 flags |= hasChanged;
1576} 1575}
1577 1576
1578#endif /* HAVE_BG_PIXMAP */ 1577#endif /* HAVE_BG_PIXMAP */
1579 1578
1580#if defined(ENABLE_TRANSPARENCY) && !defined(HAVE_AFTERIMAGE) && !XRENDER 1579#if defined(ENABLE_TRANSPARENCY) && !defined(HAVE_AFTERIMAGE)
1581/* taken from aterm-0.4.2 */ 1580/* taken from aterm-0.4.2 */
1582 1581
1583static void 1582static void
1584ShadeXImage(Visual *visual, XImage *srcImage, int shade, int rm, int gm, int bm) 1583ShadeXImage(Visual *visual, XImage *srcImage, int shade, int rm, int gm, int bm)
1585{ 1584{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines