diff options
-rw-r--r-- | unix/x0vncserver/XPixelBuffer.cxx | 40 | ||||
-rw-r--r-- | unix/x0vncserver/XPixelBuffer.h | 6 | ||||
-rw-r--r-- | unix/x0vncserver/x0vncserver.cxx | 15 |
3 files changed, 35 insertions, 26 deletions
diff --git a/unix/x0vncserver/XPixelBuffer.cxx b/unix/x0vncserver/XPixelBuffer.cxx index 164c7042..7e515b25 100644 --- a/unix/x0vncserver/XPixelBuffer.cxx +++ b/unix/x0vncserver/XPixelBuffer.cxx @@ -27,40 +27,48 @@ using namespace rfb; -XPixelBuffer::XPixelBuffer(Display *dpy, Image* image, +XPixelBuffer::XPixelBuffer(Display *dpy, ImageFactory &factory, int offsetLeft, int offsetTop, + int width, int height, ColourMap* cm) : FullFramePixelBuffer(), m_dpy(dpy), - m_image(image), + m_image(0), m_offsetLeft(offsetLeft), m_offsetTop(offsetTop), - m_stride(image->xim->bytes_per_line * 8 / image->xim->bits_per_pixel) + m_stride(0) { + m_image = factory.newImage(dpy, width, height); + // Fill in the PixelFormat structure of the parent class. - format.bpp = image->xim->bits_per_pixel; - format.depth = image->xim->depth; - format.bigEndian = (image->xim->byte_order == MSBFirst); - format.trueColour = image->isTrueColor(); - format.redShift = ffs(image->xim->red_mask) - 1; - format.greenShift = ffs(image->xim->green_mask) - 1; - format.blueShift = ffs(image->xim->blue_mask) - 1; - format.redMax = image->xim->red_mask >> format.redShift; - format.greenMax = image->xim->green_mask >> format.greenShift; - format.blueMax = image->xim->blue_mask >> format.blueShift; + format.bpp = m_image->xim->bits_per_pixel; + format.depth = m_image->xim->depth; + format.bigEndian = (m_image->xim->byte_order == MSBFirst); + format.trueColour = m_image->isTrueColor(); + format.redShift = ffs(m_image->xim->red_mask) - 1; + format.greenShift = ffs(m_image->xim->green_mask) - 1; + format.blueShift = ffs(m_image->xim->blue_mask) - 1; + format.redMax = m_image->xim->red_mask >> format.redShift; + format.greenMax = m_image->xim->green_mask >> format.greenShift; + format.blueMax = m_image->xim->blue_mask >> format.blueShift; // Set up the remaining data of the parent class. - width_ = image->xim->width; - height_ = image->xim->height; - data = (rdr::U8 *)image->xim->data; + width_ = width; + height_ = height; + data = (rdr::U8 *)m_image->xim->data; colourmap = cm; + // Calculate the distance in pixels between two subsequent scan + // lines of the framebuffer. + m_stride = m_image->xim->bytes_per_line * 8 / m_image->xim->bits_per_pixel; + // Get initial screen image from the X display. m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop); } XPixelBuffer::~XPixelBuffer() { + delete m_image; } void diff --git a/unix/x0vncserver/XPixelBuffer.h b/unix/x0vncserver/XPixelBuffer.h index 75cd552d..7829038c 100644 --- a/unix/x0vncserver/XPixelBuffer.h +++ b/unix/x0vncserver/XPixelBuffer.h @@ -35,8 +35,9 @@ using namespace rfb; class XPixelBuffer : public FullFramePixelBuffer { public: - XPixelBuffer(Display *dpy, Image* image, + XPixelBuffer(Display *dpy, ImageFactory &factory, int offsetLeft, int offsetTop, + int width, int height, ColourMap* cm); virtual ~XPixelBuffer(); @@ -46,9 +47,10 @@ public: // Or better do not allow public access at all. virtual Image *getImage() const { return m_image; } + // Override PixelBuffer::getStride(). virtual int getStride() const { return m_stride; } - // Override PixelBuffer's function. + // Override PixelBuffer::grabRegion(). virtual void grabRegion(const rfb::Region& region); protected: diff --git a/unix/x0vncserver/x0vncserver.cxx b/unix/x0vncserver/x0vncserver.cxx index 9331cf56..f2ff4306 100644 --- a/unix/x0vncserver/x0vncserver.cxx +++ b/unix/x0vncserver/x0vncserver.cxx @@ -138,7 +138,7 @@ class XDesktop : public SDesktop, public ColourMap { public: XDesktop(Display* dpy_, Geometry *geometry_) - : dpy(dpy_), geometry(geometry_), pb(0), server(0), image(0), pollmgr(0), + : dpy(dpy_), geometry(geometry_), pb(0), server(0), pollmgr(0), oldButtonMask(0), haveXtest(false), maxButtons(0), running(false) { #ifdef HAVE_XTEST @@ -175,15 +175,17 @@ public: vlog.info("Enabling %d button%s of X pointer device", maxButtons, (maxButtons != 1) ? "s" : ""); - // Create an image for maintaining framebuffer data. + // Create an ImageFactory instance for producing Image objects. ImageFactory factory((bool)useShm, (bool)useOverlay); - image = factory.newImage(dpy, geometry->width(), geometry->height()); - vlog.info("Allocated %s", image->classDesc()); // Provide pixel buffer to the server object. - pb = new XPixelBuffer(dpy, image, + // FIXME: Pass coordinates in a structure? + pb = new XPixelBuffer(dpy, factory, geometry->offsetLeft(), geometry->offsetTop(), + geometry->width(), geometry->height(), this); + vlog.info("Allocated %s", pb->getImage()->classDesc()); + server = vs; server->setPixelBuffer(pb); @@ -199,11 +201,9 @@ public: delete pb; delete pollmgr; - delete image; pb = 0; pollmgr = 0; - image = 0; } inline bool isRunning() { @@ -273,7 +273,6 @@ protected: Geometry* geometry; XPixelBuffer* pb; VNCServer* server; - Image* image; PollingManager* pollmgr; int oldButtonMask; bool haveXtest; |