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.124 by sf-exg, Tue Nov 23 16:37:36 2010 UTC vs.
Revision 1.126 by sf-exg, Wed Dec 1 15:39:00 2010 UTC

1131 c.g = (c.g * shade) / 100; 1131 c.g = (c.g * shade) / 100;
1132 c.b = (c.b * shade) / 100; 1132 c.b = (c.b * shade) / 100;
1133 } 1133 }
1134 else 1134 else
1135 { 1135 {
1136 c.r = ((0xffff - c.r) * (200 - shade)) / 100; 1136 c.r = (c.r * (200 - shade)) / 100;
1137 c.g = ((0xffff - c.g) * (200 - shade)) / 100; 1137 c.g = (c.g * (200 - shade)) / 100;
1138 c.b = ((0xffff - c.b) * (200 - shade)) / 100; 1138 c.b = (c.b * (200 - shade)) / 100;
1139 } 1139 }
1140 1140
1141 XRenderPictFormat *solid_format = XRenderFindStandardFormat (dpy, PictStandardARGB32); 1141 XRenderPictFormat *solid_format = XRenderFindStandardFormat (dpy, PictStandardARGB32);
1142 XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual); 1142 XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual);
1143 XRenderPictureAttributes pa; 1143 XRenderPictureAttributes pa;
1157 1157
1158 if (mask_pic && overlay_pic && back_pic) 1158 if (mask_pic && overlay_pic && back_pic)
1159 { 1159 {
1160 XRenderColor mask_c; 1160 XRenderColor mask_c;
1161 1161
1162 mask_c.red = mask_c.green = mask_c.blue = shade > 100 ? 0xffff : 0; 1162 mask_c.red = mask_c.green = mask_c.blue = 0;
1163 mask_c.alpha = 0xffff; 1163 mask_c.alpha = 0xffff;
1164 XRenderFillRectangle (dpy, PictOpSrc, overlay_pic, &mask_c, 0, 0, 1, 1); 1164 XRenderFillRectangle (dpy, PictOpSrc, overlay_pic, &mask_c, 0, 0, 1, 1);
1165 1165
1166 mask_c.alpha = 0; 1166 mask_c.alpha = 0;
1167 mask_c.red = 0xffff - c.r; 1167 mask_c.red = 0xffff - c.r;
1168 mask_c.green = 0xffff - c.g; 1168 mask_c.green = 0xffff - c.g;
1169 mask_c.blue = 0xffff - c.b; 1169 mask_c.blue = 0xffff - c.b;
1170 XRenderFillRectangle (dpy, PictOpSrc, mask_pic, &mask_c, 0, 0, 1, 1); 1170 XRenderFillRectangle (dpy, PictOpSrc, mask_pic, &mask_c, 0, 0, 1, 1);
1171 XRenderComposite (dpy, PictOpOver, overlay_pic, mask_pic, back_pic, 0, 0, 0, 0, 0, 0, width, height); 1171 XRenderComposite (dpy, PictOpOver, overlay_pic, mask_pic, back_pic, 0, 0, 0, 0, 0, 0, width, height);
1172
1173 if (shade > 100)
1174 {
1175 mask_c.red = mask_c.green = mask_c.blue = 0xffff * (shade - 100) / 100;
1176 mask_c.alpha = 0;
1177 XRenderFillRectangle (dpy, PictOpSrc, overlay_pic, &mask_c, 0, 0, 1, 1);
1178
1179 XRenderComposite (dpy, PictOpOver, overlay_pic, None, back_pic, 0, 0, 0, 0, 0, 0, width, height);
1180 }
1181
1172 ret = true; 1182 ret = true;
1173 } 1183 }
1174 1184
1175 XRenderFreePicture (dpy, mask_pic); 1185 XRenderFreePicture (dpy, mask_pic);
1176 XRenderFreePicture (dpy, overlay_pic); 1186 XRenderFreePicture (dpy, overlay_pic);
1331 root_pixmap = new_root_pixmap; 1341 root_pixmap = new_root_pixmap;
1332} 1342}
1333# endif /* ENABLE_TRANSPARENCY */ 1343# endif /* ENABLE_TRANSPARENCY */
1334 1344
1335#if defined(ENABLE_TRANSPARENCY) && !defined(HAVE_AFTERIMAGE) 1345#if defined(ENABLE_TRANSPARENCY) && !defined(HAVE_AFTERIMAGE)
1336static void ShadeXImage(Visual *visual, XImage *srcImage, int shade, const rgba &c); 1346static void shade_ximage (Visual *visual, XImage *ximage, int shade, const rgba &c);
1337# endif 1347# endif
1338 1348
1339bool 1349bool
1340bgPixmap_t::render () 1350bgPixmap_t::render ()
1341{ 1351{
1380 if (!(background_flags & transpPmapTinted) && (flags & tintNeeded)) 1390 if (!(background_flags & transpPmapTinted) && (flags & tintNeeded))
1381 { 1391 {
1382 rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC); 1392 rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC);
1383 if (flags & tintSet) 1393 if (flags & tintSet)
1384 tint.get (c); 1394 tint.get (c);
1385 ShadeXImage (DefaultVisual (target->dpy, target->display->screen), result, shade, c); 1395 shade_ximage (DefaultVisual (target->dpy, target->display->screen), result, shade, c);
1386 } 1396 }
1387 1397
1388 GC gc = XCreateGC (target->dpy, target->vt, 0UL, NULL); 1398 GC gc = XCreateGC (target->dpy, target->vt, 0UL, NULL);
1389 1399
1390 if (gc) 1400 if (gc)
1495 1505
1496#if defined(ENABLE_TRANSPARENCY) && !defined(HAVE_AFTERIMAGE) 1506#if defined(ENABLE_TRANSPARENCY) && !defined(HAVE_AFTERIMAGE)
1497/* taken from aterm-0.4.2 */ 1507/* taken from aterm-0.4.2 */
1498 1508
1499static void 1509static void
1500ShadeXImage(Visual *visual, XImage *srcImage, int shade, const rgba &c) 1510shade_ximage (Visual *visual, XImage *ximage, int shade, const rgba &c)
1501{ 1511{
1502 int sh_r, sh_g, sh_b; 1512 int sh_r, sh_g, sh_b;
1503 uint32_t mask_r, mask_g, mask_b; 1513 uint32_t mask_r, mask_g, mask_b;
1504 uint32_t *lookup, *lookup_r, *lookup_g, *lookup_b; 1514 uint32_t *lookup, *lookup_r, *lookup_g, *lookup_b;
1505 rgba low; 1515 rgba low;
1506 rgba high; 1516 rgba high;
1507 int i; 1517 int i;
1508 int host_byte_order = byteorder.big_endian () ? MSBFirst : LSBFirst; 1518 int host_byte_order = byteorder.big_endian () ? MSBFirst : LSBFirst;
1509 1519
1510 if (visual->c_class != TrueColor || srcImage->format != ZPixmap) return; 1520 if (visual->c_class != TrueColor || ximage->format != ZPixmap) return;
1511 1521
1512 /* for convenience */ 1522 /* for convenience */
1513 mask_r = visual->red_mask; 1523 mask_r = visual->red_mask;
1514 mask_g = visual->green_mask; 1524 mask_g = visual->green_mask;
1515 mask_b = visual->blue_mask; 1525 mask_b = visual->blue_mask;
1516 1526
1517 /* boring lookup table pre-initialization */ 1527 /* boring lookup table pre-initialization */
1518 switch (srcImage->depth) 1528 switch (ximage->depth)
1519 { 1529 {
1520 case 15: 1530 case 15:
1521 if ((mask_r != 0x7c00) || 1531 if ((mask_r != 0x7c00) ||
1522 (mask_g != 0x03e0) || 1532 (mask_g != 0x03e0) ||
1523 (mask_b != 0x001f)) 1533 (mask_b != 0x001f))
1576 /* prepare limits for color transformation (each channel is handled separately) */ 1586 /* prepare limits for color transformation (each channel is handled separately) */
1577 if (shade > 100) 1587 if (shade > 100)
1578 { 1588 {
1579 shade = 200 - shade; 1589 shade = 200 - shade;
1580 1590
1581 high.r = (65535 - c.r) * shade / 100; 1591 high.r = c.r * shade / 100;
1582 high.g = (65535 - c.g) * shade / 100; 1592 high.g = c.g * shade / 100;
1583 high.b = (65535 - c.b) * shade / 100; 1593 high.b = c.b * shade / 100;
1584 1594
1585 low.r = 65535 - high.r; 1595 low.r = 65535 * (100 - shade) / 100;
1586 low.g = 65535 - high.g; 1596 low.g = 65535 * (100 - shade) / 100;
1587 low.b = 65535 - high.b; 1597 low.b = 65535 * (100 - shade) / 100;
1588 } 1598 }
1589 else 1599 else
1590 { 1600 {
1591 high.r = c.r * shade / 100; 1601 high.r = c.r * shade / 100;
1592 high.g = c.g * shade / 100; 1602 high.g = c.g * shade / 100;
1617 tmp += (mask_b>>sh_b) * low.b; 1627 tmp += (mask_b>>sh_b) * low.b;
1618 lookup_b[i] = (tmp/65535)<<sh_b; 1628 lookup_b[i] = (tmp/65535)<<sh_b;
1619 } 1629 }
1620 1630
1621 /* apply table to input image (replacing colors by newly calculated ones) */ 1631 /* apply table to input image (replacing colors by newly calculated ones) */
1622 if (srcImage->bits_per_pixel == 32 1632 if (ximage->bits_per_pixel == 32
1623 && (srcImage->depth == 24 || srcImage->depth == 32) 1633 && (ximage->depth == 24 || ximage->depth == 32)
1624 && srcImage->byte_order == host_byte_order) 1634 && ximage->byte_order == host_byte_order)
1625 { 1635 {
1626 uint32_t *p1, *pf, *p, *pl; 1636 uint32_t *p1, *pf, *p, *pl;
1627 p1 = (uint32_t *) srcImage->data; 1637 p1 = (uint32_t *) ximage->data;
1628 pf = (uint32_t *) (srcImage->data + srcImage->height * srcImage->bytes_per_line); 1638 pf = (uint32_t *) (ximage->data + ximage->height * ximage->bytes_per_line);
1629 1639
1630 while (p1 < pf) 1640 while (p1 < pf)
1631 { 1641 {
1632 p = p1; 1642 p = p1;
1633 pl = p1 + srcImage->width; 1643 pl = p1 + ximage->width;
1634 for (; p < pl; p++) 1644 for (; p < pl; p++)
1635 { 1645 {
1636 *p = lookup_r[(*p & 0xff0000) >> 16] | 1646 *p = lookup_r[(*p & 0xff0000) >> 16] |
1637 lookup_g[(*p & 0x00ff00) >> 8] | 1647 lookup_g[(*p & 0x00ff00) >> 8] |
1638 lookup_b[(*p & 0x0000ff)] | 1648 lookup_b[(*p & 0x0000ff)] |
1639 (*p & 0xff000000); 1649 (*p & 0xff000000);
1640 } 1650 }
1641 p1 = (uint32_t *) ((char *) p1 + srcImage->bytes_per_line); 1651 p1 = (uint32_t *) ((char *) p1 + ximage->bytes_per_line);
1642 } 1652 }
1643 } 1653 }
1644 else 1654 else
1645 { 1655 {
1646 for (int y = 0; y < srcImage->height; y++) 1656 for (int y = 0; y < ximage->height; y++)
1647 for (int x = 0; x < srcImage->width; x++) 1657 for (int x = 0; x < ximage->width; x++)
1648 { 1658 {
1649 unsigned long pixel = XGetPixel (srcImage, x, y); 1659 unsigned long pixel = XGetPixel (ximage, x, y);
1650 pixel = lookup_r[(pixel & mask_r) >> sh_r] | 1660 pixel = lookup_r[(pixel & mask_r) >> sh_r] |
1651 lookup_g[(pixel & mask_g) >> sh_g] | 1661 lookup_g[(pixel & mask_g) >> sh_g] |
1652 lookup_b[(pixel & mask_b) >> sh_b]; 1662 lookup_b[(pixel & mask_b) >> sh_b];
1653 XPutPixel (srcImage, x, y, pixel); 1663 XPutPixel (ximage, x, y, pixel);
1654 } 1664 }
1655 } 1665 }
1656 1666
1657 free (lookup); 1667 free (lookup);
1658} 1668}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines