154 ptile->valid =
false;
174 if (pptile ==
nullptr) {
184 *r_mask = ptile->
mask;
201 bool use_thread_lock,
204 if (use_thread_lock) {
207 const bool has_float = (ibuf->
rect_float !=
nullptr);
214 paint_tile_map,
image, ibuf, iuser, x_tile, y_tile, r_mask,
true);
216 if (use_thread_lock) {
223 if (*tmpibuf ==
nullptr) {
231 ptile->
iuser = *iuser;
251 *r_valid = &ptile->
valid;
264 SWAP(
float *, ptile->
rect.
fp, (*tmpibuf)->rect_float);
279 [&](
PaintTile **pptile) { *pptile = ptile; },
280 [&](
PaintTile **pptile) { existing_tile = *pptile; });
283 ptile = existing_tile;
286 if (use_thread_lock) {
299 const bool has_float = (ibuf->
rect_float !=
nullptr);
349 BLI_assert(tile_x < tiles_dims[0] && tile_y < tiles_dims[1]);
350 return (tile_y * tiles_dims[0]) + tile_x;
367 utile->
rect.
fp =
static_cast<float *
>(
416 tmpibuf->
rect = prev_rect;
423 if (utile->
users == 0) {
490 for (
uint y_tile = 0; y_tile < ubuf->
tiles_dims[1]; y_tile += 1) {
492 for (
uint x_tile = 0; x_tile < ubuf->
tiles_dims[0]; x_tile += 1) {
499 ubuf->
tiles[i] = utile;
586 bool changed =
false;
592 for (
uint y_tile = 0; y_tile < ubuf->
tiles_dims[1]; y_tile += 1) {
594 for (
uint x_tile = 0; x_tile < ubuf->
tiles_dims[0]; x_tile += 1) {
645 const char *ibuf_name)
648 if (
STREQ(ubuf->ibuf_name, ibuf_name)) {
661 ubuf->
post =
nullptr;
669 if (ubuf ==
nullptr) {
750 if (uh_prev !=
nullptr) {
752 if (ubuf_reference) {
753 ubuf_reference = ubuf_reference->
post;
756 return ubuf_reference;
823 utile->
rect.
pt = ptile->rect.pt;
824 ptile->rect.pt =
nullptr;
845 if (ubuf_pre->image_dims[0] != ubuf_post->
image_dims[0] ||
846 ubuf_pre->image_dims[1] != ubuf_post->
image_dims[1]) {
857 for (
uint y_tile = 0; y_tile < ubuf_pre->tiles_dims[1]; y_tile += 1) {
859 for (
uint x_tile = 0; x_tile < ubuf_pre->tiles_dims[0]; x_tile += 1) {
862 if ((ubuf_reference !=
nullptr) &&
863 ((ubuf_pre->tiles[i] ==
nullptr) ||
866 (ubuf_pre->tiles[i]->users == 1))) {
867 if (ubuf_pre->tiles[i] !=
nullptr) {
870 ubuf_post->
tiles[i] = ubuf_pre->tiles[i];
871 ubuf_pre->tiles[i] =
nullptr;
876 ubuf_post->
tiles[i] = ubuf_reference->
tiles[i];
880 ubuf_pre->tiles[i] = ubuf_reference->
tiles[i];
881 ubuf_pre->tiles[i]->
users += 1;
890 if (ubuf_pre->tiles[i] !=
nullptr) {
891 ubuf_post->
tiles[i] = utile;
895 ubuf_pre->tiles[i] = utile;
896 ubuf_post->
tiles[i] = utile;
957 while (us_iter != us || (!is_final && us_iter == us)) {
1070 if (us_p != us_prev) {
1118 us_reference,
image, iuser->
tile, ubuf_pre) :
1121 if (ubuf_reference) {
struct ScrArea * CTX_wm_area(const bContext *C)
struct Object * CTX_data_active_object(const bContext *C)
void BKE_image_release_ibuf(struct Image *ima, struct ImBuf *ibuf, void *lock)
struct ImBuf * BKE_image_acquire_ibuf(struct Image *ima, struct ImageUser *iuser, void **r_lock)
void BKE_image_partial_update_mark_full_update(struct Image *image)
Mark the whole image to be updated.
void BKE_image_free_gputextures(struct Image *ima)
void BKE_image_mark_dirty(struct Image *image, struct ImBuf *ibuf)
ePaintMode BKE_paintmode_get_active_from_context(const struct bContext *C)
@ UNDOTYPE_FLAG_DECODE_ACTIVE_STEP
UndoStep * BKE_undosys_step_push_init_with_type(UndoStack *ustack, struct bContext *C, const char *name, const UndoType *ut)
eUndoPushReturn BKE_undosys_step_push(UndoStack *ustack, struct bContext *C, const char *name)
UndoStep * BKE_undosys_stack_init_or_active_with_type(UndoStack *ustack, const UndoType *ut)
#define BKE_undosys_stack_limit_steps_and_memory_defaults(ustack)
const UndoType * BKE_UNDOSYS_TYPE_IMAGE
void(* UndoTypeForEachIDRefFn)(void *user_data, struct UndoRefID *id_ref)
#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)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
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(struct ID *id, int flag)
Object is a sort of wrapper for general info.
bool ED_object_mode_set_ex(struct bContext *C, eObjectMode mode, bool use_undo, struct ReportList *reports)
#define ED_IMAGE_UNDO_TILE_NUMBER(size)
#define ED_IMAGE_UNDO_TILE_SIZE
#define ED_IMAGE_UNDO_TILE_BITS
struct UndoStack * ED_undo_stack_get(void)
void ED_editors_init_for_undo(struct Main *bmain)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
void imb_freerectfloatImBuf(struct ImBuf *ibuf)
struct ImBuf * IMB_allocImBuf(unsigned int x, unsigned int y, unsigned char planes, unsigned int flags)
bool imb_addrectfloatImBuf(struct ImBuf *ibuf, const unsigned int channels)
void IMB_rect_size_set(struct ImBuf *ibuf, const uint size[2])
void imb_freerectImbuf_all(struct ImBuf *ibuf)
bool imb_addrectImBuf(struct ImBuf *ibuf)
void IMB_rectcpy(struct ImBuf *dbuf, const struct ImBuf *sbuf, int destx, int desty, int srcx, int srcy, int width, int height)
Contains defines and structs used throughout the imbuf module.
@ IB_DISPLAY_BUFFER_INVALID
#define IMB_FILENAME_SIZE
Read Guarded memory(de)allocation.
ValueIterator values() const
const Value * lookup_ptr(const Key &key) const
auto add_or_modify(const Key &key, const CreateValueF &create_value, const ModifyValueF &modify_value) -> decltype(create_value(nullptr))
depth_tx normal_tx diffuse_light_tx specular_light_tx volume_light_tx environment_tx ambient_occlusion_tx aov_value_tx in_weight_img image(1, GPU_R32F, Qualifier::WRITE, ImageType::FLOAT_2D_ARRAY, "out_weight_img") .image(3
void IMB_freeImBuf(ImBuf *UNUSED(ibuf))
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 utile_decref(UndoImageTile *utile)
static bool image_undosys_step_encode(struct bContext *C, struct Main *UNUSED(bmain), UndoStep *us_p)
static void uhandle_restore_list(ListBase *undo_handles, bool use_init)
static UndoImageTile * utile_alloc(bool has_float)
static void ptile_free(PaintTile *ptile)
PaintTileMap * ED_image_paint_tile_map_get(void)
static void ptile_invalidate_map(PaintTileMap *paint_tile_map)
static void image_undosys_step_encode_init(struct bContext *UNUSED(C), UndoStep *us_p)
static ImageUndoStep * image_undo_push_begin(const char *name, int paint_mode)
static void image_undosys_step_decode(struct bContext *C, struct Main *bmain, UndoStep *us_p, const eUndoStepDir dir, bool is_final)
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)
void ED_image_undo_push_begin(const char *name, int paint_mode)
static void ptile_restore_runtime_map(PaintTileMap *paint_tile_map)
void ED_image_undosys_type(UndoType *ut)
static UndoImageBuf * ubuf_from_image_no_tiles(Image *image, const ImBuf *ibuf)
static void image_undosys_step_decode_undo(ImageUndoStep *us, bool is_final)
void ED_image_paint_tile_lock_end(void)
void ED_image_paint_tile_lock_init(void)
static void image_undosys_foreach_ID_ref(UndoStep *us_p, UndoTypeForEachIDRefFn foreach_ID_ref_fn, void *user_data)
static UndoImageBuf * uhandle_ensure_ubuf(UndoImageHandle *uh, Image *image, ImBuf *ibuf)
static UndoImageBuf * uhandle_add_ubuf(UndoImageHandle *uh, Image *image, ImBuf *ibuf)
static void image_undosys_step_decode_redo(ImageUndoStep *us)
static UndoImageHandle * uhandle_add(ListBase *undo_handles, Image *image, ImageUser *iuser)
void ED_image_undo_push_end(void)
static UndoImageHandle * uhandle_ensure(ListBase *undo_handles, Image *image, ImageUser *iuser)
static void ubuf_ensure_compat_ibuf(const UndoImageBuf *ubuf, ImBuf *ibuf)
static void image_undosys_step_free(UndoStep *us_p)
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 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)
struct UndoImageHandle UndoImageHandle
static uint32_t index_from_xy(uint32_t tile_x, uint32_t tile_y, const uint32_t tiles_dims[2])
static UndoImageBuf * uhandle_lookup_ubuf(UndoImageHandle *uh, const Image *UNUSED(image), const char *ibuf_name)
struct UndoImageBuf UndoImageBuf
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)
static ImBuf * imbuf_alloc_temp_tile()
static UndoImageBuf * ubuf_lookup_from_reference(ImageUndoStep *us_prev, const Image *image, int tile_number, const UndoImageBuf *ubuf)
static SpinLock paint_tiles_lock
static void utile_restore(const UndoImageTile *utile, const uint x, const uint y, ImBuf *ibuf, ImBuf *tmpibuf)
void * BKE_image_get_tile
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
static void area(int d1, int d2, int e1, int e2, float weights[2])
uint64_t get_default_hash_4(const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4)
unsigned __int64 uint64_t
struct ImBuf * mipmap[IMB_MIPMAP_LEVELS]
char name[IMB_FILENAME_SIZE]
PaintTileMap * paint_tile_map
bool operator==(const PaintTileKey &other) const
blender::Map< PaintTileKey, PaintTile * > map
union PaintTile::@530 rect
struct UndoImageBuf::@532 image_state
struct UndoImageBuf * prev
char ibuf_name[IMB_FILENAME_SIZE]
struct UndoImageBuf * post
struct UndoImageBuf * next
UndoRefID_Image image_ref
struct UndoImageHandle * next
struct UndoImageHandle * prev
union UndoImageTile::@531 rect
struct UndoStep * step_active
struct UndoStep * step_init
const struct UndoType * type
void(* step_decode)(struct bContext *C, struct Main *bmain, UndoStep *us, eUndoStepDir dir, bool is_final)
bool(* step_encode)(struct bContext *C, struct Main *bmain, UndoStep *us)
void(* step_encode_init)(struct 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 WM_file_tag_modified(void)