Subversion Repositories Kolibri OS

Rev

Rev 6315 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4994 IgorA 1
format MS COFF
2
public EXPORTS
3
section '.flat' code readable align 16
4
 
5
include '../../../../macros.inc'
6
include '../../../../proc32.inc'
7
 
8
 
9
 
10
;---------
5008 IgorA 11
offs_m_or_i    equ  8 ;смещение параметра 'MM' или 'II' (Motorola, Intel)
12
offs_id_gr     equ 10 ;смещение id group
5010 IgorA 13
offs_id_gr_mak equ 12 ;смещение id group производителя
5008 IgorA 14
offs_tag_0     equ  2 ;смещение 0-го тега
4994 IgorA 15
tag_size       equ 12 ;размер структуры тега
16
;форматы данных
17
tag_format_ui1b  equ  1 ;unsigned integer 1 byte
18
tag_format_text  equ  2 ;ascii string
19
tag_format_ui2b  equ  3 ;unsigned integer 2 byte
20
tag_format_ui4b  equ  4 ;unsigned integer 4 byte
4995 IgorA 21
tag_format_urb   equ  5 ;unsigned integer 4/4 byte
4994 IgorA 22
tag_format_si1b  equ  6 ;signed integer 1 byte
23
tag_format_undef equ  7 ;undefined
24
tag_format_si2b  equ  8 ;signed integer 2 byte
25
tag_format_si4b  equ  9 ;signed integer 4 byte
4995 IgorA 26
tag_format_srb   equ 10 ;signed integer 4/4 byte
4994 IgorA 27
tag_format_f4b	 equ 11 ;float 4 byte
28
tag_format_f8b	 equ 12 ;float 8 byte
29
 
30
align 4
31
txt_dp db ': ',0
5009 IgorA 32
txt_zap db ', ',0
4995 IgorA 33
txt_div db '/',0
4994 IgorA 34
 
5010 IgorA 35
;заголовок таблиц с группами тегов
4994 IgorA 36
align 4
37
exif_tag_numbers:
5010 IgorA 38
dd 0,      gr_0    ;группа app1
5008 IgorA 39
dd 0x8769, gr_8769 ;Exif offset
40
dd 0xa005, gr_a005 ;Interop offset
41
dd 0x8825, gr_8825 ;GPS info
5010 IgorA 42
 
43
;групы app2 (здесь у каждого производителя камер свой формат тегов)
44
dw 0x927c ;app2 для Nikon
45
db 'Ni'
46
dd gr_927c_Ni
47
 
48
dw 0x927c ;app2 для Panasonic
49
db 'Pa'
50
dd gr_927c_Pa
51
 
52
dw 0x927c ;app2 для Canon
53
db 'Ca'
54
dd gr_927c_Ca
6315 IgorA 55
 
56
dw 0x927c ;app2 для Samsung
57
db 'Sa'
58
dd gr_927c_Sa
5008 IgorA 59
.end:
4994 IgorA 60
 
