Cleanup: support passing in arbitrary buffers to IMB_allocFromBuffer

Also remove IB_metadata flag from the resulting imbuf as this image
has no meta-data.
This commit is contained in:
Campbell Barton 2021-09-06 20:04:25 +10:00
parent 49f1695ed0
commit a0912ff566
Notes: blender-bot 2023-02-13 11:53:10 +01:00
Referenced by commit 4f0ec3cea5, Cleanup: use pre-calculated size variable
2 changed files with 12 additions and 7 deletions

View File

@ -405,11 +405,8 @@ ImBuf *BKE_main_thumbnail_to_imbuf(Main *bmain, BlendThumbnail *data)
}
if (data) {
/* NOTE: we cannot use IMB_allocFromBuffer(), since it tries to dupalloc passed buffer,
* which will fail here (we do not want to pass the first two ints!). */
img = IMB_allocImBuf(
(unsigned int)data->width, (unsigned int)data->height, 32, IB_rect | IB_metadata);
memcpy(img->rect, data->rect, BLEN_THUMB_MEMSIZE(data->width, data->height) - sizeof(*data));
img = IMB_allocFromBuffer(
(const uint *)data->rect, NULL, (uint)data->width, (uint)data->height, 4);
}
return img;

View File

@ -445,13 +445,21 @@ struct ImBuf *IMB_allocFromBuffer(const unsigned int *rect,
ibuf = IMB_allocImBuf(w, h, 32, 0);
ibuf->channels = channels;
/* Avoid #MEM_dupallocN since the buffers might not be allocated using guarded-allocation. */
if (rectf) {
ibuf->rect_float = MEM_dupallocN(rectf);
const size_t size = sizeof(float[4]) * w * h;
ibuf->rect_float = MEM_mallocN(sizeof(float[4]) * w * h, __func__);
memcpy(ibuf->rect_float, rectf, size);
ibuf->flags |= IB_rectfloat;
ibuf->mall |= IB_rectfloat;
}
if (rect) {
ibuf->rect = MEM_dupallocN(rect);
const size_t size = sizeof(uchar[4]) * w * h;
ibuf->rect = MEM_mallocN(size, __func__);
memcpy(ibuf->rect, rect, size);
ibuf->flags |= IB_rect;
ibuf->mall |= IB_rect;
}