157 ptile->valid =
false;
177 if (pptile ==
nullptr) {
185 "UndoImageTile.mask");
187 *r_mask = ptile->
mask;
201 return old_buffer_data;
207 return old_buffer_data;
219 bool use_thread_lock,
222 if (use_thread_lock) {
232 paint_tile_map, image, ibuf, iuser, x_tile, y_tile, r_mask,
true);
234 if (use_thread_lock) {
241 if (*tmpibuf ==
nullptr) {
247 ptile->
image = image;
249 ptile->
iuser = *iuser;
269 *r_valid = &ptile->
valid;
297 [&](
PaintTile **pptile) { *pptile = ptile; },
298 [&](
PaintTile **pptile) { existing_tile = *pptile; });
301 ptile = existing_tile;
304 if (use_thread_lock) {
315 Image *image = ptile->image;
324 ptile->rect.byte_ptr);
343 ptile->rect.byte_ptr);
369static uint32_t
index_from_xy(uint32_t tile_x, uint32_t tile_y,
const uint32_t tiles_dims[2])
371 BLI_assert(tile_x < tiles_dims[0] && tile_y < tiles_dims[1]);
372 return (tile_y * tiles_dims[0]) + tile_x;
389 utile->
rect.
fp =
static_cast<float *
>(
449 if (utile->
users == 0) {
515 for (
uint y_tile = 0; y_tile < ubuf->
tiles_dims[1]; y_tile += 1) {
517 for (
uint x_tile = 0; x_tile < ubuf->
tiles_dims[0]; x_tile += 1) {
606 Image *image = uh->image_ref.ptr;
613 bool changed =
false;
619 for (
uint y_tile = 0; y_tile < ubuf->
tiles_dims[1]; y_tile += 1) {
621 for (
uint x_tile = 0; x_tile < ubuf->
tiles_dims[0]; x_tile += 1) {
672 const char *ibuf_filepath,
673 const int ibuf_fileframe)
676 if (
STREQ(ubuf->ibuf_filepath, ibuf_filepath) && ubuf->ibuf_fileframe == ibuf_fileframe) {
689 ubuf->
post =
nullptr;
697 if (ubuf ==
nullptr) {
708 if (
STREQ(image->
id.
name + 2, uh->image_ref.name + 2) && uh->iuser.tile == tile_number) {
718 if (image == uh->image_ref.ptr && uh->iuser.tile == tile_number) {
778 if (uh_prev !=
nullptr) {
781 if (ubuf_reference) {
782 ubuf_reference = ubuf_reference->
post;
786 return ubuf_reference;
851 utile->
rect.
pt = ptile->rect.pt;
852 ptile->rect.pt =
nullptr;
873 if (ubuf_pre->image_dims[0] != ubuf_post->
image_dims[0] ||
874 ubuf_pre->image_dims[1] != ubuf_post->
image_dims[1])
882 us_reference, uh->image_ref.ptr, uh->iuser.tile, ubuf_post) :
886 for (
uint y_tile = 0; y_tile < ubuf_pre->tiles_dims[1]; y_tile += 1) {
888 for (
uint x_tile = 0; x_tile < ubuf_pre->tiles_dims[0]; x_tile += 1) {
891 if ((ubuf_reference !=
nullptr) &&
892 ((ubuf_pre->tiles[
i] ==
nullptr) ||
895 (ubuf_pre->tiles[
i]->users == 1)))
897 if (ubuf_pre->tiles[
i] !=
nullptr) {
900 ubuf_post->
tiles[
i] = ubuf_pre->tiles[
i];
901 ubuf_pre->tiles[
i] =
nullptr;
910 ubuf_pre->tiles[
i] = ubuf_reference->
tiles[
i];
911 ubuf_pre->tiles[
i]->
users += 1;
920 if (ubuf_pre->tiles[
i] !=
nullptr) {
921 ubuf_post->
tiles[
i] = utile;
925 ubuf_pre->tiles[
i] = utile;
926 ubuf_post->
tiles[
i] = utile;
987 while (us_iter != us || (!is_final && us_iter == us)) {
1008 if (us_iter == us) {
1053 foreach_ID_ref_fn(user_data, ((
UndoRefID *)&uh->image_ref));
1100 if (us_p != us_prev) {
1147 iuser->
tile = current_tile->tile_number;
1170 us_reference, image, iuser->
tile, ubuf_pre) :
1173 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)
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE int square_i(int a)
char * STRNCPY(char(&dst)[N], const char *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)
float * IMB_steal_float_buffer(ImBuf *ibuf)
uint8_t * IMB_steal_byte_buffer(ImBuf *ibuf)
void IMB_assign_float_buffer(ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership)
bool IMB_alloc_byte_pixels(ImBuf *ibuf, bool initialize_pixels=true)
void IMB_free_all_data(ImBuf *ibuf)
void IMB_freeImBuf(ImBuf *ibuf)
ImBuf * IMB_allocImBuf(unsigned int x, unsigned int y, unsigned char planes, unsigned int flags)
void IMB_free_float_pixels(ImBuf *ibuf)
void IMB_rect_size_set(ImBuf *ibuf, const uint size[2])
bool IMB_alloc_float_pixels(ImBuf *ibuf, const unsigned int channels, bool initialize_pixels=true)
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)
#define IMB_FILEPATH_SIZE
@ IB_DISPLAY_BUFFER_INVALID
Read Guarded memory(de)allocation.
BMesh const char void * data
unsigned long long int uint64_t
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))
static void utile_decref(UndoImageTile *utile)
static bool image_undosys_step_encode(bContext *C, Main *, UndoStep *us_p)
static UndoImageBuf * uhandle_lookup_ubuf(UndoImageHandle *uh, const Image *, const char *ibuf_filepath, const int ibuf_fileframe)
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 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)
void ED_image_undo_push_begin_with_image_all_udims(const char *name, Image *image, 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)
void ED_image_undo_push(Image *image, ImBuf *ibuf, ImageUser *iuser, ImageUndoStep *us)
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_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
bool mode_set_ex(bContext *C, eObjectMode mode, bool use_undo, ReportList *reports)
uint64_t get_default_hash(const T &v, const Args &...args)
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::@003155223071336066213233076114024325107117104057 rect
char ibuf_filepath[IMB_FILEPATH_SIZE]
struct UndoImageBuf::@001020310130367332223202167065145270304217254051 image_state
UndoRefID_Image image_ref
union UndoImageTile::@373124311320224076230064357037274246127211221337 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()