Blender V4.5
allocimbuf.cc File Reference
#include <algorithm>
#include <cstddef>
#include "IMB_imbuf.hh"
#include "IMB_imbuf_types.hh"
#include "IMB_allocimbuf.hh"
#include "IMB_colormanagement_intern.hh"
#include "IMB_filetype.hh"
#include "IMB_metadata.hh"
#include "imbuf.hh"
#include "MEM_guardedalloc.h"
#include "BLI_threads.h"
#include "GPU_texture.hh"
#include "atomic_ops.h"

Go to the source code of this file.

Functions

void imb_mmap_lock_init ()
void imb_mmap_lock_exit ()
void imb_mmap_lock ()
void imb_mmap_unlock ()
template<class BufferType>
static void imb_free_buffer (BufferType &buffer)
static void imb_free_dds_buffer (DDSData &dds_data)
template<class BufferType>
bool imb_alloc_buffer (BufferType &buffer, const uint x, const uint y, const uint channels, const size_t type_size, bool initialize_pixels)
template<class BufferType>
void imb_make_writeable_buffer (BufferType &buffer)
template<class BufferType>
auto imb_steal_buffer_data (BufferType &buffer) -> decltype(BufferType::data)
void IMB_free_mipmaps (ImBuf *ibuf)
void IMB_free_float_pixels (ImBuf *ibuf)
void IMB_free_byte_pixels (ImBuf *ibuf)
static void free_encoded_data (ImBuf *ibuf)
void IMB_free_all_data (ImBuf *ibuf)
void IMB_free_gpu_textures (ImBuf *ibuf)
void IMB_freeImBuf (ImBuf *ibuf)
void IMB_refImBuf (ImBuf *ibuf)
ImBufIMB_makeSingleUser (ImBuf *ibuf)
bool imb_addencodedbufferImBuf (ImBuf *ibuf)
bool imb_enlargeencodedbufferImBuf (ImBuf *ibuf)
void * imb_alloc_pixels (uint x, uint y, uint channels, size_t typesize, bool initialize_pixels, const char *alloc_name)
bool IMB_alloc_float_pixels (ImBuf *ibuf, const uint channels, bool initialize_pixels)
bool IMB_alloc_byte_pixels (ImBuf *ibuf, bool initialize_pixels)
uint8_t * IMB_steal_byte_buffer (ImBuf *ibuf)
float * IMB_steal_float_buffer (ImBuf *ibuf)
uint8_t * IMB_steal_encoded_buffer (ImBuf *ibuf)
void IMB_make_writable_byte_buffer (ImBuf *ibuf)
void IMB_make_writable_float_buffer (ImBuf *ibuf)
void IMB_assign_byte_buffer (ImBuf *ibuf, uint8_t *buffer_data, const ImBufOwnership ownership)
void IMB_assign_float_buffer (ImBuf *ibuf, float *buffer_data, const ImBufOwnership ownership)
void IMB_assign_byte_buffer (ImBuf *ibuf, const ImBufByteBuffer &buffer, const ImBufOwnership ownership)
void IMB_assign_float_buffer (ImBuf *ibuf, const ImBufFloatBuffer &buffer, const ImBufOwnership ownership)
void IMB_assign_dds_data (ImBuf *ibuf, const DDSData &data, const ImBufOwnership ownership)
ImBufIMB_allocFromBufferOwn (uint8_t *byte_buffer, float *float_buffer, uint w, uint h, uint channels)
ImBufIMB_allocFromBuffer (const uint8_t *byte_buffer, const float *float_buffer, uint w, uint h, uint channels)
ImBufIMB_allocImBuf (uint x, uint y, uchar planes, uint flags)
bool IMB_initImBuf (ImBuf *ibuf, uint x, uint y, uchar planes, uint flags)
ImBufIMB_dupImBuf (const ImBuf *ibuf1)
size_t IMB_get_pixel_count (const ImBuf *ibuf)
 Get the length of the data of the given image buffer in pixels.
size_t IMB_get_size_in_memory (const ImBuf *ibuf)

Variables

static SpinLock mmap_spin

