HaikuDepot: SharedBitmap: Added loading from buffers.

Refactored loading from a buffer when loading from resources and
 re-used that for instantiating a SharedBitmap from a BMallocIO.
This commit is contained in:
Stephan Aßmus
2014-03-28 23:49:27 +01:00
parent a04a520b0d
commit 22949ba2ef
2 changed files with 97 additions and 36 deletions
+87 -36
View File
@@ -26,6 +26,8 @@ SharedBitmap::SharedBitmap(BBitmap* bitmap)
:
BReferenceable(),
fResourceID(-1),
fBuffer(NULL),
fSize(0),
fMimeType()
{
fBitmap[0] = bitmap;
@@ -38,6 +40,8 @@ SharedBitmap::SharedBitmap(int32 resourceID)
:
BReferenceable(),
fResourceID(resourceID),
fBuffer(NULL),
fSize(0),
fMimeType()
{
fBitmap[0] = NULL;
@@ -50,6 +54,8 @@ SharedBitmap::SharedBitmap(const char* mimeType)
:
BReferenceable(),
fResourceID(-1),
fBuffer(NULL),
fSize(0),
fMimeType(mimeType)
{
fBitmap[0] = NULL;
@@ -58,18 +64,36 @@ SharedBitmap::SharedBitmap(const char* mimeType)
}
SharedBitmap::SharedBitmap(const BMallocIO& data)
:
BReferenceable(),
fResourceID(-1),
fBuffer(new(std::nothrow) uint8[data.BufferLength()]),
fSize(data.BufferLength()),
fMimeType()
{
if (fBuffer != NULL)
memcpy(fBuffer, data.Buffer(), fSize);
fBitmap[0] = NULL;
fBitmap[1] = NULL;
fBitmap[2] = NULL;
}
SharedBitmap::~SharedBitmap()
{
delete fBitmap[0];
delete fBitmap[1];
delete fBitmap[2];
delete[] fBuffer;
}
const BBitmap*
SharedBitmap::Bitmap(Size which)
{
if (fResourceID == -1 && fMimeType.Length() == 0)
if (fResourceID == -1 && fMimeType.Length() == 0 && fBuffer == NULL)
return fBitmap[0];
int32 index = 0;
@@ -93,6 +117,8 @@ SharedBitmap::Bitmap(Size which)
if (fBitmap[index] == NULL) {
if (fResourceID >= 0)
fBitmap[index] = _CreateBitmapFromResource(size);
else if (fBuffer != NULL)
fBitmap[index] = _CreateBitmapFromBuffer(size);
else if (fMimeType.Length() > 0)
fBitmap[index] = _CreateBitmapFromMimeType(size);
}
@@ -112,48 +138,29 @@ SharedBitmap::_CreateBitmapFromResource(int32 size) const
size_t dataSize;
const void* data = resources.LoadResource(B_VECTOR_ICON_TYPE, fResourceID,
&dataSize);
if (data != NULL) {
BBitmap* bitmap = new BBitmap(BRect(0, 0, size - 1, size - 1), 0,
B_RGBA32);
status = bitmap->InitCheck();
if (status == B_OK) {
status = BIconUtils::GetVectorIcon(
reinterpret_cast<const uint8*>(data), dataSize, bitmap);
};
if (status != B_OK) {
delete bitmap;
bitmap = NULL;
}
return bitmap;
}
if (data != NULL)
return _LoadIconFromBuffer(data, dataSize, size);
data = resources.LoadResource(B_MESSAGE_TYPE, fResourceID, &dataSize);
if (data != NULL) {
BMemoryIO stream(data, dataSize);
// Try to read as an archived bitmap.
BMessage archive;
status = archive.Unflatten(&stream);
if (status != B_OK)
return NULL;
BBitmap* bitmap = new BBitmap(&archive);
status = bitmap->InitCheck();
if (status != B_OK) {
delete bitmap;
bitmap = NULL;
}
return bitmap;
}
if (data != NULL)
return _LoadBitmapFromBuffer(data, dataSize);
return NULL;
}
BBitmap*
SharedBitmap::_CreateBitmapFromBuffer(int32 size) const
{
BBitmap* bitmap = _LoadIconFromBuffer(fBuffer, fSize, size);
if (bitmap == NULL)
bitmap = _LoadBitmapFromBuffer(fBuffer, fSize);
return bitmap;
}
BBitmap*
SharedBitmap::_CreateBitmapFromMimeType(int32 size) const
{
@@ -176,6 +183,50 @@ SharedBitmap::_CreateBitmapFromMimeType(int32 size) const
}
BBitmap*
SharedBitmap::_LoadBitmapFromBuffer(const void* buffer, size_t size) const
{
BMemoryIO stream(buffer, size);
// Try to read as an archived bitmap.
BMessage archive;
status_t status = archive.Unflatten(&stream);
if (status != B_OK)
return NULL;
BBitmap* bitmap = new BBitmap(&archive);
status = bitmap->InitCheck();
if (status != B_OK) {
delete bitmap;
bitmap = NULL;
}
return bitmap;
}
BBitmap*
SharedBitmap::_LoadIconFromBuffer(const void* data, size_t dataSize,
int32 size) const
{
BBitmap* bitmap = new BBitmap(BRect(0, 0, size - 1, size - 1), 0,
B_RGBA32);
status_t status = bitmap->InitCheck();
if (status == B_OK) {
status = BIconUtils::GetVectorIcon(
reinterpret_cast<const uint8*>(data), dataSize, bitmap);
};
if (status != B_OK) {
delete bitmap;
bitmap = NULL;
}
return bitmap;
}
// #pragma mark - UserInfo
+10
View File
@@ -16,6 +16,7 @@
class BBitmap;
class BMallocIO;
class SharedBitmap : public BReferenceable {
@@ -30,16 +31,25 @@ public:
SharedBitmap(BBitmap* bitmap);
SharedBitmap(int32 resourceID);
SharedBitmap(const char* mimeType);
SharedBitmap(const BMallocIO& data);
~SharedBitmap();
const BBitmap* Bitmap(Size which);
private:
BBitmap* _CreateBitmapFromResource(int32 size) const;
BBitmap* _CreateBitmapFromBuffer(int32 size) const;
BBitmap* _CreateBitmapFromMimeType(int32 size) const;
BBitmap* _LoadBitmapFromBuffer(const void* buffer,
size_t dataSize) const;
BBitmap* _LoadIconFromBuffer(const void* buffer,
size_t dataSize, int32 size) const;
private:
int32 fResourceID;
uint8* fBuffer;
size_t fSize;
BString fMimeType;
BBitmap* fBitmap[3];
};