27 const int tile_number,
28 const bool is_preview_render)
38 assert(b_image->source != IMA_SRC_SEQUENCE);
42 this->b_iuser.tile = tile_number;
49 bool is_float =
false;
93 const size_t num_pixels = ((size_t)metadata.
width) * metadata.
height;
94 const int out_channels = metadata.
channels;
95 const int in_channels = ibuf->
channels;
98 if (in_pixels && out_channels == in_channels) {
100 memcpy(out_pixels, in_pixels, num_pixels * out_channels *
sizeof(
float));
102 else if (in_pixels && out_channels == 4) {
104 float *out_pixel = out_pixels;
105 const float *in_pixel = in_pixels;
106 for (
size_t i = 0;
i < num_pixels;
i++) {
107 out_pixel[0] = in_pixel[0];
108 out_pixel[1] = (in_channels >= 2) ? in_pixel[1] : 0.0f;
109 out_pixel[2] = (in_channels >= 3) ? in_pixel[2] : 0.0f;
110 out_pixel[3] = (in_channels >= 4) ? in_pixel[3] : 1.0f;
111 out_pixel += out_channels;
112 in_pixel += in_channels;
117 if (out_channels == 1) {
118 std::fill(out_pixels, out_pixels + num_pixels, 0.0f);
121 std::fill((
float4 *)out_pixels,
122 (
float4 *)out_pixels + num_pixels,
131 const bool associate_alpha)
136 const size_t num_pixels = ((size_t)metadata.
width) * metadata.
height;
137 const int out_channels = metadata.
channels;
138 const int in_channels = 4;
143 const uchar *in_pixel = in_pixels;
144 half *out_pixel = out_pixels;
145 if (associate_alpha && out_channels == in_channels) {
146 for (
size_t i = 0;
i < num_pixels;
i++, in_pixel += in_channels, out_pixel += out_channels) {
155 for (
size_t i = 0;
i < num_pixels;
i++) {
156 for (
int c = 0; c < out_channels; c++, in_pixel++, out_pixel++) {
164 if (out_channels == 1) {
168 std::fill((
half4 *)out_pixels,
169 (
half4 *)out_pixels + num_pixels,
178 const bool associate_alpha)
180 const size_t num_pixels = ((size_t)metadata.
width) * metadata.
height;
181 const int out_channels = metadata.
channels;
182 const int in_channels = 4;
187 memcpy(out_pixels, in_pixels, num_pixels * in_channels *
sizeof(
unsigned char));
189 if (associate_alpha && out_channels == in_channels) {
191 unsigned char *out_pixel = (
unsigned char *)out_pixels;
192 for (
size_t i = 0;
i < num_pixels;
i++, out_pixel += 4) {
193 out_pixel[0] = (out_pixel[0] * out_pixel[3]) / 255;
194 out_pixel[1] = (out_pixel[1] * out_pixel[3]) / 255;
195 out_pixel[2] = (out_pixel[2] * out_pixel[3]) / 255;
201 if (out_channels == 1) {
202 std::fill(out_pixels, out_pixels + num_pixels, 0.0f);
214 const bool associate_alpha)
220 const bool mismatch = (ibuf ==
nullptr || ibuf->
x != metadata.
width ||
ImBuf * BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **r_lock)
void BKE_image_release_ibuf(Image *ima, ImBuf *ibuf, void *lock)
void BKE_image_free_buffers_ex(Image *image, bool do_lock)
bool BKE_image_has_loaded_ibuf(Image *image)
static void load_half_pixels(const ImBuf *ibuf, const ImageMetaData &metadata, half *out_pixels, const bool associate_alpha)
static void load_byte_pixels(const ImBuf *ibuf, const ImageMetaData &metadata, uchar *out_pixels, const bool associate_alpha)
static void load_float_pixels(const ImBuf *ibuf, const ImageMetaData &metadata, float *out_pixels)
bool load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) override
bool load_pixels(const ImageMetaData &metadata, void *pixels, const size_t pixels_size, const bool associate_alpha) override
bool equals(const ImageLoader &other) const override
BlenderImageLoader(::Image *b_image, ::ImageUser *b_iuser, const int frame, const int tile_number, const bool is_preview_render)
int get_tile_number() const override
string name() const override
void builtin_images_load()
unique_ptr< Session > session
void device_load_builtin(Device *device, Scene *scene, Progress &progress)
float util_image_cast_to_float(T value)
#define CCL_NAMESPACE_END
ccl_device_inline half float_to_half_image(const float f)
ccl_device_inline half4 float4_to_half4_display(const float4 f)
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer