git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2571 3789f03b-4d11-0410-bbf8-ca57d06f2519tags/v0.0.90
XPixelBuffer::XPixelBuffer(Display *dpy, Image* image, | XPixelBuffer::XPixelBuffer(Display *dpy, Image* image, | ||||
int offsetLeft, int offsetTop, | int offsetLeft, int offsetTop, | ||||
const PixelFormat& pf, ColourMap* cm) | |||||
: FullFramePixelBuffer(pf, image->xim->width, image->xim->height, | |||||
(rdr::U8 *)image->xim->data, cm), | |||||
ColourMap* cm) | |||||
: FullFramePixelBuffer(), | |||||
m_dpy(dpy), | m_dpy(dpy), | ||||
m_image(image), | m_image(image), | ||||
m_offsetLeft(offsetLeft), | m_offsetLeft(offsetLeft), | ||||
m_offsetTop(offsetTop), | m_offsetTop(offsetTop), | ||||
m_stride(image->xim->bytes_per_line * 8 / image->xim->bits_per_pixel) | m_stride(image->xim->bytes_per_line * 8 / image->xim->bits_per_pixel) | ||||
{ | { | ||||
// Get initial screen image. | |||||
// 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; | |||||
// Set up the remaining data of the parent class. | |||||
width_ = image->xim->width; | |||||
height_ = image->xim->height; | |||||
data = (rdr::U8 *)image->xim->data; | |||||
colourmap = cm; | |||||
// Get initial screen image from the X display. | |||||
m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop); | m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop); | ||||
} | } | ||||
public: | public: | ||||
XPixelBuffer(Display *dpy, Image* image, | XPixelBuffer(Display *dpy, Image* image, | ||||
int offsetLeft, int offsetTop, | int offsetLeft, int offsetTop, | ||||
const PixelFormat& pf, ColourMap* cm); | |||||
ColourMap* cm); | |||||
virtual ~XPixelBuffer(); | virtual ~XPixelBuffer(); | ||||
// We allow public access to the underlying Image object. | // We allow public access to the underlying Image object. |
image = factory.newImage(dpy, geometry->width(), geometry->height()); | image = factory.newImage(dpy, geometry->width(), geometry->height()); | ||||
vlog.info("Allocated %s", image->classDesc()); | vlog.info("Allocated %s", image->classDesc()); | ||||
pf.bpp = image->xim->bits_per_pixel; | |||||
pf.depth = image->xim->depth; | |||||
pf.bigEndian = (image->xim->byte_order == MSBFirst); | |||||
pf.trueColour = image->isTrueColor(); | |||||
pf.redShift = ffs(image->xim->red_mask) - 1; | |||||
pf.greenShift = ffs(image->xim->green_mask) - 1; | |||||
pf.blueShift = ffs(image->xim->blue_mask) - 1; | |||||
pf.redMax = image->xim->red_mask >> pf.redShift; | |||||
pf.greenMax = image->xim->green_mask >> pf.greenShift; | |||||
pf.blueMax = image->xim->blue_mask >> pf.blueShift; | |||||
// Provide pixel buffer to the server object. | // Provide pixel buffer to the server object. | ||||
pb = new XPixelBuffer(dpy, image, | pb = new XPixelBuffer(dpy, image, | ||||
geometry->offsetLeft(), geometry->offsetTop(), | geometry->offsetLeft(), geometry->offsetTop(), | ||||
pf, this); | |||||
this); | |||||
server = vs; | server = vs; | ||||
server->setPixelBuffer(pb); | server->setPixelBuffer(pb); | ||||
protected: | protected: | ||||
Display* dpy; | Display* dpy; | ||||
Geometry* geometry; | Geometry* geometry; | ||||
PixelFormat pf; | |||||
XPixelBuffer* pb; | XPixelBuffer* pb; | ||||
VNCServer* server; | VNCServer* server; | ||||
Image* image; | Image* image; |