5008 IgorA 61
align 4
62
gr_0:
5002 IgorA 63
db 0x00,0x0b,'Processing software',0
64
db 0x00,0xfe,'Subfile type',0
65
db 0x00,0xff,'OldSubfile type',0
66
db 0x01,0x00,'Image width',0
67
db 0x01,0x01,'Image height',0
68
db 0x01,0x02,'Bits per sample',0
69
db 0x01,0x03,'Compression',0
70
db 0x01,0x06,'Photometric interpretation',0
71
db 0x01,0x07,'Thresholding',0
72
db 0x01,0x08,'Cell width',0
73
db 0x01,0x09,'Cell length',0
74
db 0x01,0x0a,'Fill order',0
75
db 0x01,0x0d,'Document name',0
4994 IgorA 76
db 0x01,0x0e,'Image description',0
77
db 0x01,0x0f,'Manufacturer of digicam',0
78
db 0x01,0x10,'Model',0
5002 IgorA 79
db 0x01,0x11,'Strip offsets',0
4994 IgorA 80
db 0x01,0x12,'Orientation',0
5002 IgorA 81
db 0x01,0x15,'Samples per pixel',0
82
db 0x01,0x16,'Rows per strip',0
83
db 0x01,0x17,'Strip byte counts',0
84
db 0x01,0x18,'Min sample value',0
85
db 0x01,0x19,'Max sample value',0
4994 IgorA 86
db 0x01,0x1a,'X resolution',0
87
db 0x01,0x1b,'Y resolution',0
5002 IgorA 88
db 0x01,0x1c,'Planar configuration',0
89
db 0x01,0x1d,'Page name',0
90
db 0x01,0x1e,'X position',0
91
db 0x01,0x1f,'Y position',0
92
db 0x01,0x20,'Free offsets',0
93
db 0x01,0x21,'Free byte counts',0
94
db 0x01,0x22,'Gray response unit',0
95
db 0x01,0x23,'Gray response curve',0
96
db 0x01,0x24,'T4 options',0
97
db 0x01,0x25,'T6 options',0
4994 IgorA 98
db 0x01,0x28,'Resolution unit',0
5002 IgorA 99
db 0x01,0x29,'Page number',0
100
db 0x01,0x2c,'Color response unit',0
101
db 0x01,0x2d,'Transfer function',0
4994 IgorA 102
db 0x01,0x31,'Software',0
5002 IgorA 103
db 0x01,0x32,'Modify date',0
104
db 0x01,0x3b,'Artist',0
105
db 0x01,0x3c,'Host computer',0
106
db 0x01,0x3d,'Predictor',0
4994 IgorA 107
db 0x01,0x3e,'White point',0
108
db 0x01,0x3f,'Primary chromaticities',0
5002 IgorA 109
db 0x01,0x40,'Color map',0
110
db 0x01,0x41,'Halftone hints',0
111
db 0x01,0x42,'Tile width',0
112
db 0x01,0x43,'Tile length',0
113
db 0x01,0x44,'Tile offsets',0
114
db 0x01,0x45,'Tile byte counts',0
115
db 0x01,0x46,'Bad fax lines',0
116
db 0x01,0x47,'Clean fax data',0
117
db 0x01,0x48,'Consecutive bad fax lines',0
118
db 0x01,0x4a,'Sub IFDs',0
119
db 0x01,0x4c,'Ink set',0
120
db 0x01,0x4d,'Ink names',0
121
db 0x01,0x4e,'Numberof inks',0
122
db 0x01,0x50,'Dot range',0
123
db 0x01,0x51,'Target printer',0
124
db 0x01,0x52,'Extra samples',0
125
db 0x01,0x53,'Sample format',0
126
db 0x01,0x54,'SMin sample value',0
127
db 0x01,0x55,'SMax sample value',0
128
db 0x01,0x56,'Transfer range',0
129
db 0x01,0x57,'Clip path',0
130
db 0x01,0x58,'X clip path units',0
131
db 0x01,0x59,'Y clip path units',0
132
db 0x01,0x5a,'Indexed',0
133
db 0x01,0x5b,'JPEG tables',0
134
db 0x01,0x5f,'OPIProxy',0
135
db 0x01,0x90,'Global parameters IFD',0
136
db 0x01,0x91,'Profile type',0
137
db 0x01,0x92,'Fax profile',0
138
db 0x01,0x93,'Coding methods',0
139
db 0x01,0x94,'Version year',0
140
db 0x01,0x95,'Mode number',0
141
db 0x01,0xb1,'Decode',0
142
db 0x01,0xb2,'Default image color',0
143
db 0x01,0xb3,'T82 options',0
144
db 0x01,0xb5,'JPEG tables',0 ;уже было ?
145
db 0x02,0x00,'JPEG proc',0
146
db 0x02,0x01,'Thumbnail offset',0
147
db 0x02,0x02,'Thumbnail length',0
148
db 0x02,0x03,'JPEG restart interval',0
149
db 0x02,0x05,'JPEG lossless predictors',0
150
db 0x02,0x06,'JPEG point transforms',0
151
db 0x02,0x07,'JPEG QTables',0
152
db 0x02,0x08,'JPEG DCTables',0
153
db 0x02,0x09,'JPEG ACTables',0
4994 IgorA 154
db 0x02,0x11,'YCbCrCoefficients',0
5002 IgorA 155
db 0x02,0x12,'YCbCrSubSampling',0
4994 IgorA 156
db 0x02,0x13,'YCbCrPositioning',0
157
db 0x02,0x14,'Reference black white',0
5002 IgorA 158
db 0x02,0x2f,'Strip row counts',0
159
db 0x03,0xe7,'USPTO Miscellaneous',0
160
db 0x47,0x46,'Rating',0
161
db 0x47,0x47,'XP_DIP_XML',0
162
db 0x47,0x48,'Stitch info',0
163
db 0x47,0x49,'Rating percent',0
164
db 0x80,0x0d,'Image ID',0
165
db 0x80,0xa3,'Wang tag 1',0
166
db 0x80,0xa4,'Wang annotation',0
167
db 0x80,0xa5,'Wang tag 3',0
168
db 0x80,0xa6,'Wang tag 4',0
169
db 0x80,0xe3,'Matteing',0
170
db 0x80,0xe4,'Data type',0
171
db 0x80,0xe5,'Image depth',0
172
db 0x80,0xe6,'Tile depth',0
173
db 0x82,0x7d,'Model 2',0
174
db 0x82,0x8d,'CFA repeat pattern dim',0
175
db 0x82,0x8e,'CFA pattern 2',0
176
db 0x82,0x8f,'Battery level',0
177
db 0x82,0x90,'Kodak IFD',0
4994 IgorA 178
db 0x82,0x98,'Copyright',0
5002 IgorA 179
db 0x82,0xa5,'MD file tag',0
180
db 0x82,0xa6,'MD scale pixel',0
181
db 0x82,0xa7,'MD color table',0
182
db 0x82,0xa8,'MD lab name',0
183
db 0x82,0xa9,'MD sample info',0
184
db 0x82,0xaa,'MD prep date',0
185
db 0x82,0xab,'MD prep time',0
186
db 0x82,0xac,'MD file units',0
187
db 0x83,0x0e,'Pixel scale',0
188
db 0x83,0x35,'Advent scale',0
189
db 0x83,0x36,'Advent revision',0
190
db 0x83,0x5c,'UIC1 tag',0
191
db 0x83,0x5d,'UIC2 tag',0
192
db 0x83,0x5e,'UIC3 tag',0
193
db 0x83,0x5f,'UIC4 tag',0
194
db 0x83,0xbb,'IPTC-NAA',0
195
db 0x84,0x7e,'Intergraph packet data',0
196
db 0x84,0x7f,'Intergraph flag registers',0
197
db 0x84,0x80,'Intergraph matrix',0
198
db 0x84,0x81,'INGR reserved',0
199
db 0x84,0x82,'Model tie point',0
200
db 0x84,0xe0,'Site',0
201
db 0x84,0xe1,'Color sequence',0
202
db 0x84,0xe2,'IT8 header',0
203
db 0x84,0xe3,'Raster padding',0
204
db 0x84,0xe4,'Bits per run length',0
205
db 0x84,0xe5,'Bits per extended run length',0
206
db 0x84,0xe6,'Color table',0
207
db 0x84,0xe7,'Image color indicator',0
208
db 0x84,0xe8,'Background color indicator',0
209
db 0x84,0xe9,'Image color value',0
210
db 0x84,0xea,'Background color value',0
211
db 0x84,0xeb,'Pixel intensity range',0
212
db 0x84,0xec,'Transparency indicator',0
213
db 0x84,0xed,'Color characterization',0
214
db 0x84,0xee,'HCUsage',0
215
db 0x84,0xef,'Trap indicator',0
216
db 0x84,0xf0,'CMYK equivalent',0
217
db 0x85,0x46,'SEM info',0
218
db 0x85,0x68,'AFCP_IPTC',0
219
db 0x85,0xb8,'Pixel magic JBIG options',0
220
db 0x85,0xd8,'Model transform',0
221
db 0x86,0x02,'WB_GRGB levels',0
222
db 0x86,0x06,'Leaf data',0
223
db 0x86,0x49,'Photoshop settings',0
4994 IgorA 224
db 0x87,0x69,'Exif offset',0
5002 IgorA 225
db 0x87,0x73,'ICC_Profile',0
226
db 0x87,0x7f,'TIFF_FX extensions',0
227
db 0x87,0x80,'Multi profiles',0
228
db 0x87,0x81,'Shared data',0
229
db 0x87,0x82,'T88 options',0
230
db 0x87,0xac,'Image layer',0
231
db 0x87,0xaf,'Geo tiff directory',0
232
db 0x87,0xb0,'Geo tiff double params',0
233
db 0x87,0xb1,'Geo tiff ascii params',0
5009 IgorA 234
db 0x88,0x25,'GPS info',0
5002 IgorA 235
db 0x88,0x28,'Opto-Electric conv factor',0
236
db 0x88,0x29,'Interlace',0
237
db 0x88,0x5c,'Fax recv params',0
238
db 0x88,0x5d,'Fax sub address',0
239
db 0x88,0x5e,'Fax recv time',0
240
db 0x88,0x8a,'Leaf sub IFD',0
241
db 0x92,0x0b,'Flash energy',0
242
db 0x92,0x0c,'Spatial frequency response',0
243
db 0x92,0x0d,'Noise',0
244
db 0x92,0x0e,'Focal plane X resolution',0
245
db 0x92,0x0f,'Focal plane Y resolution',0
246
db 0x92,0x10,'Focal plane resolution unit',0
247
db 0x92,0x15,'Exposure index',0
248
db 0x92,0x16,'TIFF-EP standard ID',0
249
db 0x92,0x17,'Sensing method',0
250
db 0x92,0x3a,'CIP3 data file',0
251
db 0x92,0x3b,'CIP3 sheet',0
252
db 0x92,0x3c,'CIP3 side',0
253
db 0x92,0x3f,'Sto nits',0
254
db 0x93,0x2f,'MS document text',0
255
db 0x93,0x30,'MS property set storage',0
256
db 0x93,0x31,'MS document text position',0
257
db 0x93,0x5c,'Image source data',0
258
db 0x9c,0x9b,'XP title',0
259
db 0x9c,0x9c,'XP comment',0
260
db 0x9c,0x9d,'XP author',0
261
db 0x9c,0x9e,'XP keywords',0
262
db 0x9c,0x9f,'XP subject',0
263
db 0xa2,0x0c,'Spatial frequency fesponse',0
264
db 0xa2,0x0d,'Noise',0
265
db 0xa2,0x11,'Image number',0
266
db 0xa2,0x12,'Security classification',0
267
db 0xa2,0x13,'Image history',0
268
db 0xa2,0x16,'TIFF-EP standard ID',0
4995 IgorA 269
db 0xa4,0x80,'GDAL metadata',0
270
db 0xa4,0x81,'GDAL no data',0
271
db 0xaf,0xc0,'Expand software',0
272
db 0xaf,0xc1,'Expand lens',0
273
db 0xaf,0xc2,'Expand film',0
274
db 0xaf,0xc3,'Expand filterLens',0
275
db 0xaf,0xc4,'Expand scanner',0
276
db 0xaf,0xc5,'Expand flash lamp',0
5002 IgorA 277
db 0xbc,0x01,'Pixel format',0
278
db 0xbc,0x02,'Transformation',0
279
db 0xbc,0x03,'Uncompressed',0
280
db 0xbc,0x04,'Image type',0
281
db 0xbc,0x80,'Image width',0
282
db 0xbc,0x81,'Image height',0
283
db 0xbc,0x82,'Width resolution',0
284
db 0xbc,0x83,'Height resolution',0
285
db 0xbc,0xc0,'Image offset',0
286
db 0xbc,0xc1,'Image byte count',0
287
db 0xbc,0xc2,'Alpha offset',0
288
db 0xbc,0xc3,'Alpha byte count',0
289
db 0xbc,0xc4,'Image data discard',0
290
db 0xbc,0xc5,'Alpha data discard',0
291
db 0xc4,0x27,'Oce scanjob desc',0
292
db 0xc4,0x28,'Oce application selector',0
293
db 0xc4,0x29,'Oce ID number',0
294
db 0xc4,0x2a,'Oce image logic',0
295
db 0xc4,0x4f,'Annotations',0
296
db 0xc4,0xa5,'Print IM',0
297
db 0xc5,0x73,'Original file name',0
298
db 0xc5,0x80,'USPTO original content type',0
299
db 0xc6,0x12,'DNG version',0
300
db 0xc6,0x13,'DNG backward version',0
301
db 0xc6,0x14,'Unique camera model',0
302
db 0xc6,0x15,'Localized camera model',0
303
db 0xc6,0x16,'CFA plane color',0
304
db 0xc6,0x17,'CFA layout',0
305
db 0xc6,0x18,'Linearization table',0
306
db 0xc6,0x19,'Black level repeat dim',0
307
db 0xc6,0x1a,'Black level',0
308
db 0xc6,0x1b,'Black level delta H',0
309
db 0xc6,0x1c,'Black level delta V',0
310
db 0xc6,0x1d,'White level',0
311
db 0xc6,0x1e,'Default scale',0
312
db 0xc6,0x1f,'Default crop origin',0
313
db 0xc6,0x20,'Default crop size',0
314
db 0xc6,0x21,'Color matrix 1',0
315
db 0xc6,0x22,'Color matrix 2',0
316
db 0xc6,0x23,'Camera calibration 1',0
317
db 0xc6,0x24,'Camera calibration 2',0
318
db 0xc6,0x25,'Reduction matrix 1',0
319
db 0xc6,0x26,'Reduction matrix 2',0
320
db 0xc6,0x27,'Analog balance',0
321
db 0xc6,0x28,'As shot neutral',0
322
db 0xc6,0x29,'As shot white XY',0
323
db 0xc6,0x2a,'BaselineExposure',0
324
db 0xc6,0x2b,'BaselineNoise',0
325
db 0xc6,0x2c,'BaselineSharpness',0
326
db 0xc6,0x2d,'BayerGreenSplit',0
327
db 0xc6,0x2e,'Linear response limit',0
328
db 0xc6,0x2f,'Camera serial number',0
329
db 0xc6,0x30,'DNG lens info',0
330
db 0xc6,0x31,'Chroma blur radius',0
331
db 0xc6,0x32,'Anti alias strength',0
332
db 0xc6,0x33,'Shadow scale',0
333
db 0xc6,0x34,'SR2 private',0
334
db 0xc6,0x35,'Maker note safety',0
335
db 0xc6,0x40,'Raw image segmentation',0
336
db 0xc6,0x5a,'Calibration illuminant 1',0
337
db 0xc6,0x5b,'Calibration illuminant 2',0
338
db 0xc6,0x5c,'Best quality scale',0
339
db 0xc6,0x5d,'Raw data unique ID',0
340
db 0xc6,0x60,'Alias layer metadata',0
341
db 0xc6,0x8b,'Original raw file name',0
342
db 0xc6,0x8c,'Original raw file data',0
343
db 0xc6,0x8d,'Active area',0
344
db 0xc6,0x8e,'Masked areas',0
345
db 0xc6,0x8f,'AsShot ICC profile',0
346
db 0xc6,0x90,'AsShot pre profile matrix',0
347
db 0xc6,0x91,'Current ICC profile',0
348
db 0xc6,0x92,'Current pre profile matrix',0
349
db 0xc6,0xbf,'Colorimetric reference',0
350
db 0xc6,0xd2,'Panasonic title',0
351
db 0xc6,0xd3,'Panasonic title 2',0
352
db 0xc6,0xf3,'Camera calibration sig',0
353
db 0xc6,0xf4,'Profile calibration sig',0
354
db 0xc6,0xf5,'Profile IFD',0
355
db 0xc6,0xf6,'AsShot profile name',0
356
db 0xc6,0xf7,'Noise reduction applied',0
357
db 0xc6,0xf8,'Profile name',0
358
db 0xc6,0xf9,'Profile hue sat map dims',0
359
db 0xc6,0xfa,'Profile hue sat map data 1',0
360
db 0xc6,0xfb,'Profile hue sat map data 2',0
361
db 0xc6,0xfc,'Profile tone curve',0
362
db 0xc6,0xfd,'Profile embed policy',0
363
db 0xc6,0xfe,'Profile copyright',0
364
db 0xc7,0x14,'Forward matrix 1',0
365
db 0xc7,0x15,'Forward matrix 2',0
366
db 0xc7,0x16,'Preview application name',0
367
db 0xc7,0x17,'Preview application version',0
368
db 0xc7,0x18,'Preview settings name',0
369
db 0xc7,0x19,'Preview settings digest',0
370
db 0xc7,0x1a,'Preview color space',0
371
db 0xc7,0x1b,'Preview date time',0
372
db 0xc7,0x1c,'Raw image digest',0
373
db 0xc7,0x1d,'Original raw file digest',0
374
db 0xc7,0x1e,'Sub tile block size',0
375
db 0xc7,0x1f,'Row interleave factor',0
376
db 0xc7,0x25,'Profile look table dims',0
377
db 0xc7,0x26,'Profile look table data',0
378
db 0xc7,0x40,'Opcode list 1',0
379
db 0xc7,0x41,'Opcode list 2',0
380
db 0xc7,0x4e,'Opcode list 3',0
381
db 0xc7,0x61,'Noise profile',0
382
db 0xc7,0x63,'Time codes',0
383
db 0xc7,0x64,'Frame rate',0
384
db 0xc7,0x72,'TStop',0
385
db 0xc7,0x89,'Reel name',0
386
db 0xc7,0x91,'Original default final size',0
387
db 0xc7,0x92,'Original best quality size',0
388
db 0xc7,0x93,'Original default crop size',0
389
db 0xc7,0xa1,'Camera label',0
390
db 0xc7,0xa3,'Profile hue sat map encoding',0
391
db 0xc7,0xa4,'Profile look table encoding',0
392
db 0xc7,0xa5,'Baseline exposure offset',0
393
db 0xc7,0xa6,'Default black render',0
394
db 0xc7,0xa7,'New raw image digest',0
395
db 0xc7,0xa8,'Raw to preview gain',0
396
db 0xc7,0xb5,'Default user crop',0
5008 IgorA 397
db 0xfe,0x00,'KDC_IFD',0
398
 
