29 #include <libopenraw/consts.h>
30 #include <libopenraw/debug.h>
32 #include "bitmapdata.hpp"
33 #include "rawdata.hpp"
34 #include "cfapattern.hpp"
35 #include "rawfile.hpp"
36 #include "render/bimedian_demosaic.hpp"
37 #include "render/grayscale.hpp"
42 static const int MAX_MATRIX_SIZE = 12;
47 uint16_t blackLevel, whiteLevel;
48 ExifPhotometricInterpretation photometricInterpretation;
58 std::vector<uint16_t> slices;
61 uint32_t colourMatrixCount;
62 double colourMatrix2[MAX_MATRIX_SIZE];
63 uint32_t colourMatrix2Count;
67 blackLevel(0), whiteLevel(0),
68 photometricInterpretation(EV_PI_CFA),
69 cfa_pattern(
CfaPattern::twoByTwoPattern(OR_CFA_PATTERN_NONE)),
79 memset(colourMatrix2, 0,
sizeof(colourMatrix2));
81 void advance(
size_t s);
91 RawData::getAndExtractRawData(
const char* filename, uint32_t options,
104 err = OR_ERROR_CANT_OPEN;
112 d(new RawData::Private(this))
127 uint32_t _x, _y, out_x, out_y;
130 if(
dataType() != OR_DATA_TYPE_RAW) {
131 LOGDBG1(
"wrong data type\n");
132 return OR_ERROR_INVALID_FORMAT;
134 if(d->photometricInterpretation != EV_PI_CFA &&
135 d->photometricInterpretation != EV_PI_LINEAR_RAW) {
136 LOGDBG1(
"only CFA or LinearRaw are supported.\n");
137 return OR_ERROR_INVALID_FORMAT;
140 or_cfa_pattern pattern;
151 src = (uint16_t*)data();
153 or_error err = OR_ERROR_NONE;
155 if (d->photometricInterpretation == EV_PI_CFA) {
159 uint8_t *dst = (uint8_t *)bitmapdata.allocData(
sizeof(uint8_t) * 3 * _x * _y);
160 err = bimedian_demosaic(src, _x, _y, pattern, dst, out_x, out_y);
168 uint16_t *dst = (uint16_t *)bitmapdata.allocData(
sizeof(uint16_t)
171 err = grayscale_to_rgb(src, _x, _y, dst);
180 uint16_t RawData::blackLevel()
const
182 return d->blackLevel;
185 uint16_t RawData::whiteLevel()
const
187 return d->whiteLevel;
190 void RawData::setBlackLevel(uint16_t m)
195 void RawData::setWhiteLevel(uint16_t m)
200 void RawData::setPhotometricInterpretation(ExifPhotometricInterpretation pi)
202 d->photometricInterpretation = pi;
205 ExifPhotometricInterpretation RawData::getPhotometricInterpretation()
const
207 return d->photometricInterpretation;
213 matrixSize = d->colourMatrixCount;
217 void RawData::setColourMatrix1(
const double* matrix, uint32_t matrixSize)
219 if(matrixSize > MAX_MATRIX_SIZE) {
220 matrixSize = MAX_MATRIX_SIZE;
222 for(uint32_t i = 0; i < matrixSize; i++) {
225 d->colourMatrixCount = matrixSize;
230 matrixSize = d->colourMatrix2Count;
231 return d->colourMatrix2;
234 void RawData::setColourMatrix2(
const double* matrix, uint32_t matrixSize)
236 if(matrixSize > MAX_MATRIX_SIZE) {
237 matrixSize = MAX_MATRIX_SIZE;
239 for(uint32_t i = 0; i < matrixSize; i++) {
240 d->colourMatrix2[i] = matrix[i];
242 d->colourMatrix2Count = matrixSize;
248 std::swap(this->d, with.d);
251 void * RawData::allocData(
const size_t s)
253 void * p = BitmapData::allocData(s);
254 d->pos = (uint8_t*)p;
263 if(d->slices.size()) {
271 void RawData::setSlices(
const std::vector<uint16_t> & slices)
282 void RawData::setCfaPatternType(or_cfa_pattern t)
289 return d->cfa_pattern;
292 void RawData::setCfaPattern(
const CfaPattern* pattern)
294 d->cfa_pattern = pattern;
297 void RawData::setCompression(uint32_t t)
302 uint32_t RawData::compression()
const
304 return d->compression;
311 assert(d->offset < d->data_size);
321 assert(d->offset <
size());
322 *(d->pos) = c & 0xff;
323 *(d->pos + 1) = (c >> 8) & 0xff;
324 d->advance(
sizeof(c));
333 void RawData::Private::nextRow()
335 uint32_t w =
self->width() * 2;
336 uint32_t row = offset / w;
338 if(row == self->height())
344 offset = row * w + sliceOffset * 2;
345 pos = (uint8_t*)(self->data()) + offset;
349 void RawData::Private::nextSlice()
351 if(slices.size() > slice) {
352 sliceOffset += slices[slice];
355 if(slices.size() > slice) {
356 sliceWidth = slices[slice];
363 void RawData::Private::advance(
size_t s)
365 if(offset + s - row_offset >= sliceWidth * 2) {