1 /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
2 /* EXIFPROBE - TIFF/JPEG/EXIF image file probe */
3 /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
4 /* Copyright (C) 2002,2005 by Duane H. Hesser. All rights reserved. */
5 /* */
6 /* See the file LICENSE.EXIFPROBE for terms of use. */
7 /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
8
9 #ifndef lint
10 static char *ModuleId = "@(#) $Id: maker_kyocera.c,v 1.5 2005/07/24 22:56:26 alex Exp $";
11 #endif
12
13 /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
14 /* Kyocera camera maker-specific routines */
15 /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
16
17 #include <stdio.h>
18 #include <string.h>
19 #include <stdlib.h>
20 #include "defs.h"
21 #include "datadefs.h"
22 #include "maker_datadefs.h"
23 #include "summary.h"
24 #include "maker.h"
25 #include "misc.h"
26 #include "tags.h"
27 #include "maker_extern.h"
28 #include "extern.h"
29
30 extern struct camera_id kyocera_model_id[];
31
32 int
kyocera_model_number(char * model,char * software)33 kyocera_model_number(char *model,char *software)
34 {
35 struct camera_id *model_id;
36 int number = NO_MODEL;
37
38 for(model_id = &kyocera_model_id[0]; model_id && model_id->name; ++model_id)
39 {
40 if(strncasecmp(model,model_id->name,model_id->namelen) == 0)
41 {
42 number = model_id->id;
43 setnoteversion(model_id->noteversion);
44 setnotetagset(model_id->notetagset); /* info only */
45 break;
46 }
47 }
48
49 return(number);
50 }
51
52
53 /* Dispatch a print routine for direct values in Kyocera cameras, */
54 /* based upon model */
55
56 void
print_kyocera_makervalue(struct ifd_entry * entry_ptr,int make,int model,char * prefix)57 print_kyocera_makervalue(struct ifd_entry *entry_ptr,int make,int model,
58 char *prefix)
59 {
60 int noteversion = 0;
61
62 noteversion = getnoteversion();
63
64 if(entry_ptr && (PRINT_VALUE))
65 {
66 switch(noteversion)
67 {
68 case 1:
69 print_kyocera1_makervalue(entry_ptr,make,model,prefix);
70 break;
71 default:
72 print_value(entry_ptr,PREFIX);
73 break;
74 }
75 }
76 }
77
78 /* Model-specific print routine for Kyocera cameras. This routine is */
79 /* responsible for picking off any direct entry tags which are */
80 /* peculiar and will not be handled properly by print_value() */
81 /* (usually UNDEFINED values which fit in the 4-byte entry value). If */
82 /* there are no such entries, this function simply calls */
83 /* print_value(). */
84
85 void
print_kyocera1_makervalue(struct ifd_entry * entry_ptr,int make,int model,char * prefix)86 print_kyocera1_makervalue(struct ifd_entry *entry_ptr,int make,int model,
87 char *prefix)
88 {
89 if(entry_ptr && (PRINT_VALUE))
90 {
91 switch(entry_ptr->tag)
92 {
93 default:
94 print_value(entry_ptr,PREFIX);
95 break;
96 }
97 }
98 }
99
100
101 /* Dispatch a routine to decode and print offset values for Kyocera */
102 /* cameras. */
103
104 void
print_kyocera_offset_makervalue(FILE * inptr,unsigned short byteorder,struct ifd_entry * entry_ptr,unsigned long fileoffset_base,struct image_summary * summary_entry,char * parent_name,char * prefix,int indent,int make,int model,int at_offset)105 print_kyocera_offset_makervalue(FILE *inptr,unsigned short byteorder,
106 struct ifd_entry *entry_ptr,unsigned long fileoffset_base,
107 struct image_summary *summary_entry,char *parent_name,char *prefix,
108 int indent,int make,int model,int at_offset)
109 {
110 int noteversion = 0;
111
112 noteversion = getnoteversion();
113
114 if(entry_ptr)
115 {
116 switch(noteversion)
117 {
118 case 1:
119 kyocera1_offset_makervalue(inptr,byteorder,entry_ptr,
120 fileoffset_base,summary_entry,
121 parent_name,prefix,indent,
122 make,model,at_offset);
123 break;
124 default:
125 print_generic_offset_makervalue(inptr,byteorder,entry_ptr,fileoffset_base,
126 parent_name,prefix,indent,
127 make,model,at_offset);
128 break;
129 }
130 }
131 }
132
133 /* Model-specific routine to print UNDEFINED values found at offsets */
134 /* in Kyocera makernotes. */
135
136 void
kyocera1_offset_makervalue(FILE * inptr,unsigned short byteorder,struct ifd_entry * entry_ptr,unsigned long fileoffset_base,struct image_summary * summary_entry,char * parent_name,char * prefix,int indent,int make,int model,int at_offset)137 kyocera1_offset_makervalue(FILE *inptr,unsigned short byteorder,
138 struct ifd_entry *entry_ptr,unsigned long fileoffset_base,
139 struct image_summary *summary_entry,char *parent_name,char *prefix,
140 int indent,int make,int model,int at_offset)
141 {
142 unsigned long value_offset,count;
143 char *nameoftag;
144 char *fulldirname = NULL;
145 int chpr = 0;
146
147 if(entry_ptr)
148 {
149 nameoftag = maker_tagname(entry_ptr->tag,make,model);
150 fulldirname = splice(parent_name,".",nameoftag);
151 value_offset = fileoffset_base + entry_ptr->value;
152 count = entry_ptr->count;
153
154 switch(entry_ptr->tag)
155 {
156 case 0x0e00: /* PrintIM (Epson Print Image matching) */
157 if(!at_offset && (PRINT_VALUE))
158 {
159 if(!(PRINT_OFFSET))
160 {
161 chpr += printf("@%lu:%lu",value_offset,count);
162 chpr = newline(chpr);
163 }
164 }
165 process_pim(inptr,byteorder,entry_ptr->value,fileoffset_base,
166 count,nameoftag,parent_name,prefix,indent);
167 break;
168 default:
169 print_generic_offset_makervalue(inptr,byteorder,entry_ptr,
170 fileoffset_base,fulldirname,prefix,
171 indent,make,model,at_offset);
172 break;
173 }
174 if(fulldirname)
175 free(fulldirname);
176 }
177 setcharsprinted(chpr);
178 }
179
180
181 /* Kyocera-specific tagnames for makernotes. */
182
183 char *
maker_kyocera_tagname(unsigned short tag,int model)184 maker_kyocera_tagname(unsigned short tag,int model)
185 {
186 char *tagname = CNULL;
187 int noteversion = 0;
188
189 /* Should have to do this only once, and only for unrecognized */
190 /* models. If the model is recognized (or the user has forced a */
191 /* noteversion) noteversion will already be set. */
192 if((noteversion = getnoteversion()) == 0)
193 {
194 noteversion = -1;
195 setnoteversion(-1);
196 }
197
198 if(tagname == NULL)
199 {
200 switch(tag)
201 {
202 case 0x0e00: tagname = "PrintIM"; break;
203 default: break;
204 }
205 }
206 return(tagname);
207 }
208