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

Side by Side Diff: webrtc/modules/desktop_capture/x11/x_server_pixel_buffer.cc

Issue 2044693002: Fixed partially out of screen window capture in unix (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 6 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
« no previous file with comments | « webrtc/modules/desktop_capture/x11/x_server_pixel_buffer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 return image->bits_per_pixel == 32 && 52 return image->bits_per_pixel == 32 &&
53 image->red_mask == 0xff0000 && 53 image->red_mask == 0xff0000 &&
54 image->green_mask == 0xff00 && 54 image->green_mask == 0xff00 &&
55 image->blue_mask == 0xff; 55 image->blue_mask == 0xff;
56 } 56 }
57 57
58 } // namespace 58 } // namespace
59 59
60 namespace webrtc { 60 namespace webrtc {
61 61
62 XServerPixelBuffer::XServerPixelBuffer() 62 XServerPixelBuffer::XServerPixelBuffer() {}
63 : display_(NULL), window_(0),
64 x_image_(NULL),
65 shm_segment_info_(NULL), shm_pixmap_(0), shm_gc_(NULL) {
66 }
67 63
68 XServerPixelBuffer::~XServerPixelBuffer() { 64 XServerPixelBuffer::~XServerPixelBuffer() {
69 Release(); 65 Release();
70 } 66 }
71 67
72 void XServerPixelBuffer::Release() { 68 void XServerPixelBuffer::Release() {
73 if (x_image_) { 69 if (x_image_) {
74 XDestroyImage(x_image_); 70 XDestroyImage(x_image_);
75 x_image_ = NULL; 71 x_image_ = NULL;
76 } 72 }
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 return false; 218 return false;
223 } 219 }
224 } 220 }
225 return true; 221 return true;
226 } 222 }
227 223
228 void XServerPixelBuffer::Synchronize() { 224 void XServerPixelBuffer::Synchronize() {
229 if (shm_segment_info_ && !shm_pixmap_) { 225 if (shm_segment_info_ && !shm_pixmap_) {
230 // XShmGetImage can fail if the display is being reconfigured. 226 // XShmGetImage can fail if the display is being reconfigured.
231 XErrorTrap error_trap(display_); 227 XErrorTrap error_trap(display_);
232 XShmGetImage(display_, window_, x_image_, 0, 0, AllPlanes); 228 // XShmGetImage will return false if the window is partially out of screen.
Sergey Ulanov 2016/06/10 23:35:58 s/will return false/fails/
229 xshm_get_image_succeeded_ =
230 XShmGetImage(display_, window_, x_image_, 0, 0, AllPlanes);
233 } 231 }
234 } 232 }
235 233
236 void XServerPixelBuffer::CaptureRect(const DesktopRect& rect, 234 void XServerPixelBuffer::CaptureRect(const DesktopRect& rect,
237 DesktopFrame* frame) { 235 DesktopFrame* frame) {
238 assert(rect.right() <= window_size_.width()); 236 assert(rect.right() <= window_size_.width());
239 assert(rect.bottom() <= window_size_.height()); 237 assert(rect.bottom() <= window_size_.height());
240 238
241 uint8_t* data; 239 uint8_t* data;
242 240
243 if (shm_segment_info_) { 241 if (shm_segment_info_ && (shm_pixmap_ || xshm_get_image_succeeded_)) {
244 if (shm_pixmap_) { 242 if (shm_pixmap_) {
245 XCopyArea(display_, window_, shm_pixmap_, shm_gc_, 243 XCopyArea(display_, window_, shm_pixmap_, shm_gc_,
246 rect.left(), rect.top(), rect.width(), rect.height(), 244 rect.left(), rect.top(), rect.width(), rect.height(),
247 rect.left(), rect.top()); 245 rect.left(), rect.top());
248 XSync(display_, False); 246 XSync(display_, False);
249 } 247 }
250 data = reinterpret_cast<uint8_t*>(x_image_->data) + 248 data = reinterpret_cast<uint8_t*>(x_image_->data) +
251 rect.top() * x_image_->bytes_per_line + 249 rect.top() * x_image_->bytes_per_line +
252 rect.left() * x_image_->bits_per_pixel / 8; 250 rect.left() * x_image_->bits_per_pixel / 8;
253 } else { 251 } else {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 // Write as 32-bit RGB. 326 // Write as 32-bit RGB.
329 dst_pos_32[x] = ((r >> 8) & 0xff0000) | ((g >> 16) & 0xff00) | 327 dst_pos_32[x] = ((r >> 8) & 0xff0000) | ((g >> 16) & 0xff00) |
330 ((b >> 24) & 0xff); 328 ((b >> 24) & 0xff);
331 } 329 }
332 dst_pos += frame->stride(); 330 dst_pos += frame->stride();
333 src_pos += src_stride; 331 src_pos += src_stride;
334 } 332 }
335 } 333 }
336 334
337 } // namespace webrtc 335 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/desktop_capture/x11/x_server_pixel_buffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698