Skip to content

Commit a4a5d75

Browse files
author
Grok Compression
committed
refactor: remove mutable toRelative/toAbsolute from Rect<T>
Remove absoluteCoordinates state tracking from Rect<T>. Make toRelative() return a new Rect by value instead of mutating in place. Remove toAbsolute() entirely. Simplify setOrigin() by removing the bool parameter. Update ResWindow.h genSplitWindowBuffers to use local copies for relative coordinate computation instead of temporarily mutating members.
1 parent c737920 commit a4a5d75

2 files changed

Lines changed: 26 additions & 61 deletions

File tree

src/lib/core/canvas/resolution/ResWindow.h

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ struct ResWindow
8383
resWindowBufferREL_(new Buf2dAligned(resWindow.width(), resWindow.height())),
8484
resWindowBufferSplitREL_{nullptr, nullptr}
8585
{
86-
resWindowBuffer_->setOrigin(tileCompAtRes_, true);
86+
resWindowBuffer_->setOrigin(tileCompAtRes_);
8787
uint8_t numDecomps =
8888
(resno == 0) ? (uint8_t)(numresolutions - 1U) : (uint8_t)(numresolutions - resno);
8989
Rect32 resWindowPadded;
@@ -96,8 +96,8 @@ struct ResWindow
9696
if(resno > 0)
9797
band = orient == t1::BAND_ORIENT_LL ? Rect32(tileCompAtLowerRes_)
9898
: tileCompAtRes_.tileBand[orient - 1];
99-
bandWindow.setOrigin(band, true);
100-
assert(bandWindow.intersection(band).setOrigin(bandWindow, true) == bandWindow);
99+
bandWindow.setOrigin(band);
100+
assert(bandWindow.intersection(band).setOrigin(bandWindow) == bandWindow);
101101
bandWindowsBoundsPadded_.push_back(bandWindow);
102102
}
103103
// windowed decompression
@@ -108,7 +108,6 @@ struct ResWindow
108108
assert(resno > 0);
109109
resWindowBuffer_->setRect(resWindowPadded);
110110
resWindowBufferREL_->setRect(resWindowBuffer_->toRelative());
111-
resWindowBuffer_->toAbsolute();
112111

113112
for(uint8_t orient = 0; orient < t1::BAND_NUM_ORIENTATIONS; orient++)
114113
{
@@ -118,10 +117,10 @@ struct ResWindow
118117
}
119118
genSplitWindowBuffers(resWindowBufferSplit_, resWindowBuffer_,
120119
bandWindowsBuffersPadded_[t1::BAND_ORIENT_LL],
121-
bandWindowsBuffersPadded_[t1::BAND_ORIENT_LH], true);
120+
bandWindowsBuffersPadded_[t1::BAND_ORIENT_LH], false);
122121
genSplitWindowBuffers(resWindowBufferSplitREL_, resWindowBuffer_,
123122
bandWindowsBuffersPadded_[t1::BAND_ORIENT_LL],
124-
bandWindowsBuffersPadded_[t1::BAND_ORIENT_LH], false);
123+
bandWindowsBuffersPadded_[t1::BAND_ORIENT_LH], true);
125124
}
126125
}
127126
else
@@ -170,31 +169,23 @@ struct ResWindow
170169
}
171170
void genSplitWindowBuffers(Buf2dAligned** resWindowBufferSplit, Buf2dAligned* resWindowBuffer,
172171
Buf2dAligned* bandWindowsBuffersPaddedXL,
173-
Buf2dAligned* bandWindowsBuffersPaddedXH, bool absolute)
172+
Buf2dAligned* bandWindowsBuffersPaddedXH, bool useRelative)
174173
{
175-
if(!absolute)
176-
{
177-
tileCompAtLowerRes_.toRelative();
178-
bandWindowsBuffersPaddedXL->toRelative();
179-
bandWindowsBuffersPaddedXH->toRelative();
180-
}
174+
auto lowerRes = useRelative ? Rect32(tileCompAtLowerRes_).toRelative() : Rect32(tileCompAtLowerRes_);
175+
auto xlBounds = useRelative ? Rect32(bandWindowsBuffersPaddedXL).toRelative()
176+
: Rect32(bandWindowsBuffersPaddedXL);
177+
auto xhBounds = useRelative ? Rect32(bandWindowsBuffersPaddedXH).toRelative()
178+
: Rect32(bandWindowsBuffersPaddedXH);
181179

182180
// two windows formed by horizontal pass and used as input for vertical pass
183-
auto splitResWindowBounds = Rect32(resWindowBuffer->x0, bandWindowsBuffersPaddedXL->y0,
184-
resWindowBuffer->x1, bandWindowsBuffersPaddedXL->y1);
181+
auto splitResWindowBounds = Rect32(resWindowBuffer->x0, xlBounds.y0,
182+
resWindowBuffer->x1, xlBounds.y1);
185183
resWindowBufferSplit[SPLIT_L] = new Buf2dAligned(splitResWindowBounds);
186184

187185
splitResWindowBounds =
188-
Rect32(resWindowBuffer->x0, tileCompAtLowerRes_.y1 + bandWindowsBuffersPaddedXH->y0,
189-
resWindowBuffer->x1, tileCompAtLowerRes_.y1 + bandWindowsBuffersPaddedXH->y1);
186+
Rect32(resWindowBuffer->x0, lowerRes.y1 + xhBounds.y0,
187+
resWindowBuffer->x1, lowerRes.y1 + xhBounds.y1);
190188
resWindowBufferSplit[SPLIT_H] = new Buf2dAligned(splitResWindowBounds);
191-
192-
if(!absolute)
193-
{
194-
tileCompAtLowerRes_.toAbsolute();
195-
bandWindowsBuffersPaddedXL->toAbsolute();
196-
bandWindowsBuffersPaddedXH->toAbsolute();
197-
}
198189
}
199190
bool alloc(bool clear)
200191
{
@@ -330,7 +321,7 @@ struct ResWindow
330321
oneLessDecompTile = ResSimple::getBandWindow(numDecomps - 1, 0, unreducedTileComp);
331322
}
332323
paddedResWindow.grow_IN_PLACE(2 * padding).clip_IN_PLACE(oneLessDecompTile);
333-
paddedResWindow.setOrigin(oneLessDecompTile, true);
324+
paddedResWindow.setOrigin(oneLessDecompTile);
334325

