diff --git a/src/apps/haikudepot/PackageInfo.cpp b/src/apps/haikudepot/PackageInfo.cpp index 4a7ae891bb..71457dc82b 100644 --- a/src/apps/haikudepot/PackageInfo.cpp +++ b/src/apps/haikudepot/PackageInfo.cpp @@ -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(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(data), dataSize, bitmap); + }; + + if (status != B_OK) { + delete bitmap; + bitmap = NULL; + } + + return bitmap; +} + + // #pragma mark - UserInfo diff --git a/src/apps/haikudepot/PackageInfo.h b/src/apps/haikudepot/PackageInfo.h index d57429f67a..23a61ec756 100644 --- a/src/apps/haikudepot/PackageInfo.h +++ b/src/apps/haikudepot/PackageInfo.h @@ -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]; };