From 59a15bb433e3fe21d0fad3638ba712e78e26f486 Mon Sep 17 00:00:00 2001 From: DarkWyrm Date: Wed, 12 Mar 2003 14:29:59 +0000 Subject: [PATCH] Added ServerApp code for BBitmap handling Added some support functions to ServerBitmap BitmapManager now adds ID tokens to ServerBitmaps git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2898 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/server/BitmapManager.cpp | 7 ++ src/servers/app/server/ServerApp.cpp | 96 +++++++++++++++++++++++- src/servers/app/server/ServerApp.h | 3 +- src/servers/app/server/ServerBitmap.h | 8 ++ 4 files changed, 110 insertions(+), 4 deletions(-) diff --git a/src/servers/app/server/BitmapManager.cpp b/src/servers/app/server/BitmapManager.cpp index a44c837155..f80031b4f2 100644 --- a/src/servers/app/server/BitmapManager.cpp +++ b/src/servers/app/server/BitmapManager.cpp @@ -129,6 +129,13 @@ ServerBitmap * BitmapManager::CreateBitmap(BRect bounds, color_space space, int3 } bmp->_area=area_for(bmpbuffer); bmp->_buffer=bmpbuffer; + bmp->_token=tokenizer.GetToken(); + + // calculate area offset + area_info ai; + get_area_info(bmp->_area,&ai); + bmp->_offset=bmpbuffer-(uint8*)ai.address; + bmplist->AddItem(bmp); release_sem(lock); return bmp; diff --git a/src/servers/app/server/ServerApp.cpp b/src/servers/app/server/ServerApp.cpp index 1654c55fc0..aa7489b2ee 100644 --- a/src/servers/app/server/ServerApp.cpp +++ b/src/servers/app/server/ServerApp.cpp @@ -30,7 +30,9 @@ #include #include #include +#include +#include "BitmapManager.h" #include "CursorManager.h" #include "Desktop.h" #include "DisplayDriver.h" @@ -39,7 +41,6 @@ #include "ServerWindow.h" #include "ServerCursor.h" #include "ServerBitmap.h" -#include "ServerProtocol.h" #include "ServerConfig.h" #include "LayerData.h" @@ -248,7 +249,7 @@ int32 ServerApp::MonitorApp(void *data) } default: { - app->DispatchMessage(msgcode, msgbuffer); + app->_DispatchMessage(msgcode, msgbuffer); break; } } @@ -275,7 +276,7 @@ int32 ServerApp::MonitorApp(void *data) All attachments are placed in the buffer via a PortLink, so it will be a matter of casting and incrementing an index variable to access them. */ -void ServerApp::DispatchMessage(int32 code, int8 *buffer) +void ServerApp::_DispatchMessage(int32 code, int8 *buffer) { int8 *index=buffer; LayerData ld; @@ -350,6 +351,78 @@ void ServerApp::DispatchMessage(int32 code, int8 *buffer) } break; } + case AS_CREATE_BITMAP: + { + // Allocate a bitmap for an application + + // Attached Data: + // 1) port_id reply port + // 2) BRect bounds + // 3) color_space space + // 4) int32 bitmap_flags + // 5) int32 bytes_per_row + // 6) int32 screen_id::id + + // Reply Code: SERVER_TRUE + // Reply Data: + // 1) int32 server token + // 2) area_id id of the area in which the bitmap data resides + // 3) int32 area pointer offset used to calculate fBasePtr + + // First, let's attempt to allocate the bitmap + port_id replyport=*((port_id*)index); index+=sizeof(port_id); + BRect r=*((BRect*)index); index+=sizeof(BRect); + color_space cs=*((color_space*)index); index+=sizeof(color_space); + int32 f=*((int32*)index); index+=sizeof(int32); + int32 bpr=*((int32*)index); index+=sizeof(int32); + + screen_id s; + s.id=*((int32*)index); + + ServerBitmap *sbmp=bitmapmanager->CreateBitmap(r,cs,f,bpr,s); + if(sbmp) + { + // list for doing faster lookups for a bitmap than what the BitmapManager + // can do. + _bmplist->AddItem(sbmp); + _applink->SetOpCode(SERVER_TRUE); + _applink->Attach(sbmp->Token()); + _applink->Attach(sbmp->Area()); + _applink->Attach(sbmp->AreaOffset()); + _applink->Flush(); + } + else + { + // alternatively, if something went wrong, we reply with SERVER_FALSE + write_port(replyport,SERVER_FALSE,NULL,0); + } + + break; + } + case AS_DELETE_BITMAP: + { + // Delete a bitmap's allocated memory + + // Attached Data: + // 1) int32 reply port + // 2) int32 token + + // Reply Code: SERVER_TRUE if successful, + // SERVER_FALSE if the buffer was already deleted or was not found + port_id replyport=*((port_id*)index); index+=sizeof(port_id); + + ServerBitmap *sbmp=_FindBitmap(*((int32*)index)); + if(sbmp) + { + _bmplist->RemoveItem(sbmp); + bitmapmanager->DeleteBitmap(sbmp); + write_port(replyport,SERVER_TRUE,NULL,0); + } + else + write_port(replyport,SERVER_FALSE,NULL,0); + + break; + } case AS_SET_SCREEN_MODE: { // Attached data @@ -451,3 +524,20 @@ void ServerApp::DispatchMessage(int32 code, int8 *buffer) } } } + +/*! + \brief Looks up a ServerApp's ServerBitmap in its list + \param token ID token of the bitmap to find + \return The bitmap having that ID or NULL if not found +*/ +ServerBitmap *ServerApp::_FindBitmap(int32 token) +{ + ServerBitmap *temp; + for(int32 i=0; i<_bmplist->CountItems();i++) + { + temp=(ServerBitmap*)_bmplist->ItemAt(i); + if(temp && temp->Token()==token) + return temp; + } + return NULL; +} diff --git a/src/servers/app/server/ServerApp.h b/src/servers/app/server/ServerApp.h index 2b93200159..de386e7704 100644 --- a/src/servers/app/server/ServerApp.h +++ b/src/servers/app/server/ServerApp.h @@ -71,7 +71,8 @@ public: protected: friend AppServer; friend ServerWindow; - void DispatchMessage(int32 code, int8 *buffer); + void _DispatchMessage(int32 code, int8 *buffer); + ServerBitmap *_FindBitmap(int32 token); port_id _sender,_receiver; BString _signature; diff --git a/src/servers/app/server/ServerBitmap.h b/src/servers/app/server/ServerBitmap.h index 9194e71ff0..bb53da23de 100644 --- a/src/servers/app/server/ServerBitmap.h +++ b/src/servers/app/server/ServerBitmap.h @@ -57,6 +57,9 @@ public: */ area_id Area(void) { return _area; } + // Returns the offset of the bitmap in its area + int32 AreaOffset(void) { return _offset; } + //! Returns the bitmap's buffer uint8 *Bits(void) { return _buffer; } uint32 BitsLength(void); @@ -82,6 +85,9 @@ public: //! Returns whether the bitmap is valid bool InitCheck(void) { return _initialized; } + //! Returns the identifier token for the bitmap + int32 Token(void) { return _token; } + protected: friend BitmapManager; @@ -104,6 +110,8 @@ protected: color_space _space; int32 _flags; int _bpp; + int32 _token; + int32 _offset; }; #endif