Before this change the ImBuf struct had dedicated fields for the buffer data. Now the color space is stored inside of the struct which wraps around the buffer information. This only changes the field placement, without changing the way it is handled. In the future one might imagine that operations like stealing buffer data should null-ify the buffer colorspace pointer. Such changes would need to have more accurate thinking before implementation. Should be no functional changes. Pull Request: https://projects.blender.org/blender/blender/pulls/109291
54 lines
1.4 KiB
C++
54 lines
1.4 KiB
C++
/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/** \file
|
|
* \ingroup imbuf
|
|
*/
|
|
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "BLI_path_util.h"
|
|
#include "BLI_utildefines.h"
|
|
|
|
#include "IMB_filetype.h"
|
|
#include "IMB_imbuf.h"
|
|
#include "IMB_imbuf_types.h"
|
|
|
|
#include "IMB_colormanagement.h"
|
|
#include "IMB_colormanagement_intern.h"
|
|
|
|
bool IMB_saveiff(ImBuf *ibuf, const char *filepath, int flags)
|
|
{
|
|
errno = 0;
|
|
|
|
BLI_assert(!BLI_path_is_rel(filepath));
|
|
|
|
if (ibuf == nullptr) {
|
|
return false;
|
|
}
|
|
ibuf->flags = flags;
|
|
|
|
const ImFileType *type = IMB_file_type_from_ibuf(ibuf);
|
|
if (type == nullptr || type->save == nullptr) {
|
|
fprintf(stderr, "Couldn't save picture.\n");
|
|
return false;
|
|
}
|
|
|
|
/* If writing byte image from float buffer, create a byte buffer for writing.
|
|
*
|
|
* For color managed image writing, IMB_colormanagement_imbuf_for_write should
|
|
* have already created this byte buffer. This is a basic fallback for other
|
|
* cases where we do not have a specific desired output colorspace. */
|
|
if (!(type->flag & IM_FTYPE_FLOAT)) {
|
|
if (ibuf->byte_buffer.data == nullptr && ibuf->float_buffer.data) {
|
|
ibuf->byte_buffer.colorspace = colormanage_colorspace_get_roled(COLOR_ROLE_DEFAULT_BYTE);
|
|
IMB_rect_from_float(ibuf);
|
|
}
|
|
}
|
|
|
|
return type->save(ibuf, filepath, flags);
|
|
}
|