Chromium Code Reviews| Index: x11/real_x_connection.cc |
| diff --git a/x11/real_x_connection.cc b/x11/real_x_connection.cc |
| index 1155e242d586765ba732649e43b577e2825a9393..70fe17c174dd98f56b8c351fc2c016358839f556 100644 |
| --- a/x11/real_x_connection.cc |
| +++ b/x11/real_x_connection.cc |
| @@ -15,6 +15,7 @@ extern "C" { |
| #include <X11/extensions/sync.h> |
| #include <X11/extensions/Xcomposite.h> |
| #include <X11/extensions/Xdamage.h> |
| +#include <X11/extensions/Xrender.h> |
| #include <X11/Xatom.h> |
| #include <X11/Xlib-xcb.h> |
| #include <X11/Xutil.h> |
| @@ -1344,6 +1345,114 @@ bool RealXConnection::QueryPointerPosition(Point* absolute_pos_out) { |
| return true; |
| } |
| +bool RealXConnection::RenderQueryExtension() { |
| + int render_event, render_error; |
| + if (!XRenderQueryExtension (display_, &render_event, &render_error)) |
|
Daniel Erat
2011/04/02 14:54:36
why not do "return XRenderQueryExtension(...)"?
marcheu
2011/04/04 19:55:58
Done.
|
| + return false; |
| + return true; |
| +} |
| + |
| +XPicture RealXConnection::RenderCreatePicture(XDrawable drawable, int depth) { |
| + XRenderPictFormat *format; |
| + XRenderPictureAttributes pa; |
| + |
| + format = XRenderFindStandardFormat(display_, |
|
Daniel Erat
2011/04/02 14:54:36
nit: move 'display_' to the beginning of the next
marcheu
2011/04/04 19:55:58
Done.
|
| + depth == 24 ? PictStandardRGB24 : PictStandardARGB32); |
| + pa.repeat = True; |
| + XPicture r = XRenderCreatePicture(display_, drawable, format, CPRepeat, &pa); |
| + return r; |
| +} |
| + |
| +XPixmap RealXConnection::CreatePixmapFromData(char* data, const Size& size) { |
|
Daniel Erat
2011/04/02 14:54:36
see other comment about using ImageContainer inste
marcheu
2011/04/04 19:55:58
Done.
|
| + int data_size = size.width * size.height * 4; |
| + char* pixmap_data = (char*)malloc(data_size); |
|
Daniel Erat
2011/04/02 14:54:36
use static_cast
marcheu
2011/04/02 23:31:38
Note to self: add a comment that XDestroyImage wil
marcheu
2011/04/04 19:55:58
Done.
|
| + |
| + /* premultiply the RGB channels */ |
| + memcpy(pixmap_data, data, data_size); |
| + for(int i = 0; i<size.width * size.height; i++) { |
|
Daniel Erat
2011/04/02 14:54:36
add space between for and ( and around <
marcheu
2011/04/04 19:55:58
Done.
|
| + pixmap_data[i*4+0] = pixmap_data[i*4+0] * pixmap_data[i*4+3] / 255; |
| + pixmap_data[i*4+1] = pixmap_data[i*4+1] * pixmap_data[i*4+3] / 255; |
| + pixmap_data[i*4+2] = pixmap_data[i*4+2] * pixmap_data[i*4+3] / 255; |
| + } |
| + |
| + XPixmap pixmap = XCreatePixmap(display_, root_, size.width, size.height, 32); |
| + |
| + XImage* image = XCreateImage (display_, |
| + DefaultVisual(display_, DefaultScreen(display_)), |
|
Daniel Erat
2011/04/02 14:54:36
fix indenting
marcheu
2011/04/04 19:55:58
Done.
|
| + 32, |
|
Daniel Erat
2011/04/02 14:54:36
nit: mind labeling the ambiguous arguments with tr
marcheu
2011/04/04 19:55:58
Done.
|
| + ZPixmap, |
| + 0, |
| + pixmap_data, |
| + size.width, size.height, |
| + 32, 0); |
| + |
| + GC gc = XCreateGC (display_, pixmap, 0, NULL); |
|
Daniel Erat
2011/04/02 14:54:36
remove space
marcheu
2011/04/04 19:55:58
Done.
|
| + if (!gc) { |
| + XDestroyImage (image); |
|
Daniel Erat
2011/04/02 14:54:36
remove space
marcheu
2011/04/04 19:55:58
Done.
|
| + XFreePixmap (display_, pixmap); |
|
Daniel Erat
2011/04/02 14:54:36
remove space
marcheu
2011/04/04 19:55:58
Done.
|
| + return None; |
| + } |
| + |
| + XPutImage (display_, pixmap, gc, image, 0, 0, 0, 0, size.width, size.height); |
|
Daniel Erat
2011/04/02 14:54:36
ditto
marcheu
2011/04/04 19:55:58
Done.
|
| + XDestroyImage(image); |
| + |
| + XFreeGC (display_, gc); |
| + |
| + return pixmap; |
| +} |
| + |
| +void RealXConnection::RenderComposite(bool blend, XPicture src, XPicture mask, |
| + XPicture dst, Point srcpos, Point maskpos, Matrix4 transform, Size size) |
|
Daniel Erat
2011/04/02 14:54:36
fix indenting
marcheu
2011/04/04 19:55:58
Done.
|
| +{ |
|
Daniel Erat
2011/04/02 14:54:36
move to end of previous line
marcheu
2011/04/04 19:55:58
Done.
|
| + XTransform xform = {{ |
| + { XDoubleToFixed( size.width/(float)transform[0][0] ), |
|
Daniel Erat
2011/04/02 14:54:36
fix indenting/spacing/casts
marcheu
2011/04/04 19:55:58
Tried to do something about it, not sure exactly h
|
| + XDoubleToFixed( transform[1][0] ), |
| + XDoubleToFixed( transform[2][0] ) }, |
| + { XDoubleToFixed( transform[0][1] ), |
| + XDoubleToFixed( size.height/(float)transform[1][1] ), |
| + XDoubleToFixed( transform[2][1] ) }, |
| + { XDoubleToFixed( 0.0 ), |
| + XDoubleToFixed( 0.0 ), |
| + XDoubleToFixed( 1.0 ) } |
| + }}; |
| + Point dstpos(transform[3][0], transform[3][1]); |
| + |
| + // Don't use transform/filtering all the time, |
| + // there are performance implications in doing so. |
| + if ( (size.width != transform[0][0]) || (size.height != transform[1][1] ) ) { |
|
Daniel Erat
2011/04/02 14:54:36
remove extra spaces here and below
marcheu
2011/04/04 19:55:58
Done.
|
| + XRenderSetPictureTransform( display_, src, &xform ); |
| + XRenderSetPictureFilter( display_, src, FilterBilinear, 0, 0 ); |
| + } |
| + |
| + int op = blend ? PictOpOver : PictOpSrc; |
| + XRenderComposite(display_, op, src, mask, dst, |
| + (int)srcpos.x, (int)srcpos.y, (int)maskpos.x, (int)maskpos.y, |
|
Daniel Erat
2011/04/02 14:54:36
c++ casts, and group related params together on li
marcheu
2011/04/04 19:55:58
Done.
|
| + (int)dstpos.x, (int)dstpos.y, |
| + (int)transform[0][0], (int)transform[1][1]); |
| +} |
| + |
| +void RealXConnection::RenderFreePicture(XPicture pict) |
| +{ |
|
Daniel Erat
2011/04/02 14:54:36
...
marcheu
2011/04/04 19:55:58
Done.
|
| + XRenderFreePicture(display_, pict); |
| +} |
| + |
| +void RealXConnection::RenderFillRectangle(XPicture dst, |
| + float red, |
| + float green, |
| + float blue, |
| + Point pos, |
| + Size size) |
| +{ |
|
Daniel Erat
2011/04/02 14:54:36
...
marcheu
2011/04/04 19:55:58
Done.
|
| + XRenderColor c; |
| + |
| + c.red = red * 0xffff; |
| + c.green = green * 0xffff; |
| + c.blue = blue * 0xffff; |
| + c.alpha = 0xffff; |
| + XRenderFillRectangle(display_, PictOpSrc, dst, &c, |
| + pos.x, pos.y, size.width, size.height); |
| +} |
| + |
| void RealXConnection::Free(void* item) { |
| XFree(item); |
| } |