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)),
73 slice(0), sliceWidth(0),
74 sliceOffset(0), slices(),
78 memset(colourMatrix, 0,
sizeof(colourMatrix));
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;
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;
214 return d->colourMatrix;
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++) {
223 d->colourMatrix[i] = matrix[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()) {
264 d->sliceWidth = d->slices[0];
271 void RawData::setSlices(
const std::vector<uint16_t> & slices)
275 d->sliceWidth = slices[0];
278 d->sliceWidth = width();
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())
345 pos = (uint8_t*)(self->data()) + offset;
349 void RawData::Private::nextSlice()
351 if(slices.size() >
slice) {
355 if(slices.size() >
slice) {
363 void RawData::Private::advance(
size_t s)
365 if(offset + s - row_offset >=
sliceWidth * 2) {
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard. I guess it failed.
::or_error getRenderedImage(BitmapData &bitmapdata, uint32_t options)
double colourMatrix[MAX_MATRIX_SIZE]
const double * getColourMatrix2(uint32_t &size) const
::or_error getRawData(RawData &rawdata, uint32_t options)
RawData & append(uint16_t c)
virtual void setDimensions(uint32_t x, uint32_t y)
static const CfaPattern * twoByTwoPattern(::or_cfa_pattern)
void swap(BitmapData &with)
::or_cfa_pattern patternType() const
const CfaPattern * cfaPattern() const
void setDataType(DataType _type)
DataType dataType() const
virtual void setDimensions(uint32_t x, uint32_t y) override
static RawFile * newRawFile(const char *_filename, Type _typeHint=OR_RAWFILE_TYPE_UNKNOWN)
const double * getColourMatrix1(uint32_t &size) const