Function Documentation

◆ free_encoded_data()

void free_encoded_data ( ImBuf * ibuf)
static

◆ imb_addencodedbufferImBuf()

◆ imb_alloc_buffer()

template<class BufferType>
bool imb_alloc_buffer ( BufferType & buffer,
const uint x,
const uint y,
const uint channels,
const size_t type_size,
bool initialize_pixels )

◆ IMB_alloc_byte_pixels()

bool IMB_alloc_byte_pixels ( ImBuf * ibuf,
bool initialize_pixels = true )

◆ IMB_alloc_float_pixels()

bool IMB_alloc_float_pixels ( ImBuf * ibuf,
const unsigned int channels,
bool initialize_pixels = true )

◆ imb_alloc_pixels()

void * imb_alloc_pixels ( unsigned int x,
unsigned int y,
unsigned int channels,
size_t typesize,
bool initialize_pixels,
const char * alloc_name )

Exported for image tools in blender, to quickly allocate 32 bits rect.

Definition at line 343 of file allocimbuf.cc.

References MEM_callocN(), MEM_mallocN(), size(), SIZE_MAX, x, and y.

Referenced by convertRGBAToLogElement(), imb_alloc_buffer(), logImageGetDataRGBA(), and logImageSetDataRGBA().

◆ IMB_allocFromBuffer()

◆ IMB_allocFromBufferOwn()

ImBuf * IMB_allocFromBufferOwn ( uint8_t * byte_buffer,
float * float_buffer,
unsigned int w,
unsigned int h,
unsigned int channels )

Create a copy of a pixel buffer and wrap it to a new ImBuf (transferring ownership to the in imbuf).

Definition at line 492 of file allocimbuf.cc.

References BLI_assert, ImBuf::channels, IB_TAKE_OWNERSHIP, IMB_allocImBuf(), IMB_assign_byte_buffer(), IMB_assign_float_buffer(), MEM_allocN_len, and w().

Referenced by blend_file_thumb_from_screenshot(), and studiolight_load_equirect_image().

◆ IMB_allocImBuf()

ImBuf * IMB_allocImBuf ( uint x,
uint y,
uchar planes,
uint flags )

Definition at line 550 of file allocimbuf.cc.

References IMB_freeImBuf(), IMB_initImBuf(), MEM_callocN(), x, and y.

Referenced by accessor_get_ibuf(), add_ibuf_for_tile(), blender::compositor::FileOutput::add_pass(), blender::compositor::FileOutput::add_view(), BKE_icon_geom_rasterize(), BKE_previewimg_to_imbuf(), BKE_tracking_get_plane_imbuf(), BKE_tracking_get_search_imbuf(), BKE_tracking_sample_pattern(), BKE_tracking_stabilize_frame(), brush_painter_imbuf_new(), brush_painter_imbuf_partial_update(), blender::io::usd::cache_image_color(), blender::image_engine::FloatBufferCache::cached_float_buffer(), colormanage_cache_put(), blender::compositor::compute_linear_buffer(), blender::imbuf::tests::create_6x2_test_image(), blender::imbuf::tests::create_6x2_test_image_fl(), blender::seq::create_missing_media_image(), create_src_image(), dynamicPaint_outputSurfaceImage(), ED_view3d_draw_offscreen_imbuf(), float_image_to_ibuf(), ibJpegImageFromCinfo(), image_acquire_ibuf(), image_get_render_result(), blender::ed::greasepencil::image_render::image_render_end(), IMB_allocFromBuffer(), IMB_allocFromBufferOwn(), IMB_dupImBuf(), IMB_font_preview(), IMB_half_x(), IMB_half_y(), IMB_ImBufFromStereo3d(), imb_load_dpx_cineon(), imb_load_filepath_thumbnail_openexr(), imb_load_filepath_thumbnail_svg(), imb_load_filepath_thumbnail_webp(), imb_load_jp2_stream(), imb_load_openexr(), imb_loadiris(), imb_loadwebp(), IMB_makemipmap(), IMB_onehalf(), IMB_remakemipmap(), IMB_scale_into_new(), imb_scale_via_transform(), IMB_stereo3d_ImBuf(), IMB_thumb_load_font(), imbuf_alloc_temp_tile(), blender::seq::input_preprocess(), blender::imbuf::load_pixels(), Freestyle::Canvas::loadMap(), M_imbuf_new(), make_grayscale_ibuf_copy(), blender::ed::vse::make_sep_waveform_view_from_ibuf(), blender::ed::vse::make_vectorscope_view_from_ibuf(), blender::ed::vse::make_waveform_view_from_ibuf(), blender::ed::vse::make_zebra_view_from_ibuf(), blender::bke::node_preview_verify(), NSImageToImBuf(), paint_2d_lift_clone(), blender::seq::prepare_effect_imbufs(), RE_layer_load_from_file(), RE_render_result_rect_to_ibuf(), RE_RenderPassEnsureImBuf(), RE_RenderViewEnsureImBuf(), render_layer_allocate_pass(), Freestyle::SteerableViewMap::saveSteerableViewMap(), screen_opengl_render_doit(), screenshot_exec(), seq_process_render_image(), blender::seq::seq_render_effect_strip_impl(), blender::seq::seq_render_mask(), blender::seq::seq_render_scene_strip(), blender::seq::seq_render_strip(), blender::seq::seq_render_strip_stack(), blender::ed::asset::take_screenshot_crop(), blender::imbuf::tests::TEST(), thumb_create_ex(), blender::imbuf::tests::transform_2x_smaller(), blender::imbuf::tests::transform_fractional_larger(), ui_tooltip_data_from_button_or_extra_icon(), and blender::ed::object::write_external_bake_pixels().

