diff --git a/headers/private/servers/app/DrawingEngine.h b/headers/private/servers/app/DrawingEngine.h index aa90f4f8fe..48dc29b814 100644 --- a/headers/private/servers/app/DrawingEngine.h +++ b/headers/private/servers/app/DrawingEngine.h @@ -59,7 +59,8 @@ public: // for screen shots bool DumpToFile(const char *path); ServerBitmap* DumpToBitmap(); - + status_t ReadBitmap(ServerBitmap *bitmap, bool drawCursor, + BRect bounds); // clipping for all drawing functions, passing a NULL region // will remove any clipping (drawing allowed everywhere) diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index 4b067bc7f6..469f5dd26e 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -2439,8 +2439,11 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) ServerBitmap *bitmap = FindBitmap(bitmapToken); if (bitmap != NULL) { - fLink.StartMessage(B_OK); - // TODO: Implement for real + if (fDesktop->GetDrawingEngine()->ReadBitmap(bitmap, + drawCursor, bounds) == B_OK) { + fLink.StartMessage(B_OK); + } else + fLink.StartMessage(B_BAD_VALUE); } else fLink.StartMessage(B_BAD_VALUE); diff --git a/src/servers/app/drawing/DrawingEngine.cpp b/src/servers/app/drawing/DrawingEngine.cpp index 75110af139..d4ac81a325 100644 --- a/src/servers/app/drawing/DrawingEngine.cpp +++ b/src/servers/app/drawing/DrawingEngine.cpp @@ -16,6 +16,7 @@ #include "DrawState.h" #include "Painter.h" #include "PNGDump.h" +#include "ServerBitmap.h" #include "RenderingBuffer.h" #include "frame_buffer_support.h" @@ -1135,6 +1136,39 @@ DrawingEngine::DumpToBitmap() return NULL; } +status_t +DrawingEngine::ReadBitmap(ServerBitmap *bitmap, bool drawCursor, BRect bounds) +{ + if (Lock()) { + RenderingBuffer *buffer = fGraphicsCard->DrawingBuffer(); + if (!buffer) + return B_ERROR; + + BRect clip(0, 0, buffer->Width() - 1, buffer->Height() - 1); + bounds = bounds & clip; + + uint32 width = (bounds.IntegerWidth() + 1) * 4; + uint32 height = bounds.IntegerHeight() + 1; + uint32 srcBytesPerRow = buffer->BytesPerRow(); + uint32 dstBytesPerRow = bitmap->BytesPerRow(); + uint8 *dst = (uint8 *)bitmap->Bits(); + uint8 *src = (uint8 *)buffer->Bits(); + src += (uint32)bounds.top * srcBytesPerRow + (uint32)bounds.left * 4; + + /* ToDo: handle color conversion */ + for (uint32 i = 0; i < height; i++) { + memcpy(dst, src, width); + dst += dstBytesPerRow; + src += srcBytesPerRow; + } + + Unlock(); + return B_OK; + } + + return B_ERROR; +} + // #pragma mark - BRect