From 429ea9689b1793cee77ea3e9fa23ed6a53d8c7e6 Mon Sep 17 00:00:00 2001 From: Constantin Kaplinsky Date: Mon, 2 Jun 2008 11:56:57 +0000 Subject: [PATCH] Grabbing the screen moved from PollingManager to XPixelBuffer. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2568 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- unix/x0vncserver/PollingManager.cxx | 4 ---- unix/x0vncserver/PollingManager.h | 12 +----------- unix/x0vncserver/XPixelBuffer.cxx | 11 ++++++++++- unix/x0vncserver/XPixelBuffer.h | 8 ++++++++ 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/unix/x0vncserver/PollingManager.cxx b/unix/x0vncserver/PollingManager.cxx index 71b5d660..9a9f28af 100644 --- a/unix/x0vncserver/PollingManager.cxx +++ b/unix/x0vncserver/PollingManager.cxx @@ -64,9 +64,6 @@ PollingManager::PollingManager(Display *dpy, XPixelBuffer *buffer, ((buffer->height() + 31) / 32)), m_pollingStep(0) { - // Get initial screen image. - m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop); - // Create additional images used in polling algorithm, warn if // underlying class names are different from the class name of the // primary image. @@ -290,7 +287,6 @@ int PollingManager::sendChanges() if (rect.br.y > m_height) rect.br.y = m_height; // Add to the changed region maintained by the server. - getScreenRect(rect); m_server->add_changed(rect); // Skip processed tiles. x += count; diff --git a/unix/x0vncserver/PollingManager.h b/unix/x0vncserver/PollingManager.h index 015b3ca6..97a158fa 100644 --- a/unix/x0vncserver/PollingManager.h +++ b/unix/x0vncserver/PollingManager.h @@ -64,7 +64,7 @@ protected: Display *m_dpy; VNCServer *m_server; - Image *m_image; + const Image *m_image; const int m_bytesPerPixel; const int m_offsetLeft; @@ -74,16 +74,6 @@ protected: private: - inline void getScreen() { - m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop); - } - - inline void getScreenRect(const Rect& r) { - m_image->get(DefaultRootWindow(m_dpy), - m_offsetLeft + r.tl.x, m_offsetTop + r.tl.y, - r.width(), r.height(), r.tl.x, r.tl.y); - } - inline void getRow(int x, int y, int w) { if (w == m_width) { // Getting full row may be more efficient. diff --git a/unix/x0vncserver/XPixelBuffer.cxx b/unix/x0vncserver/XPixelBuffer.cxx index 78ac5588..2692c18a 100644 --- a/unix/x0vncserver/XPixelBuffer.cxx +++ b/unix/x0vncserver/XPixelBuffer.cxx @@ -20,6 +20,8 @@ // XPixelBuffer.cxx // +#include +#include #include #include @@ -36,6 +38,8 @@ XPixelBuffer::XPixelBuffer(Display *dpy, Image* image, m_offsetTop(offsetTop), m_stride(image->xim->bytes_per_line * 8 / image->xim->bits_per_pixel) { + // Get initial screen image. + m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop); } XPixelBuffer::~XPixelBuffer() @@ -45,6 +49,11 @@ XPixelBuffer::~XPixelBuffer() void XPixelBuffer::grabRegion(const rfb::Region& region) { - // m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop); + std::vector rects; + std::vector::const_iterator i; + region.get_rects(&rects); + for (i = rects.begin(); i != rects.end(); i++) { + grabRect(*i); + } } diff --git a/unix/x0vncserver/XPixelBuffer.h b/unix/x0vncserver/XPixelBuffer.h index 2f84245e..b909bb8a 100644 --- a/unix/x0vncserver/XPixelBuffer.h +++ b/unix/x0vncserver/XPixelBuffer.h @@ -59,6 +59,14 @@ protected: // The number of pixels in a row, with padding included. int m_stride; + + // Copy pixels from the screen to the pixel buffer, + // for the specified rectangular area of the buffer. + inline void grabRect(const Rect &r) { + m_image->get(DefaultRootWindow(m_dpy), + m_offsetLeft + r.tl.x, m_offsetTop + r.tl.y, + r.width(), r.height(), r.tl.x, r.tl.y); + } }; #endif // __XPIXELBUFFER_H__ -- 2.39.5