From 9e7c0e5d014514c3d35fc7bf3d1fcce7975db3d0 Mon Sep 17 00:00:00 2001 From: DarkWyrm Date: Thu, 12 Feb 2004 01:25:41 +0000 Subject: [PATCH] Removed unnecessary methods in ServerScreen and DisplayDriver Bugfixes - cursor now works under new DisplayDriver cursor management Currently still searching for a clipping bug in ViewDriver::CopyToBitmap git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6563 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/server/AppServer.cpp | 6 +- src/servers/app/server/BitmapDriver.cpp | 7 +- src/servers/app/server/DisplayDriver.cpp | 71 ++---------- src/servers/app/server/ServerScreen.cpp | 31 +++--- src/servers/app/server/ServerScreen.h | 38 +++---- src/servers/app/server/ViewDriver.cpp | 134 +++++------------------ src/servers/app/server/ViewDriver.h | 1 - 7 files changed, 75 insertions(+), 213 deletions(-) diff --git a/src/servers/app/server/AppServer.cpp b/src/servers/app/server/AppServer.cpp index 27a1091730..ec64be2d76 100644 --- a/src/servers/app/server/AppServer.cpp +++ b/src/servers/app/server/AppServer.cpp @@ -673,11 +673,7 @@ void AppServer::DispatchMessage(PortMessage *msg) PortLink replylink(replyport); replylink.SetOpCode(AS_GET_SCREEN_MODE); - replylink.Attach(dmode.virtual_width); - replylink.Attach(dmode.virtual_height); - - // Eventually, GetDepth() will get replaced - replylink.Attach(fDriver->GetDepth()); + replylink.Attach(dmode); replylink.Flush(); break; } diff --git a/src/servers/app/server/BitmapDriver.cpp b/src/servers/app/server/BitmapDriver.cpp index 0277ee1029..3b4293cdb2 100644 --- a/src/servers/app/server/BitmapDriver.cpp +++ b/src/servers/app/server/BitmapDriver.cpp @@ -97,10 +97,9 @@ void BitmapDriver::SetTarget(ServerBitmap *target) if(target) { - _buffer_depth=target->Width(); - _buffer_height=target->Height(); - _buffer_depth=target->BitsPerPixel(); - _bytes_per_row=target->BytesPerRow(); + _displaymode.virtual_width=target->Width(); + _displaymode.virtual_height=target->Height(); + _displaymode.space=target->ColorSpace(); // Setting mode not necessary. Can get color space stuff via ServerBitmap->ColorSpace } diff --git a/src/servers/app/server/DisplayDriver.cpp b/src/servers/app/server/DisplayDriver.cpp index 6fb94867ce..1f54efdbc8 100644 --- a/src/servers/app/server/DisplayDriver.cpp +++ b/src/servers/app/server/DisplayDriver.cpp @@ -242,14 +242,10 @@ DisplayDriver::DisplayDriver(void) { _locker=new BLocker(); - _buffer_depth=0; - _buffer_width=0; - _buffer_height=0; - _buffer_mode=-1; - _is_cursor_hidden=false; _is_cursor_obscured=false; _cursor=NULL; + _cursorsave=NULL; _dpms_caps=B_DPMS_ON; _dpms_state=B_DPMS_ON; } @@ -1354,7 +1350,7 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, DisplayDriver* dri } if (segmentArray[i].MinY() == segmentArray[i].MaxY()) { - if ( (segmentArray[i].MinX() < _buffer_width) && + if ( (segmentArray[i].MinX() < _displaymode.virtual_width) && (segmentArray[i].MaxX() >= 0) ) (driver->*setLine)(ROUND(segmentArray[i].MinX()), ROUND(segmentArray[i].MaxX()), y); @@ -1362,7 +1358,7 @@ void DisplayDriver::FillPolygon(BPoint *ptlist, int32 numpts, DisplayDriver* dri } else { - if ( (segmentArray[i].GetX(y) < _buffer_width) && + if ( (segmentArray[i].GetX(y) < _displaymode.virtual_width) && (segmentArray[i+1].GetX(y) >= 0) ) (driver->*setLine)(ROUND(segmentArray[i].GetX(y)), ROUND(segmentArray[i+1].GetX(y)), y); @@ -1598,12 +1594,7 @@ void DisplayDriver::HideCursor(void) _is_cursor_hidden=true; if(_cursorsave) - { CopyBitmap(_cursorsave,_cursorsave->Bounds(),cursorframe, &_drawdata); - - delete _cursorsave; - _cursorsave=NULL; - } Unlock(); } @@ -1654,15 +1645,18 @@ void DisplayDriver::MoveCursorTo(const float &x, const float &y) return; } -// if(!_cursorsave) -// _cursorsave=new ServerBitmap(_cursor); - + if(!_cursorsave) + _cursorsave=new UtilityBitmap(_cursor->Bounds(),(color_space)_displaymode.space,0); + + _drawdata.draw_mode=B_OP_COPY; CopyBitmap(_cursorsave,_cursor->Bounds(),saveframe,&_drawdata); CopyToBitmap(_cursorsave,cursorframe); saveframe=cursorframe; + _drawdata.draw_mode=B_OP_ALPHA; CopyBitmap(_cursor,_cursor->Bounds(),cursorframe,&_drawdata); + _drawdata.draw_mode=B_OP_COPY; Unlock(); } @@ -1719,12 +1713,7 @@ void DisplayDriver::ObscureCursor(void) _is_cursor_obscured=true; if(_cursorsave) - { CopyBitmap(_cursorsave,_cursorsave->Bounds(),cursorframe, &_drawdata); - - delete _cursorsave; - _cursorsave=NULL; - } Unlock(); @@ -1753,8 +1742,6 @@ void DisplayDriver::SetCursor(ServerCursor *cursor) if(visible) CopyBitmap(_cursorsave,_cursorsave->Bounds(),cursorframe, &_drawdata); delete _cursor; - delete _cursorsave; - _cursorsave=NULL; } _cursor=new ServerCursor(cursor); @@ -1768,7 +1755,9 @@ void DisplayDriver::SetCursor(ServerCursor *cursor) if(visible) { CopyToBitmap(_cursorsave, cursorframe); + _drawdata.draw_mode=B_OP_ALPHA; CopyBitmap(_cursor, _cursor->Bounds(), cursorframe, &_drawdata); + _drawdata.draw_mode=B_OP_COPY; } Unlock(); @@ -2313,17 +2302,6 @@ void DisplayDriver::StrokeLineArray(BPoint *pts, const int32 &numlines, const Dr { } -/*! - \brief Sets the screen mode to specified resolution and color depth. - \param mode constant as defined in GraphicsDefs.h - - Subclasses must include calls to _SetDepth, _SetHeight, _SetWidth, and _SetMode - to update the state variables kept internally by the DisplayDriver class. -*/ -void DisplayDriver::SetMode(const int32 &mode) -{ -} - /* \brief Sets the screen mode to specified resolution and color depth. \param mode Data structure as defined in Screen.h @@ -2476,33 +2454,6 @@ void DisplayDriver::GetTruncatedStrings(const char **instrings,const int32 &stri { } -/*! - \brief Returns the bit depth for the current screen mode - \return Current number of bits per pixel -*/ -uint8 DisplayDriver::GetDepth(void) -{ - return _buffer_depth; -} - -/*! - \brief Returns the number of bytes used in each row of the frame buffer - \return The number of bytes used in each row of the frame buffer -*/ -uint32 DisplayDriver::GetBytesPerRow(void) -{ - return _bytes_per_row; -} - -/*! - \brief Returns the screen mode constant in use by the driver - \return Current screen mode -*/ -int32 DisplayDriver::GetMode(void) -{ - return _buffer_mode; -} - /*! \brief Returns whether or not the cursor is currently obscured \return True if obscured, false if not. diff --git a/src/servers/app/server/ServerScreen.cpp b/src/servers/app/server/ServerScreen.cpp index 175a33d9d8..0ffba0a6e0 100644 --- a/src/servers/app/server/ServerScreen.cpp +++ b/src/servers/app/server/ServerScreen.cpp @@ -32,27 +32,20 @@ #include "ServerScreen.h" #include "DisplayDriver.h" -Screen::Screen(DisplayDriver *dDriver, BPoint res, uint32 colorspace, - const int32 &ID) +Screen::Screen(DisplayDriver *dDriver, BPoint res, uint32 colorspace, const int32 &ID) { fID = ID; fDDriver = dDriver; SetResolution(res, colorspace); } -Screen::~Screen(void){ +Screen::~Screen(void) +{ //printf("~Screen( %ld )\n", fID); } -void Screen::SetColorSpace(const uint32 &colorspace){ -// fDDriver->SetColorSpace(colorspace); -} - -uint32 Screen::ColorSpace(void) const{ -// return fDDriver->ColorSpace(); -} - -bool Screen::SupportsResolution(BPoint res, uint32 colorspace){ +bool Screen::SupportsResolution(BPoint res, uint32 colorspace) +{ // TODO: remove/improve return true; display_mode *dm = NULL; @@ -60,7 +53,8 @@ bool Screen::SupportsResolution(BPoint res, uint32 colorspace){ fDDriver->GetModeList(&dm, &count); - for (uint32 i=0; i < count; i++){ + for (uint32 i=0; i < count; i++) + { if (dm[i].virtual_width == (uint16)res.x && dm[i].virtual_height == (uint16)res.y && dm[i].space == colorspace) @@ -71,7 +65,8 @@ bool Screen::SupportsResolution(BPoint res, uint32 colorspace){ return false; } -bool Screen::SetResolution(BPoint res, uint32 colorspace){ +bool Screen::SetResolution(BPoint res, uint32 colorspace) +{ if (!SupportsResolution(res, colorspace)) return false; @@ -81,12 +76,13 @@ bool Screen::SetResolution(BPoint res, uint32 colorspace){ mode.virtual_height = (uint16)res.y; mode.space = colorspace; -// fDDriver->SetMode(&mode); + fDDriver->SetMode(mode); return true; } -BPoint Screen::Resolution() const{ +BPoint Screen::Resolution() const +{ display_mode mode; fDDriver->GetMode(&mode); @@ -94,7 +90,8 @@ BPoint Screen::Resolution() const{ return BPoint(mode.virtual_width, mode.virtual_height); } -int32 Screen::ScreenNumber(void) const{ +int32 Screen::ScreenNumber(void) const +{ return fID; } diff --git a/src/servers/app/server/ServerScreen.h b/src/servers/app/server/ServerScreen.h index 1e13270a9a..3fb152e3f2 100644 --- a/src/servers/app/server/ServerScreen.h +++ b/src/servers/app/server/ServerScreen.h @@ -28,35 +28,29 @@ #define _SCREEN_H_ #include -//#include "DisplayDriver.h" class DisplayDriver; -class Screen{ +class Screen +{ public: - Screen(DisplayDriver *dDriver, BPoint res, - uint32 colorspace, const int32 &ID); - Screen(){ ; } - ~Screen(void); - - void SetColorSpace(const uint32 &colorspace); - uint32 ColorSpace(void) const; - - void SetID(int32 ID){ fID = ID; } + Screen(DisplayDriver *dDriver, BPoint res, uint32 colorspace, const int32 &ID); + Screen(){ ; } + ~Screen(void); + + void SetID(int32 ID){ fID = ID; } // TODO: get/set prototype methods for graphic card features - bool SupportsResolution(BPoint res, uint32 colorspace); - bool SetResolution(BPoint res, uint32 colorspace); - BPoint Resolution() const; - - int32 ScreenNumber(void) const; - DisplayDriver* DDriver() const { return fDDriver; } + bool SupportsResolution(BPoint res, uint32 colorspace); + bool SetResolution(BPoint res, uint32 colorspace); + BPoint Resolution() const; + + int32 ScreenNumber(void) const; + DisplayDriver* DDriver() const { return fDDriver; } private: - - // TODO: members in witch we should store data. - - int32 fID; - DisplayDriver *fDDriver; + // TODO: members in which we should store data. + int32 fID; + DisplayDriver *fDDriver; }; #endif diff --git a/src/servers/app/server/ViewDriver.cpp b/src/servers/app/server/ViewDriver.cpp index 8d197637a0..9e94a0106a 100644 --- a/src/servers/app/server/ViewDriver.cpp +++ b/src/servers/app/server/ViewDriver.cpp @@ -79,7 +79,7 @@ VDView::VDView(BRect bounds) : BView(bounds,"viewdriver_view",B_FOLLOW_ALL, B_WILL_DRAW) { SetViewColor(B_TRANSPARENT_32_BIT); - viewbmp=new BBitmap(bounds,B_CMAP8,true); + viewbmp=new BBitmap(bounds,B_RGBA32,true); // This link for sending mouse messages to the OBAppServer. // This is only to take the place of the Input Server. @@ -416,7 +416,7 @@ void VDWindow::MessageReceived(BMessage *msg) view->serverlink->Flush(); break; } - case VDWIN_SHOWCURSOR: +/* case VDWIN_SHOWCURSOR: { if(view->hide_cursor>0) view->hide_cursor--; @@ -487,7 +487,7 @@ void VDWindow::MessageReceived(BMessage *msg) } break; } - default: +*/ default: BWindow::MessageReceived(msg); break; } @@ -537,12 +537,10 @@ ViewDriver::ViewDriver(void) framebuffer=screenwin->view->viewbmp; serverlink=screenwin->view->serverlink; hide_cursor=0; - - _buffer_width=640; - _buffer_height=480; - _buffer_depth=8; - _buffer_mode=B_8_BIT_640x480; - _bytes_per_row=framebuffer->BytesPerRow(); + + _displaymode.virtual_width=640; + _displaymode.virtual_height=480; + _displaymode.space=B_RGBA32; // We add this because if we see the default workspace color, then we have at least // a reasonable idea that everything is kosher. @@ -611,12 +609,7 @@ void ViewDriver::SetMode(const display_mode &mode) } delete framebuffer; - - // don't forget to update the internal vars! - _buffer_width=mode.virtual_width; - _buffer_height=mode.virtual_height; - _buffer_mode=mode.space; - + screenwin->view->viewbmp=tempbmp; framebuffer=screenwin->view->viewbmp; drawview=new BView(framebuffer->Bounds(),"drawview",B_FOLLOW_ALL, B_WILL_DRAW); @@ -628,86 +621,6 @@ void ViewDriver::SetMode(const display_mode &mode) drawview->Sync(); framebuffer->Unlock(); - _bytes_per_row=framebuffer->BytesPerRow(); - screenwin->view->Invalidate(); - screenwin->Unlock(); -} - -void ViewDriver::SetMode(const int32 &space) -{ - if(!is_initialized) - return; - - screenwin->Lock(); - int16 w=640,h=480; - color_space s=B_CMAP8; - - switch(space) - { - case B_32_BIT_800x600: - case B_16_BIT_800x600: - case B_8_BIT_800x600: - { - w=800; h=600; - break; - } - case B_32_BIT_1024x768: - case B_16_BIT_1024x768: - case B_8_BIT_1024x768: - { - w=1024; h=768; - break; - } - default: - break; - } - screenwin->ResizeTo(w-1,h-1); - - switch(space) - { - case B_32_BIT_640x480: - case B_32_BIT_800x600: - case B_32_BIT_1024x768: - s=B_RGBA32; - _buffer_depth=32; - break; - case B_16_BIT_640x480: - case B_16_BIT_800x600: - case B_16_BIT_1024x768: - s=B_RGBA15; - _buffer_depth=15; - break; - case B_8_BIT_640x480: - case B_8_BIT_800x600: - case B_8_BIT_1024x768: - s=B_CMAP8; - _buffer_depth=8; - break; - default: - _buffer_depth=8; - break; - } - - - delete framebuffer; - - // don't forget to update the internal vars! - _buffer_width=w; - _buffer_height=h; - _buffer_mode=space; - - screenwin->view->viewbmp=new BBitmap(BRect(0,0,w-1,h-1),s,true); - framebuffer=screenwin->view->viewbmp; - drawview=new BView(framebuffer->Bounds(),"drawview",B_FOLLOW_ALL, B_WILL_DRAW); - framebuffer->AddChild(drawview); - - framebuffer->Lock(); - drawview->SetHighColor(workspace_default_color.GetColor32()); - drawview->FillRect(drawview->Bounds()); - drawview->Sync(); - framebuffer->Unlock(); - - _bytes_per_row=framebuffer->BytesPerRow(); screenwin->view->Invalidate(); screenwin->Unlock(); } @@ -1759,7 +1672,10 @@ status_t ViewDriver::WaitForRetrace(bigtime_t timeout=B_INFINITE_TIMEOUT) void ViewDriver::CopyBitmap(ServerBitmap *bitmap, const BRect &source, const BRect &dest, const DrawData *d) { if(!is_initialized || !bitmap || !d) + { + printf("CopyBitmap returned - not init or NULL bitmap\n"); return; + } SetDrawData(d); @@ -1775,6 +1691,8 @@ void ViewDriver::CopyBitmap(ServerBitmap *bitmap, const BRect &source, const BRe framebuffer->Lock(); drawview->DrawBitmap(mediator,source,dest); + drawview->Sync(); + screenwin->view->Invalidate(dest); framebuffer->Unlock(); screenwin->Unlock(); @@ -1783,11 +1701,20 @@ void ViewDriver::CopyBitmap(ServerBitmap *bitmap, const BRect &source, const BRe void ViewDriver::CopyToBitmap(ServerBitmap *destbmp, const BRect &sourcerect) { - if(!is_initialized || !destbmp) - return; + // TODO: BUG: CRASH: There is a crash on memcpy whenever the cursor is saved and it + // is clipped to the bottom edge of the screen. - if(destbmp->BitsPerPixel() != _buffer_depth) + if(!is_initialized || !destbmp) + { + printf("CopyToBitmap returned - not init or NULL bitmap\n"); return; + } + + if(((uint32)destbmp->ColorSpace() & 0x000F) != (_displaymode.space & 0x000F)) + { + printf("CopyToBitmap returned - unequal buffer pixel depth\n"); + return; + } BRect destrect(destbmp->Bounds()), source(sourcerect); @@ -1797,7 +1724,6 @@ void ViewDriver::CopyToBitmap(ServerBitmap *destbmp, const BRect &sourcerect) if(source.Width() > destrect.Width()) source.right=source.left+destrect.Width(); - if(source.Height() > destrect.Height()) source.bottom=source.top+destrect.Height(); @@ -1849,14 +1775,14 @@ void ViewDriver::CopyToBitmap(ServerBitmap *destbmp, const BRect &sourcerect) uint32 line_length = uint32 ((destrect.right - destrect.left+1)*colorspace_size); uint32 lines = uint32 (destrect.bottom-destrect.top+1); - - for (uint32 pos_y = 0; pos_y != lines; pos_y++) - { + + for (uint32 pos_y=0; pos_y