xref: /haiku/src/add-ons/translators/raw/LibRAW.h (revision 02354704729d38c3b078c696adc1bbbd33cbcf72)
1 /*
2  * Copyright 2021, Jérôme Duval, jerome.duval@gmail.com.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef LIBRAW_H
6 #define LIBRAW_H
7 
8 
9 #include <DataIO.h>
10 #include <SupportDefs.h>
11 
12 #include <libraw/libraw_const.h>
13 
14 
15 class LibRaw;
16 class LibRaw_haiku_datastream;
17 
18 
19 struct image_meta_info {
20 	char	manufacturer[64];
21 	char	model[64];
22 	char	software[64];
23 	float	flash_used;
24 	float	iso_speed;
25 	float	shutter;
26 	float	aperture;
27 	float	focal_length;
28 	double	pixel_aspect;
29 	uint32	raw_width;
30 	uint32	raw_height;
31 	int		flip;
32 	uint32	dng_version;
33 	uint32	shot_order;
34 	int32	black;
35 	int32	maximum;
36 	float	camera_multipliers[4];
37 	float	pre_multipliers[4];
38 	float	rgb_camera[3][4];	/* RGB from camera color */
39 	time_t	timestamp;
40 };
41 
42 struct image_data_info {
43 	uint32	width;
44 	uint32	height;
45 	uint32	output_width;
46 	uint32	output_height;
47 	uint32	bits_per_sample;
48 	uint32	compression;
49 	uint32	photometric_interpretation;
50 	uint32	flip;
51 	uint32	samples;
52 	uint32	bytes;
53 	off_t	data_offset;
54 	bool	is_raw;
55 };
56 
57 #define COMPRESSION_NONE		1
58 #define COMPRESSION_OLD_JPEG	6		// Old JPEG (before 6.0)
59 #define COMPRESSION_PACKBITS	32773	// Macintosh RLE
60 
61 
62 typedef void (*monitor_hook)(const char* message, float percentage, void* data);
63 
64 class LibRAW {
65 public:
66 								LibRAW(BPositionIO& stream);
67 								~LibRAW();
68 
69 			status_t			Identify();
70 			status_t			ReadImageAt(uint32 index, uint8*& outputBuffer,
71 									size_t& bufferSize);
72 
73 			void				GetMetaInfo(image_meta_info& metaInfo) const;
74 			uint32				CountImages() const;
75 			status_t			ImageAt(uint32 index, image_data_info& info)
76 									const;
77 
78 			status_t			GetEXIFTag(off_t& offset, size_t& length,
79 									bool& bigEndian) const;
80 			void				SetProgressMonitor(monitor_hook hook,
81 									void* data);
82 
83 			void				SetHalfSize(bool half);
84 
85 private:
86 	static	int					ProgressCallback(void *data,
87 									enum LibRaw_progress p,
88 									int iteration, int expected);
89 			int					_ProgressCallback(enum LibRaw_progress p,
90 									int iteration, int expected);
91 
92 			monitor_hook		fProgressMonitor;
93 			void*				fProgressData;
94 
95 			LibRaw*				fRaw;
96 			LibRaw_haiku_datastream* fDatastream;
97 };
98 
99 
100 #endif	// LIBRAW_H
101