Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Side by Side Diff: x11/real_x_connection.cc

Issue 6793005: Add the xrender backend to the window manager. (Closed) Base URL: ssh://gitrw.chromium.org:9222/window_manager.git@master
Patch Set: Address first round of comments. Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "window_manager/x11/real_x_connection.h" 5 #include "window_manager/x11/real_x_connection.h"
6 6
7 extern "C" { 7 extern "C" {
8 #include <xcb/composite.h> 8 #include <xcb/composite.h>
9 #include <xcb/damage.h> 9 #include <xcb/damage.h>
10 #include <xcb/randr.h> 10 #include <xcb/randr.h>
11 #include <xcb/shape.h> 11 #include <xcb/shape.h>
12 #include <xcb/sync.h> 12 #include <xcb/sync.h>
13 #include <xcb/xfixes.h> 13 #include <xcb/xfixes.h>
14 #include <X11/extensions/shape.h> 14 #include <X11/extensions/shape.h>
15 #include <X11/extensions/sync.h> 15 #include <X11/extensions/sync.h>
16 #include <X11/extensions/Xcomposite.h> 16 #include <X11/extensions/Xcomposite.h>
17 #include <X11/extensions/Xdamage.h> 17 #include <X11/extensions/Xdamage.h>
18 #include <X11/extensions/Xrender.h>
18 #include <X11/Xatom.h> 19 #include <X11/Xatom.h>
19 #include <X11/Xlib-xcb.h> 20 #include <X11/Xlib-xcb.h>
20 #include <X11/Xutil.h> 21 #include <X11/Xutil.h>
21 #include <X11/XKBlib.h> 22 #include <X11/XKBlib.h>
22 } 23 }
23 24
24 #include "base/string_util.h" 25 #include "base/string_util.h"
25 #include "window_manager/geometry.h" 26 #include "window_manager/geometry.h"
26 #include "window_manager/util.h" 27 #include "window_manager/util.h"
27 #include "window_manager/x11/x_connection_internal.h" 28 #include "window_manager/x11/x_connection_internal.h"
(...skipping 1309 matching lines...) Expand 10 before | Expand all | Expand 10 after
1337 xcb_query_pointer_reply(xcb_conn_, cookie, &error)); 1338 xcb_query_pointer_reply(xcb_conn_, cookie, &error));
1338 scoped_ptr_malloc<xcb_generic_error_t> scoped_error(error); 1339 scoped_ptr_malloc<xcb_generic_error_t> scoped_error(error);
1339 if (error || !reply.get()) { 1340 if (error || !reply.get()) {
1340 LOG(WARNING) << "Querying pointer position failed"; 1341 LOG(WARNING) << "Querying pointer position failed";
1341 return false; 1342 return false;
1342 } 1343 }
1343 absolute_pos_out->reset(reply->root_x, reply->root_y); 1344 absolute_pos_out->reset(reply->root_x, reply->root_y);
1344 return true; 1345 return true;
1345 } 1346 }
1346 1347
1348 bool RealXConnection::RenderQueryExtension() {
1349 int render_event, render_error;
1350 return XRenderQueryExtension(display_, &render_event, &render_error);
1351 }
1352
1353 XPicture RealXConnection::RenderCreatePicture(XDrawable drawable, int depth) {
1354 XRenderPictFormat *format;
1355 XRenderPictureAttributes pa;
1356
1357 format = XRenderFindStandardFormat(
1358 display_,
1359 depth == 24 ? PictStandardRGB24 : PictStandardARGB32);
1360 pa.repeat = True;
1361 XPicture r = XRenderCreatePicture(display_, drawable, format, CPRepeat, &pa);
1362 return r;
1363 }
1364
1365 XPixmap RealXConnection::CreatePixmapFromContainer(
1366 const ImageContainer* container) {
Daniel Erat 2011/04/04 21:16:35 nit: make this be a reference instead of a pointer
marcheu 2011/04/05 00:23:40 Done.
1367 Size size = container->GetSize();
1368 int data_size = size.width * size.height * 4;
1369
1370 // XDestroyImage will free() this.
1371 char* pixmap_data = static_cast<char*>(malloc(data_size));
1372
1373 // Premultiply the RGB channels.
1374 memcpy(pixmap_data, container->data(), data_size);
1375 for (int i = 0; i < size.width * size.height; i++) {
1376 pixmap_data[i*4+0] = pixmap_data[i*4+0] * pixmap_data[i*4+3] / 255;
1377 pixmap_data[i*4+1] = pixmap_data[i*4+1] * pixmap_data[i*4+3] / 255;
1378 pixmap_data[i*4+2] = pixmap_data[i*4+2] * pixmap_data[i*4+3] / 255;
1379 }
1380
1381 XPixmap pixmap = XCreatePixmap(display_, root_, size.width, size.height, 32);
1382
1383 XImage* image = XCreateImage(
1384 display_,
1385 DefaultVisual(display_, DefaultScreen(display_)),
1386 32, // depth
1387 ZPixmap,
1388 0, // offset
1389 pixmap_data,
1390 size.width, size.height,
1391 32, // bitmap_pad
1392 0); // bytes_per_line
1393
1394 GC gc = XCreateGC(display_, pixmap, 0, NULL);
1395 if (!gc) {
1396 XDestroyImage(image);
1397 XFreePixmap(display_, pixmap);
1398 return None;
1399 }
1400
1401 XPutImage(display_,
1402 pixmap,
1403 gc,
1404 image,
1405 0, 0, // src x,y
1406 0, 0, // dst x,y
1407 size.width, size.height);
1408 XDestroyImage(image);
1409
1410 XFreeGC(display_, gc);
1411
1412 return pixmap;
1413 }
1414
1415 void RealXConnection::RenderComposite(bool blend, XPicture src, XPicture mask,
1416 XPicture dst, Point srcpos, Point maskpos,
Daniel Erat 2011/04/04 21:16:35 use const references for non-POD types, and use se
marcheu 2011/04/05 00:23:40 Done.
1417 Matrix4 transform, Size size) {
1418 Point dstpos(transform[3][0], transform[3][1]);
1419
1420 // Don't use transform/filtering all the time,
1421 // there are performance implications in doing so.
1422 if ((size.width != transform[0][0]) || (size.height != transform[1][1])) {
Daniel Erat 2011/04/04 21:16:35 might be simpler as this (may require static_casts
marcheu 2011/04/05 00:23:40 Done.
1423 XTransform xform = {{{XDoubleToFixed(size.width/float(transform[0][0])),
1424 XDoubleToFixed(transform[1][0]),
1425 XDoubleToFixed(transform[2][0])},
1426 {XDoubleToFixed(transform[0][1]),
1427 XDoubleToFixed(size.height/float(transform[1][1])),
1428 XDoubleToFixed(transform[2][1])},
1429 {XDoubleToFixed(0.0),
1430 XDoubleToFixed(0.0),
1431 XDoubleToFixed(1.0)}}};
1432 XRenderSetPictureTransform(display_, src, &xform);
1433 XRenderSetPictureFilter(display_, src, FilterBilinear, 0, 0);
1434 }
1435
1436 int op = blend ? PictOpOver : PictOpSrc;
1437 XRenderComposite(display_,
1438 op,
1439 src,
1440 mask,
1441 dst,
1442 int(srcpos.x), (int)(srcpos.y),
Daniel Erat 2011/04/04 21:16:35 nit: use static_cast (also, you're mixing int() an
marcheu 2011/04/05 00:23:40 Done.
1443 int(maskpos.x), int(maskpos.y),
1444 int(dstpos.x), (int)(dstpos.y),
1445 int(transform[0][0]), int(transform[1][1]));
1446 }
1447
1448 void RealXConnection::RenderFreePicture(XPicture pict) {
1449 XRenderFreePicture(display_, pict);
1450 }
1451
1452 void RealXConnection::RenderFillRectangle(XPicture dst,
1453 float red,
1454 float green,
1455 float blue,
1456 Point pos,
Daniel Erat 2011/04/04 21:16:35 const Point&, const Size&
marcheu 2011/04/05 00:23:40 Done.
1457 Size size) {
1458 XRenderColor c;
1459
1460 c.red = red * 0xffff;
1461 c.green = green * 0xffff;
1462 c.blue = blue * 0xffff;
1463 c.alpha = 0xffff;
1464 XRenderFillRectangle(display_,
1465 PictOpSrc,
1466 dst,
1467 &c,
1468 pos.x, pos.y,
1469 size.width, size.height);
1470 }
1471
1347 void RealXConnection::Free(void* item) { 1472 void RealXConnection::Free(void* item) {
1348 XFree(item); 1473 XFree(item);
1349 } 1474 }
1350 1475
1351 XVisualInfo* RealXConnection::GetVisualInfo(long mask, 1476 XVisualInfo* RealXConnection::GetVisualInfo(long mask,
1352 XVisualInfo* visual_template, 1477 XVisualInfo* visual_template,
1353 int* item_count) { 1478 int* item_count) {
1354 return XGetVisualInfo(display_, mask, visual_template, item_count); 1479 return XGetVisualInfo(display_, mask, visual_template, item_count);
1355 } 1480 }
1356 1481
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
1510 string message; 1635 string message;
1511 StringAppendV(&message, format, ap); 1636 StringAppendV(&message, format, ap);
1512 va_end(ap); 1637 va_end(ap);
1513 1638
1514 LOG(WARNING) << "Got XCB error while " << message << ": " 1639 LOG(WARNING) << "Got XCB error while " << message << ": "
1515 << GetErrorText(error->error_code); 1640 << GetErrorText(error->error_code);
1516 return false; 1641 return false;
1517 } 1642 }
1518 1643
1519 } // namespace window_manager 1644 } // namespace window_manager
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698