123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- /*
- * Copyright 2009-2010, Pier Luigi Fiorini. All rights reserved.
- * Distributed under the terms of the MIT License.
- *
- * Authors:
- * Pier Luigi Fiorini, pierluigi.fiorini@gmail.com
- */
- #include <string.h>
- #include <Path.h>
- #include <IconUtils.h>
- #include "BitmapUtils.h"
- #define BEOS_ICON_ATTRIBUTE "BEOS:ICON"
- #define BEOS_MINI_ICON_ATTRIBUTE "BEOS:M:STD_ICON"
- #define BEOS_LARGE_ICON_ATTRIBUTE "BEOS:L:STD_ICON"
- BBitmap*
- ReadNodeIcon(const char* name, icon_size size, bool followSymlink)
- {
- BEntry entry(name, followSymlink);
- entry_ref ref;
- entry.GetRef(&ref);
- BNode node(BPath(&ref).Path());
- BBitmap* ret = new BBitmap(BRect(0, 0, (float)size - 1, (float)size - 1), B_RGBA32);
- if (BIconUtils::GetIcon(&node, BEOS_ICON_ATTRIBUTE, BEOS_MINI_ICON_ATTRIBUTE,
- BEOS_LARGE_ICON_ATTRIBUTE, size, ret) != B_OK) {
- delete ret;
- ret = NULL;
- }
- return ret;
- }
- BBitmap* IconFromResources(BResources* res, int32 num, icon_size size)
- {
- if (!res)
- return NULL;
- size_t nbytes = 0;
- type_code type = B_VECTOR_ICON_TYPE;
- color_space cspace = B_RGBA32;
- // Try to find a vector icon
- const void* data = res->LoadResource(type, num, &nbytes);
- if (data == NULL) {
- // Determine resource type from icon size
- switch (size) {
- case B_MINI_ICON:
- type = B_MINI_ICON_TYPE;
- break;
- case B_LARGE_ICON:
- type = B_LARGE_ICON_TYPE;
- break;
- default:
- return NULL;
- }
- // Get bitmap icon
- data = res->LoadResource(type, num, &nbytes);
- if (data == NULL)
- return NULL;
- cspace = B_CMAP8;
- }
- BBitmap* icon = new BBitmap(BRect(0, 0, (float)size - 1, (float)size - 1),
- cspace);
- if (icon->InitCheck() != B_OK)
- return NULL;
- switch (type) {
- case B_VECTOR_ICON_TYPE:
- if (BIconUtils::GetVectorIcon((const uint8*)data, nbytes, icon) != B_OK) {
- delete icon;
- return NULL;
- }
- break;
- default:
- icon->SetBits(data, size * size, 0, cspace);
- }
- return icon;
- }
- BBitmap*
- RescaleBitmap(const BBitmap* src, float width, float height)
- {
- width--; height--;
- if (!src || !src->IsValid())
- return NULL;
- BRect srcSize = src->Bounds();
- if (height < 0) {
- float srcProp = srcSize.Height() / srcSize.Width();
- height = width * (float)ceil(srcProp);
- }
- BBitmap* res = new BBitmap(BRect(0, 0, (float)width, (float)height),
- src->ColorSpace());
- int32 dx = (int32)((srcSize.Width() + 1) / (float)(width + 1));
- int32 dy = (int32)((srcSize.Height() + 1) / (float)(height + 1));
- uint8 bpp = (uint8)(src->BytesPerRow() / ceil(srcSize.Width()));
- int32 srcYOff = src->BytesPerRow();
- int32 dstYOff = res->BytesPerRow();
- void* dstData = res->Bits();
- void* srcData = src->Bits();
- for (int32 y = 0; y <= height; y++) {
- void* dstRow = (void*)((uintptr_t)dstData + (uint32)(y * dstYOff));
- void* srcRow = (void*)((uintptr_t)srcData + ((uint32)(y * dy)
- * srcYOff));
- for (int32 x = 0; x <= width; x++)
- memcpy((void*)((uintptr_t)dstRow + (x * bpp)), (void*)((uintptr_t)srcRow
- + ((uint32)(x * dx) * bpp)), bpp);
- }
- return res;
- }
|