159 ptile->valid =
false;
179 if (pptile ==
nullptr) {
187 "UndoImageTile.mask");
189 *r_mask = ptile->
mask;
203 return old_buffer_data;
209 return old_buffer_data;
221 bool use_thread_lock,
224 if (use_thread_lock) {
234 paint_tile_map, image, ibuf, iuser, x_tile, y_tile, r_mask,
true);
236 if (use_thread_lock) {
243 if (*tmpibuf ==
nullptr) {
249 ptile->
image = image;
251 ptile->
iuser = *iuser;
271 *r_valid = &ptile->
valid;
299 [&](
PaintTile **pptile) { *pptile = ptile; },
300 [&](
PaintTile **pptile) { existing_tile = *pptile; });
303 ptile = existing_tile;
306 if (use_thread_lock) {
317 Image *image = ptile->image;
326 ptile->rect.byte_ptr);
345 ptile->rect.byte_ptr);
368static uint32_t
index_from_xy(uint32_t tile_x, uint32_t tile_y,
const uint32_t tiles_dims[2])
370 BLI_assert(tile_x < tiles_dims[0] && tile_y < tiles_dims[1]);
371 return (tile_y * tiles_dims[0]) + tile_x;
388 utile->
rect.
fp =
static_cast<float *
>(
448 if (utile->
users == 0) {
514 for (
uint y_tile = 0; y_tile < ubuf->
tiles_dims[1]; y_tile += 1) {
516 for (
uint x_tile = 0; x_tile < ubuf->
tiles_dims[0]; x_tile += 1) {
605 Image *image = uh->image_ref.ptr;
612 bool changed =
false;
618 for (
uint y_tile = 0; y_tile < ubuf->
tiles_dims[1]; y_tile += 1) {
620 for (
uint x_tile = 0; x_tile < ubuf->
tiles_dims[0]; x_tile += 1) {
668 const char *ibuf_filepath,
669 const int ibuf_fileframe)
672 if (
STREQ(ubuf->ibuf_filepath, ibuf_filepath) && ubuf->ibuf_fileframe == ibuf_fileframe) {
685 ubuf->
post =
nullptr;
693 if (ubuf ==
nullptr) {
704 if (
STREQ(image->
id.
name + 2, uh->image_ref.name + 2) && uh->iuser.tile == tile_number) {
714 if (image == uh->image_ref.ptr && uh->iuser.tile == tile_number) {
774 if (uh_prev !=
nullptr) {
777 if (ubuf_reference) {
778 ubuf_reference = ubuf_reference->
post;
782 return ubuf_reference;
847 utile->
rect.
pt = ptile->rect.pt;
848 ptile->rect.pt =
nullptr;
869 if (ubuf_pre->image_dims[0] != ubuf_post->
image_dims[0] ||
870 ubuf_pre->image_dims[1] != ubuf_post->
image_dims[1])
878 us_reference, uh->image_ref.ptr, uh->iuser.tile, ubuf_post) :
882 for (
uint y_tile = 0; y_tile < ubuf_pre->tiles_dims[1]; y_tile += 1) {
884 for (
uint x_tile = 0; x_tile < ubuf_pre->tiles_dims[0]; x_tile += 1) {
887 if ((ubuf_reference !=
nullptr) &&
888 ((ubuf_pre->tiles[
i] ==
nullptr) ||
891 (ubuf_pre->tiles[
i]->users == 1)))
893 if (ubuf_pre->tiles[
i] !=
nullptr) {
896 ubuf_post->
tiles[
i] = ubuf_pre->tiles[
i];
897 ubuf_pre->tiles[
i] =
nullptr;
906 ubuf_pre->tiles[
i] = ubuf_reference->
tiles[
i];
907 ubuf_pre->tiles[
i]->
users += 1;
916 if (ubuf_pre->tiles[
i] !=
nullptr) {
917 ubuf_post->
tiles[
i] = utile;
921 ubuf_pre->tiles[
i] = utile;
922 ubuf_post->
tiles[
i] = utile;
983 while (us_iter != us || (!is_final && us_iter == us)) {
1004 if (us_iter == us) {
1049 foreach_ID_ref_fn(user_data, ((
UndoRefID *)&uh->image_ref));
1096 if (us_p != us_prev) {
1143 iuser->
tile = current_tile->tile_number;
1166 us_reference, image, iuser->
tile, ubuf_pre) :
1169 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
PaintTileMap * paint_tile_map
bool operator==(const PaintTileKey &other) const
blender::Map< PaintTileKey, PaintTile * > map
union PaintTile::@275364016240307256050210375017352137171317126370 rect
char ibuf_filepath[IMB_FILEPATH_SIZE]
struct UndoImageBuf::@263271160035357327315251267115250107172320334243 image_state
UndoRefID_Image image_ref
union UndoImageTile::@040210201047004104306316350105014000227155375126 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()