File: rawdata.cpp

package info (click to toggle)
libopenraw 0.1.2-0.4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,484 kB
  • sloc: cpp: 13,907; sh: 4,090; ansic: 1,922; xml: 769; makefile: 676; perl: 42
file content (192 lines) | stat: -rw-r--r-- 5,067 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/*
 * libopenraw - rawdata.cpp
 *
 * Copyright (C) 2007-2016 Hubert Figuiere
 *
 * This library is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation, either version 3 of
 * the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library.  If not, see
 * <http://www.gnu.org/licenses/>.
 */
/* @brief C api for rawdata
 */

#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>

#include <libopenraw/consts.h>
#include <libopenraw/types.h>

#include "rawdata.hpp"
#include "cfapattern.hpp"

namespace OpenRaw {
class BitmapData;
}

using OpenRaw::RawData;
using OpenRaw::BitmapData;

extern "C" {

/** check pointer validity */
#define CHECK_PTR(p, r)                                                        \
    if (p == NULL) {                                                           \
        return r;                                                              \
    }

or_error or_get_extract_rawdata(const char *filename, uint32_t options,
                                ORRawDataRef *rawdata)
{
    or_error ret = OR_ERROR_NONE;

    RawData **pRawData = reinterpret_cast<RawData **>(rawdata);
    *pRawData = RawData::getAndExtractRawData(filename, options, ret);
    return ret;
}

ORRawDataRef or_rawdata_new(void)
{
    RawData *rawdata = new RawData();
    return reinterpret_cast<ORRawDataRef>(rawdata);
}

or_error or_rawdata_release(ORRawDataRef rawdata)
{
    if (rawdata == NULL) {
        return OR_ERROR_NOTAREF;
    }
    delete reinterpret_cast<RawData *>(rawdata);
    return OR_ERROR_NONE;
}

or_data_type or_rawdata_format(ORRawDataRef rawdata)
{
    return reinterpret_cast<RawData *>(rawdata)->dataType();
}

void *or_rawdata_data(ORRawDataRef rawdata)
{
    return reinterpret_cast<RawData *>(rawdata)->data();
}

size_t or_rawdata_data_size(ORRawDataRef rawdata)
{
    return reinterpret_cast<RawData *>(rawdata)->size();
}

void or_rawdata_dimensions(ORRawDataRef rawdata, uint32_t *width,
                           uint32_t *height)
{
    RawData *t = reinterpret_cast<RawData *>(rawdata);
    if (width != NULL) {
        *width = t->width();
    }
    if (height != NULL) {
        *height = t->height();
    }
}

void or_rawdata_get_roi(ORRawDataRef rawdata, uint32_t *x, uint32_t *y,
                        uint32_t *width, uint32_t *height)
{
    RawData *t = reinterpret_cast<RawData *>(rawdata);
    if (x != NULL) {
        *x = t->roi_x();
    }
    if (y != NULL) {
        *y = t->roi_y();
    }
    if (width != NULL) {
        *width = t->roi_width();
    }
    if (height != NULL) {
        *height = t->roi_height();
    }
}

uint32_t or_rawdata_bpc(ORRawDataRef rawdata)
{
    return reinterpret_cast<RawData *>(rawdata)->bpc();
}

or_cfa_pattern or_rawdata_get_cfa_pattern_type(ORRawDataRef rawdata)
{
    return reinterpret_cast<RawData *>(rawdata)->cfaPattern()->patternType();
}

ORCfaPatternRef or_rawdata_get_cfa_pattern(ORRawDataRef rawdata)
{
    return reinterpret_cast<ORCfaPatternRef>(reinterpret_cast<RawData *>(rawdata)->cfaPattern());
}

uint32_t or_rawdata_get_compression(ORRawDataRef rawdata)
{
  return reinterpret_cast<RawData *>(rawdata)->compression();
}

or_error or_rawdata_get_levels(ORRawDataRef rawdata, uint16_t *black,
                               uint16_t *white)
{
    RawData *t = reinterpret_cast<RawData *>(rawdata);
    if (black) {
        *black = t->blackLevel();
    }
    if (white) {
        *white = t->whiteLevel();
    }
    return OR_ERROR_NONE;
}

const double *or_rawdata_get_colour_matrix(ORRawDataRef rawdata, uint32_t index,
                                           uint32_t *size)
{
    uint32_t matrix_size = 0;
    RawData *t = reinterpret_cast<RawData *>(rawdata);
    const double *matrix = nullptr;

    switch (index) {
    case 0:
        matrix = t->getColourMatrix1(matrix_size);
        break;
    case 1:
        matrix = t->getColourMatrix2(matrix_size);
        break;
    default:
        break;
    }

    if (!matrix_size) {
        // a valid pointer might always be returned with size 0.
        // force a return of nullptr.
        // XXX change the C++ API instead?
        matrix = nullptr;
    }
    if (size) {
        *size = matrix_size;
    }

    return matrix;
}

or_error or_rawdata_get_rendered_image(ORRawDataRef rawdata,
                                       ORBitmapDataRef bitmapdata,
                                       uint32_t options)
{
    RawData *prawdata = reinterpret_cast<RawData *>(rawdata);
    CHECK_PTR(rawdata, OR_ERROR_NOTAREF);
    return prawdata->getRenderedImage(
        *reinterpret_cast<BitmapData *>(bitmapdata), options);
}
}