◆ IMB_assign_byte_buffer() [1/2]

void IMB_assign_byte_buffer ( ImBuf * ibuf,
const ImBufByteBuffer & buffer,
ImBufOwnership ownership )

Assign the content and the color space of the corresponding buffer the data from the given buffer.

Note
Does not modify the topology (width, height, number of channels) or the mipmaps in any way.
The ownership of the data in the source buffer is ignored.

Definition at line 466 of file allocimbuf.cc.

References ImBuf::byte_buffer, ImBufByteBuffer::colorspace, ImBufByteBuffer::data, and IMB_assign_byte_buffer().

◆ IMB_assign_byte_buffer() [2/2]

void IMB_assign_byte_buffer ( ImBuf * ibuf,
uint8_t * buffer_data,
ImBufOwnership ownership )

Assign the content of the corresponding buffer with the given data and ownership. The current content of the buffer is released corresponding to its ownership configuration.

Note
Does not modify the topology (width, height, number of channels) or the mipmaps in any way.

Definition at line 440 of file allocimbuf.cc.

References ImBuf::byte_buffer, ImBufByteBuffer::data, ImBuf::flags, IB_byte_data, imb_free_buffer(), and ImBufByteBuffer::ownership.

Referenced by colormanage_cache_put(), blender::compositor::compute_linear_buffer(), image_undo_steal_and_assign_byte_buffer(), IMB_allocFromBufferOwn(), IMB_assign_byte_buffer(), IMB_rotate_orthogonal(), IMB_scale_into_new(), paint_2d_do_making_brush(), RE_render_result_rect_from_ibuf(), RE_render_result_rect_to_ibuf(), render_result_rect_fill_zero(), scale_with_function(), screenshot_exec(), and blender::ed::asset::take_screenshot_crop().

◆ IMB_assign_dds_data()

void IMB_assign_dds_data ( ImBuf * ibuf,
const DDSData & data,
const ImBufOwnership ownership )

◆ IMB_assign_float_buffer() [1/2]

void IMB_assign_float_buffer ( ImBuf * ibuf,
const ImBufFloatBuffer & buffer,
const ImBufOwnership ownership )

◆ IMB_assign_float_buffer() [2/2]

◆ IMB_dupImBuf()

◆ imb_enlargeencodedbufferImBuf()

◆ IMB_free_all_data()

void IMB_free_all_data ( ImBuf * ibuf)