399
dd 0
400
 
401
align 4
402
gr_8769:
403
db 0x02,0xbc,'Application notes',0
404
db 0x82,0x9a,'Exposure time',0
405
db 0x82,0x9d,'F number',0
406
db 0x88,0x22,'Exposure program',0
407
db 0x88,0x24,'Spectral sensitivity',0
408
db 0x88,0x27,'ISO',0
409
db 0x88,0x2a,'Time zone offset',0
410
db 0x88,0x2b,'Self timer mode',0
411
db 0x88,0x30,'Sensitivity type',0
412
db 0x88,0x31,'Standard output sensitivity',0
413
db 0x88,0x32,'Recommended exposure index',0
414
db 0x88,0x33,'ISO speed',0
415
db 0x88,0x34,'ISO speed latitude yyy',0
416
db 0x88,0x35,'ISO speed latitude zzz',0
417
db 0x90,0x00,'Exif version',0
418
db 0x90,0x03,'Date time original',0
419
db 0x90,0x04,'Create date',0
420
db 0x91,0x01,'Components configuration',0
421
db 0x91,0x02,'Compressed bits per pixel',0
422
db 0x92,0x01,'Shutter speed value',0
423
db 0x92,0x02,'Aperture value',0
424
db 0x92,0x03,'Brightness value',0
425
db 0x92,0x04,'Exposure compensation',0
426
db 0x92,0x05,'Max aperture value',0
427
db 0x92,0x06,'Subject distance',0
428
db 0x92,0x07,'Metering mode',0
429
db 0x92,0x08,'Light source',0
430
db 0x92,0x09,'Flash',0
431
db 0x92,0x0a,'Focal length',0
432
db 0x92,0x11,'Image number',0
433
db 0x92,0x12,'Security classification',0
434
db 0x92,0x13,'Image history',0
435
db 0x92,0x14,'Subject area',0
436
db 0x92,0x7c,'Maker note',0
437
db 0x92,0x86,'User comment',0
438
db 0x92,0x90,'Sub sec time',0
439
db 0x92,0x91,'Sub sec time original',0
440
db 0x92,0x92,'Sub sec time digitized',0
441
db 0xa0,0x00,'Flashpix version',0
442
db 0xa0,0x01,'Color space',0
443
db 0xa0,0x02,'Exif image width',0
444
db 0xa0,0x03,'Exif image height',0
445
db 0xa0,0x04,'Related sound file',0
446
db 0xa0,0x05,'Interop offset',0
447
db 0xa2,0x0b,'Flash energy',0
448
db 0xa2,0x0e,'Focal plane X resolution',0
449
db 0xa2,0x0f,'Focal plane Y resolution',0
450
db 0xa2,0x10,'Focal plane resolution unit',0
451
db 0xa2,0x14,'Subject location',0
452
db 0xa2,0x15,'Exposure index',0
453
db 0xa2,0x17,'Sensing method',0
454
db 0xa3,0x00,'File source',0
455
db 0xa3,0x01,'Scene type',0
456
db 0xa3,0x02,'CFA pattern',0
457
db 0xa4,0x01,'Custom rendered',0
458
db 0xa4,0x02,'Exposure mode',0
459
db 0xa4,0x03,'White balance',0
460
db 0xa4,0x04,'Digital zoom ratio',0
461
db 0xa4,0x05,'Focal length in 35mm format',0
462
db 0xa4,0x06,'Scene capture type',0
463
db 0xa4,0x07,'Gain control',0
464
db 0xa4,0x08,'Contrast',0
465
db 0xa4,0x09,'Saturation',0
466
db 0xa4,0x0a,'Sharpness',0
467
db 0xa4,0x0b,'Device setting description',0
468
db 0xa4,0x0c,'Subject distance range',0
469
db 0xa4,0x20,'Image unique ID',0
470
db 0xa4,0x30,'Owner name',0
471
db 0xa4,0x31,'Serial number',0
472
db 0xa4,0x32,'Lens info',0
473
db 0xa4,0x33,'Lens make',0
474
db 0xa4,0x34,'Lens model',0
475
db 0xa4,0x35,'Lens serial number',0
476
db 0xa5,0x00,'Gamma',0
5002 IgorA 477
db 0xea,0x1c,'Padding',0
478
db 0xea,0x1d,'Offset schema',0
479
db 0xfd,0xe8,'Owner name',0
480
db 0xfd,0xe9,'Serial number',0
481
db 0xfd,0xea,'Lens',0
482
db 0xfe,0x4c,'Raw file',0
483
db 0xfe,0x4d,'Converter',0
484
db 0xfe,0x4e,'White balance',0
485
db 0xfe,0x51,'Exposure',0
486
db 0xfe,0x52,'Shadows',0
487
db 0xfe,0x53,'Brightness',0
488
db 0xfe,0x54,'Contrast',0
489
db 0xfe,0x55,'Saturation',0
490
db 0xfe,0x56,'Sharpness',0
491
db 0xfe,0x57,'Smoothness',0
492
db 0xfe,0x58,'Moire filter',0
4995 IgorA 493
 
5008 IgorA 494
dd 0
495
 
496
align 4
497
gr_a005:
498
db 0x00,0x01,'Interop index',0
499
db 0x00,0x02,'Interop version',0
500
db 0x10,0x00,'Related image file format',0
501
db 0x10,0x01,'Related image width',0
502
db 0x10,0x02,'Related image height',0
503
dd 0
504
 
505
align 4
506
gr_8825:
5007 IgorA 507
db 0x00,0x00,'GPS version ID',0
5008 IgorA 508
db 0x00,0x01,'GPS latitude ref',0
509
db 0x00,0x02,'GPS latitude',0
510
db 0x00,0x03,'GPS longitude ref',0
511
db 0x00,0x04,'GPS longitude',0
512
db 0x00,0x05,'GPS altitude ref',0
513
db 0x00,0x06,'GPS altitude',0
514
db 0x00,0x07,'GPS time stamp',0
515
db 0x00,0x08,'GPS satellites',0
516
db 0x00,0x09,'GPS status',0
517
db 0x00,0x0a,'GPS measuremode',0
518
db 0x00,0x0b,'GPS dop',0
519
db 0x00,0x0c,'GPS speed ref',0
520
db 0x00,0x0d,'GPS speed',0
521
db 0x00,0x0e,'GPS track ref',0
522
db 0x00,0x0f,'GPS track',0
523
db 0x00,0x10,'GPS img direction ref',0
524
db 0x00,0x11,'GPS img direction',0
525
db 0x00,0x12,'GPS map datum',0
526
db 0x00,0x13,'GPS dest latitude ref',0
527
db 0x00,0x14,'GPS dest latitude',0
528
db 0x00,0x15,'GPS dest longitude ref',0
529
db 0x00,0x16,'GPS dest longitude',0
530
db 0x00,0x17,'GPS dest bearing ref',0
531
db 0x00,0x18,'GPS dest bearing',0
532
db 0x00,0x19,'GPS dest distance ref',0
533
db 0x00,0x1a,'GPS dest distance',0
534
db 0x00,0x1b,'GPS processing method',0
535
db 0x00,0x1c,'GPS area information',0
536
db 0x00,0x1d,'GPS date stamp',0
537
db 0x00,0x1e,'GPS differential',0
538
db 0x00,0x1f,'GPS h positioning error',0
4994 IgorA 539
 
5007 IgorA 540
dd 0
541
 
5010 IgorA 542
;данные app2 для Nikon
543
align 4
544
gr_927c_Ni:
545
db 0x00,0x01,'MakerNoteVersion',0
546
db 0x00,0x02,'ISO',0
547
db 0x00,0x03,'ColorMode',0
548
db 0x00,0x04,'Quality',0
549
db 0x00,0x05,'WhiteBalance',0
550
db 0x00,0x06,'Sharpness',0
551
db 0x00,0x07,'FocusMode',0
552
db 0x00,0x08,'FlashSetting',0
553
db 0x00,0x09,'FlashType',0
554
db 0x00,0x0b,'WhiteBalanceFineTune',0
555
db 0x00,0x0c,'WB_RBLevels',0
556
db 0x00,0x0d,'ProgramShift',0
557
db 0x00,0x0e,'ExposureDifference',0
558
db 0x00,0x0f,'ISOSelection',0
559
db 0x00,0x10,'DataDump',0
560
db 0x00,0x11,'PreviewIFD',0
561
db 0x00,0x12,'FlashExposureComp',0
562
db 0x00,0x13,'ISOSetting',0
563
db 0x00,0x14,'ColorBalanceA ',0
564
db 0x00,0x16,'ImageBoundary',0
565
db 0x00,0x17,'ExternalFlashExposureComp',0
566
db 0x00,0x18,'FlashExposureBracketValue',0
567
db 0x00,0x19,'ExposureBracketValue',0
568
db 0x00,0x1a,'ImageProcessing',0
569
db 0x00,0x1b,'CropHiSpeed',0
570
db 0x00,0x1c,'ExposureTuning',0
571
db 0x00,0x1d,'SerialNumber',0
572
db 0x00,0x1e,'ColorSpace',0
573
db 0x00,0x1f,'VRInfo',0
574
db 0x00,0x20,'ImageAuthentication',0
575
db 0x00,0x21,'FaceDetect',0
576
db 0x00,0x22,'ActiveD-Lighting',0
577
db 0x00,0x23,'PictureControlData',0
578
db 0x00,0x24,'WorldTime',0
579
db 0x00,0x25,'ISOInfo',0
580
db 0x00,0x2a,'VignetteControl',0
581
db 0x00,0x2b,'DistortInfo',0
582
db 0x00,0x2c,'UnknownInfo',0
583
db 0x00,0x32,'UnknownInfo2',0
584
db 0x00,0x35,'HDRInfo',0
585
db 0x00,0x39,'LocationInfo',0
586
db 0x00,0x3d,'BlackLevel',0
587
db 0x00,0x80,'ImageAdjustment',0
588
db 0x00,0x81,'ToneComp',0
589
db 0x00,0x82,'AuxiliaryLens',0
590
db 0x00,0x83,'LensType',0
591
db 0x00,0x84,'Lens',0
592
db 0x00,0x85,'ManualFocusDistance',0
593
db 0x00,0x86,'DigitalZoom',0
594
db 0x00,0x87,'FlashMode',0
595
db 0x00,0x88,'AFInfo',0
596
db 0x00,0x89,'ShootingMode',0
597
db 0x00,0x8b,'LensFStops',0
598
db 0x00,0x8c,'ContrastCurve',0
599
db 0x00,0x8d,'ColorHue',0
600
db 0x00,0x8f,'SceneMode',0
601
db 0x00,0x90,'LightSource',0
602
db 0x00,0x91,'ShotInfo',0
603
db 0x00,0x92,'HueAdjustment',0
604
db 0x00,0x93,'NEFCompression',0
605
db 0x00,0x94,'Saturation',0
606
db 0x00,0x95,'NoiseReduction',0
607
db 0x00,0x96,'NEFLinearizationTable',0
608
db 0x00,0x97,'ColorBalance',0
609
db 0x00,0x98,'LensData',0
610
db 0x00,0x99,'RawImageCenter',0
611
db 0x00,0x9a,'SensorPixelSize',0
612
db 0x00,0x9c,'SceneAssist',0
613
db 0x00,0x9e,'RetouchHistory',0
614
db 0x00,0xa0,'SerialNumber',0
615
db 0x00,0xa2,'ImageDataSize',0
616
db 0x00,0xa5,'ImageCount',0
617
db 0x00,0xa6,'DeletedImageCount',0
618
db 0x00,0xa7,'ShutterCount',0
619
db 0x00,0xa8,'FlashInfo',0
620
db 0x00,0xa9,'ImageOptimization',0
621
db 0x00,0xaa,'Saturation',0
622
db 0x00,0xab,'VariProgram',0
623
db 0x00,0xac,'ImageStabilization',0
624
db 0x00,0xad,'AFResponse',0
625
db 0x00,0xb0,'MultiExposure',0
626
db 0x00,0xb1,'HighISONoiseReduction',0
627
db 0x00,0xb3,'ToningEffect',0
628
db 0x00,0xb6,'PowerUpTime',0
629
db 0x00,0xb7,'AFInfo2',0
630
db 0x00,0xb8,'FileInfo',0
631
db 0x00,0xb9,'AFTune',0
632
db 0x00,0xbd,'PictureControlData',0
633
db 0x00,0xc3,'BarometerInfo',0
634
db 0x0e,0x00,'PrintIM',0
635
db 0x0e,0x01,'NikonCaptureData',0
636
db 0x0e,0x09,'NikonCaptureVersion',0
637
db 0x0e,0x0e,'NikonCaptureOffsets',0
638
db 0x0e,0x10,'NikonScanIFD',0
639
db 0x0e,0x13,'NikonCaptureEditVersions ',0
640
db 0x0e,0x1d,'NikonICCProfile',0
641
db 0x0e,0x1e,'NikonCaptureOutput',0
642
db 0x0e,0x22,'NEFBitDepth',0
643
 
644
dd 0
645
 
646
;данные app2 для Panasonic
647
align 4
648
gr_927c_Pa:
649
db 0x00,0x01,'ImageQuality',0
650
db 0x00,0x02,'FirmwareVersion',0
651
db 0x00,0x03,'WhiteBalance',0
652
db 0x00,0x07,'FocusMode',0
653
db 0x00,0x0f,'AFAreaMode',0
654
db 0x00,0x1a,'ImageStabilization',0
655
db 0x00,0x1c,'MacroMode',0
656
db 0x00,0x1f,'ShootingMode',0
657
db 0x00,0x20,'Audio',0
658
db 0x00,0x21,'DataDump',0
659
db 0x00,0x23,'WhiteBalanceBias',0
660
db 0x00,0x24,'FlashBias',0
661
db 0x00,0x25,'InternalSerialNumber',0
662
db 0x00,0x26,'PanasonicExifVersion',0
663
db 0x00,0x28,'ColorEffect',0
664
db 0x00,0x29,'TimeSincePowerOn',0
665
db 0x00,0x2a,'BurstMode',0
666
db 0x00,0x2b,'SequenceNumber',0
667
db 0x00,0x2c,'ContrastMode',0
668
db 0x00,0x2d,'NoiseReduction',0
669
db 0x00,0x2e,'SelfTimer',0
670
db 0x00,0x30,'Rotation',0
671
db 0x00,0x31,'AFAssistLamp',0
672
db 0x00,0x32,'ColorMode',0
673
db 0x00,0x33,'BabyAge',0
674
db 0x00,0x34,'OpticalZoomMode',0
675
db 0x00,0x35,'ConversionLens',0
676
db 0x00,0x36,'TravelDay',0
677
db 0x00,0x39,'Contrast',0
678
db 0x00,0x3a,'WorldTimeLocation',0
679
db 0x00,0x3b,'TextStamp',0
680
db 0x00,0x3c,'ProgramISO',0
681
db 0x00,0x3d,'AdvancedSceneType',0
682
db 0x00,0x3f,'FacesDetected',0
683
db 0x00,0x40,'Saturation',0
684
db 0x00,0x41,'Sharpness',0
685
db 0x00,0x42,'FilmMode',0
686
db 0x00,0x44,'ColorTempKelvin',0
687
db 0x00,0x45,'BracketSettings',0
688
db 0x00,0x46,'WBShiftAB',0
689
db 0x00,0x47,'WBShiftGM',0
690
db 0x00,0x48,'FlashCurtain',0
691
db 0x00,0x49,'LongExposureNoiseReduction',0
692
db 0x00,0x4b,'PanasonicImageWidth',0
693
db 0x00,0x4c,'PanasonicImageHeight',0
694
db 0x00,0x4d,'AFPointPosition',0
695
db 0x00,0x51,'LensType',0
696
db 0x00,0x52,'LensSerialNumber',0
697
db 0x00,0x53,'AccessoryType',0
698
db 0x00,0x54,'AccessorySerialNumber',0
699
db 0x00,0x59,'Transform',0
700
db 0x00,0x5d,'IntelligentExposure',0
701
db 0x00,0x60,'LensFirmwareVersion',0
702
db 0x00,0x61,'FaceRecInfo',0
703
db 0x00,0x62,'FlashWarning',0
704
db 0x00,0x63,'RecognizedFaceFlags',0
705
db 0x00,0x65,'Title',0
706
db 0x00,0x66,'BabyName',0
707
db 0x00,0x67,'Location',0
708
db 0x00,0x69,'Country',0
709
db 0x00,0x6b,'State',0
710
db 0x00,0x6d,'City',0
711
db 0x00,0x6f,'Landmark',0
712
db 0x00,0x70,'IntelligentResolution',0
713
db 0x00,0x77,'BurstSpeed',0
714
db 0x00,0x79,'IntelligentD-Range',0
715
db 0x00,0x7c,'ClearRetouch',0
716
db 0x00,0x86,'ManometerPressure',0
717
db 0x00,0x89,'PhotoStyle',0
718
db 0x00,0x8a,'ShadingCompensation',0
719
db 0x00,0x8c,'AccelerometerZ',0
720
db 0x00,0x8d,'AccelerometerX',0
721
db 0x00,0x8e,'AccelerometerY',0
722
db 0x00,0x8f,'CameraOrientation',0
723
db 0x00,0x90,'RollAngle',0
724
db 0x00,0x91,'PitchAngle',0
725
db 0x00,0x93,'SweepPanoramaDirection',0
726
db 0x00,0x94,'SweepPanoramaFieldOfView',0
727
db 0x00,0x96,'TimerRecording',0
728
db 0x00,0x9d,'InternalNDFilter',0
729
db 0x00,0x9e,'HDR',0
730
db 0x00,0x9f,'ShutterType',0
731
db 0x00,0xa3,'ClearRetouchValue',0
732
db 0x00,0xab,'TouchAE',0
733
db 0x0e,0x00,'PrintIM',0
734
db 0x80,0x00,'MakerNoteVersion',0
735
db 0x80,0x01,'SceneMode',0
736
db 0x80,0x04,'WBRedLevel',0
737
db 0x80,0x05,'WBGreenLevel',0
738
db 0x80,0x06,'WBBlueLevel',0
739
db 0x80,0x07,'FlashFired',0
740
db 0x80,0x08,'TextStamp',0
741
db 0x80,0x09,'TextStamp',0
742
db 0x80,0x10,'BabyAge',0
743
db 0x80,0x12,'Transform',0
744
 
745
dd 0
746
 
747
;данные app2 для Canon
748
align 4
749
gr_927c_Ca:
750
db 0x00,0x01,'CanonCameraSettings',0
751
db 0x00,0x02,'CanonFocalLength',0
752
db 0x00,0x03,'CanonFlashInfo?',0
753
db 0x00,0x04,'CanonShotInfo',0
754
db 0x00,0x05,'CanonPanorama',0
755
db 0x00,0x06,'CanonImageType',0
756
db 0x00,0x07,'CanonFirmwareVersion',0
757
db 0x00,0x08,'FileNumber',0
758
db 0x00,0x09,'OwnerName',0
759
db 0x00,0x0a,'UnknownD30',0
760
db 0x00,0x0c,'SerialNumber',0
761
db 0x00,0x0d,'CanonCameraInfo',0
762
db 0x00,0x0e,'CanonFileLength',0
763
db 0x00,0x0f,'CustomFunctions',0
764
db 0x00,0x10,'CanonModelID',0
765
db 0x00,0x11,'MovieInfo',0
766
db 0x00,0x12,'CanonAFInfo',0
767
db 0x00,0x13,'ThumbnailImageValidArea',0
768
db 0x00,0x15,'SerialNumberFormat',0
769
db 0x00,0x1a,'SuperMacro',0
770
db 0x00,0x1c,'DateStampMode',0
771
db 0x00,0x1d,'MyColors',0
772
db 0x00,0x1e,'FirmwareRevision',0
773
db 0x00,0x23,'Categories',0
774
db 0x00,0x24,'FaceDetect1',0
775
db 0x00,0x25,'FaceDetect2',0
776
db 0x00,0x26,'CanonAFInfo2',0
777
db 0x00,0x27,'ContrastInfo',0
778
db 0x00,0x28,'ImageUniqueID',0
779
db 0x00,0x2f,'FaceDetect3',0
780
db 0x00,0x35,'TimeInfo',0
781
db 0x00,0x81,'RawDataOffset',0
782
db 0x00,0x83,'OriginalDecisionDataOffset',0
783
db 0x00,0x90,'CustomFunctions1D',0
784
db 0x00,0x91,'PersonalFunctions',0
785
db 0x00,0x92,'PersonalFunctionValues',0
786
db 0x00,0x93,'CanonFileInfo',0
787
db 0x00,0x94,'AFPointsInFocus1D',0
788
db 0x00,0x95,'LensModel',0
789
db 0x00,0x96,'SerialInfo ',0
790
db 0x00,0x97,'DustRemovalData',0
791
db 0x00,0x98,'CropInfo',0
792
db 0x00,0x99,'CustomFunctions2',0
793
db 0x00,0x9a,'AspectInfo',0
794
db 0x00,0xa0,'ProcessingInfo',0
795
db 0x00,0xa1,'ToneCurveTable',0
796
db 0x00,0xa2,'SharpnessTable',0
797
db 0x00,0xa3,'SharpnessFreqTable',0
798
db 0x00,0xa4,'WhiteBalanceTable',0
799
db 0x00,0xa9,'ColorBalance',0
800
db 0x00,0xaa,'MeasuredColor',0
801
db 0x00,0xae,'ColorTemperature',0
802
db 0x00,0xb0,'CanonFlags',0
803
db 0x00,0xb1,'ModifiedInfo',0
804
db 0x00,0xb2,'ToneCurveMatching',0
805
db 0x00,0xb3,'WhiteBalanceMatching',0
806
db 0x00,0xb4,'ColorSpace',0
807
db 0x00,0xb6,'PreviewImageInfo',0
808
db 0x00,0xd0,'VRDOffset',0
809
db 0x00,0xe0,'SensorInfo',0
810
db 0x40,0x01,'ColorData',0
811
db 0x40,0x02,'CRWParam?',0
812
db 0x40,0x03,'ColorInfo',0
813
db 0x40,0x05,'Flavor?',0
814
db 0x40,0x08,'BlackLevel?',0
815
db 0x40,0x10,'CustomPictureStyleFileName',0
816
db 0x40,0x13,'AFMicroAdj',0
817
db 0x40,0x15,'VignettingCorr ',0
818
db 0x40,0x16,'VignettingCorr2',0
819
db 0x40,0x18,'LightingOpt',0
820
db 0x40,0x19,'LensInfo',0
821
db 0x40,0x20,'AmbienceInfo',0
822
db 0x40,0x24,'FilterInfo',0
823
 
824
dd 0
825
 
6315 IgorA 826
;данные app2 для Samsung
827
align 4
828
gr_927c_Sa:
829
db 0x00,0x01,'MakerNoteVersion',0
830
db 0x00,0x02,'DeviceType',0
831
db 0x00,0x03,'SamsungModelID',0
832
db 0x00,0x21,'PictureWizard',0
833
db 0x00,0x30,'LocalLocationName',0
834
db 0x00,0x31,'LocationName',0
835
db 0x00,0x35,'PreviewIFD',0
836
db 0x00,0x43,'CameraTemperature',0
837
db 0x00,0x45,'RawCompressionMode',0
838
db 0x01,0x00,'FaceDetect',0
839
db 0x01,0x20,'FaceRecognition',0
840
db 0x01,0x23,'FaceName',0
841
db 0xa0,0x01,'FirmwareName',0
842
db 0xa0,0x03,'LensType',0
843
db 0xa0,0x04,'LensFirmware',0
844
db 0xa0,0x05,'InternalLensSerialNumber',0
845
db 0xa0,0x10,'SensorAreas',0
846
db 0xa0,0x11,'ColorSpace',0
847
db 0xa0,0x12,'SmartRange',0
848
db 0xa0,0x13,'ExposureCompensation',0
849
db 0xa0,0x14,'ISO',0
850
db 0xa0,0x18,'ExposureTime',0
851
db 0xa0,0x19,'FNumber',0
852
db 0xa0,0x1a,'FocalLengthIn35mmFormat',0
853
db 0xa0,0x20,'EncryptionKey',0
854
db 0xa0,0x21,'WB_RGGBLevelsUncorrected',0
855
db 0xa0,0x22,'WB_RGGBLevelsAuto',0
856
db 0xa0,0x23,'WB_RGGBLevelsIlluminator1',0
857
db 0xa0,0x24,'WB_RGGBLevelsIlluminator2',0
858
db 0xa0,0x28,'WB_RGGBLevelsBlack',0
859
db 0xa0,0x30,'ColorMatrix',0
860
db 0xa0,0x31,'ColorMatrixSRGB',0
861
db 0xa0,0x32,'ColorMatrixAdobeRGB',0
862
db 0xa0,0x33,'CbCrMatrixDefault',0
863
db 0xa0,0x34,'CbCrMatrix',0
864
db 0xa0,0x35,'CbCrGainDefault',0
865
db 0xa0,0x36,'CbCrGain',0
866
db 0xa0,0x40,'ToneCurveSRGBDefault',0
867
db 0xa0,0x41,'ToneCurveAdobeRGBDefault',0
868
db 0xa0,0x42,'ToneCurveSRGB',0
869
db 0xa0,0x43,'ToneCurveAdobeRGB',0
870
db 0xa0,0x48,'RawData?',0
871
db 0xa0,0x50,'Distortion?',0
872
db 0xa0,0x51,'ChromaticAberration?',0
873
db 0xa0,0x52,'Vignetting?',0
874
db 0xa0,0x53,'VignettingCorrection?',0
875
db 0xa0,0x54,'VignettingSetting?',0
876
 
877
dd 0
878
 
4994 IgorA 879
;input:
880
; bof - указатель на начало файла
881
; app1 - указатель для заполнения exif.app1
882
;output:
883
; app1 - указатель на начало exif.app1 (или 0 если не найдено или формат файла не поддерживается)
884
align 4
885
proc exif_get_app1 uses eax ebx edi, bof:dword, app1:dword
886
	mov eax,[bof]
887
	mov edi,[app1]
888
 
889
	;файл в формате jpg?
890
	cmp word[eax],0xd8ff
891
	jne .no_exif
892
	add eax,2
893
 
894
	;файл содержит exif.app0?
895
	cmp word[eax],0xe0ff
896
	jne @f
897
		add eax,2
898
		movzx ebx,word[eax]
899
		ror bx,8 ;всегда ли так надо?
900
		add eax,ebx
901
	@@:
902
 
903
	;файл содержит exif.app1?
904
	cmp word[eax],0xe1ff
905
	jne .no_exif
906
 
5007 IgorA 907
	xor ebx,ebx
908
	cmp word[eax+10],'II'
909
	je @f
910
		inc ebx ;if 'MM' edx=1
911
	@@:
5010 IgorA 912
	mov word[edi+offs_m_or_i],bx ;способ выравнивания чисел
913
	mov dword[edi+offs_id_gr],0 ;id групы и производителя, который всегда 0 для app1
5007 IgorA 914
	add eax,18
4994 IgorA 915
	mov [edi],eax
5007 IgorA 916
	sub eax,8
