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.14 by root, Mon Jun 4 15:53:12 2012 UTC vs.
Revision 1.22 by sf-exg, Tue Jun 5 15:18:23 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{
201} 237}
202 238
203bool 239bool
204rxvt_img::render_pixbuf (GdkPixbuf *pixbuf, int src_x, int src_y, int width, int height, int dst_x, int dst_y) 240rxvt_img::render_pixbuf (GdkPixbuf *pixbuf, int src_x, int src_y, int width, int height, int dst_x, int dst_y)
205{ 241{
206 bool argb = format->id == PictStandardARGB32;
207
208 Display *dpy = s->display->dpy; 242 Display *dpy = s->display->dpy;
209 243
210 if (s->visual->c_class != TrueColor) 244 if (s->visual->c_class != TrueColor)
211 return false; 245 return false;
212 246
213 uint32_t red_mask, green_mask, blue_mask, alpha_mask; 247 uint32_t red_mask, green_mask, blue_mask, alpha_mask;
214 248
215 if (argb) 249 red_mask = (uint32_t)format->direct.redMask << format->direct.red;
216 { 250 green_mask = (uint32_t)format->direct.greenMask << format->direct.green;
217 red_mask = 0xff << 16; 251 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; 252 alpha_mask = (uint32_t)format->direct.alphaMask << format->direct.alpha;
228 }
229 253
230 int width_r = ecb_popcount32 (red_mask); 254 int width_r = ecb_popcount32 (red_mask);
231 int width_g = ecb_popcount32 (green_mask); 255 int width_g = ecb_popcount32 (green_mask);
232 int width_b = ecb_popcount32 (blue_mask); 256 int width_b = ecb_popcount32 (blue_mask);
233 int width_a = ecb_popcount32 (alpha_mask); 257 int width_a = ecb_popcount32 (alpha_mask);
241 int sh_a = ecb_ctz32 (alpha_mask); 265 int sh_a = ecb_ctz32 (alpha_mask);
242 266
243 if (width > 32767 || height > 32767) 267 if (width > 32767 || height > 32767)
244 return false; 268 return false;
245 269
246 XImage *ximage = XCreateImage (dpy, s->visual, argb ? 32 : format->depth, ZPixmap, 0, 0, 270 XImage *ximage = XCreateImage (dpy, s->visual, format->depth, ZPixmap, 0, 0,
247 width, height, 32, 0); 271 width, height, 32, 0);
248 if (!ximage) 272 if (!ximage)
249 return false; 273 return false;
250 274
251 if (height > INT_MAX / ximage->bytes_per_line 275 if (height > INT_MAX / ximage->bytes_per_line
268 292
269 if (channels == 4 && alpha_mask == 0) 293 if (channels == 4 && alpha_mask == 0)
270 { 294 {
271 //pix_colors[Color_bg].get (c); 295 //pix_colors[Color_bg].get (c);
272 //TODO 296 //TODO
297 c.r = 0xffff; c.g = 0xc0c0; c.b = 0xcbcb;//D
273 c.r >>= 8; 298 c.r >>= 8;
274 c.g >>= 8; 299 c.g >>= 8;
275 c.b >>= 8; 300 c.b >>= 8;
276 } 301 }
277 302
321} 346}
322 347
323rxvt_img * 348rxvt_img *
324rxvt_img::clone () 349rxvt_img::clone ()
325{ 350{
351 rxvt_img *img = new rxvt_img (s, format, w, h);
352
326 GC gc = XCreateGC (s->display->dpy, pm, 0, 0); 353 GC gc = XCreateGC (s->display->dpy, pm, 0, 0);
327 Pixmap pm2 = XCreatePixmap (s->display->dpy, pm, w, h, format->depth);
328 XCopyArea (s->display->dpy, pm, pm2, gc, 0, 0, w, h, 0, 0); 354 XCopyArea (s->display->dpy, pm, img->pm, gc, 0, 0, w, h, 0, 0);
329 XFreeGC (s->display->dpy, gc); 355 XFreeGC (s->display->dpy, gc);
330 return new rxvt_img (s, format, w, h, pm2);
331}
332 356
357 return img;
358}
359
333rxvt_img * 360rxvt_img *
334rxvt_img::transform (int new_width, int new_height, int repeat, double matrix[9]) 361rxvt_img::sub_rect (int x, int y, int width, int height, int repeat)
335{ 362{
336 rxvt_img *img = new rxvt_img (s, format, new_width, new_height); 363 rxvt_img *img = new rxvt_img (s, format, width, height);
337 364
338 Display *dpy = s->display->dpy; 365 Display *dpy = s->display->dpy;
339 XRenderPictureAttributes pa; 366 XRenderPictureAttributes pa;
340 pa.repeat = repeat; 367 pa.repeat = repeat;
341 Picture src = XRenderCreatePicture (dpy, pm, format, CPRepeat, &pa); 368 Picture src = XRenderCreatePicture (dpy, pm, format, CPRepeat, &pa);
342 Picture dst = XRenderCreatePicture (dpy, img->pm, img->format, 0, 0); 369 Picture dst = XRenderCreatePicture (dpy, img->pm, img->format, 0, 0);
343 370
371 XRenderComposite (dpy, PictOpSrc, src, None, dst, x, y, 0, 0, 0, 0, width, height);
372
373 XRenderFreePicture (dpy, src);
374 XRenderFreePicture (dpy, dst);
375
376 return img;
377}
378
379rxvt_img *
380rxvt_img::transform (int new_width, int new_height, double matrix[9], int repeat)
381{
382 rxvt_img *img = new rxvt_img (s, format, new_width, new_height);
383
384 Display *dpy = s->display->dpy;
385 XRenderPictureAttributes pa;
386 pa.repeat = repeat;
387 Picture src = XRenderCreatePicture (dpy, pm, format, CPRepeat, &pa);
388 Picture dst = XRenderCreatePicture (dpy, img->pm, img->format, 0, 0);
389
344 XTransform xfrm; 390 XTransform xfrm;
345 391
346 for (int i = 0; i < 3; ++i) 392 for (int i = 0; i < 3; ++i)
347 for (int j = 0; j < 3; ++j) 393 for (int j = 0; j < 3; ++j)
348 xfrm.matrix [i][j] = XDoubleToFixed (matrix [i * 3 + j]); 394 xfrm.matrix [i][j] = XDoubleToFixed (matrix [i * 3 + j]);
349 395
396 XRenderSetPictureFilter (dpy, src, "good", 0, 0);
350 XRenderSetPictureTransform (dpy, src, &xfrm); 397 XRenderSetPictureTransform (dpy, src, &xfrm);
351 XRenderComposite (dpy, PictOpSrc, src, None, dst, 0, 0, 0, 0, 0, 0, new_width, new_height); 398 XRenderComposite (dpy, PictOpSrc, src, None, dst, 0, 0, 0, 0, 0, 0, new_width, new_height);
352 399
353 XRenderFreePicture (dpy, src); 400 XRenderFreePicture (dpy, src);
354 XRenderFreePicture (dpy, dst); 401 XRenderFreePicture (dpy, dst);
358 405
359rxvt_img * 406rxvt_img *
360rxvt_img::scale (int new_width, int new_height) 407rxvt_img::scale (int new_width, int new_height)
361{ 408{
362 double matrix[9] = { 409 double matrix[9] = {
363 new_width / (double)w, 0, 0, 410 w / (double)new_width, 0, 0,
364 0, new_height / (double)h, 0, 411 0, h / (double)new_height, 0,
365 0, 0, 1 412 0, 0, 1
366 }; 413 };
367 414
368 return transform (new_width, new_height, RepeatNormal, matrix); 415 return transform (new_width, new_height, matrix);
416}
417
418rxvt_img *
419rxvt_img::rotate (int new_width, int new_height, int x, int y, double phi, int repeat)
420{
421 double s = sin (phi);
422 double c = cos (phi);
423
424 double matrix[9] = {
425 c, -s, -c * x + s * y + x,
426 s, c, -s * x - c * y + y,
427 0, 0, 1
428 };
429
430 return transform (new_width, new_height, matrix, repeat);
369} 431}
370 432
371rxvt_img * 433rxvt_img *
372rxvt_img::convert_to (XRenderPictFormat *new_format) 434rxvt_img::convert_to (XRenderPictFormat *new_format)
373{ 435{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines