Skip to content

Commit 1ec9090

Browse files
huww98胡玮文
authored and
胡玮文
committed
Support negative stride
Add support for negative stride to FrameBuffer Slice. Change data type of stride from size_t to ptrdiff_t. Add support for negative stride in `copyIntoFrameBuffer` and `copyFromFrameBuffer`. Add a new `testNegativeStride` test. Fixes: #614 Signed-off-by: 胡玮文 <[email protected]>
1 parent 436fcd2 commit 1ec9090

25 files changed

+325
-152
lines changed

src/lib/OpenEXR/ImfAcesFile.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ AcesOutputFile::~AcesOutputFile ()
190190

191191
void
192192
AcesOutputFile::setFrameBuffer (
193-
const Rgba* base, size_t xStride, size_t yStride)
193+
const Rgba* base, ptrdiff_t xStride, ptrdiff_t yStride)
194194
{
195195
_data->rgbaFile->setFrameBuffer (base, xStride, yStride);
196196
}
@@ -282,11 +282,11 @@ class AcesInputFile::Data
282282

283283
RgbaInputFile* rgbaFile;
284284

285-
Rgba* fbBase;
286-
size_t fbXStride;
287-
size_t fbYStride;
288-
int minX;
289-
int maxX;
285+
Rgba* fbBase;
286+
ptrdiff_t fbXStride;
287+
ptrdiff_t fbYStride;
288+
int minX;
289+
int maxX;
290290

291291
bool mustConvertColor;
292292
M44f fileToAces;
@@ -440,7 +440,7 @@ AcesInputFile::~AcesInputFile ()
440440
}
441441