917
	mov [edi+4],eax
4994 IgorA 918
 
919
	jmp @f
920
	.no_exif:
921
		mov dword[edi],0
922
	@@:
923
	ret
924
endp
925
 
926
;input:
927
; app1 - указатель на начало exif.app1
928
; num - порядковый номер тега (начинается с 1)
929
; txt - указатель на текст, куда будет записано значение
930
; t_max - максимальный размер текста
6322 IgorA 931
;output:
932
; txt - заполняется текстом в виде "параметр: значение", если не найдено то пустая строка
4994 IgorA 933
align 4
6322 IgorA 934
proc exif_get_tag, app1:dword, num:dword, txt:dword, t_max:dword
4994 IgorA 935
pushad
936
	mov eax,[app1]
937
	mov edi,[txt]
938
	mov ecx,[num]
939
 
940
	xor edx,edx
5002 IgorA 941
	mov byte[edi],dl
5007 IgorA 942
	cmp [eax],edx
4994 IgorA 943
	je .end_f ;если не найден указатель на начало exif.app1
944
	cmp ecx,edx
945
	jle .end_f ;если порядковый номер тега <= 0
946
 
5007 IgorA 947
	movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1
4994 IgorA 948
 
949
	;проверяем число тегов
5007 IgorA 950
	mov eax,[eax]
951
	movzx ebx,word[eax]
4994 IgorA 952
	bt edx,0
953
	jnc @f
954
		ror bx,8
955
	@@:
956
	cmp ecx,ebx
957
	jg .end_f ;если номер тега больше чем их есть в файле
958
 
959
	;переходим на заданный тег
960
	dec ecx
961
	imul ecx,tag_size
962
	add eax,offs_tag_0
963
	add eax,ecx
964
 
5002 IgorA 965
	stdcall read_tag_value,[app1],[t_max]
966
 
967
	.end_f:
968
popad
969
	ret
970
endp
971
 
972
;input:
6322 IgorA 973
; app1 - указатель на начало exif.app1
974
; id - идентификатор тега значение которого нужно найти
975
; txt - указатель на текст, куда будет записано значение
976
; t_max - максимальный размер текста
977
;output:
978
; txt - заполняется текстом в виде "параметр: значение", если не найдено то пустая строка
979
align 4
980
proc exif_get_tag_id, app1:dword, id:dword, txt:dword, t_max:dword
981
pushad
982
	mov eax,[app1]
983
	mov edi,[txt]
984
 
985
	xor edx,edx
986
	mov byte[edi],dl
987
	cmp [eax],edx
988
	je .end_f ;если не найден указатель на начало exif.app1
989
 
990
	mov ebx,[id]
991
	movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1
992
	bt edx,0
993
	jnc @f
994
		ror bx,8
995
	@@:
996
 
997
	;берем число тегов
998
	mov eax,[eax]
999
	movzx ecx,word[eax]
1000
	bt edx,0
1001
	jnc @f
1002
		ror cx,8
1003
	@@:
1004
	;в ecx - число тегов
1005
 
1006
	;ищем заданный тег
1007
	add eax,offs_tag_0
1008
	.cycle_0:
1009
		cmp word[eax],bx ;word[eax+0] - код тега
1010
		je @f
1011
		add eax,tag_size
1012
		loop .cycle_0
1013
	jmp .end_f
1014
	@@:
1015
		stdcall read_tag_value,[app1],[t_max]
1016
	.end_f:
1017
popad
1018
	ret
1019
endp
1020
 
1021
;input:
5007 IgorA 1022
; app1 - указатель на exif.app1 или на exif.app1.child
5002 IgorA 1023
; child - указатель для заполнения начала дочерних тегов exif.app1.child
1024
; c_tag - тег для которого делается поиск дочерних
1025
;output:
1026
; child - указатель на начало дочерних тегов
1027
align 4
6322 IgorA 1028
proc exif_get_child, app1:dword, child:dword , c_tag:dword
5002 IgorA 1029
pushad
1030
	mov eax,[app1]
1031
	mov edi,[child]
1032
 
1033
	xor edx,edx
5007 IgorA 1034
	cmp [eax],edx
1035
	je .no_found ;если не найден указатель на начало exif.app1
5002 IgorA 1036
 
5007 IgorA 1037
	movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1
5002 IgorA 1038
 
1039
	;начало поиска
1040
	mov ebx,[c_tag]
1041
	bt edx,0
1042
	jnc @f
1043
		ror bx,8
1044
	@@:
1045
 
1046
	;проверяем число тегов
5007 IgorA 1047
	mov eax,[eax]
1048
	movzx ecx,word[eax]
5002 IgorA 1049
	bt edx,0
1050
	jnc @f
1051
		ror cx,8
1052
	@@:
1053
	cmp ecx,1
5007 IgorA 1054
	jl .no_found ;если число тегов <1
5002 IgorA 1055
 
1056
	;переходим на 1-й тег
1057
	add eax,offs_tag_0
1058
	@@:
1059
		cmp word[eax],bx
1060
		je @f
1061
		add eax,tag_size
1062
		loop @b
5007 IgorA 1063
	jmp .no_found ;если не найдено
5002 IgorA 1064
	@@: ;если найдено
1065
		mov ebx,dword[eax+8]
1066
		bt edx,0
1067
		jnc @f
6315 IgorA 1068
			bswap ebx
5002 IgorA 1069
		@@:
5007 IgorA 1070
		mov eax,[app1]
1071
		add ebx,[eax+4]
5002 IgorA 1072
		mov dword[edi],ebx
5007 IgorA 1073
		m2m dword[edi+4],dword[eax+4]
5008 IgorA 1074
		ror edx,16
1075
		mov dx,word[c_tag]
1076
		ror edx,16
5007 IgorA 1077
		mov dword[edi+offs_m_or_i],edx
5010 IgorA 1078
		m2m word[edi+offs_id_gr_mak],word[eax+offs_id_gr_mak]
5002 IgorA 1079
 
5007 IgorA 1080
	jmp .end_f
1081
	.no_found:
1082
		mov dword[edi],0
5002 IgorA 1083
	.end_f:
1084
popad
1085
	ret
1086
endp
1087
 
5009 IgorA 1088
;output:
1089
; app2 - указатель на начало exif.app2 (или 0 если не найдено или формат файла не поддерживается)
1090
align 4
1091
proc exif_get_app2, app1:dword, app2:dword
1092
pushad
6313 IgorA 1093
	mov edi,[app2]
5009 IgorA 1094
	mov eax,[app1]
6313 IgorA 1095
	xor edx,edx
5009 IgorA 1096
	cmp [eax],edx
1097
	je .no_suport ;если не найден указатель на начало exif.app1
1098
 
1099
	movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1
1100
 
1101
	;начало поиска производителя камеры
1102
	mov ebx,0x010f
1103
	bt edx,0
1104
	jnc @f
1105
		ror bx,8
1106
	@@:
1107
 
1108
	;проверяем число тегов
1109
	mov eax,[eax]
1110
	movzx ecx,word[eax]
1111
	bt edx,0
1112
	jnc @f
1113
		ror cx,8
1114
	@@:
1115
	cmp ecx,1
1116
	jl .no_suport ;если число тегов <1
1117
 
1118
	;переходим на 1-й тег
1119
	add eax,offs_tag_0
1120
	@@:
1121
		cmp word[eax],bx
1122
		je @f
1123
		add eax,tag_size
1124
		loop @b
1125
	jmp .no_suport ;если не найдено
1126
	@@: ;если найдено
1127
		mov ebx,dword[eax+4]
1128
		bt edx,0
1129
		jnc @f
6315 IgorA 1130
			bswap ebx
5009 IgorA 1131
		@@:
1132
		cmp ebx,4
1133
		jle .no_suport ;название производителя меньше 4 символов, не поддержиавается
1134
 
1135
		mov ebx,dword[eax+8]
1136
		bt edx,0
1137
		jnc @f
6315 IgorA 1138
			bswap ebx
5009 IgorA 1139
		@@:
1140
 
1141
	;проверка поддерживаемых производителей
1142
	mov eax,[app1]
1143
	add ebx,[eax+4]
1144
	cmp dword[ebx],'Cano'
1145
	je .suport
1146
	cmp dword[ebx],'NIKO'
1147
	je .suport
1148
	cmp dword[ebx],'Pana'
1149
	je .suport
6315 IgorA 1150
	cmp dword[ebx],'SAMS'
1151
	je .suport
1152
	cmp dword[ebx],'sams'
1153
	je .suport
5009 IgorA 1154
 
1155
	;все остальные не поддерживаются
1156
	jmp .no_suport
1157
 
1158
	.suport:
1159
	;находим тег 0x8769 (расширенные данные по Exif)
6322 IgorA 1160
	stdcall exif_get_child, eax,edi,0x8769
5009 IgorA 1161
	cmp dword[edi],0
1162
	je .no_suport
5010 IgorA 1163
	;находим тег 0x927c (данные Maker по камере)
6322 IgorA 1164
	stdcall exif_get_child, edi,edi, 0x927c
5009 IgorA 1165
	cmp dword[edi],0
1166
	je .no_suport
1167
 
1168
	cmp dword[ebx],'NIKO'
1169
	jne @f
5010 IgorA 1170
		;for Nikon
1171
		add dword[edi],18
1172
		mov eax,dword[edi]
1173
		sub eax,8
1174
		mov dword[edi+4],eax
1175
		mov word[edi+offs_id_gr_mak],'Ni'
6315 IgorA 1176
		jmp .end_f
5009 IgorA 1177
	@@:
1178
	cmp dword[ebx],'Pana'
1179
	jne @f
5010 IgorA 1180
		;for Panasonic
1181
		add dword[edi],12
1182
		mov word[edi+offs_id_gr_mak],'Pa'
6315 IgorA 1183
		jmp .end_f
5009 IgorA 1184
	@@:
5010 IgorA 1185
	cmp dword[ebx],'Cano'
1186
	jne @f
1187
		;for Canon
