libopenraw  0.3.7
rawfile.cpp
1 /* -*- mode:c++; indent-tabs-mode:nil; c-basic-offset:4; tab-width:4; -*- */
2 /*
3  * libopenraw - rawfile.cpp
4  *
5  * Copyright (C) 2007-2020 Hubert Figuière
6  *
7  * This library is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public License
9  * as published by the Free Software Foundation, either version 3 of
10  * the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library. If not, see
19  * <http://www.gnu.org/licenses/>.
20  */
21 /* @brief C api for rawfile
22  */
23 
24 #include <stddef.h>
25 #include <stdint.h>
26 
27 #include <boost/checked_delete.hpp>
28 
29 #include <libopenraw/consts.h>
30 #include <libopenraw/thumbnails.h>
31 #include <libopenraw/types.h>
32 
33 #include "capi.h"
34 #include "rawfile.hpp"
35 #include "ifddir.hpp"
36 
37 namespace OpenRaw {
38 class BitmapData;
39 class RawData;
40 class Thumbnail;
41 }
42 
43 using OpenRaw::RawFile;
44 using OpenRaw::RawData;
46 using OpenRaw::Thumbnail;
48 
49 extern "C" {
50 
52 #define CHECK_PTR(p, r) \
53  if (p == nullptr) { \
54  return r; \
55  }
56 
57 API_EXPORT
58 const char **or_get_file_extensions()
59 {
60  return RawFile::fileExtensions();
61 }
62 
63 API_EXPORT
64 ORRawFileRef or_rawfile_new(const char *filename, or_rawfile_type type)
65 {
66  CHECK_PTR(filename, NULL);
67  RawFile *rawfile = RawFile::newRawFile(filename, type);
68  return reinterpret_cast<ORRawFileRef>(rawfile);
69 }
70 
71 API_EXPORT
72 ORRawFileRef or_rawfile_new_from_memory(const uint8_t *buffer, uint32_t len,
73  or_rawfile_type type)
74 {
75  CHECK_PTR(buffer, NULL);
76  RawFile *rawfile = RawFile::newRawFileFromMemory(buffer, len, type);
77  return reinterpret_cast<ORRawFileRef>(rawfile);
78 }
79 
80 API_EXPORT
82 {
83  CHECK_PTR(rawfile, OR_ERROR_NOTAREF);
84  boost::checked_delete(reinterpret_cast<RawFile *>(rawfile));
85  return OR_ERROR_NONE;
86 }
87 
88 API_EXPORT
90 {
91  CHECK_PTR(rawfile, OR_RAWFILE_TYPE_UNKNOWN);
92  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
93  return prawfile->type();
94 }
95 
96 API_EXPORT
98 {
99  CHECK_PTR(rawfile, OR_RAWFILE_TYPE_UNKNOWN);
100  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
101  return prawfile->typeId();
102 }
103 
104 API_EXPORT
106 {
107  CHECK_PTR(rawfile, OR_RAWFILE_TYPE_UNKNOWN);
108  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
109  return prawfile->vendorId();
110 }
111 
112 API_EXPORT const uint32_t *
114  size_t *size)
115 {
116  CHECK_PTR(rawfile, nullptr);
117  CHECK_PTR(size, nullptr);
118  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
119  const auto & v = prawfile->listThumbnailSizes();
120  if (v.empty()) {
121  *size = 0;
122  return nullptr;
123  }
124  *size = v.size();
125  // we return a pointer to the storage
126  // C++11 spec says it has to be contiguous.
127  return &(*v.begin());
128 }
129 
130 API_EXPORT
132  uint32_t _preferred_size,
133  ORThumbnailRef thumb)
134 {
135  CHECK_PTR(rawfile, OR_ERROR_NOTAREF);
136  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
137  return prawfile->getThumbnail(_preferred_size,
138  *reinterpret_cast<Thumbnail *>(thumb));
139 }
140 
141 API_EXPORT
143  uint32_t options)
144 {
145  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
146  CHECK_PTR(rawfile, OR_ERROR_NOTAREF);
147  return prawfile->getRawData(*reinterpret_cast<RawData *>(rawdata), options);
148 }
149 
150 API_EXPORT
152  ORBitmapDataRef bitmapdata,
153  uint32_t options)
154 {
155  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
156  CHECK_PTR(rawfile, OR_ERROR_NOTAREF);
157  return prawfile->getRenderedImage(
158  *reinterpret_cast<BitmapData *>(bitmapdata), options);
159 }
160 
161 API_EXPORT
163 {
164  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
165  CHECK_PTR(rawfile, 0);
166  return prawfile->getOrientation();
167 }
168 
169 API_EXPORT
171  uint32_t *size)
172 {
173  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
174  CHECK_PTR(rawfile, OR_ERROR_NOTAREF);
175  CHECK_PTR(size, OR_ERROR_INVALID_PARAM);
176  return prawfile->getColourMatrix1(matrix, *size);
177 }
178 
179 API_EXPORT
181  uint32_t *size)
182 {
183  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
184  CHECK_PTR(rawfile, OR_ERROR_NOTAREF);
185  CHECK_PTR(size, OR_ERROR_INVALID_PARAM);
186  return prawfile->getColourMatrix2(matrix, *size);
187 }
188 
189 API_EXPORT
191 {
192  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
193  CHECK_PTR(rawfile, (ExifLightsourceValue)0);
194  return prawfile->getCalibrationIlluminant1();
195 }
196 
197 API_EXPORT
199 {
200  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
201  CHECK_PTR(rawfile, (ExifLightsourceValue)0);
202  return prawfile->getCalibrationIlluminant2();
203 }
204 
205 API_EXPORT or_colour_matrix_origin
207 {
208  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
209  CHECK_PTR(rawfile, OR_COLOUR_MATRIX_UNKNOWN);
210  return prawfile->getColourMatrixOrigin();
211 }
212 
213 API_EXPORT ORConstMetaValueRef
214 or_rawfile_get_metavalue(ORRawFileRef rawfile, int32_t meta_index)
215 {
216  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
217  CHECK_PTR(rawfile, nullptr);
218  return reinterpret_cast<ORConstMetaValueRef>(prawfile->getMetaValue(meta_index));
219 }
220 
221 API_EXPORT
223 {
224  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
225  CHECK_PTR(rawfile, nullptr);
226  IfdDir::Ref dir;
227  switch (ifd) {
228  case OR_IFD_RAW:
229  dir = prawfile->cfaIfd();
230  break;
231  case OR_IFD_MAIN:
232  dir = prawfile->mainIfd();
233  break;
234  case OR_IFD_EXIF:
235  dir = prawfile->exifIfd();
236  break;
237  case OR_IFD_MNOTE:
238  dir = prawfile->makerNoteIfd();
239  break;
240  default:
241  break;
242  }
243  if (!dir) {
244  return nullptr;
245  }
246  auto wrap = new WrappedPointer<IfdDir>(dir);
247  return reinterpret_cast<ORIfdDirRef>(wrap);
248 }
249 
250 API_EXPORT ORMetadataIteratorRef
252 {
253  RawFile *prawfile = reinterpret_cast<RawFile *>(rawfile);
254  CHECK_PTR(rawfile, nullptr);
255  return reinterpret_cast<ORMetadataIteratorRef>(prawfile->getMetadataIterator());
256 }
257 
258 }
Represent some bitmap data.
Definition: bitmapdata.hpp:30
An IFD directory.
Definition: ifddir.hpp:51
Represent camera raw data.
Definition: rawdata.hpp:38
RAW file.
Definition: rawfile.hpp:66
::or_error getThumbnail(uint32_t size, Thumbnail &thumbnail)
Get the thumbnail from the raw file.
Definition: rawfile.cpp:445
TypeId typeId()
The RAW file type ID. Identify it if needed.
Definition: rawfile.cpp:380
Internals::IfdDir::Ref exifIfd()
Get the Exif IFD.
Definition: rawfile.cpp:715
::or_error getRawData(RawData &rawdata, uint32_t options)
Get the RAW data.
Definition: rawfile.cpp:536
uint32_t getOrientation()
Get the orientation of the image, using Exif enums.
Definition: rawfile.cpp:568
Internals::MakerNoteDir::Ref makerNoteIfd()
Get the MakerNote IFD.
Definition: rawfile.cpp:724
::or_error getColourMatrix1(double *matrix, uint32_t &size)
Get colour matrix.
Definition: rawfile.cpp:589
const std::vector< uint32_t > & listThumbnailSizes(void)
List the available thumbnail sizes.
Definition: rawfile.cpp:433
::or_error getRenderedImage(BitmapData &bitmapdata, uint32_t options)
Get the rendered image.
Definition: rawfile.cpp:557
Internals::IfdDir::Ref mainIfd()
Get the main IFD.
Definition: rawfile.cpp:706
ExifLightsourceValue getCalibrationIlluminant1()
Get the calibration illuminant that match the colour matrix.
Definition: rawfile.cpp:638
Internals::IfdDir::Ref cfaIfd()
Get the IFD containing the CFA.
Definition: rawfile.cpp:696
const MetaValue * getMetaValue(int32_t meta_index)
Get a metadata value.
Definition: rawfile.cpp:733
virtual or_colour_matrix_origin getColourMatrixOrigin() const
Get the origin of the colour matrix for the RAW file.
Definition: rawfile.cpp:648
Type type() const
Accessor for the type.
Definition: rawfile.cpp:375
Represent a thumbnail.
Definition: thumbnail.hpp:32
Wrap a pointer so that we can return it.
Definition: capi.h:14
const struct _MetaValue * ORConstMetaValueRef
A const metadata value.
Definition: metadata.h:47
struct _MetadataIterator * ORMetadataIteratorRef
A metadata iterator.
Definition: metadata.h:44
struct _RawData * ORRawDataRef
RawData reference.
Definition: types.h:31
uint32_t or_rawfile_typeid
This is the type ID, a combination of vendor model It maps a specific camera. Only for the NATIVE fil...
Definition: consts.h:130
struct _RawFile * ORRawFileRef
RawFile reference.
Definition: types.h:30
or_ifd_dir_type
Type of IfdDir.
Definition: consts.h:140
struct _Thumbnail * ORThumbnailRef
Thumbnail reference.
Definition: types.h:33
or_rawfile_type
Types of RAW files.
Definition: consts.h:59
or_colour_matrix_origin
Where the colour matrix comes from. Typically DNG is provided. The others are built-in.
Definition: consts.h:121
struct _IfdDir * ORIfdDirRef
IfdDir reference.
Definition: types.h:34
or_error
Error codes returned by libopenraw.
Definition: consts.h:42
struct _BitmapData * ORBitmapDataRef
BitmapData reference.
Definition: types.h:32
@ OR_IFD_RAW
RAW data.
Definition: consts.h:150
@ OR_IFD_MNOTE
MakerNote.
Definition: consts.h:148
@ OR_IFD_MAIN
Main (like in TIFF)
Definition: consts.h:144
@ OR_IFD_EXIF
Exif metadata.
Definition: consts.h:146
@ OR_RAWFILE_TYPE_UNKNOWN
Definition: consts.h:60
@ OR_COLOUR_MATRIX_UNKNOWN
Definition: consts.h:122
@ OR_ERROR_INVALID_PARAM
Definition: consts.h:49
@ OR_ERROR_NONE
Definition: consts.h:43
@ OR_ERROR_NOTAREF
Definition: consts.h:45
API_EXPORT ORIfdDirRef or_rawfile_get_ifd(ORRawFileRef rawfile, or_ifd_dir_type ifd)
Get an IFD directory.
Definition: rawfile.cpp:222
API_EXPORT or_error or_rawfile_release(ORRawFileRef rawfile)
Release the RawFile.
Definition: rawfile.cpp:81
API_EXPORT or_colour_matrix_origin or_rawfile_get_colour_matrix_origin(ORRawFileRef rawfile)
Get the colour matrix origin for file.
Definition: rawfile.cpp:206
API_EXPORT ExifLightsourceValue or_rawfile_get_calibration_illuminant2(ORRawFileRef rawfile)
Get calibration illuminant for the second colour matrix.
Definition: rawfile.cpp:198
API_EXPORT ORRawFileRef or_rawfile_new(const char *filename, or_rawfile_type type)
Create a new RawFile object from a file.
Definition: rawfile.cpp:64
API_EXPORT ORRawFileRef or_rawfile_new_from_memory(const uint8_t *buffer, uint32_t len, or_rawfile_type type)
Create a new RawFile object from a memory buffer.
Definition: rawfile.cpp:72
API_EXPORT or_error or_rawfile_get_colourmatrix2(ORRawFileRef rawfile, double *matrix, uint32_t *size)
Get the second colour matrix.
Definition: rawfile.cpp:180
API_EXPORT or_error or_rawfile_get_colourmatrix1(ORRawFileRef rawfile, double *matrix, uint32_t *size)
Get the first colour matrix.
Definition: rawfile.cpp:170
API_EXPORT const uint32_t * or_rawfile_get_thumbnail_sizes(ORRawFileRef rawfile, size_t *size)
Get the the array of thumbnail sizes.
Definition: rawfile.cpp:113
API_EXPORT const char ** or_get_file_extensions()
Return a NULL terminated list of extensions that the library supposedly handle.
Definition: rawfile.cpp:58
API_EXPORT or_rawfile_typeid or_rawfile_get_vendorid(ORRawFileRef rawfile)
Return the type id to identify the vendor.
Definition: rawfile.cpp:105
API_EXPORT or_error or_rawfile_get_thumbnail(ORRawFileRef rawfile, uint32_t _preferred_size, ORThumbnailRef thumb)
Get a thumbnail from a RawFile..
Definition: rawfile.cpp:131
API_EXPORT ORConstMetaValueRef or_rawfile_get_metavalue(ORRawFileRef rawfile, int32_t meta_index)
Get the metadata value.
Definition: rawfile.cpp:214
API_EXPORT or_rawfile_typeid or_rawfile_get_typeid(ORRawFileRef rawfile)
Return the type id to identify the exact file type.
Definition: rawfile.cpp:97
API_EXPORT int32_t or_rawfile_get_orientation(ORRawFileRef rawfile)
Get the orientation.
Definition: rawfile.cpp:162
API_EXPORT or_error or_rawfile_get_rendered_image(ORRawFileRef rawfile, ORBitmapDataRef bitmapdata, uint32_t options)
Get the rendered image from the raw file.
Definition: rawfile.cpp:151
API_EXPORT or_error or_rawfile_get_rawdata(ORRawFileRef rawfile, ORRawDataRef rawdata, uint32_t options)
Get the RawData out of the RawFile.
Definition: rawfile.cpp:142
API_EXPORT ExifLightsourceValue or_rawfile_get_calibration_illuminant1(ORRawFileRef rawfile)
Get calibration illuminant for the first colour matrix.
Definition: rawfile.cpp:190
API_EXPORT ORMetadataIteratorRef or_rawfile_get_metadata_iterator(ORRawFileRef rawfile)
Get a metadata iterator.
Definition: rawfile.cpp:251
API_EXPORT or_rawfile_type or_rawfile_get_type(ORRawFileRef rawfile)
Get the RawFile type.
Definition: rawfile.cpp:89
Global namespace for libopenraw.
Definition: arwfile.cpp:29