00001
00002
00003
00004
00005 #ifndef BALL_VIEW_RENDERING_RENDERTARGET_H
00006 #define BALL_VIEW_RENDERING_RENDERTARGET_H
00007
00008 #include <BALL/COMMON/global.h>
00009 #include <BALL/COMMON/exception.h>
00010
00011 #include <assert.h>
00012 #include <vector>
00013 #include <boost/smart_ptr.hpp>
00014 #include <boost/shared_array.hpp>
00015
00016 #include <BALL/VIEW/RENDERING/pixelFormat.h>
00017
00018 namespace BALL
00019 {
00020 namespace VIEW
00021 {
00022
00024 struct Resolution
00025 {
00026 unsigned int width;
00027 unsigned int height;
00028
00029 Resolution() : width(0), height(0) { }
00030
00031 Resolution(const unsigned width, const unsigned int height) : width(width),height(height) { }
00032 };
00033
00034
00038 class FrameBufferFormat
00039 {
00040 public:
00041
00043 FrameBufferFormat() :
00044 width(0), height(0), pitch(0), pixelFormat(PixelFormat::RGB_32)
00045 { }
00046
00047 FrameBufferFormat(const unsigned int width,
00048 const unsigned int height, const PixelFormat &pixelFormat)
00049 : width(width), height(height),
00050 pitch(width * pixelFormat.computeByteSize()),
00051 pixelFormat(pixelFormat)
00052 {
00053 assert(pitch >= width * pixelFormat.computeByteSize());
00054 }
00055
00056 FrameBufferFormat(const unsigned int width, const unsigned int height,
00057 const unsigned int pitch, const PixelFormat &pixelFormat )
00058 : width(width), height(height), pitch(pitch), pixelFormat(pixelFormat)
00059 {
00060 assert(pitch >= width * pixelFormat.computeByteSize());
00061 }
00062
00063 FrameBufferFormat(const FrameBufferFormat &format)
00064 : width(format.width), height(format.height),
00065 pitch(format.pitch), pixelFormat(format.pixelFormat)
00066 {
00067 }
00068
00069 const FrameBufferFormat &operator=(const FrameBufferFormat &format)
00070 {
00071 width = format.width;
00072 height = format.height;
00073 pitch = format.pitch;
00074 pixelFormat = format.pixelFormat;
00075 return *this;
00076 }
00077
00078 bool operator==(const FrameBufferFormat& format) const
00079 {
00080 return width==format.width && height==format.height &&
00081 pitch==format.pitch && pixelFormat==format.pixelFormat;
00082 }
00083
00084 bool operator!=(const FrameBufferFormat& format) const
00085 {
00086 return width!=format.width || height!=format.height ||
00087 pitch!=format.pitch || pixelFormat!=format.pixelFormat;
00088 }
00089
00090 bool isValid() const { return width > 0 && height > 0 && pitch > 0; }
00091
00095 unsigned int getWidth() const { return width; }
00096
00100 void setWidth(unsigned int width) { this->width = width; }
00101
00103 unsigned int getHeight() const { return height; }
00104
00106 void setHeight(unsigned int height) { this->height = height; }
00107
00109 unsigned int getPitch() const { return pitch; }
00110
00112 void setPitch(unsigned int pitch) { this->pitch = pitch; }
00113
00115 const PixelFormat &getPixelFormat() const { return pixelFormat; }
00116
00118 void setPixelFormat(const PixelFormat &pixelFormat)
00119 { this->pixelFormat = pixelFormat; }
00120
00124 size_t computeSize() const
00125 {
00126
00127 return isValid() ? (getPitch() * getHeight()) : 0;
00128 }
00129
00131 void resize(const unsigned int newWidth, const unsigned int newHeight)
00132 {
00133 this->width = newWidth;
00134 this->height = newHeight;
00135 }
00136
00140 const FrameBufferFormat resized(const unsigned int newWidth,
00141 const unsigned int newHeight) const
00142 {
00143 return FrameBufferFormat(newWidth, newHeight, pitch, pixelFormat);
00144 }
00145
00146 private:
00148 unsigned int width;
00149
00151 unsigned int height;
00152
00159 unsigned int pitch;
00160
00161 PixelFormat pixelFormat;
00162 };
00163
00164 inline std::ostream &operator<<(std::ostream &o, const FrameBufferFormat &f)
00165 {
00166 o << f.getWidth() << "x" << f.getHeight() << ", pitch " << f.getPitch()
00167 << ", pixel format: " << f.getPixelFormat();
00168 return o;
00169 }
00170
00171 typedef std::vector<FrameBufferFormat> BufferFormatList;
00172
00173
00174
00175 class FrameBuffer
00176 {
00177 public:
00178
00182 FrameBuffer( void* data, const FrameBufferFormat &format ) :
00183 data(data), format(format)
00184 {
00185 }
00186
00190 virtual ~FrameBuffer() {}
00191
00193 void *getData() { return data; }
00194
00196 const void *getData() const { return data; }
00197
00199 const FrameBufferFormat &getFormat() const { return format; }
00200
00201 protected:
00202
00204 void setData(void *data) { this->data = data; }
00205
00207 void setFormat(const FrameBufferFormat &format) { this->format = format; }
00208
00209 private:
00214 void *data;
00215
00219 FrameBufferFormat format;
00220 };
00221
00222 typedef boost::shared_ptr<FrameBuffer> FrameBufferPtr;
00223
00224
00225
00226 class RenderTarget
00227 {
00228 public:
00229
00230 virtual ~RenderTarget() { }
00231
00240 virtual FrameBufferPtr getBuffer() throw(BALL::Exception::NoBufferAvailable) = 0;
00241
00242 virtual FrameBufferFormat getFormat() const = 0;
00243
00250 virtual void releaseBuffer(FrameBufferPtr buffer) = 0;
00251
00254 virtual bool init() = 0;
00255
00258 virtual bool resize(const unsigned int width, const unsigned int height) = 0;
00259
00262 virtual void refresh() = 0;
00263
00264
00265
00266 virtual void prepareRendering() = 0;
00267 };
00268
00269 }
00270
00271 }
00272
00273 #endif // BALL_VIEW_RENDERING_RENDERTARGET_H