1188
		mov word[edi+offs_id_gr_mak],'Ca'
6315 IgorA 1189
		jmp .end_f
5010 IgorA 1190
	@@:
5009 IgorA 1191
 
6315 IgorA 1192
	cmp dword[ebx],'SAMS'
1193
	je @f
1194
	cmp dword[ebx],'sams'
1195
	je @f
1196
		jmp .end_f
1197
	@@:
1198
		;for Samsung
1199
		mov word[edi+offs_id_gr_mak],'Sa'
1200
		jmp .end_f
1201
	@@:
1202
 
5009 IgorA 1203
	.no_suport:
1204
		mov dword[edi],0
6315 IgorA 1205
	.end_f:
5009 IgorA 1206
popad
1207
	ret
1208
endp
1209
 
5002 IgorA 1210
;description:
1211
; вспомогательная функция для чтения назначений тегов
1212
;input:
1213
; eax - указатель начала тега
1214
; edi - указатель на память для записи текстовой строки
1215
align 4
1216
proc read_tag_value, app1:dword, t_max:dword
4994 IgorA 1217
	push exif_tag_numbers
1218
	pop esi
5008 IgorA 1219
 
1220
	;поиск таблицы для группы тегов
1221
	mov ebx,[app1]
5010 IgorA 1222
	mov ebx,dword[ebx+offs_id_gr] ;берем идентификатор группы тегов
5008 IgorA 1223
	@@:
5010 IgorA 1224
		cmp dword[esi],ebx
5008 IgorA 1225
		je .set_table
1226
		add esi,8
1227
		cmp esi,exif_tag_numbers.end
1228
		jge .tag_unknown ;тег не опознан (не найдена таблица группы тегов)
1229
		jmp @b
1230
	.set_table:
1231
		mov esi,dword[esi+4] ;установка адреса таблицы в esi
1232
 
1233
	;поиск названия тега в таблице
4994 IgorA 1234
	.next_tag:
1235
	mov bx,word[esi]
1236
	cmp bx,0
5007 IgorA 1237
	jne @f
1238
		cmp dword[esi],0
1239
		jne @f
5008 IgorA 1240
		jmp .tag_unknown ;тег не опознан (в группе не найден тег)
5007 IgorA 1241
	@@:
4994 IgorA 1242
	bt edx,0
1243
	jc @f
1244
		ror bx,8
1245
	@@:
1246
	cmp word[eax],bx
1247
	je .found
1248
	inc esi
1249
	@@:
1250
		inc esi
1251
		cmp byte[esi],0
1252
		jne @b
1253
	inc esi
1254
	jmp .next_tag
1255
	.found:
1256
 
5008 IgorA 1257
	;копируем строку с названием тега
4994 IgorA 1258
	add esi,2
1259
	stdcall str_n_cat,edi,esi,[t_max]
1260
 
5009 IgorA 1261
	jmp .start_read
4995 IgorA 1262
	.tag_unknown:
5008 IgorA 1263
		;если тег не найден ставим его код вместо названия
1264
		movzx ebx,word[eax]
5009 IgorA 1265
		bt edx,0
1266
		jnc @f
1267
			ror bx,8
1268
		@@:
5008 IgorA 1269
		stdcall hex_in_str, edi, ebx,4
1270
		mov byte[edi+4],0
5009 IgorA 1271
	.start_read:
4995 IgorA 1272
 
4994 IgorA 1273
	;читаем информацию в теге
5008 IgorA 1274
	mov bx,tag_format_ui1b
1275
	bt edx,0
1276
	jnc @f
1277
		ror bx,8
1278
	@@:
1279
	cmp word[eax+2],bx
1280
	jne .tag_01
1281
		stdcall str_n_cat,edi,txt_dp,[t_max]
1282
		call get_tag_data_size
5009 IgorA 1283
		cmp ebx,4
1284
		jg .over4b_01
5008 IgorA 1285
		cmp ebx,1
5009 IgorA 1286
		je @f
1287
			or edx,2 ;array data
1288
			mov ecx,dword[eax+8]
1289
			mov dh,bl
1290
		@@:
1291
			;если 1 одно байтовое число
5008 IgorA 1292
			movzx ebx,byte[eax+8]
1293
			stdcall str_len,edi
1294
			add edi,eax
1295
			mov eax,ebx
5010 IgorA 1296
			stdcall convert_int_to_str, [t_max]
5009 IgorA 1297
			bt edx,1
1298
			jnc .end_f
1299
			@@:
1300
				;если от 2 до 4 одно байтовых чисел
1301
				dec dh
1302
				cmp dh,0
1303
				je .end_f
1304
				shr ecx,8
1305
				stdcall str_n_cat,edi,txt_zap,[t_max]
1306
				stdcall str_len,edi
1307
				add edi,eax
1308
				movzx eax,cl
5010 IgorA 1309
				stdcall convert_int_to_str, [t_max]
5009 IgorA 1310
				jmp @b
5008 IgorA 1311
		.over4b_01:
1312
			;...
1313
		jmp .end_f
1314
	.tag_01:
1315
 
4994 IgorA 1316
	mov bx,tag_format_text
1317
	bt edx,0
1318
	jnc @f
1319
		ror bx,8
1320
	@@:
1321
	cmp word[eax+2],bx
1322
	jne .tag_02
1323
		stdcall str_n_cat,edi,txt_dp,[t_max]
4995 IgorA 1324
		call get_tag_data_size ;проверяем длинну строки
4994 IgorA 1325
		cmp ebx,4
1326
		jg @f
1327
			;если строка помещается в 4 символа
1328
			mov esi,eax
1329
			add esi,8
1330
			stdcall str_n_cat,edi,esi,[t_max]
1331
			jmp .end_f
1332
		;если строка не помещается в 4 символа
1333
		@@:
1334
		mov esi,dword[eax+8]
1335
		bt edx,0
1336
		jnc @f
6315 IgorA 1337
			bswap esi
4994 IgorA 1338
		@@:
5007 IgorA 1339
		mov eax,[app1]
1340
		mov eax,[eax+4]
1341
		add esi,eax
4994 IgorA 1342
		stdcall str_n_cat,edi,esi,[t_max]
4995 IgorA 1343
		jmp .end_f
4994 IgorA 1344
	.tag_02:
1345
 
4995 IgorA 1346
	mov bx,tag_format_ui2b
1347
	bt edx,0
1348
	jnc @f
1349
		ror bx,8
1350
	@@:
1351
	cmp word[eax+2],bx
1352
	jne .tag_03
1353
		stdcall str_n_cat,edi,txt_dp,[t_max]
1354
		call get_tag_data_size
5009 IgorA 1355
		cmp ebx,2
4995 IgorA 1356
		jg .over4b_03
5009 IgorA 1357
		jne @f
1358
			;если два 2 байтовых числа
1359
			or edx,2 ;array data
1360
			movzx ecx,word[eax+10]
1361
			bt edx,0
1362
			jnc @f
1363
				ror cx,8
1364
			@@:
4995 IgorA 1365
			;если одно 2 байтовое число
1366
			movzx ebx,word[eax+8]
1367
			bt edx,0
1368
			jnc @f
1369
				ror bx,8
1370
			@@:
1371
			stdcall str_len,edi
1372
			add edi,eax
1373
			mov eax,ebx
5010 IgorA 1374
			stdcall convert_int_to_str, [t_max]
5009 IgorA 1375
			bt edx,1 ;array ?
1376
			jnc .end_f
1377
			;добавляем 2-е число
1378
			stdcall str_n_cat,edi,txt_zap,[t_max]
1379
			stdcall str_len,edi
1380
			add edi,eax
1381
			mov eax,ecx
5010 IgorA 1382
			stdcall convert_int_to_str, [t_max]
1383
			jmp .end_f
4995 IgorA 1384
		.over4b_03:
5010 IgorA 1385
			mov ecx,[t_max]
1386
			mov esi,dword[eax+8]
1387
			bt edx,0
1388
			jnc @f
6315 IgorA 1389
				bswap esi
5010 IgorA 1390
			@@:
1391
			mov eax,[app1]
1392
			mov eax,[eax+4]
1393
			add esi,eax
1394
 
1395
			;берем число
1396
			.array_03:
1397
			stdcall str_len,edi
1398
			cmp ecx,eax
1399
			jle .end_f ;если не хватило строки
1400
			add edi,eax
1401
			sub ecx,eax
1402
			movzx eax,word[esi]
1403
			bt edx,0
1404
			jnc @f
1405
				ror ax,8
1406
			@@:
1407
			stdcall convert_int_to_str,ecx
1408
 
1409
			dec ebx
1410
			cmp ebx,0
1411
			je .end_f
1412
 
1413
			;добавляем запятую
1414
			stdcall str_n_cat,edi,txt_zap,ecx
1415
			add esi,2
1416
			jmp .array_03
4995 IgorA 1417
	.tag_03:
1418
 
1419
	mov bx,tag_format_ui4b
1420
	bt edx,0
1421
	jnc @f
1422
		ror bx,8
1423
	@@:
1424
	cmp word[eax+2],bx
1425
	jne .tag_04
1426
		stdcall str_n_cat,edi,txt_dp,[t_max]
1427
		call get_tag_data_size
1428
		cmp ebx,1
1429
		jg .over4b_04
1430
			;если одно 4 байтовое число
1431
			mov ebx,dword[eax+8]
1432
			bt edx,0
1433
			jnc @f
6315 IgorA 1434
				bswap ebx
4995 IgorA 1435
			@@:
1436
			stdcall str_len,edi
1437
			add edi,eax
1438
			mov eax,ebx
5010 IgorA 1439
			stdcall convert_int_to_str, [t_max]
4995 IgorA 1440
		.over4b_04:
1441
			;...
1442
		jmp .end_f
1443
	.tag_04:
1444
 
1445
	mov bx,tag_format_urb
1446
	bt edx,0
1447
	jnc @f
1448
		ror bx,8
1449
	@@:
1450
	cmp word[eax+2],bx
1451
	jne .tag_05
