Fix initialization and memory issues

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2158 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
shadow303 2002-12-04 01:16:15 +00:00
parent 325a5f6bb6
commit 7348e71fc3
3 changed files with 31 additions and 22 deletions

View File

@ -306,7 +306,6 @@ ScreenDriver::ScreenDriver(void)
under_cursor=NULL; under_cursor=NULL;
cursorframe.Set(0,0,0,0); cursorframe.Set(0,0,0,0);
oldcursorframe.Set(0,0,0,0);
} }
ScreenDriver::~ScreenDriver(void) ScreenDriver::~ScreenDriver(void)
@ -319,12 +318,19 @@ ScreenDriver::~ScreenDriver(void)
bool ScreenDriver::Initialize(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(); fbuffer->Show();
// draw on the module's default cursor here to make it look preety
// wait 1 sec for the window to show... // wait 1 sec for the window to show...
snooze(500000); snooze(500000);
crosscursor = new ServerBitmap(cross);
SetCursor(crosscursor,BPoint(5,5));
delete crosscursor;
return true; return true;
} }
@ -1303,16 +1309,13 @@ void ScreenDriver::MoveCursorTo(float x, float y)
printf("ScreenDriver::MoveCursorTo(%f,%f)\n",x,y); printf("ScreenDriver::MoveCursorTo(%f,%f)\n",x,y);
#endif #endif
Lock(); Lock();
if(!IsCursorHidden() && under_cursor) if(!IsCursorHidden())
BlitBitmap(under_cursor,under_cursor->Bounds(),cursorframe); BlitBitmap(under_cursor,under_cursor->Bounds(),cursorframe);
oldcursorframe=cursorframe;
cursorframe.OffsetTo(x,y); 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); BlitBitmap(cursor,cursor->Bounds(),cursorframe);
Unlock(); Unlock();
@ -1327,7 +1330,7 @@ printf("ScreenDriver::ShowCursor\n");
if(fbuffer->IsConnected()) if(fbuffer->IsConnected())
{ {
SetCursorHidden(false); SetCursorHidden(false);
if(CursorStateChanged() && cursor) if(CursorStateChanged())
BlitBitmap(cursor,cursor->Bounds(),cursorframe); BlitBitmap(cursor,cursor->Bounds(),cursorframe);
} }
Unlock(); Unlock();
@ -1340,7 +1343,7 @@ printf("ScreenDriver::ObscureCursor\n");
#endif #endif
Lock(); Lock();
SetCursorObscured(true); SetCursorObscured(true);
if(!IsCursorHidden() && fbuffer->IsConnected() && under_cursor) if(!IsCursorHidden() && fbuffer->IsConnected())
BlitBitmap(under_cursor,under_cursor->Bounds(),cursorframe); BlitBitmap(under_cursor,under_cursor->Bounds(),cursorframe);
Unlock(); Unlock();
} }
@ -1372,13 +1375,12 @@ printf("ScreenDriver::SetCursor\n");
else else
SetHotSpot(BPoint(0,0)); SetHotSpot(BPoint(0,0));
cursorframe.right=cursorframe.left+csr->Bounds().Width()-1; cursorframe.right=cursorframe.left+csr->Bounds().Width();
cursorframe.bottom=cursorframe.top+csr->Bounds().Height()-1; cursorframe.bottom=cursorframe.top+csr->Bounds().Height();
oldcursorframe=cursorframe;
ExtractToBitmap(under_cursor,under_cursor->Bounds(),cursorframe); ExtractToBitmap(under_cursor,under_cursor->Bounds(),cursorframe);
if(!IsCursorHidden() && cursor) if(!IsCursorHidden())
BlitBitmap(cursor,cursor->Bounds(),cursorframe); BlitBitmap(cursor,cursor->Bounds(),cursorframe);
Unlock(); Unlock();
@ -1477,7 +1479,7 @@ printf("ScreenDriver::BlitBitmap(): Incompatible bitmap pixel depth\n");
return; return;
} }
uint8 colorspace_size=sourcebmp->BitsPerPixel(); uint8 colorspace_size=sourcebmp->BitsPerPixel()/8;
// First, clip source rect to destination // First, clip source rect to destination
if(sourcerect.Width() > destrect.Width()) if(sourcerect.Width() > destrect.Width())
sourcerect.right=sourcerect.left+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) ); src_bits += uint32 ( (sourcerect.top * src_width) + (sourcerect.left * colorspace_size) );
dest_bits += uint32 ( (destrect.top * dest_width) + (destrect.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); 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 != lines; pos_y++)
@ -1565,7 +1567,7 @@ printf("ScreenDriver::ExtractToBitmap(): Incompatible bitmap pixel depth\n");
return; return;
} }
uint8 colorspace_size=destbmp->BitsPerPixel(); uint8 colorspace_size=destbmp->BitsPerPixel()/8;
// First, clip source rect to destination // First, clip source rect to destination
if(sourcerect.Width() > destrect.Width()) if(sourcerect.Width() > destrect.Width())
sourcerect.right=sourcerect.left+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) ); src_bits += uint32 ( (sourcerect.top * src_width) + (sourcerect.left * colorspace_size) );
dest_bits += uint32 ( (destrect.top * dest_width) + (destrect.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); 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 != lines; pos_y++)

