| Index: remoting/host/linux/x_server_pixel_buffer.cc
|
| diff --git a/remoting/host/linux/x_server_pixel_buffer.cc b/remoting/host/linux/x_server_pixel_buffer.cc
|
| deleted file mode 100644
|
| index a7949cff9ba628308e420ee6d2b4f2ea04825ab5..0000000000000000000000000000000000000000
|
| --- a/remoting/host/linux/x_server_pixel_buffer.cc
|
| +++ /dev/null
|
| @@ -1,265 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "remoting/host/linux/x_server_pixel_buffer.h"
|
| -
|
| -#include <sys/shm.h>
|
| -
|
| -#include "base/logging.h"
|
| -
|
| -#if defined(TOOLKIT_GTK)
|
| -#include <gdk/gdk.h>
|
| -#else // !defined(TOOLKIT_GTK)
|
| -#include <X11/Xlib.h>
|
| -#endif // !defined(TOOLKIT_GTK)
|
| -
|
| -namespace {
|
| -
|
| -#if defined(TOOLKIT_GTK)
|
| -// GDK sets error handler for Xlib errors, so we need to use it to
|
| -// trap X errors when this code is compiled with GTK.
|
| -void EnableXServerErrorTrap() {
|
| - gdk_error_trap_push();
|
| -}
|
| -
|
| -int GetLastXServerError() {
|
| - return gdk_error_trap_pop();
|
| -}
|
| -
|
| -#else // !defined(TOOLKIT_GTK)
|
| -
|
| -static bool g_xserver_error_trap_enabled = false;
|
| -static int g_last_xserver_error_code = 0;
|
| -
|
| -int XServerErrorHandler(Display* display, XErrorEvent* error_event) {
|
| - DCHECK(g_xserver_error_trap_enabled);
|
| - g_last_xserver_error_code = error_event->error_code;
|
| - return 0;
|
| -}
|
| -
|
| -void EnableXServerErrorTrap() {
|
| - DCHECK(!g_xserver_error_trap_enabled);
|
| - XSetErrorHandler(&XServerErrorHandler);
|
| - g_xserver_error_trap_enabled = true;
|
| - g_last_xserver_error_code = 0;
|
| -}
|
| -
|
| -int GetLastXServerError() {
|
| - DCHECK(g_xserver_error_trap_enabled);
|
| - XSetErrorHandler(NULL);
|
| - g_xserver_error_trap_enabled = false;
|
| - return g_last_xserver_error_code;
|
| -}
|
| -
|
| -#endif // !defined(TOOLKIT_GTK)
|
| -
|
| -} // namespace
|
| -
|
| -namespace remoting {
|
| -
|
| -XServerPixelBuffer::XServerPixelBuffer()
|
| - : display_(NULL), root_window_(0), x_image_(NULL),
|
| - shm_segment_info_(NULL), shm_pixmap_(0), shm_gc_(NULL) {
|
| -}
|
| -
|
| -XServerPixelBuffer::~XServerPixelBuffer() {
|
| - Release();
|
| -}
|
| -
|
| -void XServerPixelBuffer::Release() {
|
| - if (x_image_) {
|
| - XDestroyImage(x_image_);
|
| - x_image_ = NULL;
|
| - }
|
| - if (shm_pixmap_) {
|
| - XFreePixmap(display_, shm_pixmap_);
|
| - shm_pixmap_ = 0;
|
| - }
|
| - if (shm_gc_) {
|
| - XFreeGC(display_, shm_gc_);
|
| - shm_gc_ = NULL;
|
| - }
|
| - if (shm_segment_info_) {
|
| - if (shm_segment_info_->shmaddr != reinterpret_cast<char*>(-1))
|
| - shmdt(shm_segment_info_->shmaddr);
|
| - if (shm_segment_info_->shmid != -1)
|
| - shmctl(shm_segment_info_->shmid, IPC_RMID, 0);
|
| - delete shm_segment_info_;
|
| - shm_segment_info_ = NULL;
|
| - }
|
| -}
|
| -
|
| -void XServerPixelBuffer::Init(Display* display) {
|
| - Release();
|
| - display_ = display;
|
| - int default_screen = DefaultScreen(display_);
|
| - root_window_ = RootWindow(display_, default_screen);
|
| - InitShm(default_screen);
|
| -}
|
| -
|
| -void XServerPixelBuffer::InitShm(int screen) {
|
| - XWindowAttributes root_attr;
|
| - XGetWindowAttributes(display_, root_window_, &root_attr);
|
| - int width = root_attr.width, height = root_attr.height;
|
| - Visual* default_visual = DefaultVisual(display_, screen);
|
| - int default_depth = DefaultDepth(display_, screen);
|
| -
|
| - int major, minor;
|
| - Bool havePixmaps;
|
| - if (!XShmQueryVersion(display_, &major, &minor, &havePixmaps))
|
| - // Shared memory not supported. CaptureRect will use the XImage API instead.
|
| - return;
|
| -
|
| - bool using_shm = false;
|
| - shm_segment_info_ = new XShmSegmentInfo;
|
| - shm_segment_info_->shmid = -1;
|
| - shm_segment_info_->shmaddr = reinterpret_cast<char*>(-1);
|
| - shm_segment_info_->readOnly = False;
|
| - x_image_ = XShmCreateImage(display_, default_visual, default_depth, ZPixmap,
|
| - 0, shm_segment_info_, width, height);
|
| - if (x_image_) {
|
| - shm_segment_info_->shmid = shmget(
|
| - IPC_PRIVATE, x_image_->bytes_per_line * x_image_->height,
|
| - IPC_CREAT | 0600);
|
| - if (shm_segment_info_->shmid != -1) {
|
| - shm_segment_info_->shmaddr = x_image_->data =
|
| - reinterpret_cast<char*>(shmat(shm_segment_info_->shmid, 0, 0));
|
| - if (x_image_->data != reinterpret_cast<char*>(-1)) {
|
| - EnableXServerErrorTrap();
|
| - using_shm = XShmAttach(display_, shm_segment_info_);
|
| - XSync(display_, False);
|
| - if (GetLastXServerError() != 0)
|
| - using_shm = false;
|
| - if (using_shm) {
|
| - VLOG(1) << "Using X shared memory segment "
|
| - << shm_segment_info_->shmid;
|
| - }
|
| - }
|
| - } else {
|
| - LOG(WARNING) << "Failed to get shared memory segment. "
|
| - "Performance may be degraded.";
|
| - }
|
| - }
|
| -
|
| - if (!using_shm) {
|
| - LOG(WARNING) << "Not using shared memory. Performance may be degraded.";
|
| - Release();
|
| - return;
|
| - }
|
| -
|
| - if (havePixmaps)
|
| - havePixmaps = InitPixmaps(width, height, default_depth);
|
| -
|
| - shmctl(shm_segment_info_->shmid, IPC_RMID, 0);
|
| - shm_segment_info_->shmid = -1;
|
| -
|
| - VLOG(1) << "Using X shared memory extension v" << major << "." << minor
|
| - << " with" << (havePixmaps?"":"out") << " pixmaps.";
|
| -}
|
| -
|
| -bool XServerPixelBuffer::InitPixmaps(int width, int height, int depth) {
|
| - if (XShmPixmapFormat(display_) != ZPixmap)
|
| - return false;
|
| -
|
| - EnableXServerErrorTrap();
|
| - shm_pixmap_ = XShmCreatePixmap(display_, root_window_,
|
| - shm_segment_info_->shmaddr,
|
| - shm_segment_info_,
|
| - width, height, depth);
|
| - XSync(display_, False);
|
| - if (GetLastXServerError() != 0) {
|
| - // |shm_pixmap_| is not not valid because the request was not processed
|
| - // by the X Server, so zero it.
|
| - shm_pixmap_ = 0;
|
| - return false;
|
| - }
|
| -
|
| - EnableXServerErrorTrap();
|
| - XGCValues shm_gc_values;
|
| - shm_gc_values.subwindow_mode = IncludeInferiors;
|
| - shm_gc_values.graphics_exposures = False;
|
| - shm_gc_ = XCreateGC(display_, root_window_,
|
| - GCSubwindowMode | GCGraphicsExposures,
|
| - &shm_gc_values);
|
| - XSync(display_, False);
|
| - if (GetLastXServerError() != 0) {
|
| - XFreePixmap(display_, shm_pixmap_);
|
| - shm_pixmap_ = 0;
|
| - shm_gc_ = 0; // See shm_pixmap_ comment above.
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void XServerPixelBuffer::Synchronize() {
|
| - if (shm_segment_info_ && !shm_pixmap_) {
|
| - // XShmGetImage can fail if the display is being reconfigured.
|
| - EnableXServerErrorTrap();
|
| - XShmGetImage(display_, root_window_, x_image_, 0, 0, AllPlanes);
|
| - GetLastXServerError();
|
| - }
|
| -}
|
| -
|
| -uint8* XServerPixelBuffer::CaptureRect(const SkIRect& rect) {
|
| - if (shm_segment_info_) {
|
| - if (shm_pixmap_) {
|
| - XCopyArea(display_, root_window_, shm_pixmap_, shm_gc_,
|
| - rect.fLeft, rect.fTop, rect.width(), rect.height(),
|
| - rect.fLeft, rect.fTop);
|
| - XSync(display_, False);
|
| - }
|
| - return reinterpret_cast<uint8*>(x_image_->data) +
|
| - rect.fTop * x_image_->bytes_per_line +
|
| - rect.fLeft * x_image_->bits_per_pixel / 8;
|
| - } else {
|
| - if (x_image_)
|
| - XDestroyImage(x_image_);
|
| - x_image_ = XGetImage(display_, root_window_, rect.fLeft, rect.fTop,
|
| - rect.width(), rect.height(), AllPlanes, ZPixmap);
|
| - return reinterpret_cast<uint8*>(x_image_->data);
|
| - }
|
| -}
|
| -
|
| -int XServerPixelBuffer::GetStride() const {
|
| - return x_image_->bytes_per_line;
|
| -}
|
| -
|
| -int XServerPixelBuffer::GetDepth() const {
|
| - return x_image_->depth;
|
| -}
|
| -
|
| -int XServerPixelBuffer::GetBitsPerPixel() const {
|
| - return x_image_->bits_per_pixel;
|
| -}
|
| -
|
| -int XServerPixelBuffer::GetRedMask() const {
|
| - return x_image_->red_mask;
|
| -}
|
| -
|
| -int XServerPixelBuffer::GetBlueMask() const {
|
| - return x_image_->blue_mask;
|
| -}
|
| -
|
| -int XServerPixelBuffer::GetGreenMask() const {
|
| - return x_image_->green_mask;
|
| -}
|
| -
|
| -int XServerPixelBuffer::GetRedShift() const {
|
| - return ffs(x_image_->red_mask) - 1;
|
| -}
|
| -
|
| -int XServerPixelBuffer::GetBlueShift() const {
|
| - return ffs(x_image_->blue_mask) - 1;
|
| -}
|
| -
|
| -int XServerPixelBuffer::GetGreenShift() const {
|
| - return ffs(x_image_->green_mask) - 1;
|
| -}
|
| -
|
| -bool XServerPixelBuffer::IsRgb() const {
|
| - return GetRedShift() == 16 && GetGreenShift() == 8 && GetBlueShift() == 0;
|
| -}
|
| -
|
| -} // namespace remoting
|
|
|