Skip to content

Commit f374c42

Browse files
committed
RawImage: change blackLevelSeparate into an Optional<Array2DRef<int>> after all...
1 parent bdc4dcc commit f374c42

File tree

14 files changed

+46
-45
lines changed

14 files changed

+46
-45
lines changed

src/librawspeed/common/RawImage.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ class RawImageData : public ErrorLog {
161161
ColorFilterArray cfa;
162162
int blackLevel = -1;
163163
std::array<int, 4> blackLevelSeparateStorage;
164-
Array2DRef<int> blackLevelSeparate = {blackLevelSeparateStorage.data(), 0, 0};
164+
Optional<Array2DRef<int>> blackLevelSeparate;
165165
int whitePoint = 65536;
166166
std::vector<BlackArea> blackAreas;
167167

src/librawspeed/common/RawImageDataFloat.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ void RawImageDataFloat::calculateBlackAreas() {
8888
}
8989

9090
blackLevelSeparate = Array2DRef(blackLevelSeparateStorage.data(), 2, 2);
91-
auto blackLevelSeparate1D = *blackLevelSeparate.getAsArray1DRef();
91+
auto blackLevelSeparate1D = *blackLevelSeparate->getAsArray1DRef();
9292

9393
if (!totalpixels) {
9494
for (int& i : blackLevelSeparate1D)
@@ -122,8 +122,7 @@ void RawImageDataFloat::scaleBlackWhite() {
122122

123123
const int skipBorder = 150;
124124
int gw = (dim.x - skipBorder) * cpp;
125-
if ((blackAreas.empty() && blackLevelSeparate.width == 0 &&
126-
blackLevelSeparate.height == 0 && blackLevel < 0) ||
125+
if ((blackAreas.empty() && !blackLevelSeparate && blackLevel < 0) ||
127126
whitePoint == 65536) { // Estimate
128127
float b = 100000000;
129128
float m = -10000000;
@@ -143,7 +142,7 @@ void RawImageDataFloat::scaleBlackWhite() {
143142
}
144143

145144
/* If filter has not set separate blacklevel, compute or fetch it */
146-
if (blackLevelSeparate.width == 0 && blackLevelSeparate.height == 0)
145+
if (!blackLevelSeparate)
147146
calculateBlackAreas();
148147

149148
startWorker(RawImageWorker::RawImageWorkerTask::SCALE_VALUES, true);
@@ -154,8 +153,8 @@ void RawImageDataFloat::scaleValues(int start_y, int end_y) {
154153
int gw = dim.x * cpp;
155154
std::array<float, 4> mul;
156155
std::array<float, 4> sub;
157-
assert(blackLevelSeparate.width == 2 && blackLevelSeparate.height == 2);
158-
auto blackLevelSeparate1D = *blackLevelSeparate.getAsArray1DRef();
156+
assert(blackLevelSeparate->width == 2 && blackLevelSeparate->height == 2);
157+
auto blackLevelSeparate1D = *blackLevelSeparate->getAsArray1DRef();
159158
for (int i = 0; i < 4; i++) {
160159
int v = i;
161160
if ((mOffset.x & 1) != 0)

src/librawspeed/common/RawImageDataU16.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ void RawImageDataU16::calculateBlackAreas() {
109109
}
110110

111111
blackLevelSeparate = Array2DRef(blackLevelSeparateStorage.data(), 2, 2);
112-
auto blackLevelSeparate1D = *blackLevelSeparate.getAsArray1DRef();
112+
auto blackLevelSeparate1D = *blackLevelSeparate->getAsArray1DRef();
113113

114114
if (!totalpixels) {
115115
for (int& i : blackLevelSeparate1D)
@@ -147,8 +147,7 @@ void RawImageDataU16::calculateBlackAreas() {
147147
void RawImageDataU16::scaleBlackWhite() {
148148
const int skipBorder = 250;
149149
int gw = (dim.x - skipBorder) * cpp;
150-
if ((blackAreas.empty() && blackLevelSeparate.width == 0 &&
151-
blackLevelSeparate.height == 0 && blackLevel < 0) ||
150+
if ((blackAreas.empty() && !blackLevelSeparate && blackLevel < 0) ||
152151
whitePoint >= 65536) { // Estimate
153152
int b = 65536;
154153
int m = 0;
@@ -171,12 +170,12 @@ void RawImageDataU16::scaleBlackWhite() {
171170

172171
/* Skip, if not needed */
173172
if ((blackAreas.empty() && blackLevel == 0 && whitePoint == 65535 &&
174-
blackLevelSeparate.width == 0 && blackLevelSeparate.height == 0) ||
173+
!blackLevelSeparate) ||
175174
dim.area() <= 0)
176175
return;
177176

178177
/* If filter has not set separate blacklevel, compute or fetch it */
179-
if (blackLevelSeparate.width == 0 && blackLevelSeparate.height == 0)
178+
if (!blackLevelSeparate)
180179
calculateBlackAreas();
181180

182181
startWorker(RawImageWorker::RawImageWorkerTask::SCALE_VALUES, true);
@@ -189,7 +188,7 @@ void RawImageDataU16::scaleValues(int start_y, int end_y) {
189188

190189
#else
191190

192-
int depth_values = whitePoint - blackLevelSeparate(0, 0);
191+
int depth_values = whitePoint - (*blackLevelSeparate)(0, 0);
193192
float app_scale = 65535.0F / implicit_cast<float>(depth_values);
194193

195194
// Check SSE2
@@ -204,8 +203,8 @@ void RawImageDataU16::scaleValues(int start_y, int end_y) {
204203

205204
#ifdef WITH_SSE2
206205
void RawImageDataU16::scaleValues_SSE2(int start_y, int end_y) {
207-
assert(blackLevelSeparate.width == 2 && blackLevelSeparate.height == 2);
208-
auto blackLevelSeparate1D = *blackLevelSeparate.getAsArray1DRef();
206+
assert(blackLevelSeparate->width == 2 && blackLevelSeparate->height == 2);
207+
auto blackLevelSeparate1D = *blackLevelSeparate->getAsArray1DRef();
209208

210209
int depth_values = whitePoint - blackLevelSeparate1D(0);
211210
float app_scale = 65535.0F / implicit_cast<float>(depth_values);
@@ -345,8 +344,8 @@ void RawImageDataU16::scaleValues_SSE2(int start_y, int end_y) {
345344
void RawImageDataU16::scaleValues_plain(int start_y, int end_y) {
346345
const CroppedArray2DRef<uint16_t> img(getU16DataAsCroppedArray2DRef());
347346

348-
assert(blackLevelSeparate.width == 2 && blackLevelSeparate.height == 2);
349-
auto blackLevelSeparate1D = *blackLevelSeparate.getAsArray1DRef();
347+
assert(blackLevelSeparate->width == 2 && blackLevelSeparate->height == 2);
348+
auto blackLevelSeparate1D = *blackLevelSeparate->getAsArray1DRef();
350349

351350
int depth_values = whitePoint - blackLevelSeparate1D(0);
352351
float app_scale = 65535.0F / implicit_cast<float>(depth_values);

src/librawspeed/decoders/ArwDecoder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ void ArwDecoder::GetWB() const {
647647
ThrowRDE("Black Level has %d entries instead of 4", bl->count);
648648
mRaw->blackLevelSeparate =
649649
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
650-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
650+
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate->getAsArray1DRef();
651651
for (int i = 0; i < 4; ++i)
652652
blackLevelSeparate1D(i) = bl->getU16(i) >> mShiftDownScaleForExif;
653653
}

src/librawspeed/decoders/Cr2Decoder.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ bool Cr2Decoder::decodeCanonColorData() const {
407407

408408
mRaw->blackLevelSeparate =
409409
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
410-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
410+
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate->getAsArray1DRef();
411411
for (int c = 0; c != 4; ++c)
412412
blackLevelSeparate1D(c) = wb->getU16(c + levelOffsets->first);
413413

@@ -498,7 +498,7 @@ void Cr2Decoder::decodeMetaDataInternal(const CameraMetaData* meta) {
498498
assert(mShiftUpScaleForExif == 0 || mShiftUpScaleForExif == 2);
499499
if (mShiftUpScaleForExif) {
500500
mRaw->blackLevel = 0;
501-
mRaw->blackLevelSeparate = {mRaw->blackLevelSeparateStorage.data(), 0, 0};
501+
mRaw->blackLevelSeparate = std::nullopt;
502502
}
503503
if (mShiftUpScaleForExif != 0 && isPowerOfTwo(1 + mRaw->whitePoint))
504504
mRaw->whitePoint = ((1 + mRaw->whitePoint) << mShiftUpScaleForExif) - 1;

src/librawspeed/decoders/DngDecoder.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ void DngDecoder::handleMetadata(const TiffIFD* raw) {
633633
mRaw->blackLevel = 0;
634634
mRaw->blackLevelSeparate =
635635
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
636-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
636+
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate->getAsArray1DRef();
637637
std::fill(blackLevelSeparate1D.begin(), blackLevelSeparate1D.end(), 0);
638638
// FIXME: why do we provide both the `blackLevel` and `blackLevelSeparate`?
639639
mRaw->whitePoint = 65535;
@@ -819,7 +819,7 @@ bool DngDecoder::decodeBlackLevels(const TiffIFD* raw) const {
819819
if (black_entry->count < blackdim.area())
820820
ThrowRDE("BLACKLEVEL entry is too small");
821821

822-
using BlackType = decltype(mRaw->blackLevelSeparate)::value_type;
822+
using BlackType = decltype(mRaw->blackLevelSeparateStorage)::value_type;
823823

824824
if (blackdim.x < 2 || blackdim.y < 2) {
825825
// We so not have enough to fill all individually, read a single and copy it
@@ -831,15 +831,15 @@ bool DngDecoder::decodeBlackLevels(const TiffIFD* raw) const {
831831

832832
mRaw->blackLevelSeparate =
833833
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
834-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
834+
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate->getAsArray1DRef();
835835
for (int y = 0; y < 2; y++) {
836836
for (int x = 0; x < 2; x++)
837837
blackLevelSeparate1D(y * 2 + x) = implicit_cast<int>(value);
838838
}
839839
} else {
840840
mRaw->blackLevelSeparate =
841841
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
842-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
842+
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate->getAsArray1DRef();
843843
for (int y = 0; y < 2; y++) {
844844
for (int x = 0; x < 2; x++) {
845845
float value = black_entry->getFloat(y * blackdim.x + x);
@@ -864,7 +864,7 @@ bool DngDecoder::decodeBlackLevels(const TiffIFD* raw) const {
864864
for (int i = 0; i < mRaw->dim.y; i++)
865865
black_sum[i & 1] += blackleveldeltav->getFloat(i);
866866

867-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
867+
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate->getAsArray1DRef();
868868
for (int i = 0; i < 4; i++) {
869869
const float value =
870870
black_sum[i >> 1] / static_cast<float>(mRaw->dim.y) * 2.0F;
@@ -888,7 +888,7 @@ bool DngDecoder::decodeBlackLevels(const TiffIFD* raw) const {
888888
for (int i = 0; i < mRaw->dim.x; i++)
889889
black_sum[i & 1] += blackleveldeltah->getFloat(i);
890890

891-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
891+
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate->getAsArray1DRef();
892892
for (int i = 0; i < 4; i++) {
893893
const float value =
894894
black_sum[i & 1] / static_cast<float>(mRaw->dim.x) * 2.0F;
@@ -914,7 +914,7 @@ void DngDecoder::setBlack(const TiffIFD* raw) const {
914914
// FIXME: is this the right thing to do?
915915
mRaw->blackLevelSeparate =
916916
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
917-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
917+
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate->getAsArray1DRef();
918918
std::fill(blackLevelSeparate1D.begin(), blackLevelSeparate1D.end(), 0);
919919

920920
if (raw->hasEntry(TiffTag::BLACKLEVEL))

src/librawspeed/decoders/NefDecoder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ void NefDecoder::decodeMetaDataInternal(const CameraMetaData* meta) {
630630
const int sh = 14 - bitPerPixel;
631631
mRaw->blackLevelSeparate =
632632
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
633-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
633+
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate->getAsArray1DRef();
634634
blackLevelSeparate1D(0) = bl->getU16(0) >> sh;
635635
blackLevelSeparate1D(1) = bl->getU16(1) >> sh;
636636
blackLevelSeparate1D(2) = bl->getU16(2) >> sh;

src/librawspeed/decoders/OrfDecoder.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,8 @@ void OrfDecoder::decodeMetaDataInternal(const CameraMetaData* meta) {
318318
if (blackEntry->count == 4) {
319319
mRaw->blackLevelSeparate =
320320
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
321-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
321+
auto blackLevelSeparate1D =
322+
*mRaw->blackLevelSeparate->getAsArray1DRef();
322323
for (int i = 0; i < 4; i++) {
323324
auto c = mRaw->cfa.getColorAt(i & 1, i >> 1);
324325
int j;

src/librawspeed/decoders/PefDecoder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ void PefDecoder::decodeMetaDataInternal(const CameraMetaData* meta) {
133133
if (black->count == 4) {
134134
mRaw->blackLevelSeparate =
135135
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
136-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
136+
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate->getAsArray1DRef();
137137
for (int i = 0; i < 4; i++)
138138
blackLevelSeparate1D(i) = black->getU32(i);
139139
}

src/librawspeed/decoders/RafDecoder.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,13 +301,13 @@ void RafDecoder::decodeMetaDataInternal(const CameraMetaData* meta) {
301301
if (sep_black->count == 4) {
302302
mRaw->blackLevelSeparate =
303303
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
304-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
304+
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate->getAsArray1DRef();
305305
for (int k = 0; k < 4; k++)
306306
blackLevelSeparate1D(k) = sep_black->getU32(k);
307307
} else if (sep_black->count == 36) {
308308
mRaw->blackLevelSeparate =
309309
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
310-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
310+
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate->getAsArray1DRef();
311311
for (int& k : blackLevelSeparate1D)
312312
k = 0;
313313

@@ -323,7 +323,7 @@ void RafDecoder::decodeMetaDataInternal(const CameraMetaData* meta) {
323323

324324
// Set black level to average of EXIF data, can be overridden by XML data.
325325
int sum = 0;
326-
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
326+
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate->getAsArray1DRef();
327327
for (int b : blackLevelSeparate1D)
328328
sum += b;
329329
mRaw->blackLevel = (sum + 2) >> 2;

0 commit comments

Comments
 (0)