Grok  10.0.3
ResWindow.h
Go to the documentation of this file.
1 
17 #pragma once
18 
19 #include "grk_includes.h"
20 #include <stdexcept>
21 #include <algorithm>
22 
23 /*
24  Various coordinate systems are used to describe regions in the tile component buffer.
25 
26  1) Canvas coordinates: JPEG 2000 global image coordinates.
27 
28  2) Tile component coordinates: canvas coordinates with sub-sampling applied
29 
30  3) Band coordinates: coordinates relative to a specified sub-band's origin
31 
32  4) Buffer coordinates: coordinate system where all resolutions are translated
33  to common origin (0,0). If each code block is translated relative to the origin of the
34  resolution that **it belongs to**, the blocks are then all in buffer coordinate system
35 
36  Note: the name of any method or variable returning non canvas coordinates is appended
37  with "REL", to signify relative coordinates.
38 
39  */
40 
41 namespace grk
42 {
43 
45 {
49 };
50 
51 template<typename T>
52 struct TileComponentWindow;
53 template<typename T>
54 struct TileComponentWindowBase;
55 
68 template<typename T>
69 struct ResWindow
70 {
71  friend struct TileComponentWindowBase<T>;
72  friend struct TileComponentWindow<T>;
74 
75  private:
76  ResWindow(uint8_t numresolutions, uint8_t resno, Buf2dAligned* resWindowHighestResREL,
77  ResSimple tileCompAtRes, ResSimple tileCompAtLowerRes, grk_rect32 resWindow,
78  grk_rect32 tileCompWindowUnreduced, grk_rect32 tileCompUnreduced,
79  uint32_t FILTER_WIDTH)
80  : allocated_(false), filterWidth_(FILTER_WIDTH), tileCompAtRes_(tileCompAtRes),
81  tileCompAtLowerRes_(tileCompAtLowerRes),
82  resWindowBuffer_(new Buf2dAligned(resWindow)), resWindowBufferSplit_{nullptr, nullptr},
83  resWindowBufferHighestResREL_(resWindowHighestResREL),
84  resWindowBufferREL_(new Buf2dAligned(resWindow.width(), resWindow.height())),
85  resWindowBufferSplitREL_{nullptr, nullptr}
86  {
88  uint8_t numDecomps =
89  (resno == 0) ? (uint8_t)(numresolutions - 1U) : (uint8_t)(numresolutions - resno);
90  grk_rect32 resWindowPadded;
91  for(uint8_t orient = 0; orient < ((resno) > 0 ? BAND_NUM_ORIENTATIONS : 1); orient++)
92  {
93  // todo: should only need padding equal to FILTER_WIDTH, not 2*FILTER_WIDTH
94  auto bandWindow =
95  getPaddedBandWindow(numDecomps, orient, tileCompWindowUnreduced, tileCompUnreduced,
96  2 * FILTER_WIDTH, resWindowPadded);
98  if(resno > 0)
100  : tileCompAtRes_.tileBand[orient - 1];
101  bandWindow.setOrigin(band, true);
102  assert(bandWindow.intersection(band).setOrigin(bandWindow, true) == bandWindow);
103  bandWindowsBoundsPadded_.push_back(bandWindow);
104  }
105  // windowed decompression
106  if(FILTER_WIDTH)
107  {
109  {
110  assert(resno > 0);
111  resWindowBuffer_->setRect(resWindowPadded);
114 
115  for(uint8_t orient = 0; orient < BAND_NUM_ORIENTATIONS; orient++)
116  {
117  auto bandWindow = bandWindowsBoundsPadded_[orient];
118  bandWindowsBuffersPadded_.push_back(new Buf2dAligned(bandWindow, true));
120  new Buf2dAligned(bandWindow.toRelative(), true));
121  }
128  }
129  }
130  else
131  {
132  assert(tileCompAtRes_.numTileBandWindows == 3 ||
133  !tileCompAtLowerRes.numTileBandWindows);
134 
135  // dummy LL band window
137  {
138  bandWindowsBuffersPadded_.push_back(new Buf2dAligned(0, 0));
139  bandWindowsBuffersPaddedREL_.push_back(new Buf2dAligned(0, 0));
140  for(uint32_t i = 0; i < tileCompAtRes_.numTileBandWindows; ++i)
141  {
142  auto tileCompBand = tileCompAtRes_.tileBand + i;
143 
144  auto band = grk_rect32(tileCompBand);
145  bandWindowsBuffersPadded_.push_back(new Buf2dAligned(band));
146  bandWindowsBuffersPaddedREL_.push_back(new Buf2dAligned(band.toRelative()));
147  }
148  for(uint8_t i = 0; i < SPLIT_NUM_ORIENTATIONS; i++)
149  {
151  split.y0 = (resWindowBuffer_->y0 == 0
152  ? 0
153  : ceildivpow2<uint32_t>(resWindowBuffer_->y0 - i, 1));
154  split.y1 = (resWindowBuffer_->y1 == 0
155  ? 0
156  : ceildivpow2<uint32_t>(resWindowBuffer_->y1 - i, 1));
157  resWindowBufferSplit_[i] = new Buf2dAligned(split);
159  }
160  }
161  }
162  }
164  {
165  delete resWindowBufferREL_;
166  for(auto& b : bandWindowsBuffersPaddedREL_)
167  delete b;
168  for(uint32_t i = 0; i < SPLIT_NUM_ORIENTATIONS; ++i)
169  delete resWindowBufferSplitREL_[i];
170 
171  delete resWindowBuffer_;
172  for(auto& b : bandWindowsBuffersPadded_)
173  delete b;
174  for(uint32_t i = 0; i < SPLIT_NUM_ORIENTATIONS; ++i)
175  delete resWindowBufferSplit_[i];
176  }
177  void genSplitWindowBuffers(Buf2dAligned** resWindowBufferSplit, Buf2dAligned* resWindowBuffer,
178  Buf2dAligned* bandWindowsBuffersPaddedXL,
179  Buf2dAligned* bandWindowsBuffersPaddedXH, bool absolute)
180  {
181  if(!absolute)
182  {
184  bandWindowsBuffersPaddedXL->toRelative();
185  bandWindowsBuffersPaddedXH->toRelative();
186  }
187 
188  // two windows formed by horizontal pass and used as input for vertical pass
189  auto splitResWindowBounds = grk_rect32(resWindowBuffer->x0, bandWindowsBuffersPaddedXL->y0,
190  resWindowBuffer->x1, bandWindowsBuffersPaddedXL->y1);
191  resWindowBufferSplit[SPLIT_L] = new Buf2dAligned(splitResWindowBounds);
192 
193  splitResWindowBounds = grk_rect32(
194  resWindowBuffer->x0, tileCompAtLowerRes_.y1 + bandWindowsBuffersPaddedXH->y0,
195  resWindowBuffer->x1, tileCompAtLowerRes_.y1 + bandWindowsBuffersPaddedXH->y1);
196  resWindowBufferSplit[SPLIT_H] = new Buf2dAligned(splitResWindowBounds);
197 
198  if(!absolute)
199  {
201  bandWindowsBuffersPaddedXL->toAbsolute();
202  bandWindowsBuffersPaddedXH->toAbsolute();
203  }
204  }
205  bool alloc(bool clear)
206  {
207  if(allocated_)
208  return true;
209 
210  // if top level window is present, then all buffers attach to this window
212  {
213  // ensure that top level window is allocated
215  return false;
216 
217  // don't allocate bandWindows for windowed decompression
218  if(filterWidth_)
219  return true;
220 
221  // attach to top level window
224 
225  // tileCompResLower_ is null for lowest resolution
227  {
228  for(uint8_t orientation = 0; orientation < bandWindowsBuffersPaddedREL_.size();
229  ++orientation)
230  {
231  switch(orientation)
232  {
233  case BAND_ORIENT_HL:
234  bandWindowsBuffersPaddedREL_[orientation]->attach(
236  break;
237  case BAND_ORIENT_LH:
238  bandWindowsBuffersPaddedREL_[orientation]->attach(
240  break;
241  case BAND_ORIENT_HH:
242  bandWindowsBuffersPaddedREL_[orientation]->attach(
245  break;
246  default:
247  break;
248  }
249  }
253  }
254 
255  // attach canvas windows to relative windows
256  for(uint8_t orientation = 0; orientation < bandWindowsBuffersPaddedREL_.size();
257  ++orientation)
258  {
259  bandWindowsBuffersPadded_[orientation]->attach(
260  bandWindowsBuffersPaddedREL_[orientation]);
261  }
263  for(uint8_t i = 0; i < SPLIT_NUM_ORIENTATIONS; ++i)
264  {
267  }
268  }
269  else
270  {
271  // 1. allocate resolution window
272  // resolution window is always allocated
273  if(!resWindowBufferREL_->alloc2d(clear))
274  return false;
276 
277  // 2, allocate padded band windows
278  // band windows are allocated if present
279  for(auto& b : bandWindowsBuffersPadded_)
280  {
281  if(!b->alloc2d(clear))
282  return false;
283  }
284  for(uint8_t orientation = 0; orientation < bandWindowsBuffersPaddedREL_.size();
285  ++orientation)
286  {
287  bandWindowsBuffersPaddedREL_[orientation]->attach(
288  bandWindowsBuffersPaddedREL_[orientation]);
289  }
290 
291  // 3. allocate split windows
293  {
295  {
299  }
300  else
301  {
304  }
305  for(uint8_t i = 0; i < SPLIT_NUM_ORIENTATIONS; ++i)
306  {
309  }
310  }
311  }
312 
313  allocated_ = true;
314 
315  return true;
316  }
317 
325  static grk_rect32 getPaddedBandWindow(uint8_t numDecomps, uint8_t orientation,
326  grk_rect32 unreducedTileCompWindow,
327  grk_rect32 unreducedTileComp, uint32_t padding,
328  grk_rect32& paddedResWindow)
329  {
330  assert(orientation < BAND_NUM_ORIENTATIONS);
331  if(numDecomps == 0)
332  {
333  assert(orientation == 0);
334  return unreducedTileCompWindow.grow_IN_PLACE(padding).intersection(&unreducedTileComp);
335  }
336  paddedResWindow = unreducedTileCompWindow;
337  auto oneLessDecompTile = unreducedTileComp;
338  if(numDecomps > 1)
339  {
340  paddedResWindow = ResSimple::getBandWindow(numDecomps - 1, 0, unreducedTileCompWindow);
341  oneLessDecompTile = ResSimple::getBandWindow(numDecomps - 1, 0, unreducedTileComp);
342  }
343  paddedResWindow.grow_IN_PLACE(2 * padding).clip_IN_PLACE(&oneLessDecompTile);
344  paddedResWindow.setOrigin(oneLessDecompTile, true);
345 
346  return ResSimple::getBandWindow(1, orientation, paddedResWindow);
347  }
348 
350  {
351  return resWindowBuffer_->simple();
352  }
354  {
355  return resWindowBuffer_->simpleF();
356  }
358  {
360  }
362  {
363  return resWindowBufferSplitREL_[orientation];
364  }
366  {
367  return &bandWindowsBoundsPadded_[orientation];
368  }
370  {
371  return bandWindowsBuffersPaddedREL_[orientation];
372  }
375  {
376  return bandWindowsBuffersPadded_[orientation]->simple();
377  }
380  {
381  return bandWindowsBuffersPadded_[orientation]->simpleF();
382  }
384  {
385  return resWindowBufferREL_;
386  }
388  uint32_t filterWidth_;
389 
390  ResSimple tileCompAtRes_; // numTileBandWindows> 0 will trigger creation of band window buffers
391  ResSimple tileCompAtLowerRes_; // numTileBandWindows==0 for lowest resolution
392 
395  std::vector<Buf2dAligned*> bandWindowsBuffersPadded_;
396 
397  /*
398  bandWindowsBoundsPadded_ is used for determining which precincts and code blocks overlap
399  the window of interest, in each respective resolution
400  */
401  std::vector<grk_rect32> bandWindowsBoundsPadded_;
402 
406  std::vector<Buf2dAligned*> bandWindowsBuffersPaddedREL_;
407 };
408 
409 } // namespace grk
Copyright (C) 2016-2022 Grok Image Compression Inc.
Definition: ICacheable.h:20
eSplitOrientation
Definition: ResWindow.h:45
@ SPLIT_H
Definition: ResWindow.h:47
@ SPLIT_L
Definition: ResWindow.h:46
@ SPLIT_NUM_ORIENTATIONS
Definition: ResWindow.h:48
grk_rect< uint32_t > grk_rect32
Definition: geometry.h:61
eBandOrientation
Definition: ResSimple.h:23
@ BAND_ORIENT_HH
Definition: ResSimple.h:27
@ BAND_ORIENT_HL
Definition: ResSimple.h:25
@ BAND_NUM_ORIENTATIONS
Definition: ResSimple.h:28
@ BAND_ORIENT_LH
Definition: ResSimple.h:26
@ BAND_ORIENT_LL
Definition: ResSimple.h:24
Definition: ResSimple.h:43
grk_rect32 tileBand[BAND_NUM_INDICES]
Definition: ResSimple.h:110
uint8_t numTileBandWindows
Definition: ResSimple.h:111
static grk_rect32 getBandWindow(uint8_t numDecomps, uint8_t orientation, grk_rect32 tileCompWindowUnreduced)
Get band window (in tile component coordinates) for specified number of decompositions.
Definition: ResSimple.h:77
ResWindow.
Definition: ResWindow.h:70
Buf2dAligned * getResWindowBufferSplitREL(eSplitOrientation orientation) const
Definition: ResWindow.h:361
void genSplitWindowBuffers(Buf2dAligned **resWindowBufferSplit, Buf2dAligned *resWindowBuffer, Buf2dAligned *bandWindowsBuffersPaddedXL, Buf2dAligned *bandWindowsBuffersPaddedXH, bool absolute)
Definition: ResWindow.h:177
uint32_t filterWidth_
Definition: ResWindow.h:388
ResSimple tileCompAtRes_
Definition: ResWindow.h:390
const grk_rect32 * getBandWindowPadded(eBandOrientation orientation) const
Definition: ResWindow.h:365
ResWindow(uint8_t numresolutions, uint8_t resno, Buf2dAligned *resWindowHighestResREL, ResSimple tileCompAtRes, ResSimple tileCompAtLowerRes, grk_rect32 resWindow, grk_rect32 tileCompWindowUnreduced, grk_rect32 tileCompUnreduced, uint32_t FILTER_WIDTH)
Definition: ResWindow.h:76
const Buf2dAligned * getBandWindowBufferPaddedREL(eBandOrientation orientation) const
Definition: ResWindow.h:369
Buf2dAligned * resWindowBufferSplit_[SPLIT_NUM_ORIENTATIONS]
Definition: ResWindow.h:394
bool allocated_
Definition: ResWindow.h:387
Buf2dAligned * resWindowBufferHighestResREL_
Definition: ResWindow.h:403
std::vector< Buf2dAligned * > bandWindowsBuffersPadded_
Definition: ResWindow.h:395
~ResWindow()
Definition: ResWindow.h:163
Buf2dAligned * getResWindowBufferREL(void) const
Definition: ResWindow.h:383
grk_buf2d_simple< int32_t > getResWindowBufferSimple(void) const
Definition: ResWindow.h:349
const grk_buf2d_simple< int32_t > getBandWindowBufferPaddedSimple(eBandOrientation orientation) const
Definition: ResWindow.h:374
Buf2dAligned * resWindowBufferSplitREL_[SPLIT_NUM_ORIENTATIONS]
Definition: ResWindow.h:405
grk_buf2d_simple< float > getResWindowBufferSimpleF(void) const
Definition: ResWindow.h:353
Buf2dAligned * resWindowBufferREL_
Definition: ResWindow.h:404
const grk_buf2d_simple< float > getBandWindowBufferPaddedSimpleF(eBandOrientation orientation) const
Definition: ResWindow.h:379
void disableBandWindowAllocation(void)
Definition: ResWindow.h:357
std::vector< grk_rect32 > bandWindowsBoundsPadded_
Definition: ResWindow.h:401
ResSimple tileCompAtLowerRes_
Definition: ResWindow.h:391
static grk_rect32 getPaddedBandWindow(uint8_t numDecomps, uint8_t orientation, grk_rect32 unreducedTileCompWindow, grk_rect32 unreducedTileComp, uint32_t padding, grk_rect32 &paddedResWindow)
Get band window (in tile component coordinates) for specified number of decompositions (with padding)
Definition: ResWindow.h:325
Buf2dAligned * resWindowBuffer_
Definition: ResWindow.h:393
bool alloc(bool clear)
Definition: ResWindow.h:205
grk_buf2d< T, AllocatorAligned > Buf2dAligned
Definition: ResWindow.h:73
std::vector< Buf2dAligned * > bandWindowsBuffersPaddedREL_
Definition: ResWindow.h:406
Definition: TileComponentWindow.h:54
Definition: TileComponentWindow.h:160
Definition: buffer.h:206
Definition: buffer.h:230
void attach(T *buffer, uint32_t strd)
Definition: buffer.h:293
grk_buf2d_simple< T > simple(void) const
Definition: buffer.h:248
bool alloc2d(bool clear)
Definition: buffer.h:271
grk_buf2d_simple< float > simpleF(void) const
Definition: buffer.h:252
T width() const
Definition: geometry.h:335
T y1
Definition: geometry.h:124
grk_rect< T > & grow_IN_PLACE(T boundary)
Definition: geometry.h:368
T x0
Definition: geometry.h:124
T x1
Definition: geometry.h:124
grk_rect< T > & clip_IN_PLACE(const grk_rect< T > &rhs)
Definition: geometry.h:301
grk_rect< T > & toRelative(void)
Definition: geometry.h:156
T height() const
Definition: geometry.h:339
bool valid(void) const
Definition: geometry.h:185
grk_rect< T > & setOrigin(T origx, T origy, bool absolute)
Definition: geometry.h:126
grk_rect< T > intersection(const grk_rect< T > rhs) const
Definition: geometry.h:281
void setRect(grk_rect< T > *rhs)
Definition: geometry.h:228
grk_rect< T > & toAbsolute(void)
Definition: geometry.h:166
T y0
Definition: geometry.h:124