From c5ac899aac8937f6c4a1fd3243560c33839bc36d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Mon, 21 Jul 2008 12:31:27 +0000 Subject: [PATCH] * Refactor the method that actually copies rectangles from the back buffer to the front buffer so that derived classes could override it. * Minor coding style changes. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26542 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/drawing/HWInterface.cpp | 38 +++++++++++++++---------- src/servers/app/drawing/HWInterface.h | 12 +++++--- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/servers/app/drawing/HWInterface.cpp b/src/servers/app/drawing/HWInterface.cpp index ab0bc387a7..1a6e5946f1 100644 --- a/src/servers/app/drawing/HWInterface.cpp +++ b/src/servers/app/drawing/HWInterface.cpp @@ -336,20 +336,11 @@ HWInterface::CopyBackToFront(const BRect& frame) // make sure we don't copy out of bounds area = bufferClip & area; - uint32 srcBPR = backBuffer->BytesPerRow(); - uint8* src = (uint8*)backBuffer->Bits(); - BRegion region((BRect)area); if (IsDoubleBuffered()) region.Exclude((clipping_rect)_CursorFrame()); - - int32 count = region.CountRects(); - for (int32 i = 0; i < count; i++) { - clipping_rect r = region.RectAtInt(i); - // offset to left top pixel in source buffer (always B_RGBA32) - uint8* srcOffset = src + r.top * srcBPR + r.left * 4; - _CopyToFront(srcOffset, srcBPR, r.left, r.top, r.right, r.bottom); - } + + CopyBackToFront(region); _DrawCursor(area); @@ -359,6 +350,24 @@ HWInterface::CopyBackToFront(const BRect& frame) } +void +HWInterface::CopyBackToFront(/*const*/ BRegion& region) +{ + RenderingBuffer* backBuffer = BackBuffer(); + + uint32 srcBPR = backBuffer->BytesPerRow(); + uint8* src = (uint8*)backBuffer->Bits(); + + int32 count = region.CountRects(); + for (int32 i = 0; i < count; i++) { + clipping_rect r = region.RectAtInt(i); + // offset to left top pixel in source buffer (always B_RGBA32) + uint8* srcOffset = src + r.top * srcBPR + r.left * 4; + _CopyToFront(srcOffset, srcBPR, r.left, r.top, r.right, r.bottom); + } +} + + // #pragma mark - @@ -609,9 +618,8 @@ HWInterface::_DrawCursor(IntRect area) const // * location in front buffer is calculated // * conversion from B_RGBA32 to format of front buffer is taken care of void -HWInterface::_CopyToFront(uint8* src, uint32 srcBPR, - int32 x, int32 y, - int32 right, int32 bottom) const +HWInterface::_CopyToFront(uint8* src, uint32 srcBPR, int32 x, int32 y, + int32 right, int32 bottom) const { RenderingBuffer* frontBuffer = FrontBuffer(); @@ -727,7 +735,7 @@ HWInterface::_CopyToFront(uint8* src, uint32 srcBPR, case B_GRAY8: if (frontBuffer->Width() > dstBPR) { // VGA 16 color grayscale planar mode - if (fVGADevice > 0) { + if (fVGADevice >= 0) { vga_planar_blit_args args; args.source = src; args.source_bytes_per_row = srcBPR; diff --git a/src/servers/app/drawing/HWInterface.h b/src/servers/app/drawing/HWInterface.h index 73660e6615..816aabcabf 100644 --- a/src/servers/app/drawing/HWInterface.h +++ b/src/servers/app/drawing/HWInterface.h @@ -125,10 +125,10 @@ class HWInterface : protected MultiLocker { virtual status_t GetOverlayRestrictions(const Overlay* overlay, overlay_restrictions* restrictions); - virtual bool CheckOverlayRestrictions(int32 width, int32 height, - color_space colorSpace); - virtual const overlay_buffer* AllocateOverlayBuffer(int32 width, int32 height, - color_space space); + virtual bool CheckOverlayRestrictions(int32 width, + int32 height, color_space colorSpace); + virtual const overlay_buffer* AllocateOverlayBuffer(int32 width, + int32 height, color_space space); virtual void FreeOverlayBuffer(const overlay_buffer* buffer); virtual void ConfigureOverlay(Overlay* overlay); @@ -146,6 +146,10 @@ class HWInterface : protected MultiLocker { // while as CopyBackToFront() actually performs the operation status_t CopyBackToFront(const BRect& frame); +protected: + virtual void CopyBackToFront(/*const*/ BRegion& region); + +public: // TODO: Just a quick and primitive way to get single buffered mode working. // Later, the implementation should be smarter, right now, it will // draw the cursor for almost every drawing operation.