summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--rfb_win32/ScaledDIBSectionBuffer.cxx82
-rw-r--r--rfb_win32/ScaledDIBSectionBuffer.h19
2 files changed, 89 insertions, 12 deletions
diff --git a/rfb_win32/ScaledDIBSectionBuffer.cxx b/rfb_win32/ScaledDIBSectionBuffer.cxx
index 5b6f248c..e6c15b8e 100644
--- a/rfb_win32/ScaledDIBSectionBuffer.cxx
+++ b/rfb_win32/ScaledDIBSectionBuffer.cxx
@@ -29,27 +29,46 @@ using namespace rfb;
using namespace win32;
ScaledDIBSectionBuffer::ScaledDIBSectionBuffer(HWND window)
- : DIBSectionBuffer(window) {
+ : src_buffer(0), scaling(false), DIBSectionBuffer(window) {
scaled_data = data;
}
-void ScaledDIBSectionBuffer::setSrcPixelBuffer(U8 **src_data_, int w, int h, PixelFormat pf) {
- src_data = src_data_;
- src_width = w;
- src_height = h;
- scaled_width = width_ = (int)ceil(src_width * scale_ratio);
- scaled_height = height_ = (int)ceil(src_height * scale_ratio);
- setPF(pf);
+ScaledDIBSectionBuffer::~ScaledDIBSectionBuffer() {
+ if (src_buffer) delete src_buffer;
+}
+
+void ScaledDIBSectionBuffer::setScale(int scale_) {
+ if (scale_ == getScale()) return;
+
+ if (src_buffer) {
+ delete src_buffer;
+ src_buffer = 0;
+ }
+ if (scale_ != 100) {
+ scaling = true;
+ src_buffer = new ManagedPixelBuffer(format, src_width, src_height);
+ src_data = &(src_buffer->data);
+ } else {
+ scaling = false;
+ }
+ ScaledPixelBuffer::setScale(scale_);
}
void ScaledDIBSectionBuffer::setPF(const PixelFormat &pf) {
+ if (scaling) src_buffer->setPF(pf);
DIBSectionBuffer::setPF(pf);
+ scaled_data = data;
}
void ScaledDIBSectionBuffer::setSize(int src_width_, int src_height_) {
src_width = src_width_;
src_height = src_height_;
- setScale(scale_ratio * 100);
+ if (scaling) {
+ src_buffer->setSize(src_width, src_height);
+ }
+ calculateScaledBufferSize();
+ recreateScaledBuffer();
+ scaled_data = data;
}
void ScaledDIBSectionBuffer::recreateScaledBuffer() {
@@ -58,3 +77,48 @@ void ScaledDIBSectionBuffer::recreateScaledBuffer() {
DIBSectionBuffer::recreateBuffer();
scaled_data = data;
}
+
+void ScaledDIBSectionBuffer::fillRect(const Rect &dest, Pixel pix) {
+ if (scaling) {
+ src_buffer->fillRect(dest, pix);
+ scaleRect(dest);
+ } else {
+ DIBSectionBuffer::fillRect(dest, pix);
+ }
+}
+
+void ScaledDIBSectionBuffer::imageRect(const Rect &dest, const void* pixels, int stride) {
+ if (scaling) {
+ src_buffer->imageRect(dest, pixels, stride);
+ scaleRect(dest);
+ } else {
+ DIBSectionBuffer::imageRect(dest, pixels, stride);
+ }
+}
+
+void ScaledDIBSectionBuffer::copyRect(const Rect &dest, const Point &move_by_delta) {
+ if (scaling) {
+ src_buffer->copyRect(dest, move_by_delta);
+ scaleRect(dest);
+ } else {
+ DIBSectionBuffer::copyRect(dest, move_by_delta);
+ }
+}
+
+void ScaledDIBSectionBuffer::maskRect(const Rect& r, const void* pixels, const void* mask_) {
+ if (scaling) {
+ src_buffer->maskRect(r, pixels, mask_);
+ scaleRect(r);
+ } else {
+ DIBSectionBuffer::maskRect(r, pixels, mask_);
+ }
+}
+
+void ScaledDIBSectionBuffer::maskRect(const Rect& r, Pixel pixel, const void* mask_) {
+ if (scaling) {
+ src_buffer->maskRect(r, pixel, mask_);
+ scaleRect(r);
+ } else {
+ DIBSectionBuffer::maskRect(r, pixel, mask_);
+ }
+}
diff --git a/rfb_win32/ScaledDIBSectionBuffer.h b/rfb_win32/ScaledDIBSectionBuffer.h
index c0dd5868..3cc267b2 100644
--- a/rfb_win32/ScaledDIBSectionBuffer.h
+++ b/rfb_win32/ScaledDIBSectionBuffer.h
@@ -36,18 +36,30 @@ namespace rfb {
// -=- ScaledDIBSectionBuffer
//
- class ScaledDIBSectionBuffer : public ScaledPixelBuffer, DIBSectionBuffer {
+ class ScaledDIBSectionBuffer : public ScaledPixelBuffer, public DIBSectionBuffer {
public:
ScaledDIBSectionBuffer(HWND window);
- virtual ~ScaledDIBSectionBuffer() {};
+ virtual ~ScaledDIBSectionBuffer();
int width() const { return scaled_width; }
int height() const { return scaled_height; }
bool isScaling() const { return scaling; }
- virtual void setSrcPixelBuffer(U8 **src_data, int w, int h, PixelFormat pf=PixelFormat());
virtual void setPF(const PixelFormat &pf);
virtual void setSize(int w, int h);
+ virtual void setScale(int scale);
+
+ Rect getRect() const { return ScaledPixelBuffer::getRect(); }
+ Rect getRect(const Point& pos) const { return ScaledPixelBuffer::getRect(pos); }
+
+ // -=- Overrides basic rendering operations of
+ // FullFramePixelBuffer class
+
+ virtual void fillRect(const Rect &dest, Pixel pix);
+ virtual void imageRect(const Rect &dest, const void* pixels, int stride=0);
+ virtual void copyRect(const Rect &dest, const Point &move_by_delta);
+ virtual void maskRect(const Rect& r, const void* pixels, const void* mask_);
+ virtual void maskRect(const Rect& r, Pixel pixel, const void* mask_);
protected:
virtual void recreateScaledBuffer();
@@ -55,6 +67,7 @@ namespace rfb {
recreateScaledBuffer();
};
+ ManagedPixelBuffer *src_buffer;
bool scaling;
};