Deallocate all CPU side data storage (byte, float, encoded, mipmaps).

Definition at line 220 of file allocimbuf.cc.

References free_encoded_data(), IMB_free_byte_pixels(), and IMB_free_float_pixels().

Referenced by IMB_freeImBuf(), and ubuf_ensure_compat_ibuf().

◆ imb_free_buffer()

◆ IMB_free_byte_pixels()

◆ imb_free_dds_buffer()

void imb_free_dds_buffer ( DDSData & dds_data)
static

◆ IMB_free_float_pixels()

◆ IMB_free_gpu_textures()

void IMB_free_gpu_textures ( ImBuf * ibuf)

◆ IMB_free_mipmaps()

◆ IMB_freeImBuf()

void IMB_freeImBuf ( ImBuf * ibuf)

Definition at line 237 of file allocimbuf.cc.

References atomic_sub_and_fetch_int32(), BLI_assert_msg, colormanage_cache_free(), ImBuf::dds_data, ImBuf::filepath, IMB_free_all_data(), imb_free_dds_buffer(), IMB_free_gpu_textures(), IMB_metadata_free(), MEM_freeN(), ImBuf::metadata, and ImBuf::refcounter.

Referenced by accessor_get_ibuf(), accessor_release_image_callback(), action_preview_render(), blender::seq::add_image_init_alpha_mode(), blender::seq::add_image_strip(), blender::ed::space_node::all_nodes_preview_update(), BKE_image_acquire_multilayer_view_ibuf(), BKE_image_add_generated(), BKE_image_has_ibuf(), BKE_image_memorypack(), BKE_image_pool_free(), BKE_image_reassign_tile(), BKE_image_release_ibuf(), BKE_image_render_write(), BKE_image_signal(), BKE_movieclip_build_proxy_frame(), BKE_movieclip_build_proxy_frame_for_ibuf(), BKE_movieclip_get_gpu_texture(), BKE_movieclip_get_size(), BKE_movieclip_get_stable_ibuf(), BKE_movieclip_has_frame(), BKE_movieclip_update_scopes(), BKE_previewimg_ensure(), BKE_tracking_get_pattern_imbuf(), BKE_tracking_refine_marker(), blend_file_thumb_from_camera(), blend_file_thumb_from_screenshot(), brush_free_data(), brush_painter_2d_refresh_cache(), brush_painter_2d_require_imbuf(), brush_painter_cache_2d_free(), brush_painter_imbuf_partial_update(), build_pict_list_from_anim(), build_pict_list_from_image_sequence(), blender::io::usd::cache_image_color(), blender::compositor::CachedImage::CachedImage(), blender::ed::vse::SeqScopes::cleanup(), blender::seq::FinalImageCache::clear(), blender::seq::SourceImageCache::clear(), blender::seq::StripImageMap::clear(), blender::seq::ThumbnailCache::clear(), clip_draw_main(), clip_free(), clip_main_region_draw(), colormanage_cache_get(), colormanage_cache_handle_release(), blender::compositor::compute_marker_points(), detect_clip_source(), detect_features_exec(), blender::ed::sculpt_paint::paint::image::do_push_undo_tile(), do_render_sequencer(), blender::seq::do_render_strip_uncached(), blender::ed::vse::draw_strip_thumbnails(), dynamicPaint_outputSurfaceImage(), ED_imapaint_dirty_region(), ED_space_clip_color_sample(), ED_space_clip_get_buffer(), ED_space_clip_get_position(), ED_space_clip_get_stable_buffer(), blender::nodes::node_composite_movieclip_cc::MovieClipOperation::execute(), file_draw_tooltip_custom_func(), filelist_free_icons(), blender::seq::final_image_cache_evict(), blender::seq::final_image_cache_invalidate_frame_range(), blender::seq::final_image_cache_put(), frame_cache_remove(), free_buffers(), blender::ed::asset::generate_previewimg_from_buffer(), GHOST_SystemCocoa::getClipboardImage(), GHOST_SystemWayland::getClipboardImage(), getClipboardImageFilepath(), getClipboardImageImBuf(), gpu_texture_update_scaled(), GHOST_SystemWin32::hasClipboardImage(), icon_copy_rect(), icon_draw_size(), icon_free_data(), icon_verify_datatoc(), image_clipboard_copy_exec(), image_clipboard_paste_exec(), image_get_render_result(), image_init_color_management(), image_load_image_file(), image_load_movie_file(), image_memorypack_imbuf(), image_save_single(), image_undosys_step_encode(), IMB_allocImBuf(), IMB_dupImBuf(), IMB_free_mipmaps(), imb_gpu_get_data(), IMB_ImBufFromStereo3d(), imb_load_dpx_cineon(), imb_load_filepath_thumbnail_openexr(), imb_load_filepath_thumbnail_webp(), imb_load_openexr(), IMB_makemipmap(), IMB_makeSingleUser(), IMB_remakemipmap(), imb_scale_via_transform(), IMB_thumb_load_font(), IMB_thumb_manage(), imbuf_save_post(), blender::seq::input_preprocess(), blender::seq::StripImageMap::invalidate(), load_image_single(), blender::imbuf::load_pixels(), blender::ed::vse::metadata_panel_context_draw(), metadata_panel_context_draw(), blender::seq::modifier_apply_stack(), MOV_decode_preview_frame(), moviecache_destructor(), moviecache_valfree(), movieclip_build_proxy_ibuf(), movieclip_get_postprocessed_ibuf(), new_image_from_plane_marker_exec(), object_preview_render(), openanim(), paint_2d_op(), prefetch_movie_frame(), prefetch_task_func(), project_bucket_init(), proxy_task_func(), ptile_restore_runtime_map(), blender::seq::StripImageMap::put(), put_postprocessed_frame_to_cache(), put_stabilized_frame_to_cache(), GHOST_SystemWayland::putClipboardImage(), putClipboardImagePNG(), py_imbuf_dealloc(), py_imbuf_free(), RE_create_gp_pass(), RE_layer_load_from_file(), RE_render_result_rect_to_ibuf(), RE_WriteRenderViewsMovie(), release_keyframed_image_buffers(), blender::seq::SourceImageCache::remove_entry(), blender::seq::ThumbnailCache::remove_entry(), render_result_free(), render_result_views_free(), sample_plane_marker_image_for_operator(), scale_perf_impl(), screen_opengl_render_doit(), screen_opengl_views_setup(), screenshot_exec(), blender::ed::asset::screenshot_preview_exec(), blender::seq::seq_prefetch_frames(), seq_process_render_image(), blender::seq::seq_proxy_build_frame(), blender::seq::seq_render_effect_strip_impl(), blender::seq::seq_render_image_strip(), blender::seq::seq_render_movie_strip(), blender::seq::seq_render_scene_strip(), blender::seq::seq_render_strip_stack(), blender::ed::vse::sequencer_calc_scopes(), blender::ed::vse::sequencer_make_scope(), blender::ed::vse::sequencer_preview_region_draw(), sequencer_sample_apply(), blender::ed::space_node::shader_preview_startjob(), blender::seq::source_image_cache_evict(), blender::seq::source_image_cache_put(), studiolight_load_equirect_image(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), blender::imbuf::tests::TEST(), texture_paint_image_from_view_exec(), thumb_create_ex(), thumb_create_or_fail(), blender::seq::thumbnail_cache_maintain_capacity(), track_get_search_floatbuf(), blender::imbuf::tests::transform_2x_smaller(), blender::imbuf::tests::transform_fractional_larger(), ubuf_from_image_all_tiles(), uhandle_restore_list(), ui_but_free(), ui_draw_but_TRACKPREVIEW(), UI_icon_to_preview(), UI_icons_free_drawinfo(), ui_tooltip_data_from_button_or_extra_icon(), ui_tooltip_from_clip(), ui_tooltip_from_image(), ui_tooltip_from_vfont(), ui_tooltip_region_free_cb(), uiTemplateMovieclipInformation(), uiTemplateRecentFiles_tooltip_func(), update_image_from_plane_marker_exec(), wm_file_write(), wm_main_playanim_intern(), blender::ed::object::write_external_bake_pixels(), blender::bke::bNodePreview::~bNodePreview(), blender::render::Context::~Context(), blender::image_engine::FloatImageBuffer::~FloatImageBuffer(), GHOST_EventDragnDrop::~GHOST_EventDragnDrop(), and blender::ed::space_node::NestedTreePreviews::~NestedTreePreviews().

