Rev 4995 | Go to most recent revision | Details | 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 | ;--------- |
||
11 | offs_m_or_i equ 8 ;смещение параметра 'MM' или 'II' (Motorola, Intel) |
||
12 | offs_tag_count equ 16 ;смещение количества тегов |
||
13 | offs_tag_0 equ 18 ;смещение 0-го тега |
||
14 | tag_size equ 12 ;размер структуры тега |
||
15 | ;форматы данных |
||
16 | tag_format_ui1b equ 1 ;unsigned integer 1 byte |
||
17 | tag_format_text equ 2 ;ascii string |
||
18 | tag_format_ui2b equ 3 ;unsigned integer 2 byte |
||
19 | tag_format_ui4b equ 4 ;unsigned integer 4 byte |
||
20 | tag_format_ui8b equ 5 ;unsigned integer 8 byte |
||
21 | tag_format_si1b equ 6 ;signed integer 1 byte |
||
22 | tag_format_undef equ 7 ;undefined |
||
23 | tag_format_si2b equ 8 ;signed integer 2 byte |
||
24 | tag_format_si4b equ 9 ;signed integer 4 byte |
||
25 | tag_format_si8b equ 10 ;signed integer 8 byte |
||
26 | tag_format_f4b equ 11 ;float 4 byte |
||
27 | tag_format_f8b equ 12 ;float 8 byte |
||
28 | |||
29 | align 4 |
||
30 | txt_dp db ': ',0 |
||
31 | |||
32 | ; |
||
33 | align 4 |
||
34 | exif_tag_numbers: |
||
35 | |||
36 | db 0x01,0x0e,'Image description',0 |
||
37 | db 0x01,0x0f,'Manufacturer of digicam',0 |
||
38 | db 0x01,0x10,'Model',0 |
||
39 | db 0x01,0x12,'Orientation',0 |
||
40 | db 0x01,0x1a,'X resolution',0 |
||
41 | db 0x01,0x1b,'Y resolution',0 |
||
42 | db 0x01,0x28,'Resolution unit',0 |
||
43 | db 0x01,0x31,'Software',0 |
||
44 | db 0x01,0x32,'Date time',0 |
||
45 | db 0x01,0x3e,'White point',0 |
||
46 | db 0x01,0x3f,'Primary chromaticities',0 |
||
47 | db 0x02,0x11,'YCbCrCoefficients',0 |
||
48 | db 0x02,0x13,'YCbCrPositioning',0 |
||
49 | db 0x02,0x14,'Reference black white',0 |
||
50 | db 0x82,0x98,'Copyright',0 |
||
51 | db 0x87,0x69,'Exif offset',0 |
||
52 | |||
53 | db 0x88,0x25,'GPS Info',0 |
||
54 | |||
55 | dw 0 |
||
56 | |||
57 | |||
58 | ;input: |
||
59 | ; bof - указатель на начало файла |
||
60 | ; app1 - указатель для заполнения exif.app1 |
||
61 | ;output: |
||
62 | ; app1 - указатель на начало exif.app1 (или 0 если не найдено или формат файла не поддерживается) |
||
63 | align 4 |
||
64 | proc exif_get_app1 uses eax ebx edi, bof:dword, app1:dword |
||
65 | mov eax,[bof] |
||
66 | mov edi,[app1] |
||
67 | |||
68 | ;файл в формате jpg? |
||
69 | cmp word[eax],0xd8ff |
||
70 | jne .no_exif |
||
71 | add eax,2 |
||
72 | |||
73 | ;файл содержит exif.app0? |
||
74 | cmp word[eax],0xe0ff |
||
75 | jne @f |
||
76 | add eax,2 |
||
77 | movzx ebx,word[eax] |
||
78 | ror bx,8 ;всегда ли так надо? |
||
79 | add eax,ebx |
||
80 | @@: |
||
81 | |||
82 | ;файл содержит exif.app1? |
||
83 | cmp word[eax],0xe1ff |
||
84 | jne .no_exif |
||
85 | |||
86 | add eax,2 |
||
87 | mov [edi],eax |
||
88 | |||
89 | jmp @f |
||
90 | .no_exif: |
||
91 | mov dword[edi],0 |
||
92 | @@: |
||
93 | ret |
||
94 | endp |
||
95 | |||
96 | ;input: |
||
97 | ; app1 - указатель на начало exif.app1 |
||
98 | ; num - порядковый номер тега (начинается с 1) |
||
99 | ; txt - указатель на текст, куда будет записано значение |
||
100 | ; t_max - максимальный размер текста |
||
101 | align 4 |
||
102 | proc exif_get_app1_tag, app1:dword, num:dword, txt:dword, t_max:dword |
||
103 | pushad |
||
104 | mov eax,[app1] |
||
105 | mov edi,[txt] |
||
106 | mov ecx,[num] |
||
107 | |||
108 | xor edx,edx |
||
109 | cmp eax,edx |
||
110 | je .end_f ;если не найден указатель на начало exif.app1 |
||
111 | cmp ecx,edx |
||
112 | jle .end_f ;если порядковый номер тега <= 0 |
||
113 | |||
114 | mov byte[edi],0 |
||
115 | cmp word[eax+offs_m_or_i],'II' |
||
116 | je @f |
||
117 | inc edx ;if 'MM' edx=1 |
||
118 | @@: |
||
119 | |||
120 | ;проверяем число тегов |
||
121 | movzx ebx,word[eax+offs_tag_count] |
||
122 | bt edx,0 |
||
123 | jnc @f |
||
124 | ror bx,8 |
||
125 | @@: |
||
126 | cmp ecx,ebx |
||
127 | jg .end_f ;если номер тега больше чем их есть в файле |
||
128 | |||
129 | ;переходим на заданный тег |
||
130 | dec ecx |
||
131 | imul ecx,tag_size |
||
132 | add eax,offs_tag_0 |
||
133 | add eax,ecx |
||
134 | |||
135 | ;читаем назначение тега |
||
136 | push exif_tag_numbers |
||
137 | pop esi |
||
138 | .next_tag: |
||
139 | mov bx,word[esi] |
||
140 | cmp bx,0 |
||
141 | je .tag_unknown ;тег не опознан |
||
142 | bt edx,0 |
||
143 | jc @f |
||
144 | ror bx,8 |
||
145 | @@: |
||
146 | cmp word[eax],bx |
||
147 | je .found |
||
148 | inc esi |
||
149 | @@: |
||
150 | inc esi |
||
151 | cmp byte[esi],0 |
||
152 | jne @b |
||
153 | inc esi |
||
154 | jmp .next_tag |
||
155 | .found: |
||
156 | |||
157 | ;копируем строку |
||
158 | add esi,2 |
||
159 | stdcall str_n_cat,edi,esi,[t_max] |
||
160 | |||
161 | ;читаем информацию в теге |
||
162 | mov bx,tag_format_text |
||
163 | bt edx,0 |
||
164 | jnc @f |
||
165 | ror bx,8 |
||
166 | @@: |
||
167 | cmp word[eax+2],bx |
||
168 | jne .tag_02 |
||
169 | stdcall str_n_cat,edi,txt_dp,[t_max] |
||
170 | ;проверяем длинну строки |
||
171 | mov ebx,dword[eax+4] |
||
172 | bt edx,0 |
||
173 | jnc @f |
||
174 | ror bx,8 |
||
175 | ror ebx,16 |
||
176 | ror bx,8 |
||
177 | @@: |
||
178 | cmp ebx,4 |
||
179 | jg @f |
||
180 | ;если строка помещается в 4 символа |
||
181 | mov esi,eax |
||
182 | add esi,8 |
||
183 | stdcall str_n_cat,edi,esi,[t_max] |
||
184 | jmp .end_f |
||
185 | ;если строка не помещается в 4 символа |
||
186 | @@: |
||
187 | mov esi,dword[eax+8] |
||
188 | bt edx,0 |
||
189 | jnc @f |
||
190 | ror si,8 |
||
191 | ror esi,16 |
||
192 | ror si,8 |
||
193 | @@: |
||
194 | add esi,offs_m_or_i |
||
195 | add esi,[app1] |
||
196 | stdcall str_n_cat,edi,esi,[t_max] |
||
197 | ;;;jmp .end_f |
||
198 | .tag_02: |
||
199 | |||
200 | jmp .end_f |
||
201 | .tag_unknown: |
||
202 | mov dword[edi],'???' |
||
203 | mov byte[edi+3],0 |
||
204 | .end_f: |
||
205 | popad |
||
206 | ret |
||
207 | endp |
||
208 | |||
209 | align 4 |
||
210 | proc exif_get_image_160_120 uses edi, app1:dword |
||
211 | mov edi,[app1] |
||
212 | |||
213 | ret |
||
214 | endp |
||
215 | |||
216 | align 4 |
||
217 | proc str_n_cat uses eax ecx edi esi, str1:dword, str2:dword, n:dword |
||
218 | mov esi,dword[str2] |
||
219 | mov ecx,dword[n] |
||
220 | mov edi,dword[str1] |
||
221 | stdcall str_len,edi |
||
222 | add edi,eax |
||
223 | cld |
||
224 | repne movsb |
||
225 | mov byte[edi],0 |
||
226 | ret |
||
227 | endp |
||
228 | |||
229 | ;output: |
||
230 | ; eax = strlen |
||
231 | align 4 |
||
232 | proc str_len, str1:dword |
||
233 | mov eax,[str1] |
||
234 | @@: |
||
235 | cmp byte[eax],0 |
||
236 | je @f |
||
237 | inc eax |
||
238 | jmp @b |
||
239 | @@: |
||
240 | sub eax,[str1] |
||
241 | ret |
||
242 | endp |
||
243 | |||
244 | align 16 |
||
245 | EXPORTS: |
||
246 | dd sz_exif_get_app1, exif_get_app1 |
||
247 | dd sz_exif_get_app1_tag, exif_get_app1_tag |
||
248 | ;dd sz_exif_get_image_160_120, exif_get_image_160_120 |
||
249 | dd 0,0 |
||
250 | sz_exif_get_app1 db 'exif_get_app1',0 |
||
251 | sz_exif_get_app1_tag db 'exif_get_app1_tag',0 |
||
252 | ;sz_exif_get_image_160_120 db 'exif_get_image_160_120',0=> |
||
253 |