Blender  V3.3
BKE_image_partial_update.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2021 Blender Foundation. */
3 
15 #pragma once
16 
17 #include "BLI_utildefines.h"
18 
19 #include "BLI_rect.h"
20 
21 #include "DNA_image_types.h"
22 
23 extern "C" {
24 struct PartialUpdateRegister;
25 struct PartialUpdateUser;
26 }
27 
29 
30 using TileNumber = int;
31 
32 namespace partial_update {
33 
34 /* --- image_partial_update.cc --- */
43 
46 
49 };
50 
60  struct rcti region;
61 
66 };
67 
73  Finished = 0,
74 
76  ChangeAvailable = 1,
77 };
78 
94  struct Image *image, struct PartialUpdateUser *user);
95 
97  struct PartialUpdateUser *user, struct 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:
126  {
127  }
128 
129  void init_data(TileNumber UNUSED(new_tile_number)) override
130  {
131  }
132 
133  void free_data() override
134  {
135  }
136 };
137 
142  public:
147 
155 
160  ImageTile *tile = nullptr;
161 
167  ImBuf *tile_buffer = nullptr;
168  void *tile_buffer_lock = nullptr;
169 
171  {
172  if (image_user != nullptr) {
173  this->image_user = *image_user;
174  }
175  else {
176  /* When no image user is given the lastframe of the image should be used. This reflect the
177  * same logic when using a stencil image in the clone tool. */
178  this->image_user.framenr = image->lastframe;
179  }
180  }
181 
182  void init_data(TileNumber new_tile_number) override
183  {
184  image_user.tile = new_tile_number;
185  tile = BKE_image_get_tile(image, new_tile_number);
187  }
188 
189  void free_data() override
190  {
192  tile = nullptr;
193  tile_buffer = nullptr;
194  tile_buffer_lock = nullptr;
195  }
196 };
197 
198 template<typename TileData = NoTileData> struct PartialUpdateChecker {
199 
205 
209  PartialUpdateUser *user;
210 
211  struct CollectResult {
213 
217  TileData tile_data;
220 
221  private:
222  TileNumber last_tile_number = 0;
223 
224  public:
226  : checker(checker),
229  {
230  }
231 
233  {
234  return result_code;
235  }
236 
247  {
250  &changed_region);
251  switch (result) {
253  tile_data.free_data();
254  return result;
255 
257  if (last_tile_number == changed_region.tile_number) {
258  return result;
259  }
260  tile_data.free_data();
262  last_tile_number = changed_region.tile_number;
263  return result;
264 
265  default:
267  return result;
268  }
269  }
270  };
271 
272  public:
275  {
276  }
277 
282  {
284  user);
285  return CollectResult(this, collect_result);
286  }
287 };
288 
289 } // namespace partial_update
290 } // namespace blender::bke::image
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)
#define BLI_assert_unreachable()
Definition: BLI_assert.h:93
#define BLI_assert(a)
Definition: BLI_assert.h:46
#define UNUSED(x)
int lastframe
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 free_data() override
Unload the data that has been loaded.
void init_data(TileNumber UNUSED(new_tile_number)) override
NoTileData(Image *UNUSED(image), ImageUser *UNUSED(image_user))
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
ePartialUpdateCollectResult BKE_image_partial_update_collect_changes(struct Image *image, struct PartialUpdateUser *user)
collect the partial update since the last request.
ePartialUpdateIterResult BKE_image_partial_update_get_next_change(struct PartialUpdateUser *user, struct 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.
struct 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.