View File

@ -106,7 +106,7 @@ protected:
int hide_cursor; int hide_cursor;
ServerBitmap *cursor, *under_cursor; ServerBitmap *cursor, *under_cursor;
int32 drawmode; int32 drawmode;
BRect cursorframe, oldcursorframe; BRect cursorframe;
}; };
#endif #endif

View File

@ -87,6 +87,7 @@ ServerBitmap::ServerBitmap(const char *path)
bytesperline=bmp->BytesPerRow(); bytesperline=bmp->BytesPerRow();
buffer=new uint8[bmp->BitsLength()]; buffer=new uint8[bmp->BitsLength()];
memcpy(buffer,(void *)bmp->Bits(),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(); bytesperline=bmp->BytesPerRow();
buffer=new uint8[bmp->BitsLength()]; buffer=new uint8[bmp->BitsLength()];
memcpy(buffer,(void *)bmp->Bits(),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(); bytesperline=bmp->BytesPerRow();
buffer=new uint8[bmp->BitsLength()]; buffer=new uint8[bmp->BitsLength()];
memcpy(buffer,(void *)bmp->Bits(),bmp->BitsLength()); memcpy(buffer,(void *)bmp->Bits(),bmp->BitsLength());
HandleSpace(cspace,bytesperline);
} }
} }
@ -146,6 +149,7 @@ ServerBitmap::ServerBitmap(ServerBitmap *bitmap)
is_initialized=true; is_initialized=true;
width=bitmap->width; width=bitmap->width;
height=bitmap->height; height=bitmap->height;
bytesperline = bitmap->bytesperline;
cspace=bitmap->cspace; cspace=bitmap->cspace;
areaid=B_ERROR; areaid=B_ERROR;
@ -178,6 +182,8 @@ ServerBitmap::ServerBitmap(int8 *data)
width=16; width=16;
height=16; height=16;
bytesperline=64; bytesperline=64;
cspace=B_RGBA32;
HandleSpace(cspace,bytesperline);
// for each row in the cursor data // for each row in the cursor data
for(j=0;j<16;j++) for(j=0;j<16;j++)
@ -206,6 +212,7 @@ ServerBitmap::ServerBitmap(int8 *data)
width=0; width=0;
height=0; height=0;
bytesperline=0; bytesperline=0;
cspace=B_NO_COLOR_SPACE;
} }
#ifdef DEBUG_SERVER_CURSOR #ifdef DEBUG_SERVER_CURSOR
@ -216,7 +223,7 @@ ServerBitmap::ServerBitmap(int8 *data)
ServerBitmap::~ServerBitmap(void) ServerBitmap::~ServerBitmap(void)
{ {
if(buffer) if(buffer)
delete buffer; delete[] buffer;
} }
void ServerBitmap::UpdateSettings(void) void ServerBitmap::UpdateSettings(void)