442442
void
443-
AcesInputFile::setFrameBuffer (Rgba* base, size_t xStride, size_t yStride)
443+
AcesInputFile::setFrameBuffer (Rgba* base, ptrdiff_t xStride, ptrdiff_t yStride)
444444
{
445445
_data->rgbaFile->setFrameBuffer (base, xStride, yStride);
446446
_data->fbBase = base;

src/lib/OpenEXR/ImfAcesFile.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class IMF_EXPORT_TYPE AcesOutputFile
150150
//------------------------------------------------
151151

152152
IMF_EXPORT
153-
void setFrameBuffer (const Rgba* base, size_t xStride, size_t yStride);
153+
void setFrameBuffer (const Rgba* base, ptrdiff_t xStride, ptrdiff_t yStride);
154154

155155
//-------------------------------------------------
156156
// Write pixel data (see class Imf::OutputFile)
@@ -247,7 +247,7 @@ class IMF_EXPORT_TYPE AcesInputFile
247247
//-----------------------------------------------------
248248

249249
IMF_EXPORT
250-
void setFrameBuffer (Rgba* base, size_t xStride, size_t yStride);
250+
void setFrameBuffer (Rgba* base, ptrdiff_t xStride, ptrdiff_t yStride);
251251

252252
//--------------------------------------------
253253
// Read pixel data (see class Imf::InputFile)

src/lib/OpenEXR/ImfCRgbaFile.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ ImfCloseOutputFile (ImfOutputFile* out)
947947

948948
int
949949
ImfOutputSetFrameBuffer (
950-
ImfOutputFile* out, const ImfRgba* base, size_t xStride, size_t yStride)
950+
ImfOutputFile* out, const ImfRgba* base, ptrdiff_t xStride, ptrdiff_t yStride)
951951
{
952952
try
953953
{
@@ -1043,8 +1043,8 @@ int
10431043
ImfTiledOutputSetFrameBuffer (
10441044
ImfTiledOutputFile* out,
10451045
const ImfRgba* base,
1046-
size_t xStride,
1047-
size_t yStride)
1046+
ptrdiff_t xStride,
1047+
ptrdiff_t yStride)
10481048
{
10491049
try
10501050
{
@@ -1165,7 +1165,7 @@ ImfCloseInputFile (ImfInputFile* in)
11651165

11661166
int
11671167
ImfInputSetFrameBuffer (
1168-
ImfInputFile* in, ImfRgba* base, size_t xStride, size_t yStride)
1168+
ImfInputFile* in, ImfRgba* base, ptrdiff_t xStride, ptrdiff_t yStride)
11691169
{
11701170
try
11711171
{
@@ -1245,7 +1245,7 @@ ImfCloseTiledInputFile (ImfTiledInputFile* in)
12451245

12461246
int
12471247
ImfTiledInputSetFrameBuffer (
1248-
ImfTiledInputFile* in, ImfRgba* base, size_t xStride, size_t yStride)
1248+
ImfTiledInputFile* in, ImfRgba* base, ptrdiff_t xStride, ptrdiff_t yStride)
12491249
{
12501250
try
12511251
{

src/lib/OpenEXR/ImfCRgbaFile.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ int ImfCloseOutputFile (ImfOutputFile* out);
297297

298298
IMF_EXPORT
299299
int ImfOutputSetFrameBuffer (
300-
ImfOutputFile* out, const ImfRgba* base, size_t xStride, size_t yStride);
300+
ImfOutputFile* out, const ImfRgba* base, ptrdiff_t xStride, ptrdiff_t yStride);
301301

302302
IMF_EXPORT
303303
int ImfOutputWritePixels (ImfOutputFile* out, int numScanLines);
@@ -335,8 +335,8 @@ IMF_EXPORT
335335
int ImfTiledOutputSetFrameBuffer (
336336
ImfTiledOutputFile* out,
337337
const ImfRgba* base,
338-
size_t xStride,
339-
size_t yStride);
338+
ptrdiff_t xStride,
339+
ptrdiff_t yStride);
340340

341341
IMF_EXPORT
342342
int ImfTiledOutputWriteTile (
@@ -385,7 +385,7 @@ int ImfCloseInputFile (ImfInputFile* in);
385385

386386
IMF_EXPORT
387387
int ImfInputSetFrameBuffer (
388-
ImfInputFile* in, ImfRgba* base, size_t xStride, size_t yStride);
388+
ImfInputFile* in, ImfRgba* base, ptrdiff_t xStride, ptrdiff_t yStride);
389389

390390
IMF_EXPORT
391391
int ImfInputReadPixels (ImfInputFile* in, int scanLine1, int scanLine2);
@@ -414,7 +414,7 @@ int ImfCloseTiledInputFile (ImfTiledInputFile* in);
414414

415415
IMF_EXPORT
416416
int ImfTiledInputSetFrameBuffer (
417-
ImfTiledInputFile* in, ImfRgba* base, size_t xStride, size_t yStride);
417+
ImfTiledInputFile* in, ImfRgba* base, ptrdiff_t xStride, ptrdiff_t yStride);
418418

419419
IMF_EXPORT
420420
int

src/lib/OpenEXR/ImfDeepFrameBuffer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
1414
DeepSlice::DeepSlice (
1515
PixelType t,
1616
char* b,
17-
size_t xst,
18-
size_t yst,
17+
ptrdiff_t xst,
18+
ptrdiff_t yst,
1919
size_t spst,
2020
int xsm,
2121
int ysm,

src/lib/OpenEXR/ImfDeepFrameBuffer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ struct IMF_EXPORT_TYPE DeepSlice : public Slice
4949
DeepSlice (
5050
PixelType type = HALF,
5151
char* base = 0,
52-
size_t xStride = 0,
53-
size_t yStride = 0,
52+
ptrdiff_t xStride = 0,
53+
ptrdiff_t yStride = 0,
5454
size_t sampleStride = 0,
5555
int xSampling = 1,
5656
int ySampling = 1,

src/lib/OpenEXR/ImfDeepScanLineInputFile.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ struct InSliceInfo
6262
PixelType typeInFile;
6363
char* base;
6464
char* pointerArrayBase;
65-
size_t xPointerStride;
66-
size_t yPointerStride;
65+
ptrdiff_t xPointerStride;
66+
ptrdiff_t yPointerStride;
6767
size_t sampleStride;
6868
int xSampling;
6969
int ySampling;
@@ -75,8 +75,8 @@ struct InSliceInfo
7575
PixelType typeInFrameBuffer = HALF,
7676
char* base = NULL,
7777
PixelType typeInFile = HALF,
78-
size_t xPointerStride = 0,
79-
size_t yPointerStride = 0,
78+
ptrdiff_t xPointerStride = 0,
79+
ptrdiff_t yPointerStride = 0,
8080
size_t sampleStride = 0,
8181
int xSampling = 1,
8282
int ySampling = 1,
@@ -89,8 +89,8 @@ InSliceInfo::InSliceInfo (
8989
PixelType tifb,
9090
char* b,
9191
PixelType tifl,
92-
size_t xpst,
93-
size_t ypst,
92+
ptrdiff_t xpst,
93+
ptrdiff_t ypst,
9494
size_t spst,
9595
int xsm,
9696
int ysm,

src/lib/OpenEXR/ImfDeepTiledInputFile.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ struct TInSliceInfo
6060
PixelType typeInFrameBuffer;
6161
PixelType typeInFile;
6262
char* pointerArrayBase;
63-
size_t xStride;
64-
size_t yStride;
63+
ptrdiff_t xStride;
64+
ptrdiff_t yStride;
6565
ptrdiff_t sampleStride;
6666
bool fill;
6767
bool skip;
@@ -73,8 +73,8 @@ struct TInSliceInfo
7373
PixelType typeInFrameBuffer = HALF,
7474
char* base = NULL,
7575
PixelType typeInFile = HALF,
76-
size_t xStride = 0,
77-
size_t yStride = 0,
76+
ptrdiff_t xStride = 0,
77+
ptrdiff_t yStride = 0,
7878
ptrdiff_t sampleStride = 0,
7979
bool fill = false,
8080
bool skip = false,
@@ -87,8 +87,8 @@ TInSliceInfo::TInSliceInfo (
8787
PixelType tifb,
8888
char* b,
8989
PixelType tifl,
90-
size_t xs,
91-
size_t ys,
90+
ptrdiff_t xs,
91+
ptrdiff_t ys,
9292
ptrdiff_t spst,
9393
bool f,
9494
bool s,

src/lib/OpenEXR/ImfDeepTiledOutputFile.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,17 +71,17 @@ struct TOutSliceInfo
7171
PixelType type;
7272
const char* base;
7373
size_t sampleStride;
74-
size_t xStride;
75-
size_t yStride;
74+
ptrdiff_t xStride;
75+
ptrdiff_t yStride;
7676
bool zero;
7777
int xTileCoords;
7878
int yTileCoords;
7979

8080
TOutSliceInfo (
8181
PixelType type = HALF,
8282
size_t sampleStride = 0,
83-
size_t xStride = 0,
84-
size_t yStride = 0,
83+
ptrdiff_t xStride = 0,
84+
ptrdiff_t yStride = 0,
8585
bool zero = false,
8686
int xTileCoords = 0,
8787
int yTileCoords = 0);
@@ -90,8 +90,8 @@ struct TOutSliceInfo
9090
TOutSliceInfo::TOutSliceInfo (
9191
PixelType t,
9292
size_t spst,
93-
size_t xStride,
94-
size_t yStride,
93+
ptrdiff_t xStride,
94+
ptrdiff_t yStride,
9595
bool z,
9696
int xtc,
9797
int ytc)

src/lib/OpenEXR/ImfFrameBuffer.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
2222
Slice::Slice (
2323
PixelType t,
2424
char* b,
25-
size_t xst,
26-
size_t yst,
25+
ptrdiff_t xst,
26+
ptrdiff_t yst,
2727
int xsm,
2828
int ysm,
2929
double fv,
@@ -49,8 +49,8 @@ Slice::Make (
4949
const IMATH_NAMESPACE::V2i& origin,
5050
int64_t w,
5151
int64_t h,
52-
size_t xStride,
53-
size_t yStride,
52+
ptrdiff_t xStride,
53+
ptrdiff_t yStride,
5454
int xSampling,
5555
int ySampling,
5656
double fillValue,
@@ -69,7 +69,7 @@ Slice::Make (
6969
THROW (IEX_NAMESPACE::ArgExc, "Invalid pixel type.");
7070
}
7171
}
72-
if (yStride == 0) yStride = static_cast<size_t> (w / xSampling) * xStride;
72+
if (yStride == 0) yStride = (w / xSampling) * xStride;
7373

7474
// data window is an int, so force promote to higher type to avoid
7575
// overflow for off y (degenerate size checks should be in
@@ -99,8 +99,8 @@ Slice::Make (
9999
PixelType type,
100100
const void* ptr,
101101
const IMATH_NAMESPACE::Box2i& dataWindow,
102-
size_t xStride,
103-
size_t yStride,
102+
ptrdiff_t xStride,
103+
ptrdiff_t yStride,
104104
int xSampling,
105105
int ySampling,
106106
double fillValue,

src/lib/OpenEXR/ImfFrameBuffer.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ struct IMF_EXPORT_TYPE Slice
6363
//---------------------------------------------------------------------
6464

6565
char* base;
66-
size_t xStride;
67-
size_t yStride;
66+
ptrdiff_t xStride;
67+
ptrdiff_t yStride;
6868

6969
//--------------------------------------------
7070
// Subsampling: pixel (x, y) is present in the
@@ -107,8 +107,8 @@ struct IMF_EXPORT_TYPE Slice
107107
Slice (
108108
PixelType type = HALF,
109109
char* base = 0,
110-
size_t xStride = 0,
111-
size_t yStride = 0,
110+
ptrdiff_t xStride = 0,
111+
ptrdiff_t yStride = 0,
112112
int xSampling = 1,
113113
int ySampling = 1,
114114
double fillValue = 0.0,
@@ -127,8 +127,8 @@ struct IMF_EXPORT_TYPE Slice
127127
const IMATH_NAMESPACE::V2i& origin,
128128
int64_t w,
129129
int64_t h,
130-
size_t xStride = 0,
131-
size_t yStride = 0,
130+
ptrdiff_t xStride = 0,
131+
ptrdiff_t yStride = 0,
132132
int xSampling = 1,
133133
int ySampling = 1,
134134
double fillValue = 0.0,
@@ -141,8 +141,8 @@ struct IMF_EXPORT_TYPE Slice
141141
PixelType type,
142142
const void* ptr,
143143
const IMATH_NAMESPACE::Box2i& dataWindow,
144-
size_t xStride = 0,
145-
size_t yStride = 0,
144+
ptrdiff_t xStride = 0,
145+
ptrdiff_t yStride = 0,
146146
int xSampling = 1,
147147
int ySampling = 1,
148148
double fillValue = 0.0,

0 commit comments

Comments
 (0)