diff options
Diffstat (limited to 'common/rfb/PixelBuffer.h')
-rw-r--r-- | common/rfb/PixelBuffer.h | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/common/rfb/PixelBuffer.h b/common/rfb/PixelBuffer.h new file mode 100644 index 00000000..4a13923c --- /dev/null +++ b/common/rfb/PixelBuffer.h @@ -0,0 +1,172 @@ +/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +// -=- PixelBuffer.h +// +// The PixelBuffer class encapsulates the PixelFormat and dimensions +// of a block of pixel data. + +#ifndef __RFB_PIXEL_BUFFER_H__ +#define __RFB_PIXEL_BUFFER_H__ + +#include <rfb/ImageGetter.h> +#include <rfb/PixelFormat.h> +#include <rfb/ColourMap.h> +#include <rfb/Rect.h> +#include <rfb/Pixel.h> + +namespace rfb { + + class Region; + + class PixelBuffer : public ImageGetter { + public: + PixelBuffer(const PixelFormat& pf, int width, int height, ColourMap* cm); + virtual ~PixelBuffer(); + + /////////////////////////////////////////////// + // Format / Layout + // + + // Set/get pixel format & colourmap + virtual void setPF(const PixelFormat &pf); + virtual const PixelFormat &getPF() const; + virtual ColourMap* getColourMap() const; + + // Get width, height and number of pixels + int width() const { return width_; } + int height() const { return height_; } + int area() const { return width_ * height_; } + + // Get rectangle encompassing this buffer + // Top-left of rectangle is either at (0,0), or the specified point. + Rect getRect() const { return Rect(0, 0, width_, height_); } + Rect getRect(const Point& pos) const { + return Rect(pos, pos.translate(Point(width_, height_))); + } + + /////////////////////////////////////////////// + // Access to pixel data + // + + // Get a pointer into the buffer + // The pointer is to the top-left pixel of the specified Rect. + // The buffer stride (in pixels) is returned. + virtual const rdr::U8* getPixelsR(const Rect& r, int* stride) = 0; + + // Get pixel data for a given part of the buffer + // Data is copied into the supplied buffer, with the specified + // stride. + virtual void getImage(void* imageBuf, const Rect& r, int stride=0); + + // Get the data at (x,y) as a Pixel. + // VERY INEFFICIENT!!! + // *** Pixel getPixel(const Point& p); + + /////////////////////////////////////////////// + // Framebuffer update methods + // + + // Ensure that the specified rectangle of buffer is up to date. + // Overridden by derived classes implementing framebuffer access + // to copy the required display data into place. + virtual void grabRegion(const Region& region) {} + + protected: + PixelBuffer(); + PixelFormat format; + int width_, height_; + ColourMap* colourmap; + }; + + // FullFramePixelBuffer + + class FullFramePixelBuffer : public PixelBuffer { + public: + FullFramePixelBuffer(const PixelFormat& pf, int width, int height, + rdr::U8* data_, ColourMap* cm); + virtual ~FullFramePixelBuffer(); + + // - Get the number of pixels per row in the actual pixel buffer data area + // This may in some cases NOT be the same as width(). + virtual int getStride() const; + + // Get a pointer to specified pixel data + virtual rdr::U8* getPixelsRW(const Rect& r, int* stride); + virtual const rdr::U8* getPixelsR(const Rect& r, int* stride) { + return getPixelsRW(r, stride); + } + + /////////////////////////////////////////////// + // Basic rendering operations + // These operations DO NOT clip to the pixelbuffer area, or trap overruns. + + // Fill a rectangle + virtual void fillRect(const Rect &dest, Pixel pix); + + // Copy pixel data to the buffer + virtual void imageRect(const Rect &dest, const void* pixels, int stride=0); + + // Copy pixel data from one PixelBuffer location to another + virtual void copyRect(const Rect &dest, const Point &move_by_delta); + + // Copy pixel data to the buffer through a mask + // pixels is a pointer to the pixel to be copied to r.tl. + // maskPos specifies the pixel offset in the mask to start from. + // mask_ is a pointer to the mask bits at (0,0). + // pStride and mStride are the strides of the pixel and mask buffers. + virtual void maskRect(const Rect& r, const void* pixels, const void* mask_); + + // pixel is the Pixel value to be used where mask_ is set + virtual void maskRect(const Rect& r, Pixel pixel, const void* mask_); + + // *** Should this be visible? + rdr::U8* data; + + protected: + FullFramePixelBuffer(); + }; + + // -=- Managed pixel buffer class + // Automatically allocates enough space for the specified format & area + + class ManagedPixelBuffer : public FullFramePixelBuffer { + public: + ManagedPixelBuffer(); + ManagedPixelBuffer(const PixelFormat& pf, int width, int height); + virtual ~ManagedPixelBuffer(); + + // Manage the pixel buffer layout + virtual void setPF(const PixelFormat &pf); + virtual void setSize(int w, int h); + + // Assign a colour map to the buffer + virtual void setColourMap(ColourMap* cm, bool own_cm); + + // Return the total number of bytes of pixel data in the buffer + int dataLen() const { return width_ * height_ * (format.bpp/8); } + + protected: + unsigned long datasize; + bool own_colourmap; + void checkDataSize(); + }; + +}; + +#endif // __RFB_PIXEL_BUFFER_H__ |