◆ IMB_get_pixel_count()

size_t IMB_get_pixel_count ( const ImBuf * ibuf)

Get the length of the data of the given image buffer in pixels.

This is the width * the height of the image buffer. This function is preferred over ibuf->x * ibuf->y due to 32 bit int overflow issues when working with very large resolution images.

Definition at line 682 of file allocimbuf.cc.

References ImBuf::x, and ImBuf::y.

Referenced by bake_ibuf_normalize_displacement(), BKE_imbuf_alpha_test(), create_src_image(), IMB_color_to_bw(), IMB_float_from_byte(), IMB_get_size_in_memory(), imb_gpu_get_data(), IMB_rectfill(), IMB_rectfill_alpha(), IMB_saturation(), imb_savewebp(), imbuf_rgba_to_abgr(), init_heights_data(), blender::seq::multiply_ibuf(), and studiolight_create_matcap_gputexture().

◆ IMB_get_size_in_memory()

◆ IMB_initImBuf()

bool IMB_initImBuf ( ImBuf * ibuf,
unsigned int x,
unsigned int y,
unsigned char planes,
unsigned int flags )

◆ IMB_make_writable_byte_buffer()

void IMB_make_writable_byte_buffer ( ImBuf * ibuf)

Make corresponding buffers available for modification. Is achieved by ensuring that the given ImBuf is the only owner of the underlying buffer data.

