Blender V4.3
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
16#pragma once
17
18#include "BLI_utildefines.h"
19
20#include "BLI_rect.h"
21
22#include "BKE_image_wrappers.hh"
23
24#include "DNA_image_types.h"
25
26extern "C" {
27struct PartialUpdateUser;
28}
29
31
32namespace partial_update {
33
34/* --- image_partial_update.cc --- */
50
60 struct rcti region;
61
66};
67
73 Finished = 0,
74
77};
78
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
164 ImageTileData(Image *image, ImageUser *image_user) : image(image)
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
265
266 public:
267 PartialUpdateChecker(Image *image, ImageUser *image_user, PartialUpdateUser *user)
268 : image(image), image_user(image_user), user(user)
269 {
270 }
271
276 {
278 user);
279 return CollectResult(this, collect_result);
280 }
281};
282
283} // namespace partial_update
284} // namespace blender::bke::image
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:97
#define BLI_assert(a)
Definition BLI_assert.h:50
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.
Load the ImageTile and ImBuf associated with the partial change.
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.
Class to not load any tile specific data when iterating over changes.
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.
@ Finished
no tiles left when iterating over tiles.
@ ChangeAvailable
a chunk was available and has been loaded.
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.
TileNumber tile_number
Tile number (UDIM) that this region belongs to.
void * BKE_image_get_tile
Definition stubs.c:36