Blender V4.5
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
91 PartialUpdateUser *user);
92
94 PartialUpdateRegion *r_region);
95
98 protected:
99 virtual ~AbstractTileData() = default;
100
101 public:
107 virtual void init_data(TileNumber tile_number) = 0;
114 virtual void free_data() = 0;
115};
116
121 public:
122 NoTileData(Image * /*image*/, ImageUser * /*image_user*/) {}
123
124 void init_data(TileNumber /*new_tile_number*/) override {}
125
126 void free_data() override {}
127};
128
133 public:
138
146
151 ImageTile *tile = nullptr;
152
158 ImBuf *tile_buffer = nullptr;
159 void *tile_buffer_lock = nullptr;
160
162 {
163 if (image_user != nullptr) {
164 this->image_user = *image_user;
165 }
166 else {
167 /* When no image user is given the lastframe of the image should be used. This reflect the
168 * same logic when using a stencil image in the clone tool. */
169 this->image_user.framenr = image->lastframe;
170 }
171 }
172
173 void init_data(TileNumber new_tile_number) override
174 {
175 image_user.tile = new_tile_number;
176 tile = BKE_image_get_tile(image, new_tile_number);
178 }
179
180 void free_data() override
181 {
183 tile = nullptr;
184 tile_buffer = nullptr;
185 tile_buffer_lock = nullptr;
186 }
187};
188
189template<typename TileData = NoTileData> struct PartialUpdateChecker {
190
196
200 PartialUpdateUser *user;
201
204
208 TileData tile_data;
211
212 private:
213 TileNumber last_tile_number = 0;
214
215 public:
222
227
238 {
242 switch (result) {
244 tile_data.free_data();
245 return result;
246
248 if (last_tile_number == changed_region.tile_number) {
249 return result;
250 }
251 tile_data.free_data();
252 tile_data.init_data(changed_region.tile_number);
253 last_tile_number = changed_region.tile_number;
254 return result;
255
256 default:
258 return result;
259 }
260 }
261 };
262
263 public:
268
273 {
275 user);
276 return CollectResult(this, collect_result);
277 }
278};
279
280} // 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