Definition at line 430 of file allocimbuf.cc.

References ImBuf::byte_buffer, and imb_make_writeable_buffer().

Referenced by imbuf_ensure_editable().

◆ IMB_make_writable_float_buffer()

void IMB_make_writable_float_buffer ( ImBuf * ibuf)

Definition at line 435 of file allocimbuf.cc.

References ImBuf::float_buffer, and imb_make_writeable_buffer().

Referenced by imbuf_ensure_editable().

◆ imb_make_writeable_buffer()

template<class BufferType>
void imb_make_writeable_buffer ( BufferType & buffer)

◆ IMB_makeSingleUser()

ImBuf * IMB_makeSingleUser ( ImBuf * ibuf)

◆ imb_mmap_lock()

◆ imb_mmap_lock_exit()

void imb_mmap_lock_exit ( )

Definition at line 41 of file allocimbuf.cc.

References BLI_spin_end(), and mmap_spin.

Referenced by IMB_exit().

◆ imb_mmap_lock_init()

void imb_mmap_lock_init ( )

Definition at line 36 of file allocimbuf.cc.

References BLI_spin_init(), and mmap_spin.

Referenced by IMB_init().

◆ imb_mmap_unlock()

◆ IMB_refImBuf()

◆ imb_steal_buffer_data()

template<class BufferType>
auto imb_steal_buffer_data ( BufferType & buffer) -> decltype(BufferType::data)

◆ IMB_steal_byte_buffer()

uint8_t * IMB_steal_byte_buffer ( ImBuf * ibuf)

Steal the buffer data pointer: the ImBuf is no longer an owner of this data.

Note
If the ImBuf does not own the data the behavior is undefined.
Stealing encoded buffer resets the encoded size.

Definition at line 404 of file allocimbuf.cc.

References ImBuf::byte_buffer, data, ImBuf::flags, IB_byte_data, and imb_steal_buffer_data().

Referenced by icon_verify_datatoc(), image_undo_steal_and_assign_byte_buffer(), imb_gpu_get_data(), and UI_icon_to_preview().

◆ IMB_steal_encoded_buffer()

uint8_t * IMB_steal_encoded_buffer ( ImBuf * ibuf)

◆ IMB_steal_float_buffer()

Variable Documentation

◆ mmap_spin

SpinLock mmap_spin
static