335326
return ResSimple::getBandWindow(1, orientation, paddedResWindow);
336327
}

src/lib/core/util/geometry.h

Lines changed: 10 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -173,28 +173,22 @@ template<typename T>
173173
struct Rect
174174
{
175175
Rect(T origin_x0, T origin_y0, T x0, T y0, T x1, T y1)
176-
: absoluteCoordinates(true), origin_x0(origin_x0), origin_y0(origin_y0), x0(x0), y0(y0),
177-
x1(x1), y1(y1)
176+
: origin_x0(origin_x0), origin_y0(origin_y0), x0(x0), y0(y0), x1(x1), y1(y1)
178177
{}
179178
Rect(T x0, T y0, T x1, T y1) : Rect(x0, y0, x0, y0, x1, y1) {}
180179
Rect(const Rect& rhs) : Rect(&rhs) {}
181180
explicit Rect(const Rect* rhs)
182181
: origin_x0(rhs->origin_x0), origin_y0(rhs->origin_y0), x0(rhs->x0), y0(rhs->y0), x1(rhs->x1),
183182
y1(rhs->y1)
184-
{
185-
absoluteCoordinates = rhs->absoluteCoordinates;
186-
}
183+
{}
187184
Rect(void) : Rect(0, 0, 0, 0) {}
188185
virtual ~Rect() = default;
189186

190-
bool absoluteCoordinates;
191187
T origin_x0, origin_y0;
192188
T x0, y0, x1, y1;
193189

194-
Rect<T>& setOrigin(T origx, T origy, bool absolute)
190+
Rect<T>& setOrigin(T origx, T origy)
195191
{
196-
absoluteCoordinates = absolute;
197-
198192
assert(x0 >= origx);
199193
assert(y0 >= origy);
200194

@@ -203,14 +197,12 @@ struct Rect
203197

204198
return *this;
205199
}
206-
Rect<T>& setOrigin(const Rect<T>& rhs, bool absolute)
200+
Rect<T>& setOrigin(const Rect<T>& rhs)
207201
{
208-
return setOrigin(&rhs, absolute);
202+
return setOrigin(&rhs);
209203
}
210-
Rect<T>& setOrigin(const Rect<T>* rhs, bool absolute)
204+
Rect<T>& setOrigin(const Rect<T>* rhs)
211205
{
212-
absoluteCoordinates = absolute;
213-
214206
if(rhs)
215207
{
216208
assert(x0 >= rhs->origin_x0);
@@ -221,23 +213,12 @@ struct Rect
221213

222214
return *this;
223215
}
224-
Rect<T>& toRelative(void)
216+
/// Return a copy with origin subtracted from coordinates (absolute → relative).
217+
Rect<T> toRelative(void) const
225218
{
226219
assert(x0 >= origin_x0);
227220
assert(y0 >= origin_y0);
228-
if(absoluteCoordinates)
229-
pan_IN_PLACE(-(int64_t)origin_x0, -(int64_t)origin_y0);
230-
absoluteCoordinates = false;
231-
232-
return *this;
233-
}
234-
Rect<T>& toAbsolute(void)
235-
{
236-
if(!absoluteCoordinates)
237-
pan_IN_PLACE(origin_x0, origin_y0);
238-
absoluteCoordinates = true;
239-
240-
return *this;
221+
return pan(-(int64_t)origin_x0, -(int64_t)origin_y0);
241222
}
242223
virtual void print(void) const
243224
{
@@ -263,7 +244,6 @@ struct Rect
263244
{
264245
if(*this != rhs)
265246
{ // self-assignment check expected
266-
absoluteCoordinates = rhs.absoluteCoordinates;
267247
origin_x0 = rhs.origin_x0;
268248
origin_y0 = rhs.origin_y0;
269249
x0 = rhs.x0;
@@ -290,7 +270,7 @@ struct Rect
290270
{
291271
if(this == &rhs)
292272
return true;
293-
return absoluteCoordinates == rhs.absoluteCoordinates && origin_x0 == rhs.origin_x0 &&
273+
return origin_x0 == rhs.origin_x0 &&
294274
origin_y0 == rhs.origin_y0 && x0 == rhs.x0 && y0 == rhs.y0 && x1 == rhs.x1 &&
295275
y1 == rhs.y1;
296276
}
@@ -346,13 +326,11 @@ struct Rect
346326
}
347327
Rect<T> intersection(const Rect<T>& rhs) const
348328
{
349-
assert(absoluteCoordinates == rhs.absoluteCoordinates);
350329

351330
return intersection(&rhs);
352331
}
353332
Rect<T> clip(const Rect* rhs) const
354333
{
355-
assert(absoluteCoordinates == rhs->absoluteCoordinates);
356334
return Rect<T>(std::max<T>(x0, rhs->x0), std::max<T>(y0, rhs->y0), std::min<T>(x1, rhs->x1),
357335
std::min<T>(y1, rhs->y1));
358336
}
@@ -371,21 +349,18 @@ struct Rect
371349
}
372350
Rect<T>& clip_IN_PLACE(const Rect& rhs)
373351
{
374-
assert(absoluteCoordinates == rhs.absoluteCoordinates);
375352
*this = Rect<T>(std::max<T>(x0, rhs.x0), std::max<T>(y0, rhs.y0), std::min<T>(x1, rhs.x1),
376353
std::min<T>(y1, rhs.y1));
377354

378355
return *this;
379356
}
380357
Rect<T> intersection(const Rect* rhs) const
381358
{
382-
assert(absoluteCoordinates == rhs->absoluteCoordinates);
383359
return Rect<T>(std::max<T>(x0, rhs->x0), std::max<T>(y0, rhs->y0), std::min<T>(x1, rhs->x1),
384360
std::min<T>(y1, rhs->y1));
385361
}
386362
bool nonEmptyIntersection(const Rect* rhs) const
387363
{
388-
assert(absoluteCoordinates == rhs->absoluteCoordinates);
389364
return std::max<T>(x0, rhs->x0) < std::min<T>(x1, rhs->x1) &&
390365
std::max<T>(y0, rhs->y0) < std::min<T>(y1, rhs->y1);
391366
}
@@ -396,7 +371,6 @@ struct Rect
396371
}
397372
Rect<T> rectUnion(const Rect* rhs) const
398373
{
399-
assert(absoluteCoordinates == rhs->absoluteCoordinates);
400374
return Rect<T>(std::min<T>(x0, rhs->x0), std::min<T>(y0, rhs->y0), std::max<T>(x1, rhs->x1),
401375
std::max<T>(y1, rhs->y1));
402376
}

0 commit comments

Comments
 (0)