… | |
… | |
27 | #define DO_TIMING_TEST 0 |
27 | #define DO_TIMING_TEST 0 |
28 | |
28 | |
29 | #if DO_TIMING_TEST |
29 | #if DO_TIMING_TEST |
30 | # include <sys/time.h> |
30 | # include <sys/time.h> |
31 | #define TIMING_TEST_START(id) \ |
31 | #define TIMING_TEST_START(id) \ |
32 | struct timeval timing_test_##id##_stv;\ |
32 | struct timeval timing_test_##id##_stv; \ |
33 | gettimeofday (&timing_test_##id##_stv, NULL); |
33 | gettimeofday (&timing_test_##id##_stv, NULL); |
34 | |
34 | |
35 | #define TIMING_TEST_PRINT_RESULT(id) \ |
35 | #define TIMING_TEST_PRINT_RESULT(id) \ |
36 | do{ struct timeval tv;gettimeofday (&tv, NULL); tv.tv_sec -= (timing_test_##id##_stv).tv_sec;\ |
36 | do { \ |
|
|
37 | struct timeval tv; \ |
|
|
38 | gettimeofday (&tv, NULL); \ |
|
|
39 | tv.tv_sec -= (timing_test_##id##_stv).tv_sec; \ |
37 | fprintf (stderr, "%s: %s: %d: elapsed %ld usec\n", #id, __FILE__, __LINE__,\ |
40 | fprintf (stderr, "%s: %s: %d: elapsed %ld usec\n", #id, __FILE__, __LINE__, \ |
38 | tv.tv_sec * 1000000 + tv.tv_usec - (timing_test_##id##_stv).tv_usec);}while (0) |
41 | tv.tv_sec * 1000000 + tv.tv_usec - (timing_test_##id##_stv).tv_usec); \ |
|
|
42 | } while (0) |
39 | |
43 | |
40 | #else |
44 | #else |
41 | #define TIMING_TEST_START(id) do{}while (0) |
45 | #define TIMING_TEST_START(id) do {} while (0) |
42 | #define TIMING_TEST_PRINT_RESULT(id) do{}while (0) |
46 | #define TIMING_TEST_PRINT_RESULT(id) do {} while (0) |
43 | #endif |
47 | #endif |
44 | |
48 | |
45 | /* |
49 | /* |
46 | * Pixmap geometry string interpretation : |
50 | * Pixmap geometry string interpretation : |
47 | * Each geometry string contains zero or one scale/position |
51 | * Each geometry string contains zero or one scale/position |
48 | * adjustment and may optionally be followed by a colon and one or more |
52 | * adjustment and may optionally be followed by a colon and one or more |
49 | * colon-delimited pixmap operations. |
53 | * colon-delimited pixmap operations. |
50 | * The following table shows the valid geometry strings and their |
54 | * The following table shows the valid geometry strings and their |
51 | * affects on the background image : |
55 | * effects on the background image : |
52 | * |
56 | * |
53 | * WxH+X+Y Set scaling to W% by H%, and position to X% by Y%. |
57 | * WxH+X+Y Set scaling to W% by H%, and position to X% by Y%. |
54 | * W and H are percentages of the terminal window size. |
58 | * W and H are percentages of the terminal window size. |
55 | * X and Y are also percentages; e.g., +50+50 centers |
59 | * X and Y are also percentages; e.g., +50+50 centers |
56 | * the image in the window. |
60 | * the image in the window. |
… | |
… | |
136 | # endif |
140 | # endif |
137 | |
141 | |
138 | return false; |
142 | return false; |
139 | } |
143 | } |
140 | |
144 | |
141 | bool |
145 | bool |
142 | bgPixmap_t::window_position_sensitive () |
146 | bgPixmap_t::window_position_sensitive () |
143 | { |
147 | { |
144 | # ifdef ENABLE_TRANSPARENCY |
148 | # ifdef ENABLE_TRANSPARENCY |
145 | if (flags & isTransparent) |
149 | if (flags & isTransparent) |
146 | return true; |
150 | return true; |
147 | # endif |
151 | # endif |
… | |
… | |
259 | int geom_flags = 0, changed = 0; |
263 | int geom_flags = 0, changed = 0; |
260 | int x = 0, y = 0; |
264 | int x = 0, y = 0; |
261 | unsigned int w = 0, h = 0; |
265 | unsigned int w = 0, h = 0; |
262 | unsigned int n; |
266 | unsigned int n; |
263 | unsigned long new_flags = (flags & (~geometryFlags)); |
267 | unsigned long new_flags = (flags & (~geometryFlags)); |
264 | char *p; |
268 | const char *p; |
265 | # define MAXLEN_GEOM 256 /* could be longer than regular geometry string */ |
269 | # define MAXLEN_GEOM 256 /* could be longer than regular geometry string */ |
266 | |
270 | |
267 | if (geom == NULL) |
271 | if (geom == NULL) |
268 | return false; |
272 | return false; |
269 | |
273 | |
… | |
… | |
495 | new_pmap_height = background->height; |
499 | new_pmap_height = background->height; |
496 | result = background; |
500 | result = background; |
497 | |
501 | |
498 | if (background_tint != TINT_LEAVE_SAME) |
502 | if (background_tint != TINT_LEAVE_SAME) |
499 | { |
503 | { |
500 | ASImage* tmp = tile_asimage (target->asv, background, 0, 0, |
504 | ASImage *tmp = tile_asimage (target->asv, background, 0, 0, |
501 | target_width, target_height, background_tint, |
505 | target_width, target_height, background_tint, |
502 | ASA_XImage, 100, ASIMAGE_QUALITY_DEFAULT); |
506 | ASA_XImage, 100, ASIMAGE_QUALITY_DEFAULT); |
503 | if (tmp) |
507 | if (tmp) |
504 | result = tmp; |
508 | result = tmp; |
505 | } |
509 | } |
… | |
… | |
533 | if (h_scale == 0 || v_scale == 0) |
537 | if (h_scale == 0 || v_scale == 0) |
534 | { |
538 | { |
535 | ASImage *tmp = tile_asimage (target->asv, result, |
539 | ASImage *tmp = tile_asimage (target->asv, result, |
536 | (h_scale > 0) ? 0 : (int)result->width - x, |
540 | (h_scale > 0) ? 0 : (int)result->width - x, |
537 | (v_scale > 0) ? 0 : (int)result->height - y, |
541 | (v_scale > 0) ? 0 : (int)result->height - y, |
538 | new_pmap_width, |
542 | new_pmap_width, |
539 | new_pmap_height, |
543 | new_pmap_height, |
540 | TINT_LEAVE_SAME, ASA_XImage, |
544 | TINT_LEAVE_SAME, ASA_XImage, |
541 | 100, ASIMAGE_QUALITY_DEFAULT); |
545 | 100, ASIMAGE_QUALITY_DEFAULT); |
542 | if (tmp) |
546 | if (tmp) |
543 | { |
547 | { |
… | |
… | |
550 | } |
554 | } |
551 | else |
555 | else |
552 | { |
556 | { |
553 | /* if blending background and image - pixmap has to be sized same as target window */ |
557 | /* if blending background and image - pixmap has to be sized same as target window */ |
554 | ASImageLayer *layers = create_image_layers (2); |
558 | ASImageLayer *layers = create_image_layers (2); |
555 | ASImage *merged_im = NULL; |
|
|
556 | |
559 | |
557 | layers[0].im = background; |
560 | layers[0].im = background; |
558 | layers[0].clip_width = target_width; |
561 | layers[0].clip_width = target_width; |
559 | layers[0].clip_height = target_height; |
562 | layers[0].clip_height = target_height; |
560 | layers[0].tint = background_tint; |
563 | layers[0].tint = background_tint; |
… | |
… | |
671 | { |
674 | { |
672 | assert (file); |
675 | assert (file); |
673 | |
676 | |
674 | if (*file) |
677 | if (*file) |
675 | { |
678 | { |
|
|
679 | if (const char *p = strchr (file, ';')) |
|
|
680 | { |
|
|
681 | size_t len = p - file; |
|
|
682 | char *f = rxvt_temp_buf<char> (len + 1); |
|
|
683 | memcpy (f, file, len); |
|
|
684 | f[len] = '\0'; |
|
|
685 | file = f; |
|
|
686 | } |
|
|
687 | |
676 | # ifdef HAVE_AFTERIMAGE |
688 | # ifdef HAVE_AFTERIMAGE |
677 | if (!target->asimman) |
689 | if (!target->asimman) |
678 | target->asimman = create_generic_imageman (target->rs[Rs_path]); |
690 | target->asimman = create_generic_imageman (target->rs[Rs_path]); |
679 | |
|
|
680 | if (char *f = strchr (file, ';')) |
|
|
681 | { |
|
|
682 | size_t len = f - file; |
|
|
683 | f = (char *)malloc (len + 1); |
|
|
684 | memcpy (f, file, len); |
|
|
685 | f[len] = '\0'; |
|
|
686 | original_asim = get_asimage (target->asimman, f, 0xFFFFFFFF, 100); |
|
|
687 | free (f); |
|
|
688 | } |
|
|
689 | else |
|
|
690 | original_asim = get_asimage (target->asimman, file, 0xFFFFFFFF, 100); |
691 | original_asim = get_asimage (target->asimman, file, 0xFFFFFFFF, 100); |
691 | |
|
|
692 | return original_asim; |
692 | return original_asim; |
693 | # endif |
693 | # endif |
694 | } |
694 | } |
695 | |
695 | |
696 | return false; |
696 | return false; |
… | |
… | |
848 | unsigned long result = 0; |
848 | unsigned long result = 0; |
849 | |
849 | |
850 | if (target == NULL) |
850 | if (target == NULL) |
851 | return 0; |
851 | return 0; |
852 | |
852 | |
853 | /* root dimentions may change from call to call - but Display structure should |
853 | /* root dimensions may change from call to call - but Display structure should |
854 | * be always up-to-date, so let's use it : |
854 | * be always up-to-date, so let's use it : |
855 | */ |
855 | */ |
856 | Window root = target->display->root; |
856 | Window root = target->display->root; |
857 | int screen = target->display->screen; |
857 | int screen = target->display->screen; |
858 | Display *dpy = target->dpy; |
858 | Display *dpy = target->dpy; |
… | |
… | |
947 | else |
947 | else |
948 | result |= transpPmapTiled; |
948 | result |= transpPmapTiled; |
949 | } |
949 | } |
950 | else |
950 | else |
951 | { |
951 | { |
952 | /* strightforward pixmap copy */ |
952 | /* straightforward pixmap copy */ |
953 | gcv.tile = root_pixmap; |
953 | gcv.tile = root_pixmap; |
954 | gcv.fill_style = FillTiled; |
954 | gcv.fill_style = FillTiled; |
955 | |
955 | |
956 | while (sx < 0) sx += (int)root_width; |
956 | while (sx < 0) sx += (int)root_width; |
957 | while (sy < 0) sy += (int)root_height; |
957 | while (sy < 0) sy += (int)root_height; |
… | |
… | |
1108 | return false; |
1108 | return false; |
1109 | } |
1109 | } |
1110 | # endif /* ENABLE_TRANSPARENCY */ |
1110 | # endif /* ENABLE_TRANSPARENCY */ |
1111 | |
1111 | |
1112 | # ifndef HAVE_AFTERIMAGE |
1112 | # ifndef HAVE_AFTERIMAGE |
1113 | static void ShadeXImage(rxvt_term *term, XImage* srcImage, int shade, int rm, int gm, int bm); |
1113 | static void ShadeXImage(rxvt_term *term, XImage *srcImage, int shade, int rm, int gm, int bm); |
1114 | # endif |
1114 | # endif |
1115 | |
1115 | |
1116 | bool |
1116 | bool |
1117 | bgPixmap_t::render () |
1117 | bgPixmap_t::render () |
1118 | { |
1118 | { |
1119 | unsigned long background_flags = 0; |
1119 | unsigned long background_flags = 0; |
1120 | |
1120 | |
1121 | if (target == NULL) |
1121 | if (target == NULL) |
1122 | return false; |
1122 | return false; |
1123 | |
|
|
1124 | target->init_asv (); |
|
|
1125 | |
1123 | |
1126 | TIMING_TEST_START (tp); |
1124 | TIMING_TEST_START (tp); |
1127 | |
1125 | |
1128 | invalidate (); |
1126 | invalidate (); |
1129 | # ifdef ENABLE_TRANSPARENCY |
1127 | # ifdef ENABLE_TRANSPARENCY |
… | |
… | |
1142 | XImage *result = NULL; |
1140 | XImage *result = NULL; |
1143 | # ifdef HAVE_AFTERIMAGE |
1141 | # ifdef HAVE_AFTERIMAGE |
1144 | if (original_asim |
1142 | if (original_asim |
1145 | || (background_flags & transpTransformations) != (flags & transpTransformations)) |
1143 | || (background_flags & transpTransformations) != (flags & transpTransformations)) |
1146 | { |
1144 | { |
|
|
1145 | target->init_asv (); |
|
|
1146 | |
1147 | ASImage *background = NULL; |
1147 | ASImage *background = NULL; |
1148 | ARGB32 as_tint = TINT_LEAVE_SAME; |
1148 | ARGB32 as_tint = TINT_LEAVE_SAME; |
1149 | if (background_flags) |
1149 | if (background_flags) |
1150 | background = pixmap2ximage (target->asv, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, 100); |
1150 | background = pixmap2ximage (target->asv, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, 100); |
1151 | |
1151 | |
… | |
… | |
1165 | as_tint = shading2tint32 (&as_shade); |
1165 | as_tint = shading2tint32 (&as_shade); |
1166 | } |
1166 | } |
1167 | |
1167 | |
1168 | if (!(background_flags & transpPmapBlured) && (flags & blurNeeded) && background != NULL) |
1168 | if (!(background_flags & transpPmapBlured) && (flags & blurNeeded) && background != NULL) |
1169 | { |
1169 | { |
1170 | ASImage* tmp = blur_asimage_gauss (target->asv, background, h_blurRadius, v_blurRadius, 0xFFFFFFFF, |
1170 | ASImage *tmp = blur_asimage_gauss (target->asv, background, h_blurRadius, v_blurRadius, 0xFFFFFFFF, |
1171 | (original_asim == NULL || tint == TINT_LEAVE_SAME)?ASA_XImage:ASA_ASImage, |
1171 | (original_asim == NULL || tint == TINT_LEAVE_SAME)?ASA_XImage:ASA_ASImage, |
1172 | 100, ASIMAGE_QUALITY_DEFAULT); |
1172 | 100, ASIMAGE_QUALITY_DEFAULT); |
1173 | if (tmp) |
1173 | if (tmp) |
1174 | { |
1174 | { |
1175 | destroy_asimage (&background); |
1175 | destroy_asimage (&background); |
… | |
… | |
1186 | else if (background_flags && pmap_depth != target->depth) |
1186 | else if (background_flags && pmap_depth != target->depth) |
1187 | result = XGetImage (target->dpy, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, ZPixmap); |
1187 | result = XGetImage (target->dpy, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, ZPixmap); |
1188 | |
1188 | |
1189 | # elif !XFT /* our own client-side tinting */ |
1189 | # elif !XFT /* our own client-side tinting */ |
1190 | |
1190 | |
1191 | /* ATTENTION: We ASSUME that XFT will let us do all the tinting neccessary server-side. |
1191 | /* ATTENTION: We ASSUME that XFT will let us do all the tinting necessary server-side. |
1192 | This may need to be changed in need_client_side_rendering() logic is altered !!! */ |
1192 | This may need to be changed in need_client_side_rendering() logic is altered !!! */ |
1193 | |
1193 | |
1194 | if (background_flags && (flags & isInvalid)) |
1194 | if (background_flags && (flags & isInvalid)) |
1195 | { |
1195 | { |
1196 | result = XGetImage (target->dpy, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, ZPixmap); |
1196 | result = XGetImage (target->dpy, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, ZPixmap); |
… | |
… | |
1327 | |
1327 | |
1328 | /* don't want Expose on the parent or vt. It is better to use |
1328 | /* don't want Expose on the parent or vt. It is better to use |
1329 | scr_touch or we get a great deal of flicker otherwise: */ |
1329 | scr_touch or we get a great deal of flicker otherwise: */ |
1330 | XClearWindow (target->dpy, target->parent[0]); |
1330 | XClearWindow (target->dpy, target->parent[0]); |
1331 | |
1331 | |
1332 | if (target->scrollBar.win) |
1332 | if (target->scrollBar.state && target->scrollBar.win) |
1333 | { |
1333 | { |
1334 | target->scrollBar.state = STATE_IDLE; |
1334 | target->scrollBar.state = STATE_IDLE; |
1335 | target->scrollBar.show (0); |
1335 | target->scrollBar.show (0); |
1336 | } |
1336 | } |
1337 | |
1337 | |
… | |
… | |
1346 | /* taken from aterm-0.4.2 */ |
1346 | /* taken from aterm-0.4.2 */ |
1347 | |
1347 | |
1348 | typedef uint32_t RUINT32T; |
1348 | typedef uint32_t RUINT32T; |
1349 | |
1349 | |
1350 | static void |
1350 | static void |
1351 | ShadeXImage(rxvt_term *term, XImage* srcImage, int shade, int rm, int gm, int bm) |
1351 | ShadeXImage(rxvt_term *term, XImage *srcImage, int shade, int rm, int gm, int bm) |
1352 | { |
1352 | { |
1353 | int sh_r, sh_g, sh_b; |
1353 | int sh_r, sh_g, sh_b; |
1354 | RUINT32T mask_r, mask_g, mask_b; |
1354 | RUINT32T mask_r, mask_g, mask_b; |
1355 | RUINT32T *lookup, *lookup_r, *lookup_g, *lookup_b; |
1355 | RUINT32T *lookup, *lookup_r, *lookup_g, *lookup_b; |
1356 | unsigned int lower_lim_r, lower_lim_g, lower_lim_b; |
1356 | unsigned int lower_lim_r, lower_lim_g, lower_lim_b; |