Blender V5.0
BKE_image_partial_update.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
15
16#pragma once
17
18#include "DNA_vec_types.h"
19
20#include "BKE_image.hh"
21#include "BKE_image_wrappers.hh"
22
23#include "DNA_image_types.h"
24
25extern "C" {
26struct PartialUpdateUser;
27}
28
30
31/* --- image_partial_update.cc --- */
33
47
64
75
94 PartialUpdateUser *user);
95
97 PartialUpdateRegion *r_region);
98
101 protected:
102 virtual ~AbstractTileData() = default;
103
104 public:
110 virtual void init_data(TileNumber tile_number) = 0;
117 virtual void free_data() = 0;
118};
119
124 public:
125 NoTileData(Image * /*image*/, ImageUser * /*image_user*/) {}
126
127 void init_data(TileNumber /*new_tile_number*/) override {}
128
129 void free_data() override {}
130};
131
136 public:
141
149
154 ImageTile *tile = nullptr;
155
161 ImBuf *tile_buffer = nullptr;
162 void *tile_buffer_lock = nullptr;
163
165 {
166 if (image_user != nullptr) {
167 this->image_user = *image_user;
168 }
169 else {
170 /* When no image user is given the lastframe of the image should be used. This reflect the
171 * same logic when using a stencil image in the clone tool. */
172 this->image_user.framenr = image->lastframe;
173 }
174 }
175
176 void init_data(TileNumber new_tile_number) override
177 {
178 image_user.tile = new_tile_number;
179 tile = BKE_image_get_tile(image, new_tile_number);
181 }
182
183 void free_data() override
184 {
186 tile = nullptr;
187 tile_buffer = nullptr;
188 tile_buffer_lock = nullptr;
189 }
190};
191
192template<typename TileData = NoTileData> struct PartialUpdateChecker {
193
199
203 PartialUpdateUser *user;
204
207
211 TileData tile_data;
214
215 private:
216 TileNumber last_tile_number = 0;
217
218 public:
225
230
241 {
245 switch (result) {
247 tile_data.free_data();
248 return result;
249
251 if (last_tile_number == changed_region.tile_number) {
252 return result;
253 }
254 tile_data.free_data();
255 tile_data.init_data(changed_region.tile_number);
256 last_tile_number = changed_region.tile_number;
257 return result;
258
259 default:
261 return result;
262 }
263 }
264 };
265
266 public:
271
276 {
278 user);
279 return CollectResult(this, collect_result);
280 }
281};
282
283} // namespace blender::bke::image::partial_update
ImBuf * BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **r_lock)
void BKE_image_release_ibuf(Image *ima, ImBuf *ibuf, void *lock)
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define BLI_assert(a)
Definition BLI_assert.h:46
Abstract class to load tile data when using the PartialUpdateChecker.
virtual void free_data()=0
Unload the data that has been loaded.
virtual void init_data(TileNumber tile_number)=0
Load the data for the given tile_number.
ImageTile * tile
ImageTile associated with the loaded tile. Data is not owned by this instance but by the image.
void free_data() override
Unload the data that has been loaded.
void init_data(TileNumber new_tile_number) override
Load the data for the given tile_number.
Image * image
Not owned Image that is being iterated over.
void init_data(TileNumber) override
Load the data for the given tile_number.
void free_data() override
Unload the data that has been loaded.
ePartialUpdateCollectResult BKE_image_partial_update_collect_changes(Image *image, PartialUpdateUser *user)
collect the partial update since the last request.
ePartialUpdateIterResult BKE_image_partial_update_get_next_change(PartialUpdateUser *user, PartialUpdateRegion *r_region)
ePartialUpdateCollectResult
Result codes of BKE_image_partial_update_collect_changes.
@ PartialChangesDetected
Changes detected since the last time requested.
@ FullUpdateNeeded
Unable to construct partial updates. Caller should perform a full update.
@ NoChangesDetected
No changes detected since the last time requested.
ePartialUpdateIterResult
Return codes of BKE_image_partial_update_get_next_change.
CollectResult(PartialUpdateChecker< TileData > *checker, ePartialUpdateCollectResult result_code)
ePartialUpdateIterResult get_next_change()
Load the next changed region.
PartialUpdateChecker(Image *image, ImageUser *image_user, PartialUpdateUser *user)
PartialUpdateUser * user
the collected changes are stored inside the PartialUpdateUser.
Image * image
Not owned Image that is being iterated over.
CollectResult collect_changes()
Check for new changes since the last time this method was invoked for this user.
rcti region
region of the image that has been updated. Region can be bigger than actual changes.
TileNumber tile_number
Tile number (UDIM) that this region belongs to.
void * BKE_image_get_tile
Definition stubs.c:36