1 /*
2  * phoexif.c: glue between pho and the jhead exif code.
3  *
4  * Copyright 2002 by Akkana Peck.
5  * You are free to use or modify this code under the Gnu Public License.
6  */
7 
8 #include "jhead.h"
9 
10 #include "phoexif.h"
11 
12 #include <stdio.h>
13 
14 struct ExifTypes_s ExifLabels[] =
15 {
16     { "Camera make", ExifString },
17     { "Camera model", ExifString },
18     { "Date", ExifString },
19     { "Orientation", ExifInt },
20     { "Color", ExifInt },
21     { "Flash", ExifInt },
22     { "Focal Length", ExifFloat },
23     { "Exposure Time", ExifFloat },
24     { "ApertureNumber", ExifFloat },
25     { "Distance", ExifFloat },
26     { "CCD Width", ExifFloat },
27     { "Exposure Bias", ExifFloat },
28     { "White Balance", ExifInt },
29     { "Metering Mode", ExifInt },
30     { "Exposure Program", ExifInt },
31     { "ISO equivalent", ExifInt },
32     { "Compression Level", ExifInt },
33     { "EXIF Comments", ExifString },
34     { "Thumbnail Size", ExifInt }
35 };
36 
ExifReadInfo(char * filename)37 void ExifReadInfo(char* filename)
38 {
39     ProcessFile(filename);
40 }
41 
42 static char buf[BUFSIZ];
43 
ItoS(int i)44 static char* ItoS(int i)
45 {
46     sprintf(buf, "%d", i);
47     return buf;
48 }
49 
FtoS(float f)50 static char* FtoS(float f)
51 {
52     sprintf(buf, "%f", f);
53     return buf;
54 }
55 
HasExif(void)56 int HasExif(void)
57 {
58     return (ImageInfo.FileName[0] != '\0');
59 }
60 
ExifGetString(ExifFields_e field)61 const char* ExifGetString(ExifFields_e field)
62 {
63     if (!HasExif()) {
64         fprintf(stderr, "No info!\n");
65         return 0;
66     }
67 
68     switch (field)
69     {
70       case ExifCameraMake:
71           return ImageInfo.CameraMake;
72       case ExifCameraModel:
73           return ImageInfo.CameraModel;
74       case ExifDate:
75           return ImageInfo.DateTime;
76       case ExifOrientation:
77           return OrientTab[ImageInfo.Orientation];
78       case ExifColor:
79           return ItoS(ImageInfo.IsColor);
80       case ExifFlash:
81           return ItoS(ImageInfo.FlashUsed);
82       case ExifFocalLength:
83           return FtoS(ImageInfo.FocalLength);
84       case ExifExposureTime:
85           return FtoS(ImageInfo.ExposureTime);
86       case ExifAperture:
87           return FtoS(ImageInfo.ApertureFNumber);
88       case ExifDistance:
89           return FtoS(ImageInfo.Distance);
90       case ExifCCDWidth:
91           return FtoS(ImageInfo.CCDWidth);
92       case ExifExposureBias:
93           return FtoS(ImageInfo.ExposureBias);
94       case ExifWhiteBalance:
95           return ItoS(ImageInfo.Whitebalance);
96       case ExifMetering:
97           return ItoS(ImageInfo.MeteringMode);
98       case ExifExposureProgram:
99           return ItoS(ImageInfo.ExposureProgram);
100       case ExifISO:
101           return ItoS(ImageInfo.ISOequivalent);
102       case ExifCompression:
103           return ItoS(ImageInfo.CompressionLevel);
104       case ExifComments:
105           return ImageInfo.Comments;
106       case ExifThumbnailSize:
107           return ItoS(ImageInfo.ThumbnailSize);
108     }
109 
110     return 0;
111 }
112 
ExifGetInt(ExifFields_e field)113 int ExifGetInt(ExifFields_e field)
114 {
115     if (!HasExif()) {
116         fprintf(stderr, "No info!\n");
117         return 0;
118     }
119 
120     switch (field)
121     {
122       case ExifOrientation:
123           return OrientRot[ImageInfo.Orientation];
124       case ExifColor:
125           return ImageInfo.IsColor;
126       case ExifFlash:
127           return ImageInfo.FlashUsed;
128       case ExifFocalLength:
129           return (int)ImageInfo.FocalLength;
130       case ExifExposureTime:
131           return (int)ImageInfo.ExposureTime;
132       case ExifAperture:
133           return (int)ImageInfo.ApertureFNumber;
134       case ExifDistance:
135           return (int)ImageInfo.Distance;
136       case ExifCCDWidth:
137           return (int)ImageInfo.CCDWidth;
138       case ExifExposureBias:
139           return (int)ImageInfo.ExposureBias;
140       case ExifWhiteBalance:
141           return ImageInfo.Whitebalance;
142       case ExifMetering:
143           return ImageInfo.MeteringMode;
144       case ExifExposureProgram:
145           return ImageInfo.ExposureProgram;
146       case ExifISO:
147           return ImageInfo.ISOequivalent;
148       case ExifCompression:
149           return ImageInfo.CompressionLevel;
150       case ExifThumbnailSize:
151           return ImageInfo.ThumbnailSize;
152       case ExifCameraMake:
153       case ExifCameraModel:
154       case ExifDate:
155       case ExifComments:
156           return 0;
157     }
158     return 0;
159 }
160 
ExifGetFloat(ExifFields_e field)161 float ExifGetFloat(ExifFields_e field)
162 {
163     if (!HasExif()) {
164         fprintf(stderr, "No info!\n");
165         return 0;
166     }
167 
168     switch (field)
169     {
170       case ExifOrientation:
171           return (float)OrientRot[ImageInfo.Orientation];
172       case ExifColor:
173           return (float)ImageInfo.IsColor;
174       case ExifFlash:
175           return (float)ImageInfo.FlashUsed;
176       case ExifFocalLength:
177           return ImageInfo.FocalLength;
178       case ExifExposureTime:
179           return ImageInfo.ExposureTime;
180       case ExifAperture:
181           return ImageInfo.ApertureFNumber;
182       case ExifDistance:
183           return ImageInfo.Distance;
184       case ExifCCDWidth:
185           return ImageInfo.CCDWidth;
186       case ExifExposureBias:
187           return ImageInfo.ExposureBias;
188       case ExifWhiteBalance:
189           return (float)ImageInfo.Whitebalance;
190       case ExifMetering:
191           return (float)ImageInfo.MeteringMode;
192       case ExifExposureProgram:
193           return (float)ImageInfo.ExposureProgram;
194       case ExifISO:
195           return (float)ImageInfo.ISOequivalent;
196       case ExifCompression:
197           return (float)ImageInfo.CompressionLevel;
198       case ExifThumbnailSize:
199           return (float)ImageInfo.ThumbnailSize;
200       case ExifCameraMake:
201       case ExifCameraModel:
202       case ExifDate:
203       case ExifComments:
204           return 0;
205     }
206     return 0;
207 }
208 
209