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

Comparing rxvt-unicode/src/rxvtimg.C (file contents):
Revision 1.16 by root, Mon Jun 4 16:12:55 2012 UTC vs.
Revision 1.24 by sf-exg, Tue Jun 5 18:52:48 2012 UTC

13} 13}
14 14
15rxvt_img::rxvt_img (rxvt_screen *screen, XRenderPictFormat *format, int width, int height, Pixmap pixmap) 15rxvt_img::rxvt_img (rxvt_screen *screen, XRenderPictFormat *format, int width, int height, Pixmap pixmap)
16: s(screen), pm(pixmap), w(width), h(height), format(format), shared(false) 16: s(screen), pm(pixmap), w(width), h(height), format(format), shared(false)
17{ 17{
18}
19
20rxvt_img *
21rxvt_img::new_from_root (rxvt_screen *s)
22{
23 Display *dpy = s->display->dpy;
24 unsigned int root_pm_w, root_pm_h;
25 Pixmap root_pixmap = s->display->get_pixmap_property (s->display->xa[XA_XROOTPMAP_ID]);
26 if (root_pixmap == None)
27 root_pixmap = s->display->get_pixmap_property (s->display->xa[XA_ESETROOT_PMAP_ID]);
28
29 if (root_pixmap == None)
30 return 0;
31
32 Window wdummy;
33 int idummy;
34 unsigned int udummy;
35
36 if (!XGetGeometry (dpy, root_pixmap, &wdummy, &idummy, &idummy, &root_pm_w, &root_pm_h, &udummy, &udummy))
37 return 0;
38
39 rxvt_img *img = new rxvt_img (
40 s,
41 XRenderFindVisualFormat (dpy, DefaultVisual (dpy, s->display->screen)),
42 root_pm_w,
43 root_pm_h,
44 root_pixmap
45 );
46
47 img->shared = true;
48
49 return img;
18} 50}
19 51
20rxvt_img * 52rxvt_img *
21rxvt_img::new_from_file (rxvt_screen *s, const char *filename) 53rxvt_img::new_from_file (rxvt_screen *s, const char *filename)
22{ 54{
87 119
88 for (int i = 0; i < width; i++) 120 for (int i = 0; i < width; i++)
89 params[i+2] = XDoubleToFixed (kernel[i] / sum); 121 params[i+2] = XDoubleToFixed (kernel[i] / sum);
90} 122}
91 123
92void 124rxvt_img *
93rxvt_img::blur (int rh, int rv) 125rxvt_img::blur (int rh, int rv)
94{ 126{
95 if (!(s->display->flags & DISPLAY_HAS_RENDER_CONV)) 127 if (!(s->display->flags & DISPLAY_HAS_RENDER_CONV))
96 return; 128 return clone ();
97 129
98 Display *dpy = s->display->dpy; 130 Display *dpy = s->display->dpy;
99 int size = max (rh, rv) * 2 + 1; 131 int size = max (rh, rv) * 2 + 1;
100 double *kernel = (double *)malloc (size * sizeof (double)); 132 double *kernel = (double *)malloc (size * sizeof (double));
101 XFixed *params = (XFixed *)malloc ((size + 2) * sizeof (XFixed)); 133 XFixed *params = (XFixed *)malloc ((size + 2) * sizeof (XFixed));
134 rxvt_img *img = new rxvt_img (s, format, w, h);
102 135
103 XRenderPictureAttributes pa; 136 XRenderPictureAttributes pa;
104 137
105 pa.repeat = RepeatPad; 138 pa.repeat = RepeatPad;
106 Picture src = XRenderCreatePicture (dpy, pm, format, CPRepeat, &pa); 139 Picture src = XRenderCreatePicture (dpy, pm , format, CPRepeat, &pa);
140 Picture dst = XRenderCreatePicture (dpy, img->pm, format, CPRepeat, &pa);
141
107 Pixmap tmp = XCreatePixmap (dpy, pm, w, h, format->depth); 142 Pixmap tmp_pm = XCreatePixmap (dpy, pm, w, h, format->depth);
108 Picture dst = XRenderCreatePicture (dpy, tmp, format, CPRepeat, &pa); 143 Picture tmp = XRenderCreatePicture (dpy, tmp_pm , format, CPRepeat, &pa);
109 XFreePixmap (dpy, tmp); 144 XFreePixmap (dpy, tmp_pm);
110 145
111 if (kernel && params) 146 if (kernel && params)
112 { 147 {
113 size = rh * 2 + 1; 148 size = rh * 2 + 1;
114 get_gaussian_kernel (rh, size, kernel, params); 149 get_gaussian_kernel (rh, size, kernel, params);
116 XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2); 151 XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2);
117 XRenderComposite (dpy, 152 XRenderComposite (dpy,
118 PictOpSrc, 153 PictOpSrc,
119 src, 154 src,
120 None, 155 None,
121 dst, 156 tmp,
122 0, 0, 157 0, 0,
123 0, 0, 158 0, 0,
124 0, 0, 159 0, 0,
125 w, h); 160 w, h);
126
127 ::swap (src, dst);
128 161
129 size = rv * 2 + 1; 162 size = rv * 2 + 1;
130 get_gaussian_kernel (rv, size, kernel, params); 163 get_gaussian_kernel (rv, size, kernel, params);
131 ::swap (params[0], params[1]); 164 ::swap (params[0], params[1]);
132 165
133 XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2); 166 XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2);
134 XRenderComposite (dpy, 167 XRenderComposite (dpy,
135 PictOpSrc, 168 PictOpSrc,
136 src, 169 tmp,
137 None, 170 None,
138 dst, 171 dst,
139 0, 0, 172 0, 0,
140 0, 0, 173 0, 0,
141 0, 0, 174 0, 0,
144 177
145 free (kernel); 178 free (kernel);
146 free (params); 179 free (params);
147 XRenderFreePicture (dpy, src); 180 XRenderFreePicture (dpy, src);
148 XRenderFreePicture (dpy, dst); 181 XRenderFreePicture (dpy, dst);
182 XRenderFreePicture (dpy, tmp);
183
184 return img;
149} 185}
150 186
151static Picture 187static Picture
152create_xrender_mask (Display *dpy, Drawable drawable, Bool argb) 188create_xrender_mask (Display *dpy, Drawable drawable, Bool argb)
153{ 189{
176 mask_c.blue = float_to_component (b); 212 mask_c.blue = float_to_component (b);
177 mask_c.alpha = float_to_component (a); 213 mask_c.alpha = float_to_component (a);
178 XRenderFillRectangle (dpy, PictOpSrc, src, &mask_c, 0, 0, 1, 1); 214 XRenderFillRectangle (dpy, PictOpSrc, src, &mask_c, 0, 0, 1, 1);
179 215
180 XRenderComposite (dpy, PictOpAdd, src, None, dst, 0, 0, 0, 0, 0, 0, w, h); 216 XRenderComposite (dpy, PictOpAdd, src, None, dst, 0, 0, 0, 0, 0, 0, w, h);
217
218 XRenderFreePicture (dpy, src);
219 XRenderFreePicture (dpy, dst);
181} 220}
182 221
183void 222void
184rxvt_img::contrast (double r, double g, double b, double a) 223rxvt_img::contrast (double r, double g, double b, double a)
185{ 224{
196 mask_c.blue = float_to_component (b); 235 mask_c.blue = float_to_component (b);
197 mask_c.alpha = float_to_component (a); 236 mask_c.alpha = float_to_component (a);
198 XRenderFillRectangle (dpy, PictOpSrc, src, &mask_c, 0, 0, 1, 1); 237 XRenderFillRectangle (dpy, PictOpSrc, src, &mask_c, 0, 0, 1, 1);
199 238
200 XRenderComposite (dpy, PictOpMultiply, src, None, dst, 0, 0, 0, 0, 0, 0, w, h); 239 XRenderComposite (dpy, PictOpMultiply, src, None, dst, 0, 0, 0, 0, 0, 0, w, h);
240
241 XRenderFreePicture (dpy, src);
242 XRenderFreePicture (dpy, dst);
201} 243}
202 244
203bool 245bool
204rxvt_img::render_pixbuf (GdkPixbuf *pixbuf, int src_x, int src_y, int width, int height, int dst_x, int dst_y) 246rxvt_img::render_pixbuf (GdkPixbuf *pixbuf, int src_x, int src_y, int width, int height, int dst_x, int dst_y)
205{ 247{
206 bool argb = format->id == PictStandardARGB32;
207
208 Display *dpy = s->display->dpy; 248 Display *dpy = s->display->dpy;
209 249
210 if (s->visual->c_class != TrueColor) 250 if (s->visual->c_class != TrueColor)
211 return false; 251 return false;
212 252
213 uint32_t red_mask, green_mask, blue_mask, alpha_mask; 253 uint32_t red_mask, green_mask, blue_mask, alpha_mask;
214 254
215 if (argb) 255 red_mask = (uint32_t)format->direct.redMask << format->direct.red;
216 { 256 green_mask = (uint32_t)format->direct.greenMask << format->direct.green;
217 red_mask = 0xff << 16; 257 blue_mask = (uint32_t)format->direct.blueMask << format->direct.blue;
218 green_mask = 0xff << 8;
219 blue_mask = 0xff;
220 alpha_mask = 0xff << 24;
221 }
222 else
223 {
224 red_mask = s->visual->red_mask;
225 green_mask = s->visual->green_mask;
226 blue_mask = s->visual->blue_mask;
227 alpha_mask = (uint32_t)format->direct.alphaMask << format->direct.alpha; 258 alpha_mask = (uint32_t)format->direct.alphaMask << format->direct.alpha;
228 }
229 259
230 int width_r = ecb_popcount32 (red_mask); 260 int width_r = ecb_popcount32 (red_mask);
231 int width_g = ecb_popcount32 (green_mask); 261 int width_g = ecb_popcount32 (green_mask);
232 int width_b = ecb_popcount32 (blue_mask); 262 int width_b = ecb_popcount32 (blue_mask);
233 int width_a = ecb_popcount32 (alpha_mask); 263 int width_a = ecb_popcount32 (alpha_mask);
241 int sh_a = ecb_ctz32 (alpha_mask); 271 int sh_a = ecb_ctz32 (alpha_mask);
242 272
243 if (width > 32767 || height > 32767) 273 if (width > 32767 || height > 32767)
244 return false; 274 return false;
245 275
246 XImage *ximage = XCreateImage (dpy, s->visual, argb ? 32 : format->depth, ZPixmap, 0, 0, 276 XImage *ximage = XCreateImage (dpy, s->visual, format->depth, ZPixmap, 0, 0,
247 width, height, 32, 0); 277 width, height, 32, 0);
248 if (!ximage) 278 if (!ximage)
249 return false; 279 return false;
250 280
251 if (height > INT_MAX / ximage->bytes_per_line 281 if (height > INT_MAX / ximage->bytes_per_line
322} 352}
323 353
324rxvt_img * 354rxvt_img *
325rxvt_img::clone () 355rxvt_img::clone ()
326{ 356{
357 rxvt_img *img = new rxvt_img (s, format, w, h);
358
327 GC gc = XCreateGC (s->display->dpy, pm, 0, 0); 359 GC gc = XCreateGC (s->display->dpy, pm, 0, 0);
328 Pixmap pm2 = XCreatePixmap (s->display->dpy, pm, w, h, format->depth);
329 XCopyArea (s->display->dpy, pm, pm2, gc, 0, 0, w, h, 0, 0); 360 XCopyArea (s->display->dpy, pm, img->pm, gc, 0, 0, w, h, 0, 0);
330 XFreeGC (s->display->dpy, gc); 361 XFreeGC (s->display->dpy, gc);
331 return new rxvt_img (s, format, w, h, pm2);
332}
333 362
363 return img;
364}
365
334rxvt_img * 366rxvt_img *
335rxvt_img::transform (int new_width, int new_height, int repeat, double matrix[9]) 367rxvt_img::sub_rect (int x, int y, int width, int height, int repeat)
336{ 368{
337 rxvt_img *img = new rxvt_img (s, format, new_width, new_height); 369 rxvt_img *img = new rxvt_img (s, format, width, height);
338 370
339 Display *dpy = s->display->dpy; 371 Display *dpy = s->display->dpy;
340 XRenderPictureAttributes pa; 372 XRenderPictureAttributes pa;
341 pa.repeat = repeat; 373 pa.repeat = repeat;
342 Picture src = XRenderCreatePicture (dpy, pm, format, CPRepeat, &pa); 374 Picture src = XRenderCreatePicture (dpy, pm, format, CPRepeat, &pa);
343 Picture dst = XRenderCreatePicture (dpy, img->pm, img->format, 0, 0); 375 Picture dst = XRenderCreatePicture (dpy, img->pm, img->format, 0, 0);
344 376
377 XRenderComposite (dpy, PictOpSrc, src, None, dst, x, y, 0, 0, 0, 0, width, height);
378
379 XRenderFreePicture (dpy, src);
380 XRenderFreePicture (dpy, dst);
381
382 return img;
383}
384
385rxvt_img *
386rxvt_img::transform (int new_width, int new_height, double matrix[9], int repeat)
387{
388 rxvt_img *img = new rxvt_img (s, format, new_width, new_height);
389
390 Display *dpy = s->display->dpy;
391 XRenderPictureAttributes pa;
392 pa.repeat = repeat;
393 Picture src = XRenderCreatePicture (dpy, pm, format, CPRepeat, &pa);
394 Picture dst = XRenderCreatePicture (dpy, img->pm, img->format, 0, 0);
395
345 XTransform xfrm; 396 XTransform xfrm;
346 397
347 for (int i = 0; i < 3; ++i) 398 for (int i = 0; i < 3; ++i)
348 for (int j = 0; j < 3; ++j) 399 for (int j = 0; j < 3; ++j)
349 xfrm.matrix [i][j] = XDoubleToFixed (matrix [i * 3 + j]); 400 xfrm.matrix [i][j] = XDoubleToFixed (matrix [i * 3 + j]);
350 401
402 XRenderSetPictureFilter (dpy, src, "good", 0, 0);
351 XRenderSetPictureTransform (dpy, src, &xfrm); 403 XRenderSetPictureTransform (dpy, src, &xfrm);
352 XRenderComposite (dpy, PictOpSrc, src, None, dst, 0, 0, 0, 0, 0, 0, new_width, new_height); 404 XRenderComposite (dpy, PictOpSrc, src, None, dst, 0, 0, 0, 0, 0, 0, new_width, new_height);
353 405
354 XRenderFreePicture (dpy, src); 406 XRenderFreePicture (dpy, src);
355 XRenderFreePicture (dpy, dst); 407 XRenderFreePicture (dpy, dst);
364 w / (double)new_width, 0, 0, 416 w / (double)new_width, 0, 0,
365 0, h / (double)new_height, 0, 417 0, h / (double)new_height, 0,
366 0, 0, 1 418 0, 0, 1
367 }; 419 };
368 420
369 return transform (new_width, new_height, RepeatNormal, matrix); 421 return transform (new_width, new_height, matrix);
422}
423
424rxvt_img *
425rxvt_img::rotate (int new_width, int new_height, int x, int y, double phi, int repeat)
426{
427 double s = sin (phi);
428 double c = cos (phi);
429
430 double matrix[9] = {
431 c, -s, -c * x + s * y + x,
432 s, c, -s * x - c * y + y,
433 0, 0, 1
434 };
435
436 return transform (new_width, new_height, matrix, repeat);
370} 437}
371 438
372rxvt_img * 439rxvt_img *
373rxvt_img::convert_to (XRenderPictFormat *new_format) 440rxvt_img::convert_to (XRenderPictFormat *new_format)
374{ 441{
384 XRenderFreePicture (dpy, dst); 451 XRenderFreePicture (dpy, dst);
385 452
386 return img; 453 return img;
387} 454}
388 455
456rxvt_img *
457rxvt_img::blend (rxvt_img *img, double factor)
458{
459 rxvt_img *img2 = clone ();
460 Display *dpy = s->display->dpy;
461 Picture src = XRenderCreatePicture (dpy, img->pm, img->format, 0, 0);
462 Picture dst = XRenderCreatePicture (dpy, img2->pm, img2->format, 0, 0);
463 Picture mask = create_xrender_mask (dpy, img->pm, False);
464
465 XRenderColor mask_c;
466
467 mask_c.alpha = float_to_component (factor);
468 mask_c.red =
469 mask_c.green =
470 mask_c.blue = 0;
471 XRenderFillRectangle (dpy, PictOpSrc, mask, &mask_c, 0, 0, 1, 1);
472
473 XRenderComposite (dpy, PictOpOver, src, mask, dst, 0, 0, 0, 0, 0, 0, w, h);
474
475 XRenderFreePicture (dpy, src);
476 XRenderFreePicture (dpy, dst);
477 XRenderFreePicture (dpy, mask);
478
479 return img2;
480}
481
389#endif 482#endif
390 483

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines