From 7348e71fc389f14ca3360cd9409be437483dd943 Mon Sep 17 00:00:00 2001 From: shadow303 Date: Wed, 4 Dec 2002 01:16:15 +0000 Subject: [PATCH] Fix initialization and memory issues git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2158 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/proto7/ScreenDriver.cpp | 42 +++++++++++++------------ src/servers/app/proto7/ScreenDriver.h | 2 +- src/servers/app/proto7/ServerBitmap.cpp | 9 +++++- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/servers/app/proto7/ScreenDriver.cpp b/src/servers/app/proto7/ScreenDriver.cpp index 53fc216aed..6b5ab97569 100644 --- a/src/servers/app/proto7/ScreenDriver.cpp +++ b/src/servers/app/proto7/ScreenDriver.cpp @@ -306,7 +306,6 @@ ScreenDriver::ScreenDriver(void) under_cursor=NULL; cursorframe.Set(0,0,0,0); - oldcursorframe.Set(0,0,0,0); } ScreenDriver::~ScreenDriver(void) @@ -319,12 +318,19 @@ ScreenDriver::~ScreenDriver(void) bool ScreenDriver::Initialize(void) { + int8 cross[] = { 16,1,5,5, + 14,0,4,0,4,0,4,0,128,32,241,224,128,32,4,0, + 4,0,4,0,14,0,0,0,0,0,0,0,0,0,0,0, + 14,0,4,0,4,0,4,0,128,32,245,224,128,32,4,0, + 4,0,4,0,14,0,0,0,0,0,0,0,0,0,0,0 }; + ServerBitmap *crosscursor; fbuffer->Show(); - // draw on the module's default cursor here to make it look preety - // wait 1 sec for the window to show... snooze(500000); + crosscursor = new ServerBitmap(cross); + SetCursor(crosscursor,BPoint(5,5)); + delete crosscursor; return true; } @@ -1303,16 +1309,13 @@ void ScreenDriver::MoveCursorTo(float x, float y) printf("ScreenDriver::MoveCursorTo(%f,%f)\n",x,y); #endif Lock(); - if(!IsCursorHidden() && under_cursor) + if(!IsCursorHidden()) BlitBitmap(under_cursor,under_cursor->Bounds(),cursorframe); - oldcursorframe=cursorframe; - cursorframe.OffsetTo(x,y); - if (under_cursor) - ExtractToBitmap(under_cursor,under_cursor->Bounds(),cursorframe); + ExtractToBitmap(under_cursor,under_cursor->Bounds(),cursorframe); - if(!IsCursorHidden() && cursor) + if(!IsCursorHidden()) BlitBitmap(cursor,cursor->Bounds(),cursorframe); Unlock(); @@ -1327,7 +1330,7 @@ printf("ScreenDriver::ShowCursor\n"); if(fbuffer->IsConnected()) { SetCursorHidden(false); - if(CursorStateChanged() && cursor) + if(CursorStateChanged()) BlitBitmap(cursor,cursor->Bounds(),cursorframe); } Unlock(); @@ -1340,7 +1343,7 @@ printf("ScreenDriver::ObscureCursor\n"); #endif Lock(); SetCursorObscured(true); - if(!IsCursorHidden() && fbuffer->IsConnected() && under_cursor) + if(!IsCursorHidden() && fbuffer->IsConnected()) BlitBitmap(under_cursor,under_cursor->Bounds(),cursorframe); Unlock(); } @@ -1372,13 +1375,12 @@ printf("ScreenDriver::SetCursor\n"); else SetHotSpot(BPoint(0,0)); - cursorframe.right=cursorframe.left+csr->Bounds().Width()-1; - cursorframe.bottom=cursorframe.top+csr->Bounds().Height()-1; - oldcursorframe=cursorframe; + cursorframe.right=cursorframe.left+csr->Bounds().Width(); + cursorframe.bottom=cursorframe.top+csr->Bounds().Height(); ExtractToBitmap(under_cursor,under_cursor->Bounds(),cursorframe); - if(!IsCursorHidden() && cursor) + if(!IsCursorHidden()) BlitBitmap(cursor,cursor->Bounds(),cursorframe); Unlock(); @@ -1477,7 +1479,7 @@ printf("ScreenDriver::BlitBitmap(): Incompatible bitmap pixel depth\n"); return; } - uint8 colorspace_size=sourcebmp->BitsPerPixel(); + uint8 colorspace_size=sourcebmp->BitsPerPixel()/8; // First, clip source rect to destination if(sourcerect.Width() > destrect.Width()) sourcerect.right=sourcerect.left+destrect.Width(); @@ -1532,7 +1534,7 @@ printf("ScreenDriver::BlitBitmap(): Incompatible bitmap pixel depth\n"); src_bits += uint32 ( (sourcerect.top * src_width) + (sourcerect.left * colorspace_size) ); dest_bits += uint32 ( (destrect.top * dest_width) + (destrect.left * colorspace_size) ); - uint32 line_length = uint32 ((destrect.right - destrect.left)*colorspace_size); + 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++) @@ -1548,7 +1550,7 @@ printf("ScreenDriver::BlitBitmap(): Incompatible bitmap pixel depth\n"); void ScreenDriver::ExtractToBitmap(ServerBitmap *destbmp,BRect destrect, BRect sourcerect) { // Another internal function called from other functions. - + if(!destbmp) { #ifdef DEBUG_DRIVER @@ -1565,7 +1567,7 @@ printf("ScreenDriver::ExtractToBitmap(): Incompatible bitmap pixel depth\n"); return; } - uint8 colorspace_size=destbmp->BitsPerPixel(); + uint8 colorspace_size=destbmp->BitsPerPixel()/8; // First, clip source rect to destination if(sourcerect.Width() > destrect.Width()) sourcerect.right=sourcerect.left+destrect.Width(); @@ -1620,7 +1622,7 @@ printf("ScreenDriver::ExtractToBitmap(): Incompatible bitmap pixel depth\n"); src_bits += uint32 ( (sourcerect.top * src_width) + (sourcerect.left * colorspace_size) ); dest_bits += uint32 ( (destrect.top * dest_width) + (destrect.left * colorspace_size) ); - uint32 line_length = uint32 ((destrect.right - destrect.left)*colorspace_size); + 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++) diff --git a/src/servers/app/proto7/ScreenDriver.h b/src/servers/app/proto7/ScreenDriver.h index eeb650fdbf..95d6304e58 100644 --- a/src/servers/app/proto7/ScreenDriver.h +++ b/src/servers/app/proto7/ScreenDriver.h @@ -106,7 +106,7 @@ protected: int hide_cursor; ServerBitmap *cursor, *under_cursor; int32 drawmode; - BRect cursorframe, oldcursorframe; + BRect cursorframe; }; #endif diff --git a/src/servers/app/proto7/ServerBitmap.cpp b/src/servers/app/proto7/ServerBitmap.cpp index c29d2d974b..c7363945fc 100644 --- a/src/servers/app/proto7/ServerBitmap.cpp +++ b/src/servers/app/proto7/ServerBitmap.cpp @@ -87,6 +87,7 @@ ServerBitmap::ServerBitmap(const char *path) bytesperline=bmp->BytesPerRow(); buffer=new uint8[bmp->BitsLength()]; memcpy(buffer,(void *)bmp->Bits(),bmp->BitsLength()); + HandleSpace(cspace,bytesperline); } } @@ -113,6 +114,7 @@ ServerBitmap::ServerBitmap(uint32 type,int32 id) bytesperline=bmp->BytesPerRow(); buffer=new uint8[bmp->BitsLength()]; memcpy(buffer,(void *)bmp->Bits(),bmp->BitsLength()); + HandleSpace(cspace,bytesperline); } } @@ -138,6 +140,7 @@ ServerBitmap::ServerBitmap(uint32 type, const char *name) bytesperline=bmp->BytesPerRow(); buffer=new uint8[bmp->BitsLength()]; memcpy(buffer,(void *)bmp->Bits(),bmp->BitsLength()); + HandleSpace(cspace,bytesperline); } } @@ -146,6 +149,7 @@ ServerBitmap::ServerBitmap(ServerBitmap *bitmap) is_initialized=true; width=bitmap->width; height=bitmap->height; + bytesperline = bitmap->bytesperline; cspace=bitmap->cspace; areaid=B_ERROR; @@ -178,6 +182,8 @@ ServerBitmap::ServerBitmap(int8 *data) width=16; height=16; bytesperline=64; + cspace=B_RGBA32; + HandleSpace(cspace,bytesperline); // for each row in the cursor data for(j=0;j<16;j++) @@ -206,6 +212,7 @@ ServerBitmap::ServerBitmap(int8 *data) width=0; height=0; bytesperline=0; + cspace=B_NO_COLOR_SPACE; } #ifdef DEBUG_SERVER_CURSOR @@ -216,7 +223,7 @@ ServerBitmap::ServerBitmap(int8 *data) ServerBitmap::~ServerBitmap(void) { if(buffer) - delete buffer; + delete[] buffer; } void ServerBitmap::UpdateSettings(void)