1452
		stdcall str_n_cat,edi,txt_dp,[t_max]
1453
		;call get_tag_data_size
1454
		;cmp ebx,1
1455
		;jg .over4b_05
1456
			mov ebx,dword[eax+8]
1457
			bt edx,0
1458
			jnc @f
6315 IgorA 1459
				bswap ebx
4995 IgorA 1460
			@@:
1461
			stdcall str_len,edi
1462
			add edi,eax
5007 IgorA 1463
			mov eax,[app1]
1464
			mov eax,[eax+4]
1465
			add ebx,eax
4995 IgorA 1466
			mov eax,[ebx]
1467
			bt edx,0
1468
			jnc @f
6315 IgorA 1469
				bswap eax
4995 IgorA 1470
			@@:
5010 IgorA 1471
			stdcall convert_int_to_str, [t_max] ;ставим 1-е число
4995 IgorA 1472
			stdcall str_n_cat,edi,txt_div,[t_max] ;ставим знак деления
1473
			stdcall str_len,edi
1474
			add edi,eax
1475
			mov eax,[ebx+4]
1476
			bt edx,0
1477
			jnc @f
6315 IgorA 1478
				bswap eax
4995 IgorA 1479
			@@:
5010 IgorA 1480
			stdcall convert_int_to_str, [t_max] ;ставим 2-е число
4995 IgorA 1481
		;.over4b_05:
1482
			;...
5007 IgorA 1483
		jmp .end_f
4995 IgorA 1484
	.tag_05:
1485
 
5007 IgorA 1486
	mov bx,tag_format_si2b
1487
	bt edx,0
1488
	jnc @f
1489
		ror bx,8
1490
	@@:
1491
	cmp word[eax+2],bx
1492
	jne .tag_08
1493
		stdcall str_n_cat,edi,txt_dp,[t_max]
1494
		call get_tag_data_size
5010 IgorA 1495
		cmp ebx,2
5007 IgorA 1496
		jg .over4b_08
5010 IgorA 1497
		jne @f
1498
			;если два 2 байтовых числа
1499
			or edx,2 ;array data
1500
			movzx ecx,word[eax+10]
1501
			bt edx,0
1502
			jnc @f
1503
				ror cx,8
1504
			@@:
5007 IgorA 1505
			;если одно 2 байтовое число
1506
			movzx ebx,word[eax+8]
1507
			bt edx,0
1508
			jnc @f
1509
				ror bx,8
1510
			@@:
1511
			stdcall str_len,edi
1512
			add edi,eax
1513
			bt bx,15
1514
			jnc @f
1515
				mov byte[edi],'-'
1516
				inc edi
1517
				neg bx
1518
				inc bx
1519
			@@:
1520
			mov eax,ebx
5010 IgorA 1521
			stdcall convert_int_to_str, [t_max]
1522
			bt edx,1 ;array ?
1523
			jnc .end_f
1524
			;добавляем 2-е число
1525
			stdcall str_n_cat,edi,txt_zap,[t_max]
1526
			stdcall str_len,edi
1527
			add edi,eax
1528
			bt bx,15
1529
			jnc @f
1530
				mov byte[edi],'-'
1531
				inc edi
1532
				neg bx
1533
				inc bx
1534
			@@:
1535
			mov eax,ecx
1536
			stdcall convert_int_to_str, [t_max]
1537
			jmp .end_f
5007 IgorA 1538
		.over4b_08:
5010 IgorA 1539
			mov ecx,[t_max]
1540
			mov esi,dword[eax+8]
1541
			bt edx,0
1542
			jnc @f
6315 IgorA 1543
				bswap esi
5010 IgorA 1544
			@@:
1545
			mov eax,[app1]
1546
			mov eax,[eax+4]
1547
			add esi,eax
1548
 
1549
			;берем число
1550
			.array_08:
1551
			stdcall str_len,edi
1552
			cmp ecx,eax
1553
			jle .end_f ;если не хватило строки
1554
			add edi,eax
1555
			sub ecx,eax
1556
			movzx eax,word[esi]
1557
			bt edx,0
1558
			jnc @f
1559
				ror ax,8
1560
			@@:
1561
			;смотрим на знак +|-
1562
			bt ax,15
1563
			jnc @f
1564
				mov byte[edi],'-'
1565
				inc edi
1566
				neg ax
1567
				inc ax
1568
			@@:
1569
			stdcall convert_int_to_str,ecx
1570
 
1571
			dec ebx
1572
			cmp ebx,0
1573
			je .end_f
1574
 
1575
			;добавляем запятую
1576
			stdcall str_n_cat,edi,txt_zap,ecx
1577
			add esi,2
1578
			jmp .array_08
5007 IgorA 1579
	.tag_08:
1580
 
1581
	mov bx,tag_format_si4b
1582
	bt edx,0
1583
	jnc @f
1584
		ror bx,8
1585
	@@:
1586
	cmp word[eax+2],bx
1587
	jne .tag_09
1588
		stdcall str_n_cat,edi,txt_dp,[t_max]
1589
		call get_tag_data_size
1590
		cmp ebx,1
1591
		jg .over4b_09
1592
			;если одно 4 байтовое число
1593
			mov ebx,dword[eax+8]
1594
			bt edx,0
1595
			jnc @f
6315 IgorA 1596
				bswap ebx
5007 IgorA 1597
			@@:
1598
			stdcall str_len,edi
1599
			add edi,eax
1600
			bt ebx,31
1601
			jnc @f
1602
				mov byte[edi],'-'
1603
				inc edi
1604
				neg ebx
1605
				inc ebx
1606
			@@:
1607
			mov eax,ebx
5010 IgorA 1608
			stdcall convert_int_to_str, [t_max]
5007 IgorA 1609
		.over4b_09:
1610
			;...
1611
		jmp .end_f
1612
	.tag_09:
1613
 
4994 IgorA 1614
	.end_f:
1615
	ret
1616
endp
1617
 
4995 IgorA 1618
;input:
1619
; eax - tag pointer
1620
; edx - 1 if 'MM', 0 if 'II'
1621
;output:
1622
; ebx - data size
4994 IgorA 1623
align 4
4995 IgorA 1624
get_tag_data_size:
1625
	mov ebx,dword[eax+4]
1626
	bt edx,0
1627
	jnc @f
6315 IgorA 1628
		bswap ebx
4995 IgorA 1629
	@@:
4994 IgorA 1630
	ret
1631
 
1632
align 4
1633
proc str_n_cat uses eax ecx edi esi, str1:dword, str2:dword, n:dword
1634
	mov esi,dword[str2]
1635
	mov ecx,dword[n]
1636
	mov edi,dword[str1]
1637
	stdcall str_len,edi
1638
	add edi,eax
1639
	cld
1640
	repne movsb
1641
	mov byte[edi],0
1642
	ret
1643
endp
1644
 
1645
;output:
1646
; eax = strlen
1647
align 4
1648
proc str_len, str1:dword
1649
	mov eax,[str1]
1650
	@@:
1651
		cmp byte[eax],0
1652
		je @f
1653
		inc eax
1654
		jmp @b
1655
	@@:
1656
	sub eax,[str1]
1657
	ret
1658
endp
1659
 
5008 IgorA 1660
align 4
1661
proc hex_in_str, buf:dword,val:dword,zif:dword
1662
	pushad
1663
		mov edi,dword[buf]
1664
		mov ecx,dword[zif]
1665
		add edi,ecx
1666
		dec edi
1667
		mov ebx,dword[val]
1668
 
1669
		.cycle:
1670
			mov al,bl
1671
			and al,0xf
1672
			cmp al,10
1673
			jl @f
1674
				add al,'a'-'0'-10
1675
			@@:
1676
			add al,'0'
1677
			mov byte[edi],al
1678
			dec edi
1679
			shr ebx,4
1680
		loop .cycle
1681
 
1682
	popad
1683
	ret
1684
endp
1685
 
4995 IgorA 1686
;input:
5010 IgorA 1687
; eax - число
1688
; edi - буфер для строки
1689
; len - длинна буфера
4995 IgorA 1690
;output:
1691
align 4
5010 IgorA 1692
proc convert_int_to_str, len:dword
1693
pushad
1694
	mov esi,[len]
1695
	add esi,edi
1696
	dec esi
1697
	call .str
1698
popad
4995 IgorA 1699
	ret
5010 IgorA 1700
endp
4995 IgorA 1701
 
1702
align 4
1703
.str:
1704
	mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
5010 IgorA 1705
	;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1706
	cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
4995 IgorA 1707
	jb @f
5010 IgorA 1708
		xor edx,edx ;очистить edx
1709
		div ecx   ;разделить - остаток в edx
1710
		push edx  ;положить в стек
4995 IgorA 1711
		call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1712
		pop eax
1713
	@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
5010 IgorA 1714
	cmp edi,esi
1715
	jge @f
6315 IgorA 1716
		or al,0x30 ;данная команда короче чем две выше
5010 IgorA 1717
		stosb      ;записать элемент из регистра al в ячеку памяти es:edi
1718
		mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор
1719
	@@:
1720
	ret        ;пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
4995 IgorA 1721
 
1722
 
1723
 
4994 IgorA 1724
align 16
1725
EXPORTS:
1726
	dd sz_exif_get_app1, exif_get_app1
5009 IgorA 1727
	dd sz_exif_get_app2, exif_get_app2
6322 IgorA 1728
	dd sz_exif_get_tag, exif_get_tag
1729
	dd sz_exif_get_tag_id, exif_get_tag_id
1730
	dd sz_exif_get_child, exif_get_child
4994 IgorA 1731
	dd 0,0
1732
	sz_exif_get_app1 db 'exif_get_app1',0
5009 IgorA 1733
	sz_exif_get_app2 db 'exif_get_app2',0
6322 IgorA 1734
	sz_exif_get_tag db 'exif_get_tag',0
1735
	sz_exif_get_tag_id db 'exif_get_tag_id',0
1736
	sz_exif_get_child db 'exif_get_child',0
1737