/src/dng_sdk/source/dng_image_writer.h
Line | Count | Source |
1 | | /*****************************************************************************/ |
2 | | // Copyright 2006-2012 Adobe Systems Incorporated |
3 | | // All Rights Reserved. |
4 | | // |
5 | | // NOTICE: Adobe permits you to use, modify, and distribute this file in |
6 | | // accordance with the terms of the Adobe license agreement accompanying it. |
7 | | /*****************************************************************************/ |
8 | | |
9 | | /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_image_writer.h#3 $ */ |
10 | | /* $DateTime: 2012/07/31 22:04:34 $ */ |
11 | | /* $Change: 840853 $ */ |
12 | | /* $Author: tknoll $ */ |
13 | | |
14 | | /** \file |
15 | | * Support for writing DNG images to files. |
16 | | */ |
17 | | |
18 | | /*****************************************************************************/ |
19 | | |
20 | | #ifndef __dng_image_writer__ |
21 | | #define __dng_image_writer__ |
22 | | |
23 | | /*****************************************************************************/ |
24 | | |
25 | | #include "dng_auto_ptr.h" |
26 | | #include "dng_classes.h" |
27 | | #include "dng_fingerprint.h" |
28 | | #include "dng_memory.h" |
29 | | #include "dng_point.h" |
30 | | #include "dng_rational.h" |
31 | | #include "dng_sdk_limits.h" |
32 | | #include "dng_string.h" |
33 | | #include "dng_tag_types.h" |
34 | | #include "dng_tag_values.h" |
35 | | #include "dng_types.h" |
36 | | |
37 | | /*****************************************************************************/ |
38 | | |
39 | | /// \brief Image resolution. |
40 | | |
41 | | class dng_resolution |
42 | | { |
43 | | |
44 | | public: |
45 | | |
46 | | dng_urational fXResolution; |
47 | | dng_urational fYResolution; |
48 | | |
49 | | uint16 fResolutionUnit; |
50 | | |
51 | | public: |
52 | | |
53 | | dng_resolution (); |
54 | | |
55 | | }; |
56 | | |
57 | | /*****************************************************************************/ |
58 | | |
59 | | class tiff_tag |
60 | | { |
61 | | |
62 | | protected: |
63 | | |
64 | | uint16 fCode; |
65 | | |
66 | | uint16 fType; |
67 | | |
68 | | uint32 fCount; |
69 | | |
70 | | protected: |
71 | | |
72 | | tiff_tag (uint16 code, |
73 | | uint16 type, |
74 | | uint32 count) |
75 | | |
76 | 8.58M | : fCode (code) |
77 | 8.58M | , fType (type) |
78 | 8.58M | , fCount (count) |
79 | | |
80 | 8.58M | { |
81 | 8.58M | } |
82 | | |
83 | | public: |
84 | | |
85 | | virtual ~tiff_tag () |
86 | 8.58M | { |
87 | 8.58M | } |
88 | | |
89 | | uint16 Code () const |
90 | 20.4M | { |
91 | 20.4M | return fCode; |
92 | 20.4M | } |
93 | | |
94 | | uint16 Type () const |
95 | 5.90M | { |
96 | 5.90M | return fType; |
97 | 5.90M | } |
98 | | |
99 | | uint32 Count () const |
100 | 6.14M | { |
101 | 6.14M | return fCount; |
102 | 6.14M | } |
103 | | |
104 | | void SetCount (uint32 count) |
105 | 51.8k | { |
106 | 51.8k | fCount = count; |
107 | 51.8k | } |
108 | | |
109 | | uint32 Size () const |
110 | 4.70M | { |
111 | 4.70M | return TagTypeSize (Type ()) * Count (); |
112 | 4.70M | } |
113 | | |
114 | | virtual void Put (dng_stream &stream) const = 0; |
115 | | |
116 | | private: |
117 | | |
118 | | // Hidden copy constructor and assignment operator. |
119 | | |
120 | | tiff_tag (const tiff_tag &tag); |
121 | | |
122 | | tiff_tag & operator= (const tiff_tag &tag); |
123 | | |
124 | | }; |
125 | | |
126 | | /******************************************************************************/ |
127 | | |
128 | | class tag_data_ptr: public tiff_tag |
129 | | { |
130 | | |
131 | | protected: |
132 | | |
133 | | const void *fData; |
134 | | |
135 | | public: |
136 | | |
137 | | tag_data_ptr (uint16 code, |
138 | | uint16 type, |
139 | | uint32 count, |
140 | | const void *data) |
141 | | |
142 | 6.48M | : tiff_tag (code, type, count) |
143 | | |
144 | 6.48M | , fData (data) |
145 | | |
146 | 6.48M | { |
147 | 6.48M | } |
148 | | |
149 | | void SetData (const void *data) |
150 | 19.0k | { |
151 | 19.0k | fData = data; |
152 | 19.0k | } |
153 | | |
154 | | virtual void Put (dng_stream &stream) const; |
155 | | |
156 | | private: |
157 | | |
158 | | // Hidden copy constructor and assignment operator. |
159 | | |
160 | | tag_data_ptr (const tag_data_ptr &tag); |
161 | | |
162 | | tag_data_ptr & operator= (const tag_data_ptr &tag); |
163 | | |
164 | | }; |
165 | | |
166 | | /******************************************************************************/ |
167 | | |
168 | | class tag_string: public tiff_tag |
169 | | { |
170 | | |
171 | | protected: |
172 | | |
173 | | dng_string fString; |
174 | | |
175 | | public: |
176 | | |
177 | | tag_string (uint16 code, |
178 | | const dng_string &s, |
179 | | bool forceASCII = true); |
180 | | |
181 | | virtual void Put (dng_stream &stream) const; |
182 | | |
183 | | }; |
184 | | |
185 | | /******************************************************************************/ |
186 | | |
187 | | class tag_encoded_text: public tiff_tag |
188 | | { |
189 | | |
190 | | private: |
191 | | |
192 | | dng_string fText; |
193 | | |
194 | | dng_memory_data fUTF16; |
195 | | |
196 | | public: |
197 | | |
198 | | tag_encoded_text (uint16 code, |
199 | | const dng_string &text); |
200 | | |
201 | | virtual void Put (dng_stream &stream) const; |
202 | | |
203 | | }; |
204 | | |
205 | | /******************************************************************************/ |
206 | | |
207 | | class tag_uint8: public tag_data_ptr |
208 | | { |
209 | | |
210 | | private: |
211 | | |
212 | | uint8 fValue; |
213 | | |
214 | | public: |
215 | | |
216 | | tag_uint8 (uint16 code, |
217 | | uint8 value = 0) |
218 | | |
219 | 53.2k | : tag_data_ptr (code, ttByte, 1, &fValue) |
220 | | |
221 | 53.2k | , fValue (value) |
222 | | |
223 | 53.2k | { |
224 | 53.2k | } |
225 | | |
226 | | void Set (uint8 value) |
227 | 0 | { |
228 | 0 | fValue = value; |
229 | 0 | } |
230 | | |
231 | | }; |
232 | | |
233 | | /******************************************************************************/ |
234 | | |
235 | | class tag_uint8_ptr: public tag_data_ptr |
236 | | { |
237 | | |
238 | | public: |
239 | | |
240 | | tag_uint8_ptr (uint16 code, |
241 | | const uint8 *data, |
242 | | uint32 count = 1) |
243 | | |
244 | 200k | : tag_data_ptr (code, ttByte, count, data) |
245 | | |
246 | 200k | { |
247 | 200k | } |
248 | | |
249 | | }; |
250 | | |
251 | | /******************************************************************************/ |
252 | | |
253 | | class tag_uint16: public tag_data_ptr |
254 | | { |
255 | | |
256 | | private: |
257 | | |
258 | | uint16 fValue; |
259 | | |
260 | | public: |
261 | | |
262 | | tag_uint16 (uint16 code, |
263 | | uint16 value = 0) |
264 | | |
265 | 1.71M | : tag_data_ptr (code, ttShort, 1, &fValue) |
266 | | |
267 | 1.71M | , fValue (value) |
268 | | |
269 | 1.71M | { |
270 | 1.71M | } |
271 | | |
272 | | void Set (uint16 value) |
273 | 336 | { |
274 | 336 | fValue = value; |
275 | 336 | } |
276 | | |
277 | | }; |
278 | | |
279 | | /******************************************************************************/ |
280 | | |
281 | | class tag_int16_ptr: public tag_data_ptr |
282 | | { |
283 | | |
284 | | public: |
285 | | |
286 | | tag_int16_ptr (uint16 code, |
287 | | const int16 *data, |
288 | | uint32 count = 1) |
289 | | |
290 | | : tag_data_ptr (code, ttSShort, count, data) |
291 | | |
292 | 0 | { |
293 | 0 | } |
294 | | |
295 | | }; |
296 | | |
297 | | /******************************************************************************/ |
298 | | |
299 | | class tag_uint16_ptr: public tag_data_ptr |
300 | | { |
301 | | |
302 | | public: |
303 | | |
304 | | tag_uint16_ptr (uint16 code, |
305 | | const uint16 *data, |
306 | | uint32 count = 1) |
307 | | |
308 | 348k | : tag_data_ptr (code, ttShort, count, data) |
309 | | |
310 | 348k | { |
311 | 348k | } |
312 | | |
313 | | }; |
314 | | |
315 | | /******************************************************************************/ |
316 | | |
317 | | class tag_uint32: public tag_data_ptr |
318 | | { |
319 | | |
320 | | private: |
321 | | |
322 | | uint32 fValue; |
323 | | |
324 | | public: |
325 | | |
326 | | tag_uint32 (uint16 code, |
327 | | uint32 value = 0) |
328 | | |
329 | 933k | : tag_data_ptr (code, ttLong, 1, &fValue) |
330 | | |
331 | 933k | , fValue (value) |
332 | | |
333 | 933k | { |
334 | 933k | } |
335 | | |
336 | | void Set (uint32 value) |
337 | 106k | { |
338 | 106k | fValue = value; |
339 | 106k | } |
340 | | |
341 | | }; |
342 | | |
343 | | /******************************************************************************/ |
344 | | |
345 | | class tag_uint32_ptr: public tag_data_ptr |
346 | | { |
347 | | |
348 | | public: |
349 | | |
350 | | tag_uint32_ptr (uint16 code, |
351 | | const uint32 *data, |
352 | | uint32 count = 1) |
353 | | |
354 | 297k | : tag_data_ptr (code, ttLong, count, data) |
355 | | |
356 | 297k | { |
357 | 297k | } |
358 | | |
359 | | }; |
360 | | |
361 | | /******************************************************************************/ |
362 | | |
363 | | class tag_urational: public tag_data_ptr |
364 | | { |
365 | | |
366 | | private: |
367 | | |
368 | | const dng_urational fValue; |
369 | | |
370 | | public: |
371 | | |
372 | | tag_urational (uint16 code, |
373 | | const dng_urational &value) |
374 | | |
375 | 1.18M | : tag_data_ptr (code, ttRational, 1, &fValue) |
376 | | |
377 | 1.18M | , fValue (value) |
378 | | |
379 | 1.18M | { |
380 | 1.18M | } |
381 | | |
382 | | }; |
383 | | |
384 | | /******************************************************************************/ |
385 | | |
386 | | class tag_urational_ptr: public tag_data_ptr |
387 | | { |
388 | | |
389 | | public: |
390 | | |
391 | | tag_urational_ptr (uint16 code, |
392 | | const dng_urational *data = NULL, |
393 | | uint32 count = 1) |
394 | | |
395 | 479k | : tag_data_ptr (code, ttRational, count, data) |
396 | | |
397 | 479k | { |
398 | 479k | } |
399 | | |
400 | | }; |
401 | | |
402 | | /******************************************************************************/ |
403 | | |
404 | | class tag_srational: public tag_data_ptr |
405 | | { |
406 | | |
407 | | private: |
408 | | |
409 | | const dng_srational fValue; |
410 | | |
411 | | public: |
412 | | |
413 | | tag_srational (uint16 code, |
414 | | const dng_srational &value) |
415 | | |
416 | 217k | : tag_data_ptr (code, ttSRational, 1, &fValue) |
417 | | |
418 | 217k | , fValue (value) |
419 | | |
420 | 217k | { |
421 | 217k | } |
422 | | |
423 | | }; |
424 | | |
425 | | /******************************************************************************/ |
426 | | |
427 | | class tag_srational_ptr: public tag_data_ptr |
428 | | { |
429 | | |
430 | | public: |
431 | | |
432 | | tag_srational_ptr (uint16 code, |
433 | | const dng_srational *data = NULL, |
434 | | uint32 count = 1) |
435 | | |
436 | 318k | : tag_data_ptr (code, ttSRational, count, data) |
437 | | |
438 | 318k | { |
439 | 318k | } |
440 | | |
441 | | }; |
442 | | |
443 | | /******************************************************************************/ |
444 | | |
445 | | class tag_real64: public tag_data_ptr |
446 | | { |
447 | | |
448 | | private: |
449 | | |
450 | | real64 fValue; |
451 | | |
452 | | public: |
453 | | |
454 | | tag_real64 (uint16 code, |
455 | | real64 value = 0.0) |
456 | | |
457 | 6.96k | : tag_data_ptr (code, ttDouble, 1, &fValue) |
458 | | |
459 | 6.96k | , fValue (value) |
460 | | |
461 | 6.96k | { |
462 | 6.96k | } |
463 | | |
464 | | void Set (real64 value) |
465 | 0 | { |
466 | 0 | fValue = value; |
467 | 0 | } |
468 | | |
469 | | }; |
470 | | |
471 | | /******************************************************************************/ |
472 | | |
473 | | class tag_matrix: public tag_srational_ptr |
474 | | { |
475 | | |
476 | | private: |
477 | | |
478 | | dng_srational fEntry [kMaxColorPlanes * |
479 | | kMaxColorPlanes]; |
480 | | |
481 | | public: |
482 | | |
483 | | tag_matrix (uint16 code, |
484 | | const dng_matrix &m); |
485 | | |
486 | | }; |
487 | | |
488 | | /******************************************************************************/ |
489 | | |
490 | | class tag_icc_profile: public tag_data_ptr |
491 | | { |
492 | | |
493 | | public: |
494 | | |
495 | | tag_icc_profile (const void *profileData, uint32 profileSize); |
496 | | |
497 | | }; |
498 | | |
499 | | /******************************************************************************/ |
500 | | |
501 | | class tag_cfa_pattern: public tiff_tag |
502 | | { |
503 | | |
504 | | private: |
505 | | |
506 | | uint32 fRows; |
507 | | uint32 fCols; |
508 | | |
509 | | const uint8 *fPattern; |
510 | | |
511 | | public: |
512 | | |
513 | | tag_cfa_pattern (uint16 code, |
514 | | uint32 rows, |
515 | | uint32 cols, |
516 | | const uint8 *pattern) |
517 | | |
518 | 53.2k | : tiff_tag (code, ttUndefined, 4 + rows * cols) |
519 | | |
520 | 53.2k | , fRows (rows ) |
521 | 53.2k | , fCols (cols ) |
522 | 53.2k | , fPattern (pattern) |
523 | | |
524 | 53.2k | { |
525 | 53.2k | } |
526 | | |
527 | | virtual void Put (dng_stream &stream) const; |
528 | | |
529 | | private: |
530 | | |
531 | | // Hidden copy constructor and assignment operator. |
532 | | |
533 | | tag_cfa_pattern (const tag_cfa_pattern &tag); |
534 | | |
535 | | tag_cfa_pattern & operator= (const tag_cfa_pattern &tag); |
536 | | |
537 | | }; |
538 | | |
539 | | /******************************************************************************/ |
540 | | |
541 | | class tag_exif_date_time: public tag_data_ptr |
542 | | { |
543 | | |
544 | | private: |
545 | | |
546 | | char fData [20]; |
547 | | |
548 | | public: |
549 | | |
550 | | tag_exif_date_time (uint16 code, |
551 | | const dng_date_time &dt); |
552 | | |
553 | | }; |
554 | | |
555 | | /******************************************************************************/ |
556 | | |
557 | | class tag_iptc: public tiff_tag |
558 | | { |
559 | | |
560 | | private: |
561 | | |
562 | | const void *fData; |
563 | | |
564 | | uint32 fLength; |
565 | | |
566 | | public: |
567 | | |
568 | | tag_iptc (const void *data, |
569 | | uint32 length); |
570 | | |
571 | | virtual void Put (dng_stream &stream) const; |
572 | | |
573 | | private: |
574 | | |
575 | | // Hidden copy constructor and assignment operator. |
576 | | |
577 | | tag_iptc (const tag_iptc &tag); |
578 | | |
579 | | tag_iptc & operator= (const tag_iptc &tag); |
580 | | |
581 | | }; |
582 | | |
583 | | /******************************************************************************/ |
584 | | |
585 | | class tag_xmp: public tag_uint8_ptr |
586 | | { |
587 | | |
588 | | private: |
589 | | |
590 | | AutoPtr<dng_memory_block> fBuffer; |
591 | | |
592 | | public: |
593 | | |
594 | | tag_xmp (const dng_xmp *xmp); |
595 | | |
596 | | private: |
597 | | |
598 | | // Hidden copy constructor and assignment operator. |
599 | | |
600 | | tag_xmp (const tag_xmp &tag); |
601 | | |
602 | | tag_xmp & operator= (const tag_xmp &tag); |
603 | | |
604 | | }; |
605 | | |
606 | | /******************************************************************************/ |
607 | | |
608 | | class dng_tiff_directory |
609 | | { |
610 | | |
611 | | private: |
612 | | |
613 | | enum |
614 | | { |
615 | | kMaxEntries = 100 |
616 | | }; |
617 | | |
618 | | uint32 fEntries; |
619 | | |
620 | | const tiff_tag *fTag [kMaxEntries]; |
621 | | |
622 | | uint32 fChained; |
623 | | |
624 | | public: |
625 | | |
626 | | dng_tiff_directory () |
627 | | |
628 | 203k | : fEntries (0) |
629 | 203k | , fChained (0) |
630 | | |
631 | 203k | { |
632 | 203k | } |
633 | | |
634 | | virtual ~dng_tiff_directory () |
635 | 203k | { |
636 | 203k | } |
637 | | |
638 | | void Add (const tiff_tag *tag); |
639 | | |
640 | | void SetChained (uint32 offset) |
641 | 0 | { |
642 | 0 | fChained = offset; |
643 | 0 | } |
644 | | |
645 | | uint32 Size () const; |
646 | | |
647 | | enum OffsetsBase |
648 | | { |
649 | | offsetsRelativeToStream = 0, |
650 | | offsetsRelativeToExplicitBase = 1, |
651 | | offsetsRelativeToIFD = 2 |
652 | | }; |
653 | | |
654 | | void Put (dng_stream &stream, |
655 | | OffsetsBase offsetsBase = offsetsRelativeToStream, |
656 | | uint32 explicitBase = 0) const; |
657 | | |
658 | | private: |
659 | | |
660 | | // Hidden copy constructor and assignment operator. |
661 | | |
662 | | dng_tiff_directory (const dng_tiff_directory &dir); |
663 | | |
664 | | dng_tiff_directory & operator= (const dng_tiff_directory &dir); |
665 | | |
666 | | }; |
667 | | |
668 | | /******************************************************************************/ |
669 | | |
670 | | class dng_basic_tag_set |
671 | | { |
672 | | |
673 | | private: |
674 | | |
675 | | tag_uint32 fNewSubFileType; |
676 | | |
677 | | tag_uint32 fImageWidth; |
678 | | tag_uint32 fImageLength; |
679 | | |
680 | | tag_uint16 fPhotoInterpretation; |
681 | | |
682 | | tag_uint16 fFillOrder; |
683 | | |
684 | | tag_uint16 fSamplesPerPixel; |
685 | | |
686 | | uint16 fBitsPerSampleData [kMaxSamplesPerPixel]; |
687 | | |
688 | | tag_uint16_ptr fBitsPerSample; |
689 | | |
690 | | bool fStrips; |
691 | | |
692 | | tag_uint32 fTileWidth; |
693 | | tag_uint32 fTileLength; |
694 | | |
695 | | dng_memory_data fTileInfoBuffer; |
696 | | |
697 | | uint32 *fTileOffsetData; |
698 | | |
699 | | tag_uint32_ptr fTileOffsets; |
700 | | |
701 | | uint32 *fTileByteCountData; |
702 | | |
703 | | tag_uint32_ptr fTileByteCounts; |
704 | | |
705 | | tag_uint16 fPlanarConfiguration; |
706 | | |
707 | | tag_uint16 fCompression; |
708 | | |
709 | | tag_uint16 fPredictor; |
710 | | |
711 | | uint16 fExtraSamplesData [kMaxSamplesPerPixel]; |
712 | | |
713 | | tag_uint16_ptr fExtraSamples; |
714 | | |
715 | | uint16 fSampleFormatData [kMaxSamplesPerPixel]; |
716 | | |
717 | | tag_uint16_ptr fSampleFormat; |
718 | | |
719 | | tag_uint16 fRowInterleaveFactor; |
720 | | |
721 | | uint16 fSubTileBlockSizeData [2]; |
722 | | |
723 | | tag_uint16_ptr fSubTileBlockSize; |
724 | | |
725 | | public: |
726 | | |
727 | | dng_basic_tag_set (dng_tiff_directory &directory, |
728 | | const dng_ifd &info); |
729 | | |
730 | | virtual ~dng_basic_tag_set () |
731 | 60.2k | { |
732 | 60.2k | } |
733 | | |
734 | | void SetTileOffset (uint32 index, |
735 | | uint32 offset) |
736 | 169k | { |
737 | 169k | fTileOffsetData [index] = offset; |
738 | 169k | } |
739 | | |
740 | | void SetTileByteCount (uint32 index, |
741 | | uint32 count) |
742 | 162k | { |
743 | 162k | fTileByteCountData [index] = count; |
744 | 162k | } |
745 | | |
746 | | bool WritingStrips () const |
747 | 0 | { |
748 | 0 | return fStrips; |
749 | 0 | } |
750 | | |
751 | | private: |
752 | | |
753 | | // Hidden copy constructor and assignment operator. |
754 | | |
755 | | dng_basic_tag_set (const dng_basic_tag_set &set); |
756 | | |
757 | | dng_basic_tag_set & operator= (const dng_basic_tag_set &set); |
758 | | |
759 | | }; |
760 | | |
761 | | /******************************************************************************/ |
762 | | |
763 | | class exif_tag_set |
764 | | { |
765 | | |
766 | | protected: |
767 | | |
768 | | dng_tiff_directory fExifIFD; |
769 | | dng_tiff_directory fGPSIFD; |
770 | | |
771 | | private: |
772 | | |
773 | | tag_uint32 fExifLink; |
774 | | tag_uint32 fGPSLink; |
775 | | |
776 | | bool fAddedExifLink; |
777 | | bool fAddedGPSLink; |
778 | | |
779 | | uint8 fExifVersionData [4]; |
780 | | |
781 | | tag_data_ptr fExifVersion; |
782 | | |
783 | | tag_urational fExposureTime; |
784 | | tag_srational fShutterSpeedValue; |
785 | | |
786 | | tag_urational fFNumber; |
787 | | tag_urational fApertureValue; |
788 | | |
789 | | tag_srational fBrightnessValue; |
790 | | |
791 | | tag_srational fExposureBiasValue; |
792 | | |
793 | | tag_urational fMaxApertureValue; |
794 | | |
795 | | tag_urational fSubjectDistance; |
796 | | |
797 | | tag_urational fFocalLength; |
798 | | |
799 | | tag_uint16 fISOSpeedRatings; |
800 | | |
801 | | tag_uint16 fSensitivityType; |
802 | | tag_uint32 fStandardOutputSensitivity; |
803 | | tag_uint32 fRecommendedExposureIndex; |
804 | | tag_uint32 fISOSpeed; |
805 | | tag_uint32 fISOSpeedLatitudeyyy; |
806 | | tag_uint32 fISOSpeedLatitudezzz; |
807 | | |
808 | | tag_uint16 fFlash; |
809 | | |
810 | | tag_uint16 fExposureProgram; |
811 | | |
812 | | tag_uint16 fMeteringMode; |
813 | | |
814 | | tag_uint16 fLightSource; |
815 | | |
816 | | tag_uint16 fSensingMethod; |
817 | | |
818 | | tag_uint16 fFocalLength35mm; |
819 | | |
820 | | uint8 fFileSourceData; |
821 | | tag_data_ptr fFileSource; |
822 | | |
823 | | uint8 fSceneTypeData; |
824 | | tag_data_ptr fSceneType; |
825 | | |
826 | | tag_cfa_pattern fCFAPattern; |
827 | | |
828 | | tag_uint16 fCustomRendered; |
829 | | tag_uint16 fExposureMode; |
830 | | tag_uint16 fWhiteBalance; |
831 | | tag_uint16 fSceneCaptureType; |
832 | | tag_uint16 fGainControl; |
833 | | tag_uint16 fContrast; |
834 | | tag_uint16 fSaturation; |
835 | | tag_uint16 fSharpness; |
836 | | tag_uint16 fSubjectDistanceRange; |
837 | | |
838 | | tag_urational fDigitalZoomRatio; |
839 | | |
840 | | tag_urational fExposureIndex; |
841 | | |
842 | | tag_uint32 fImageNumber; |
843 | | |
844 | | tag_uint16 fSelfTimerMode; |
845 | | |
846 | | tag_string fBatteryLevelA; |
847 | | tag_urational fBatteryLevelR; |
848 | | |
849 | | tag_urational fFocalPlaneXResolution; |
850 | | tag_urational fFocalPlaneYResolution; |
851 | | |
852 | | tag_uint16 fFocalPlaneResolutionUnit; |
853 | | |
854 | | uint16 fSubjectAreaData [4]; |
855 | | |
856 | | tag_uint16_ptr fSubjectArea; |
857 | | |
858 | | dng_urational fLensInfoData [4]; |
859 | | |
860 | | tag_urational_ptr fLensInfo; |
861 | | |
862 | | tag_exif_date_time fDateTime; |
863 | | tag_exif_date_time fDateTimeOriginal; |
864 | | tag_exif_date_time fDateTimeDigitized; |
865 | | |
866 | | tag_string fSubsecTime; |
867 | | tag_string fSubsecTimeOriginal; |
868 | | tag_string fSubsecTimeDigitized; |
869 | | |
870 | | tag_string fMake; |
871 | | tag_string fModel; |
872 | | tag_string fArtist; |
873 | | tag_string fSoftware; |
874 | | tag_string fCopyright; |
875 | | tag_string fImageDescription; |
876 | | |
877 | | tag_string fSerialNumber; |
878 | | |
879 | | tag_uint16 fMakerNoteSafety; |
880 | | |
881 | | tag_data_ptr fMakerNote; |
882 | | |
883 | | tag_encoded_text fUserComment; |
884 | | |
885 | | char fImageUniqueIDData [33]; |
886 | | |
887 | | tag_data_ptr fImageUniqueID; |
888 | | |
889 | | // EXIF 2.3 tags. |
890 | | |
891 | | tag_string fCameraOwnerName; |
892 | | tag_string fBodySerialNumber; |
893 | | tag_urational_ptr fLensSpecification; |
894 | | tag_string fLensMake; |
895 | | tag_string fLensModel; |
896 | | tag_string fLensSerialNumber; |
897 | | |
898 | | uint8 fGPSVersionData [4]; |
899 | | |
900 | | tag_uint8_ptr fGPSVersionID; |
901 | | |
902 | | tag_string fGPSLatitudeRef; |
903 | | tag_urational_ptr fGPSLatitude; |
904 | | |
905 | | tag_string fGPSLongitudeRef; |
906 | | tag_urational_ptr fGPSLongitude; |
907 | | |
908 | | tag_uint8 fGPSAltitudeRef; |
909 | | tag_urational fGPSAltitude; |
910 | | |
911 | | tag_urational_ptr fGPSTimeStamp; |
912 | | |
913 | | tag_string fGPSSatellites; |
914 | | tag_string fGPSStatus; |
915 | | tag_string fGPSMeasureMode; |
916 | | |
917 | | tag_urational fGPSDOP; |
918 | | |
919 | | tag_string fGPSSpeedRef; |
920 | | tag_urational fGPSSpeed; |
921 | | |
922 | | tag_string fGPSTrackRef; |
923 | | tag_urational fGPSTrack; |
924 | | |
925 | | tag_string fGPSImgDirectionRef; |
926 | | tag_urational fGPSImgDirection; |
927 | | |
928 | | tag_string fGPSMapDatum; |
929 | | |
930 | | tag_string fGPSDestLatitudeRef; |
931 | | tag_urational_ptr fGPSDestLatitude; |
932 | | |
933 | | tag_string fGPSDestLongitudeRef; |
934 | | tag_urational_ptr fGPSDestLongitude; |
935 | | |
936 | | tag_string fGPSDestBearingRef; |
937 | | tag_urational fGPSDestBearing; |
938 | | |
939 | | tag_string fGPSDestDistanceRef; |
940 | | tag_urational fGPSDestDistance; |
941 | | |
942 | | tag_encoded_text fGPSProcessingMethod; |
943 | | tag_encoded_text fGPSAreaInformation; |
944 | | |
945 | | tag_string fGPSDateStamp; |
946 | | |
947 | | tag_uint16 fGPSDifferential; |
948 | | |
949 | | tag_urational fGPSHPositioningError; |
950 | | |
951 | | public: |
952 | | |
953 | | exif_tag_set (dng_tiff_directory &directory, |
954 | | const dng_exif &exif, |
955 | | bool makerNoteSafe = false, |
956 | | const void *makerNoteData = NULL, |
957 | | uint32 makerNoteLength = 0, |
958 | | bool insideDNG = false); |
959 | | |
960 | | void Locate (uint32 offset) |
961 | 53.2k | { |
962 | 53.2k | fExifLink.Set (offset); |
963 | 53.2k | fGPSLink .Set (offset + fExifIFD.Size ()); |
964 | 53.2k | } |
965 | | |
966 | | uint32 Size () const |
967 | 53.2k | { |
968 | 53.2k | return fExifIFD.Size () + |
969 | 53.2k | fGPSIFD .Size (); |
970 | 53.2k | } |
971 | | |
972 | | void Put (dng_stream &stream) const |
973 | 46.1k | { |
974 | 46.1k | fExifIFD.Put (stream); |
975 | 46.1k | fGPSIFD .Put (stream); |
976 | 46.1k | } |
977 | | |
978 | | protected: |
979 | | |
980 | | void AddLinks (dng_tiff_directory &directory); |
981 | | |
982 | | private: |
983 | | |
984 | | // Hidden copy constructor and assignment operator. |
985 | | |
986 | | exif_tag_set (const exif_tag_set &set); |
987 | | |
988 | | exif_tag_set & operator= (const exif_tag_set &set); |
989 | | |
990 | | }; |
991 | | |
992 | | /******************************************************************************/ |
993 | | |
994 | | class tiff_dng_extended_color_profile: private dng_tiff_directory |
995 | | { |
996 | | |
997 | | protected: |
998 | | |
999 | | const dng_camera_profile &fProfile; |
1000 | | |
1001 | | public: |
1002 | | |
1003 | | tiff_dng_extended_color_profile (const dng_camera_profile &profile); |
1004 | | |
1005 | | void Put (dng_stream &stream, |
1006 | | bool includeModelRestriction = true); |
1007 | | |
1008 | | }; |
1009 | | |
1010 | | /*****************************************************************************/ |
1011 | | |
1012 | | class tag_dng_noise_profile: public tag_data_ptr |
1013 | | { |
1014 | | |
1015 | | protected: |
1016 | | |
1017 | | real64 fValues [2 * kMaxColorPlanes]; |
1018 | | |
1019 | | public: |
1020 | | |
1021 | | explicit tag_dng_noise_profile (const dng_noise_profile &profile); |
1022 | | |
1023 | | }; |
1024 | | |
1025 | | /*****************************************************************************/ |
1026 | | |
1027 | | // Enum to control the subset of metadata to save to a file. |
1028 | | |
1029 | | enum dng_metadata_subset |
1030 | | { |
1031 | | |
1032 | | kMetadataSubset_CopyrightOnly = 0, |
1033 | | kMetadataSubset_CopyrightAndContact, |
1034 | | kMetadataSubset_AllExceptCameraInfo, |
1035 | | kMetadataSubset_All, |
1036 | | kMetadataSubset_AllExceptLocationInfo, |
1037 | | kMetadataSubset_AllExceptCameraAndLocation, |
1038 | | |
1039 | | kMetadataSubset_Last = kMetadataSubset_AllExceptCameraAndLocation |
1040 | | |
1041 | | }; |
1042 | | |
1043 | | /*****************************************************************************/ |
1044 | | |
1045 | | /// \brief Support for writing dng_image or dng_negative instances to a |
1046 | | /// dng_stream in TIFF or DNG format. |
1047 | | |
1048 | | class dng_image_writer |
1049 | | { |
1050 | | |
1051 | | friend class dng_jpeg_image; |
1052 | | friend class dng_jpeg_image_encode_task; |
1053 | | friend class dng_write_tiles_task; |
1054 | | |
1055 | | protected: |
1056 | | |
1057 | | enum |
1058 | | { |
1059 | | |
1060 | | // Target size for buffer used to copy data to the image. |
1061 | | |
1062 | | kImageBufferSize = 128 * 1024 |
1063 | | |
1064 | | }; |
1065 | | |
1066 | | public: |
1067 | | |
1068 | | dng_image_writer (); |
1069 | | |
1070 | | virtual ~dng_image_writer (); |
1071 | | |
1072 | | virtual void EncodeJPEGPreview (dng_host &host, |
1073 | | const dng_image &image, |
1074 | | dng_jpeg_preview &preview, |
1075 | | int32 quality = -1); |
1076 | | |
1077 | | virtual void WriteImage (dng_host &host, |
1078 | | const dng_ifd &ifd, |
1079 | | dng_basic_tag_set &basic, |
1080 | | dng_stream &stream, |
1081 | | const dng_image &image, |
1082 | | uint32 fakeChannels = 1); |
1083 | | |
1084 | | /// Write a dng_image to a dng_stream in TIFF format. |
1085 | | /// \param host Host interface used for progress updates, abort testing, buffer allocation, etc. |
1086 | | /// \param stream The dng_stream on which to write the TIFF. |
1087 | | /// \param image The actual image data to be written. |
1088 | | /// \param photometricInterpretation Either piBlackIsZero for monochrome or piRGB for RGB images. |
1089 | | /// \param compression Must be ccUncompressed. |
1090 | | /// \param negative or metadata If non-NULL, EXIF, IPTC, and XMP metadata from this negative is written to TIFF. |
1091 | | /// \param space If non-null and color space has an ICC profile, TIFF will be tagged with this |
1092 | | /// profile. No color space conversion of image data occurs. |
1093 | | /// \param resolution If non-NULL, TIFF will be tagged with this resolution. |
1094 | | /// \param thumbnail If non-NULL, will be stored in TIFF as preview image. |
1095 | | /// \param imageResources If non-NULL, will image resources be stored in TIFF as well. |
1096 | | /// \param metadataSubset The subset of metadata (e.g., copyright only) to include in the TIFF. |
1097 | | |
1098 | | void WriteTIFF (dng_host &host, |
1099 | | dng_stream &stream, |
1100 | | const dng_image &image, |
1101 | | uint32 photometricInterpretation, |
1102 | | uint32 compression, |
1103 | | dng_negative *negative, |
1104 | | const dng_color_space *space = NULL, |
1105 | | const dng_resolution *resolution = NULL, |
1106 | | const dng_jpeg_preview *thumbnail = NULL, |
1107 | | const dng_memory_block *imageResources = NULL, |
1108 | | dng_metadata_subset metadataSubset = kMetadataSubset_All); |
1109 | | |
1110 | | void WriteTIFF (dng_host &host, |
1111 | | dng_stream &stream, |
1112 | | const dng_image &image, |
1113 | | uint32 photometricInterpretation = piBlackIsZero, |
1114 | | uint32 compression = ccUncompressed, |
1115 | | const dng_metadata *metadata = NULL, |
1116 | | const dng_color_space *space = NULL, |
1117 | | const dng_resolution *resolution = NULL, |
1118 | | const dng_jpeg_preview *thumbnail = NULL, |
1119 | | const dng_memory_block *imageResources = NULL, |
1120 | | dng_metadata_subset metadataSubset = kMetadataSubset_All); |
1121 | | |
1122 | | /// Write a dng_image to a dng_stream in TIFF format. |
1123 | | /// \param host Host interface used for progress updates, abort testing, buffer allocation, etc. |
1124 | | /// \param stream The dng_stream on which to write the TIFF. |
1125 | | /// \param image The actual image data to be written. |
1126 | | /// \param photometricInterpretation Either piBlackIsZero for monochrome or piRGB for RGB images. |
1127 | | /// \param compression Must be ccUncompressed. |
1128 | | /// \param negative or metadata If non-NULL, EXIF, IPTC, and XMP metadata from this negative is written to TIFF. |
1129 | | /// \param profileData If non-null, TIFF will be tagged with this profile. No color space conversion |
1130 | | /// of image data occurs. |
1131 | | /// \param profileSize The size for the profile data. |
1132 | | /// \param resolution If non-NULL, TIFF will be tagged with this resolution. |
1133 | | /// \param thumbnail If non-NULL, will be stored in TIFF as preview image. |
1134 | | /// \param imageResources If non-NULL, will image resources be stored in TIFF as well. |
1135 | | /// \param metadataSubset The subset of metadata (e.g., copyright only) to include in the TIFF. |
1136 | | |
1137 | | void WriteTIFFWithProfile (dng_host &host, |
1138 | | dng_stream &stream, |
1139 | | const dng_image &image, |
1140 | | uint32 photometricInterpretation, |
1141 | | uint32 compression, |
1142 | | dng_negative *negative, |
1143 | | const void *profileData = NULL, |
1144 | | uint32 profileSize = 0, |
1145 | | const dng_resolution *resolution = NULL, |
1146 | | const dng_jpeg_preview *thumbnail = NULL, |
1147 | | const dng_memory_block *imageResources = NULL, |
1148 | | dng_metadata_subset metadataSubset = kMetadataSubset_All); |
1149 | | |
1150 | | virtual void WriteTIFFWithProfile (dng_host &host, |
1151 | | dng_stream &stream, |
1152 | | const dng_image &image, |
1153 | | uint32 photometricInterpretation = piBlackIsZero, |
1154 | | uint32 compression = ccUncompressed, |
1155 | | const dng_metadata *metadata = NULL, |
1156 | | const void *profileData = NULL, |
1157 | | uint32 profileSize = 0, |
1158 | | const dng_resolution *resolution = NULL, |
1159 | | const dng_jpeg_preview *thumbnail = NULL, |
1160 | | const dng_memory_block *imageResources = NULL, |
1161 | | dng_metadata_subset metadataSubset = kMetadataSubset_All); |
1162 | | |
1163 | | /// Write a dng_image to a dng_stream in DNG format. |
1164 | | /// \param host Host interface used for progress updates, abort testing, buffer allocation, etc. |
1165 | | /// \param stream The dng_stream on which to write the TIFF. |
1166 | | /// \param negative The image data and metadata (EXIF, IPTC, XMP) to be written. |
1167 | | /// \param previewList List of previews (not counting thumbnail) to write to the file. Defaults to empty. |
1168 | | /// \param maxBackwardVersion The DNG file should be readable by readers at least back to this version. |
1169 | | /// \param uncompressed True to force uncompressed images. Otherwise use normal compression. |
1170 | | |
1171 | | void WriteDNG (dng_host &host, |
1172 | | dng_stream &stream, |
1173 | | dng_negative &negative, |
1174 | | const dng_preview_list *previewList = NULL, |
1175 | | uint32 maxBackwardVersion = dngVersion_SaveDefault, |
1176 | | bool uncompressed = false); |
1177 | | |
1178 | | /// Write a dng_image to a dng_stream in DNG format. |
1179 | | /// \param host Host interface used for progress updates, abort testing, buffer allocation, etc. |
1180 | | /// \param stream The dng_stream on which to write the TIFF. |
1181 | | /// \param negative The image data to be written. |
1182 | | /// \param metadata The metadata (EXIF, IPTC, XMP) to be written. |
1183 | | /// \param previewList List of previews (not counting thumbnail) to write to the file. Defaults to empty. |
1184 | | /// \param maxBackwardVersion The DNG file should be readable by readers at least back to this version. |
1185 | | /// \param uncompressed True to force uncompressed images. Otherwise use normal compression. |
1186 | | |
1187 | | virtual void WriteDNG (dng_host &host, |
1188 | | dng_stream &stream, |
1189 | | const dng_negative &negative, |
1190 | | const dng_metadata &metadata, |
1191 | | const dng_preview_list *previewList = NULL, |
1192 | | uint32 maxBackwardVersion = dngVersion_SaveDefault, |
1193 | | bool uncompressed = false); |
1194 | | |
1195 | | /// Resolve metadata conflicts and apply metadata policies in keeping |
1196 | | /// with Metadata Working Group (MWG) guidelines. |
1197 | | |
1198 | | virtual void CleanUpMetadata (dng_host &host, |
1199 | | dng_metadata &metadata, |
1200 | | dng_metadata_subset metadataSubset, |
1201 | | const char *dstMIMI, |
1202 | | const char *software = NULL); |
1203 | | |
1204 | | protected: |
1205 | | |
1206 | | virtual uint32 CompressedBufferSize (const dng_ifd &ifd, |
1207 | | uint32 uncompressedSize); |
1208 | | |
1209 | | virtual void EncodePredictor (dng_host &host, |
1210 | | const dng_ifd &ifd, |
1211 | | dng_pixel_buffer &buffer, |
1212 | | AutoPtr<dng_memory_block> &tempBuffer); |
1213 | | |
1214 | | virtual void ByteSwapBuffer (dng_host &host, |
1215 | | dng_pixel_buffer &buffer); |
1216 | | |
1217 | | void ReorderSubTileBlocks (const dng_ifd &ifd, |
1218 | | dng_pixel_buffer &buffer, |
1219 | | AutoPtr<dng_memory_block> &uncompressedBuffer, |
1220 | | AutoPtr<dng_memory_block> &subTileBlockBuffer); |
1221 | | |
1222 | | virtual void WriteData (dng_host &host, |
1223 | | const dng_ifd &ifd, |
1224 | | dng_stream &stream, |
1225 | | dng_pixel_buffer &buffer, |
1226 | | AutoPtr<dng_memory_block> &compressedBuffer); |
1227 | | |
1228 | | virtual void WriteTile (dng_host &host, |
1229 | | const dng_ifd &ifd, |
1230 | | dng_stream &stream, |
1231 | | const dng_image &image, |
1232 | | const dng_rect &tileArea, |
1233 | | uint32 fakeChannels, |
1234 | | AutoPtr<dng_memory_block> &compressedBuffer, |
1235 | | AutoPtr<dng_memory_block> &uncompressedBuffer, |
1236 | | AutoPtr<dng_memory_block> &subTileBlockBuffer, |
1237 | | AutoPtr<dng_memory_block> &tempBuffer); |
1238 | | |
1239 | | }; |
1240 | | |
1241 | | /*****************************************************************************/ |
1242 | | |
1243 | | #endif |
1244 | | |
1245 | | /*****************************************************************************/ |