status_t BIconButton::SetIcon(const BMimeType* fileType, bool small) { status_t status = fileType ? fileType->InitCheck() : B_BAD_VALUE; if (status >= B_OK) { BBitmap* mimeBitmap = new(std::nothrow) BBitmap(BRect(0.0, 0.0, 15.0, 15.0), B_CMAP8); if (mimeBitmap && mimeBitmap->IsValid()) { status = fileType->GetIcon(mimeBitmap, small ? B_MINI_ICON : B_LARGE_ICON); if (status >= B_OK) { if (BBitmap* bitmap = _ConvertToRGB32(mimeBitmap)) { status = _MakeBitmaps(bitmap); delete bitmap; } else { printf("BIconButton::SetIcon() - B_RGB32 bitmap is not " "valid\n"); } } else { printf("BIconButton::SetIcon() - fileType->GetIcon() failed: " "%s\n", strerror(status)); } } else printf("BIconButton::SetIcon() - B_CMAP8 bitmap is not valid\n"); delete mimeBitmap; } else { printf("BIconButton::SetIcon() - fileType is not valid: %s\n", strerror(status)); } return status; }
status_t BIcon::SetExternalBitmap(const BBitmap* bitmap, uint32 which, uint32 flags) { BBitmap* ourBitmap = NULL; if (bitmap != NULL) { if (!bitmap->IsValid()) return B_BAD_VALUE; if ((flags & B_KEEP_ICON_BITMAP) != 0) { ourBitmap = const_cast<BBitmap*>(bitmap); } else { ourBitmap = _ConvertToRGB32(bitmap); if (ourBitmap == NULL) return B_NO_MEMORY; } } if (!SetBitmap(ourBitmap, which)) { if (ourBitmap != bitmap) delete ourBitmap; return B_NO_MEMORY; } return B_OK; }
status_t BIconButton::SetIcon(const BBitmap* bitmap, uint32 flags) { if (bitmap && bitmap->ColorSpace() == B_CMAP8) { status_t status = bitmap->InitCheck(); if (status >= B_OK) { if (BBitmap* rgb32Bitmap = _ConvertToRGB32(bitmap)) { status = _MakeBitmaps(rgb32Bitmap); delete rgb32Bitmap; } else status = B_NO_MEMORY; } return status; } else return _MakeBitmaps(bitmap); }
status_t BIcon::SetTo(const BBitmap* bitmap, uint32 flags) { if (!bitmap->IsValid()) return B_BAD_VALUE; DeleteBitmaps(); // check the color space bool hasAlpha = false; bool canUseForMakeBitmaps = false; switch (bitmap->ColorSpace()) { case B_RGBA32: case B_RGBA32_BIG: hasAlpha = true; // fall through case B_RGB32: case B_RGB32_BIG: canUseForMakeBitmaps = true; break; case B_UVLA32: case B_LABA32: case B_HSIA32: case B_HSVA32: case B_HLSA32: case B_CMYA32: case B_RGBA15: case B_RGBA15_BIG: case B_CMAP8: hasAlpha = true; break; default: break; } BBitmap* trimmedBitmap = NULL; // trim the bitmap, if requested and the bitmap actually has alpha status_t error; if ((flags & (B_TRIM_ICON_BITMAP | B_TRIM_ICON_BITMAP_KEEP_ASPECT)) != 0 && hasAlpha) { if (bitmap->ColorSpace() == B_RGBA32) { error = _TrimBitmap(bitmap, (flags & B_TRIM_ICON_BITMAP_KEEP_ASPECT) != 0, trimmedBitmap); } else { BBitmap* rgb32Bitmap = _ConvertToRGB32(bitmap, true); if (rgb32Bitmap != NULL) { error = _TrimBitmap(rgb32Bitmap, (flags & B_TRIM_ICON_BITMAP_KEEP_ASPECT) != 0, trimmedBitmap); delete rgb32Bitmap; } else error = B_NO_MEMORY; } if (error != B_OK) return error; bitmap = trimmedBitmap; canUseForMakeBitmaps = true; } // create the bitmaps if (canUseForMakeBitmaps) { error = _MakeBitmaps(bitmap, flags); } else { if (BBitmap* rgb32Bitmap = _ConvertToRGB32(bitmap, true)) { error = _MakeBitmaps(rgb32Bitmap, flags); delete rgb32Bitmap; } else error = B_NO_MEMORY; } delete trimmedBitmap; return error; }