106 return x_tile == other.x_tile &&
y_tile == other.y_tile && image == other.image &&
155 ptile->valid =
false;
175 if (pptile ==
nullptr) {
185 *r_mask = ptile->
mask;
199 return old_buffer_data;
205 return old_buffer_data;
217 bool use_thread_lock,
220 if (use_thread_lock) {
230 paint_tile_map, image, ibuf, iuser, x_tile, y_tile, r_mask,
true);
232 if (use_thread_lock) {
239 if (*tmpibuf ==
nullptr) {
247 ptile->
iuser = *iuser;
267 *r_valid = &ptile->
valid;
295 [&](
PaintTile **pptile) { *pptile = ptile; },
296 [&](
PaintTile **pptile) { existing_tile = *pptile; });
299 ptile = existing_tile;
302 if (use_thread_lock) {
313 Image *image = ptile->image;
322 ptile->rect.byte_ptr);
341 ptile->rect.byte_ptr);
369 BLI_assert(tile_x < tiles_dims[0] && tile_y < tiles_dims[1]);
370 return (tile_y * tiles_dims[0]) + tile_x;
387 utile->
rect.
fp =
static_cast<float *
>(
447 if (utile->
users == 0) {
511 for (
uint y_tile = 0; y_tile < ubuf->
tiles_dims[1]; y_tile += 1) {
513 for (
uint x_tile = 0; x_tile < ubuf->
tiles_dims[0]; x_tile += 1) {
520 ubuf->
tiles[i] = utile;
602 Image *image = uh->image_ref.ptr;
606 CLOG_ERROR(&
LOG,
"Unable to get buffer for image '%s'", image->id.name + 2);
609 bool changed =
false;
615 for (
uint y_tile = 0; y_tile < ubuf->
tiles_dims[1]; y_tile += 1) {
617 for (
uint x_tile = 0; x_tile < ubuf->
tiles_dims[0]; x_tile += 1) {
668 const char *ibuf_filepath)
671 if (
STREQ(ubuf->ibuf_filepath, ibuf_filepath)) {
684 ubuf->
post =
nullptr;
692 if (ubuf ==
nullptr) {
703 if (
STREQ(image->id.name + 2, uh->image_ref.name + 2) && uh->iuser.tile == tile_number) {
713 if (image == uh->image_ref.ptr && uh->iuser.tile == tile_number) {
773 if (uh_prev !=
nullptr) {
775 if (ubuf_reference) {
776 ubuf_reference = ubuf_reference->
post;
780 return ubuf_reference;
845 utile->
rect.
pt = ptile->rect.pt;
846 ptile->rect.pt =
nullptr;
867 if (ubuf_pre->image_dims[0] != ubuf_post->
image_dims[0] ||
868 ubuf_pre->image_dims[1] != ubuf_post->
image_dims[1])
876 us_reference, uh->image_ref.ptr, uh->iuser.tile, ubuf_post) :
880 for (
uint y_tile = 0; y_tile < ubuf_pre->tiles_dims[1]; y_tile += 1) {
882 for (
uint x_tile = 0; x_tile < ubuf_pre->tiles_dims[0]; x_tile += 1) {
885 if ((ubuf_reference !=
nullptr) &&
886 ((ubuf_pre->tiles[i] ==
nullptr) ||
889 (ubuf_pre->tiles[i]->users == 1)))
891 if (ubuf_pre->tiles[i] !=
nullptr) {
894 ubuf_post->
tiles[i] = ubuf_pre->tiles[i];
895 ubuf_pre->tiles[i] =
nullptr;
900 ubuf_post->
tiles[i] = ubuf_reference->
tiles[i];
904 ubuf_pre->tiles[i] = ubuf_reference->
tiles[i];
905 ubuf_pre->tiles[i]->
users += 1;
914 if (ubuf_pre->tiles[i] !=
nullptr) {
915 ubuf_post->
tiles[i] = utile;
919 ubuf_pre->tiles[i] = utile;
920 ubuf_post->
tiles[i] = utile;
981 while (us_iter != us || (!is_final && us_iter == us)) {
1002 if (us_iter == us) {
1047 foreach_ID_ref_fn(user_data, ((
UndoRefID *)&uh->image_ref));
1094 if (us_p != us_prev) {
1142 us_reference, image, iuser->
tile, ubuf_pre) :
1145 if (ubuf_reference) {
ScrArea * CTX_wm_area(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
ImBuf * BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **r_lock)
void BKE_image_mark_dirty(Image *image, ImBuf *ibuf)
void BKE_image_release_ibuf(Image *ima, ImBuf *ibuf, void *lock)
void BKE_image_free_gputextures(Image *ima)
void BKE_image_partial_update_mark_full_update(Image *image)
Mark the whole image to be updated.
PaintMode BKE_paintmode_get_active_from_context(const bContext *C)
@ UNDOTYPE_FLAG_DECODE_ACTIVE_STEP
void(*)(void *user_data, UndoRefID *id_ref) UndoTypeForEachIDRefFn
eUndoPushReturn BKE_undosys_step_push(UndoStack *ustack, bContext *C, const char *name)
UndoStep * BKE_undosys_step_push_init_with_type(UndoStack *ustack, bContext *C, const char *name, const UndoType *ut)
#define BKE_undosys_stack_limit_steps_and_memory_defaults(ustack)
UndoStep * BKE_undosys_stack_init_or_active_with_type(UndoStack *ustack, const UndoType *ut)
const UndoType * BKE_UNDOSYS_TYPE_IMAGE
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE int square_i(int a)
#define STRNCPY(dst, src)
pthread_spinlock_t SpinLock
void BLI_spin_init(SpinLock *spin)
void BLI_spin_unlock(SpinLock *spin)
void BLI_spin_lock(SpinLock *spin)
void BLI_spin_end(SpinLock *spin)
#define CLOG_ERROR(clg_ref,...)
void DEG_id_tag_update(ID *id, unsigned int flags)
Object is a sort of wrapper for general info.
#define ED_IMAGE_UNDO_TILE_NUMBER(size)
#define ED_IMAGE_UNDO_TILE_SIZE
#define ED_IMAGE_UNDO_TILE_BITS
UndoStack * ED_undo_stack_get()
void ED_editors_init_for_undo(Main *bmain)
void imb_freerectfloatImBuf(ImBuf *ibuf)
float * IMB_steal_float_buffer(ImBuf *ibuf)
uint8_t * IMB_steal_byte_buffer(ImBuf *ibuf)
void imb_freerectImbuf_all(ImBuf *ibuf)
void IMB_assign_float_buffer(ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership)
bool imb_addrectImBuf(ImBuf *ibuf, bool initialize_pixels=true)
void IMB_rect_size_set(ImBuf *ibuf, const uint size[2])
void IMB_assign_byte_buffer(ImBuf *ibuf, uint8_t *buffer_data, ImBufOwnership ownership)
void IMB_rectcpy(ImBuf *dbuf, const ImBuf *sbuf, int destx, int desty, int srcx, int srcy, int width, int height)
bool imb_addrectfloatImBuf(ImBuf *ibuf, const unsigned int channels, bool initialize_pixels=true)
Contains defines and structs used throughout the imbuf module.
#define IMB_FILEPATH_SIZE
@ IB_DISPLAY_BUFFER_INVALID
Read Guarded memory(de)allocation.
const Value * lookup_ptr(const Key &key) const
ValueIterator values() const
auto add_or_modify(const Key &key, const CreateValueF &create_value, const ModifyValueF &modify_value) -> decltype(create_value(nullptr))
input_tx image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "preview_img") .compute_source("compositor_compute_preview.glsl") .do_static_compilation(true)
struct ImBuf * IMB_allocImBuf(unsigned int, unsigned int, unsigned char, unsigned int)
void IMB_freeImBuf(ImBuf *)
static void utile_decref(UndoImageTile *utile)
static bool image_undosys_step_encode(bContext *C, Main *, UndoStep *us_p)
static void uhandle_restore_list(ListBase *undo_handles, bool use_init)
static void image_undosys_step_encode_init(bContext *, UndoStep *us_p)
static void ptile_free(PaintTile *ptile)
static ImageUndoStep * image_undo_push_begin(const char *name, PaintMode paint_mode)
static UndoImageTile * utile_alloc(bool has_float)
void ED_image_paint_tile_lock_end()
void ED_image_undo_push_begin(const char *name, PaintMode paint_mode)
static void ptile_invalidate_map(PaintTileMap *paint_tile_map)
static float * image_undo_steal_and_assign_float_buffer(ImBuf *ibuf, float *new_buffer_data)
static UndoImageBuf * uhandle_ensure_ubuf(UndoImageHandle *uh, Image *image, ImBuf *ibuf)
static UndoImageBuf * uhandle_lookup_ubuf(UndoImageHandle *uh, const Image *, const char *ibuf_filepath)
static UndoImageHandle * uhandle_lookup_by_name(ListBase *undo_handles, const Image *image, int tile_number)
void ED_image_undo_push_begin_with_image(const char *name, Image *image, ImBuf *ibuf, ImageUser *iuser)
static void uhandle_free_list(ListBase *undo_handles)
static void utile_init_from_imbuf(UndoImageTile *utile, const uint32_t x, const uint32_t y, const ImBuf *ibuf, ImBuf *tmpibuf)
static void ptile_restore_runtime_map(PaintTileMap *paint_tile_map)
void ED_image_undosys_type(UndoType *ut)
void * ED_image_paint_tile_find(PaintTileMap *paint_tile_map, Image *image, ImBuf *ibuf, ImageUser *iuser, int x_tile, int y_tile, ushort **r_mask, bool validate)
static void image_undosys_step_decode(bContext *C, Main *bmain, UndoStep *us_p, const eUndoStepDir dir, bool is_final)
static void image_undosys_step_decode_undo(ImageUndoStep *us, bool is_final)
static UndoImageBuf * ubuf_lookup_from_reference(ImageUndoStep *us_prev, const Image *image, int tile_number, const UndoImageBuf *ubuf)
static ImBuf * imbuf_alloc_temp_tile()
void ED_image_undo_push_end()
static void image_undosys_foreach_ID_ref(UndoStep *us_p, UndoTypeForEachIDRefFn foreach_ID_ref_fn, void *user_data)
static void image_undosys_step_decode_redo(ImageUndoStep *us)
void * ED_image_paint_tile_push(PaintTileMap *paint_tile_map, Image *image, ImBuf *ibuf, ImBuf **tmpibuf, ImageUser *iuser, int x_tile, int y_tile, ushort **r_mask, bool **r_valid, bool use_thread_lock, bool find_prev)
static uint8_t * image_undo_steal_and_assign_byte_buffer(ImBuf *ibuf, uint8_t *new_buffer_data)
PaintTileMap * ED_image_paint_tile_map_get()
static UndoImageBuf * ubuf_from_image_no_tiles(Image *image, const ImBuf *ibuf)
static void ubuf_ensure_compat_ibuf(const UndoImageBuf *ubuf, ImBuf *ibuf)
static UndoImageHandle * uhandle_ensure(ListBase *undo_handles, Image *image, ImageUser *iuser)
static void image_undosys_step_free(UndoStep *us_p)
static void image_undosys_step_decode_redo_impl(ImageUndoStep *us)
static bool image_undosys_poll(bContext *C)
static void image_undosys_step_decode_undo_impl(ImageUndoStep *us, bool is_final)
static uint32_t index_from_xy(uint32_t tile_x, uint32_t tile_y, const uint32_t tiles_dims[2])
static UndoImageHandle * uhandle_add(ListBase *undo_handles, Image *image, ImageUser *iuser)
static UndoImageBuf * uhandle_add_ubuf(UndoImageHandle *uh, Image *image, ImBuf *ibuf)
void ED_image_undo_restore(UndoStep *us)
static void ubuf_free(UndoImageBuf *ubuf)
static UndoImageHandle * uhandle_lookup(ListBase *undo_handles, const Image *image, int tile_number)
static void ubuf_from_image_all_tiles(UndoImageBuf *ubuf, const ImBuf *ibuf)
void ED_image_paint_tile_lock_init()
static SpinLock paint_tiles_lock
static void utile_restore(const UndoImageTile *utile, const uint x, const uint y, ImBuf *ibuf, ImBuf *tmpibuf)
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
bool mode_set_ex(bContext *C, eObjectMode mode, bool use_undo, ReportList *reports)
uint64_t get_default_hash(const T &v)
unsigned __int64 uint64_t
char filepath[IMB_FILEPATH_SIZE]
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
ImBuf * mipmap[IMB_MIPMAP_LEVELS]
PaintTileMap * paint_tile_map
bool operator==(const PaintTileKey &other) const
blender::Map< PaintTileKey, PaintTile * > map
union PaintTile::@497 rect
char ibuf_filepath[IMB_FILEPATH_SIZE]
struct UndoImageBuf::@499 image_state
UndoRefID_Image image_ref
union UndoImageTile::@498 rect
void(* step_encode_init)(bContext *C, UndoStep *us)
void(* step_foreach_ID_ref)(UndoStep *us, UndoTypeForEachIDRefFn foreach_ID_ref_fn, void *user_data)
void(* step_free)(UndoStep *us)
bool(* poll)(struct bContext *C)
void(* step_decode)(bContext *C, Main *bmain, UndoStep *us, eUndoStepDir dir, bool is_final)
bool(* step_encode)(bContext *C, Main *bmain, UndoStep *us)
void * BKE_image_get_tile
void WM_file_tag_modified()