Skip to content

Commit 1342293

Browse files
committed
moved RawImageDataU16 specific methods to their class
1 parent e9b863b commit 1342293

27 files changed

+124
-56
lines changed

src/librawspeed/common/DngOpcodes.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,10 @@ class DngOpcodes::FixBadPixelsConstant final : public DngOpcodes::DngOpcode {
8181

8282
void apply(RawImageData* ri) override {
8383
MutexLocker guard(&ri->mBadPixelMutex);
84-
const CroppedArray2DRef<uint16_t> img(ri->getU16DataAsCroppedArray2DRef());
84+
auto rawU16 = dynamic_cast<RawImageDataU16*>(ri);
85+
assert(rawU16);
86+
const CroppedArray2DRef<uint16_t> img(
87+
rawU16->getU16DataAsCroppedArray2DRef());
8588
iPoint2D crop = ri->getCropOffset();
8689
uint32_t offset = crop.x | (crop.y << 16);
8790
for (auto row = 0; row < img.croppedHeight; ++row) {

src/librawspeed/common/RawImage.h

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,6 @@ class RawImageData : public ErrorLog {
118118
void blitFrom(RawImageData *src, const iPoint2D& srcPos,
119119
const iPoint2D& size, const iPoint2D& destPos);
120120
[[nodiscard]] rawspeed::RawImageType getDataType() const { return dataType; }
121-
[[nodiscard]] Array2DRef<uint16_t>
122-
getU16DataAsUncroppedArray2DRef() const noexcept;
123-
[[nodiscard]] CroppedArray2DRef<uint16_t>
124-
getU16DataAsCroppedArray2DRef() const noexcept;
125121
[[nodiscard]] uint8_t* getData() const;
126122
uint8_t*
127123
getData(uint32_t x,
@@ -198,6 +194,10 @@ class RawImageDataU16 final : public RawImageData {
198194
void scaleBlackWhite() override;
199195
void calculateBlackAreas() override;
200196
void setWithLookUp(uint16_t value, uint8_t* dst, uint32_t* random) override;
197+
[[nodiscard]] Array2DRef<uint16_t>
198+
getU16DataAsUncroppedArray2DRef() const noexcept;
199+
[[nodiscard]] CroppedArray2DRef<uint16_t>
200+
getU16DataAsCroppedArray2DRef() const noexcept;
201201

202202
private:
203203
void scaleValues_plain(int start_y, int end_y);
@@ -226,25 +226,11 @@ class RawImageDataFloat final : public RawImageData {
226226
friend class RawImage;
227227
};
228228

229-
inline Array2DRef<uint16_t>
230-
RawImageData::getU16DataAsUncroppedArray2DRef() const noexcept {
231-
assert(dataType == RawImageType::UINT16 &&
232-
"Attempting to access floating-point buffer as uint16_t.");
233-
assert(data && "Data not yet allocated.");
234-
return {reinterpret_cast<uint16_t*>(data), cpp * uncropped_dim.x,
235-
uncropped_dim.y, static_cast<int>(pitch / sizeof(uint16_t))};
236-
}
237-
238-
inline CroppedArray2DRef<uint16_t>
239-
RawImageData::getU16DataAsCroppedArray2DRef() const noexcept {
240-
return {getU16DataAsUncroppedArray2DRef(), cpp * mOffset.x, mOffset.y,
241-
cpp * dim.x, dim.y};
242-
}
243-
244229
// setWithLookUp will set a single pixel by using the lookup table if supplied,
245-
// You must supply the destination where the value should be written, and a pointer to
246-
// a value that will be used to store a random counter that can be reused between calls.
247-
// this needs to be inline to speed up tight decompressor loops
230+
// You must supply the destination where the value should be written, and a
231+
// pointer to a value that will be used to store a random counter that can be
232+
// reused between calls. this needs to be inline to speed up tight decompressor
233+
// loops
248234
inline void RawImageDataU16::setWithLookUp(uint16_t value, uint8_t* dst,
249235
uint32_t* random) {
250236
auto* dest = reinterpret_cast<uint16_t*>(dst);
@@ -267,6 +253,19 @@ inline void RawImageDataU16::setWithLookUp(uint16_t value, uint8_t* dst,
267253
*dest = table->tables[value];
268254
}
269255

256+
inline Array2DRef<uint16_t>
257+
RawImageDataU16::getU16DataAsUncroppedArray2DRef() const noexcept {
258+
assert(data && "Data not yet allocated.");
259+
return {reinterpret_cast<uint16_t*>(data), cpp * uncropped_dim.x,
260+
uncropped_dim.y, static_cast<int>(pitch / sizeof(uint16_t))};
261+
}
262+
263+
inline CroppedArray2DRef<uint16_t>
264+
RawImageDataU16::getU16DataAsCroppedArray2DRef() const noexcept {
265+
return {getU16DataAsUncroppedArray2DRef(), cpp * mOffset.x, mOffset.y,
266+
cpp * dim.x, dim.y};
267+
}
268+
270269
class RawImageCurveGuard final {
271270
RawImageData* mRaw;
272271
const std::vector<uint16_t>& curve;

src/librawspeed/decoders/Cr2Decoder.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,10 @@ void Cr2Decoder::sRawInterpolate() {
371371
mRaw->metadata.subsampling = subsampledRaw->metadata.subsampling;
372372
mRaw->isCFA = false;
373373

374+
auto rawU16 = dynamic_cast<RawImageDataU16*>(subsampledRaw.get());
375+
assert(rawU16);
374376
Cr2sRawInterpolator i(mRaw.get(),
375-
subsampledRaw->getU16DataAsUncroppedArray2DRef(),
377+
rawU16->getU16DataAsUncroppedArray2DRef(),
376378
sraw_coeffs, hue);
377379

378380
/* Determine sRaw coefficients */

src/librawspeed/decoders/IiqDecoder.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,9 @@ void IiqDecoder::CorrectQuadrantMultipliersCombined(ByteStream data,
311311

312312
for (int quadRow = 0; quadRow < 2; quadRow++) {
313313
for (int quadCol = 0; quadCol < 2; quadCol++) {
314-
const Array2DRef<uint16_t> img(mRaw->getU16DataAsUncroppedArray2DRef());
314+
auto rawU16 = dynamic_cast<RawImageDataU16*>(mRaw.get());
315+
assert(rawU16);
316+
const Array2DRef<uint16_t> img(rawU16->getU16DataAsUncroppedArray2DRef());
315317

316318
const Spline<> s(control_points[quadRow][quadCol]);
317319
const std::vector<uint16_t> curve = s.calculateCurve();
@@ -387,7 +389,9 @@ void IiqDecoder::handleBadPixel(const uint16_t col, const uint16_t row) const {
387389
}
388390

389391
void IiqDecoder::correctBadColumn(const uint16_t col) const {
390-
const Array2DRef<uint16_t> img(mRaw->getU16DataAsUncroppedArray2DRef());
392+
auto rawU16 = dynamic_cast<RawImageDataU16*>(mRaw.get());
393+
assert(rawU16);
394+
const Array2DRef<uint16_t> img(rawU16->getU16DataAsUncroppedArray2DRef());
391395

392396
for (int row = 2; row < mRaw->dim.y - 2; row++) {
393397
if (mRaw->cfa.getColorAt(col, row) == CFAColor::GREEN) {

src/librawspeed/decoders/NefDecoder.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,9 @@ void NefDecoder::DecodeUncompressed() const {
305305
void NefDecoder::readCoolpixSplitRaw(ByteStream input, const iPoint2D& size,
306306
const iPoint2D& offset,
307307
int inputPitch) const {
308-
const Array2DRef<uint16_t> img(mRaw->getU16DataAsUncroppedArray2DRef());
308+
auto rawU16 = dynamic_cast<RawImageDataU16*>(mRaw.get());
309+
assert(rawU16);
310+
const Array2DRef<uint16_t> img(rawU16->getU16DataAsUncroppedArray2DRef());
309311

310312
if (size.y % 2 != 0)
311313
ThrowRDE("Odd number of rows");
@@ -659,7 +661,9 @@ void NefDecoder::DecodeNikonSNef(const ByteStream& input) const {
659661
uint16_t tmp;
660662
auto* tmpch = reinterpret_cast<uint8_t*>(&tmp);
661663

662-
const Array2DRef<uint16_t> out(mRaw->getU16DataAsUncroppedArray2DRef());
664+
auto rawU16 = dynamic_cast<RawImageDataU16*>(mRaw.get());
665+
assert(rawU16);
666+
const Array2DRef<uint16_t> out(rawU16->getU16DataAsUncroppedArray2DRef());
663667
const uint8_t* in = input.peekData(out.width * out.height);
664668

665669
for (int row = 0; row < out.height; row++) {

src/librawspeed/decoders/RafDecoder.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,12 @@ void RafDecoder::applyCorrections(const Camera* cam) {
228228
rotated->metadata = mRaw->metadata;
229229
rotated->metadata.fujiRotationPos = rotationPos;
230230

231-
auto srcImg = mRaw->getU16DataAsUncroppedArray2DRef();
232-
auto dstImg = rotated->getU16DataAsUncroppedArray2DRef();
231+
auto rawU16 = dynamic_cast<RawImageDataU16*>(mRaw.get());
232+
assert(rawU16);
233+
auto srcImg = rawU16->getU16DataAsUncroppedArray2DRef();
234+
auto rotatedU16 = dynamic_cast<RawImageDataU16*>(rotated.get());
235+
assert(rotatedU16);
236+
auto dstImg = rotatedU16->getU16DataAsUncroppedArray2DRef();
233237

234238
for (int y = 0; y < new_size.y; y++) {
235239
for (int x = 0; x < new_size.x; x++) {

src/librawspeed/decompressors/Cr2Decompressor.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,9 @@ void Cr2Decompressor::decode(const Cr2Slicing& slicing_) {
131131
template <int N_COMP, int X_S_F, int Y_S_F>
132132
void Cr2Decompressor::decodeN_X_Y()
133133
{
134-
const Array2DRef<uint16_t> out(mRaw->getU16DataAsUncroppedArray2DRef());
134+
auto rawU16 = dynamic_cast<RawImageDataU16*>(mRaw);
135+
assert(rawU16);
136+
const Array2DRef<uint16_t> out(rawU16->getU16DataAsUncroppedArray2DRef());
135137

136138
// To understand the CR2 slice handling and sampling factor behavior, see
137139
// https://github.com/lclevy/libcraw2/blob/master/docs/cr2_lossless.pdf?raw=true

src/librawspeed/decompressors/CrwDecompressor.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,9 @@ inline void CrwDecompressor::decodeBlock(std::array<int16_t, 64>* diffBuf,
204204

205205
// FIXME: this function is horrible.
206206
void CrwDecompressor::decompress() {
207-
const Array2DRef<uint16_t> out(mRaw->getU16DataAsUncroppedArray2DRef());
207+
auto rawU16 = dynamic_cast<RawImageDataU16*>(mRaw);
208+
assert(rawU16);
209+
const Array2DRef<uint16_t> out(rawU16->getU16DataAsUncroppedArray2DRef());
208210
assert(out.width > 0);
209211
assert(out.width % 4 == 0);
210212
assert(out.height > 0);

src/librawspeed/decompressors/FujiDecompressor.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,9 @@ template <typename T>
178178
void FujiDecompressor::copy_line(fuji_compressed_block* info,
179179
const FujiStrip& strip, int cur_line,
180180
T&& idx) const {
181-
const Array2DRef<uint16_t> out(mRaw->getU16DataAsUncroppedArray2DRef());
181+
auto rawU16 = dynamic_cast<RawImageDataU16*>(mRaw);
182+
assert(rawU16);
183+
const Array2DRef<uint16_t> out(rawU16->getU16DataAsUncroppedArray2DRef());
182184

183185
std::array<uint16_t*, 3> lineBufB;
184186
std::array<uint16_t*, 6> lineBufG;

src/librawspeed/decompressors/HasselbladDecompressor.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ void HasselbladDecompressor::decodeScan() {
6767
frame.w, frame.h, mRaw->dim.x, mRaw->dim.y);
6868
}
6969

70-
const Array2DRef<uint16_t> out(mRaw->getU16DataAsUncroppedArray2DRef());
70+
auto rawU16 = dynamic_cast<RawImageDataU16*>(mRaw);
71+
assert(rawU16);
72+
const Array2DRef<uint16_t> out(rawU16->getU16DataAsUncroppedArray2DRef());
7173

7274
assert(out.height > 0);
7375
assert(out.width > 0);

0 commit comments

Comments
 (0)