update 'exif.obj':

1) optimize code
2) add documentation

git-svn-id: svn://kolibrios.org@5007 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2014-07-18 17:43:40 +00:00
parent 55b3e99585
commit f787c9d578
3 changed files with 420 additions and 152 deletions

View File

@ -16,7 +16,7 @@ include '../../../../develop/libraries/box_lib/trunk/box_lib.mac'
include '../../../../dll.inc' include '../../../../dll.inc'
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
caption db '<27>à®á¬®âà ¨­ä®à¬ æ¨¨ Exif 17.07.14',0 ;¯®¤¯¨áì ®ª­  caption db '<27>à®á¬®âà ¨­ä®à¬ æ¨¨ Exif 18.07.14',0 ;¯®¤¯¨áì ®ª­ 
struct FileInfoBlock struct FileInfoBlock
Function dd ? Function dd ?
@ -33,7 +33,7 @@ image_data dd 0 ;㪠
fn_toolbar db 'toolbar.png',0 fn_toolbar db 'toolbar.png',0
IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*5 IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*6
image_data_toolbar dd 0 image_data_toolbar dd 0
IMAGE_FILE1_SIZE equ 128*144*3+54 ;à §¬¥à ä ©«  á ¨§®¡à ¦¥­¨¥¬ IMAGE_FILE1_SIZE equ 128*144*3+54 ;à §¬¥à ä ©«  á ¨§®¡à ¦¥­¨¥¬
@ -137,9 +137,9 @@ pushad
; *** à¨á®¢ ­¨¥ £« ¢­®£® ®ª­  (¢ë¯®«­ï¥âáï 1 à § ¯à¨ § ¯ã᪥) *** ; *** à¨á®¢ ­¨¥ £« ¢­®£® ®ª­  (¢ë¯®«­ï¥âáï 1 à § ¯à¨ § ¯ã᪥) ***
xor eax,eax xor eax,eax
mov ebx,(20 shl 16)+480 mov ebx,(20 shl 16)+480
mov ecx,(20 shl 16)+410 mov ecx,(20 shl 16)+540
mov edx,[sc.work] mov edx,[sc.work]
or edx,(3 shl 24)+0x10000000+0x20000000 or edx,(3 shl 24)+0x30000000
mov edi,caption mov edi,caption
int 0x40 int 0x40
@ -167,6 +167,10 @@ pushad
mov edx,7 mov edx,7
int 0x40 int 0x40
mov ebx,(135 shl 16)+20
mov edx,8
int 0x40
; *** à¨á®¢ ­¨¥ ¨ª®­®ª ­  ª­®¯ª å *** ; *** à¨á®¢ ­¨¥ ¨ª®­®ª ­  ª­®¯ª å ***
mov eax,7 mov eax,7
mov ebx,[image_data_toolbar] mov ebx,[image_data_toolbar]
@ -187,6 +191,9 @@ pushad
add ebx,IMAGE_TOOLBAR_ICON_SIZE add ebx,IMAGE_TOOLBAR_ICON_SIZE
add edx,(25 shl 16) ; add edx,(25 shl 16) ;
int 0x40 int 0x40
;add ebx,IMAGE_TOOLBAR_ICON_SIZE
;add edx,(25 shl 16) ;
;int 0x40
; *** à¨á®¢ ­¨¥ ¡ãä¥à  *** ; *** à¨á®¢ ­¨¥ ¡ãä¥à  ***
stdcall [buf2d_draw], buf_0 stdcall [buf2d_draw], buf_0
@ -228,6 +235,10 @@ button:
jne @f jne @f
call but_2 call but_2
@@: @@:
cmp ah,8
jne @f
call but_3
@@:
cmp ah,1 cmp ah,1
jne still jne still
.exit: .exit:
@ -241,7 +252,7 @@ button:
align 4 align 4
but_new_file: but_new_file:
mov dword[open_file_size],0 mov dword[open_file_size],0
call draw_file call draw_file_1
ret ret
align 4 align 4
@ -301,13 +312,13 @@ but_open_file:
stdcall [exif_get_app1], [open_file],h_app1 stdcall [exif_get_app1], [open_file],h_app1
mcall 71,1,openfile_path mcall 71,1,openfile_path
call draw_file call draw_file_1
.end_open_file: .end_open_file:
popad popad
ret ret
align 4 align 4
draw_file: draw_file_1:
pushad pushad
stdcall [buf2d_clear], buf_0, [buf_0.color] stdcall [buf2d_clear], buf_0, [buf_0.color]
cmp dword[open_file_size],0 cmp dword[open_file_size],0
@ -316,7 +327,7 @@ pushad
mov eax,1 mov eax,1
mov ebx,1 mov ebx,1
.cycle_0: .cycle_0:
stdcall [exif_get_app1_tag], [h_app1],eax,txt_buf,80 stdcall [exif_get_app1_tag], h_app1,eax,txt_buf,80
stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0 stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0
inc eax inc eax
add ebx,10 add ebx,10
@ -324,14 +335,14 @@ pushad
jne .cycle_0 jne .cycle_0
;áç¨â뢠¥¬ ¤®ç¥à­¨¥ ⥣¨ ¤«ï 0x8769 ;áç¨â뢠¥¬ ¤®ç¥à­¨¥ ⥣¨ ¤«ï 0x8769
stdcall [exif_get_app1_child], [h_app1],h_child,0x8769 ;0x8825 stdcall [exif_get_app1_child], h_app1,h_child,0x8769
cmp dword[h_child],0 cmp dword[h_child],0
je @f je .no_found_child
mov eax,1 mov eax,1
sub ebx,5 sub ebx,5
.cycle_1: .cycle_1:
stdcall [exif_get_app1_child_tag], [h_app1],[h_child],eax,txt_buf,80 stdcall [exif_get_app1_tag], h_child,eax,txt_buf,80
stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb00000 stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb00000
inc eax inc eax
add ebx,10 add ebx,10
@ -339,6 +350,99 @@ pushad
jne .cycle_1 jne .cycle_1
jmp @f jmp @f
.no_found_child:
stdcall [buf2d_draw_text], buf_0, buf_1,txt_nochild,3,ebx,0xb000
jmp @f
.open_file:
stdcall [buf2d_draw_text], buf_0, buf_1,txt_openfile,3,3,0xb000
@@:
stdcall [buf2d_draw], buf_0
popad
ret
align 4
draw_file_2:
pushad
stdcall [buf2d_clear], buf_0, [buf_0.color]
cmp dword[open_file_size],0
je .open_file
mov eax,1
mov ebx,1
.cycle_0:
stdcall [exif_get_app1_tag], h_app1,eax,txt_buf,80
stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0
inc eax
add ebx,10
cmp byte[txt_buf],0
jne .cycle_0
;áç¨â뢠¥¬ ¤®ç¥à­¨¥ ⥣¨ ¤«ï 0x8825
stdcall [exif_get_app1_child], h_app1,h_child,0x8825
cmp dword[h_child],0
je .no_found_child
mov eax,1
sub ebx,5
.cycle_1:
stdcall [exif_get_app1_tag], h_child,eax,txt_buf,80
stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb00000
inc eax
add ebx,10
cmp byte[txt_buf],0
jne .cycle_1
jmp @f
.no_found_child:
stdcall [buf2d_draw_text], buf_0, buf_1,txt_nochild,3,ebx,0xb000
jmp @f
.open_file:
stdcall [buf2d_draw_text], buf_0, buf_1,txt_openfile,3,3,0xb000
@@:
stdcall [buf2d_draw], buf_0
popad
ret
align 4
draw_file_3:
pushad
stdcall [buf2d_clear], buf_0, [buf_0.color]
cmp dword[open_file_size],0
je .open_file
mov eax,1
mov ebx,1
.cycle_0:
stdcall [exif_get_app1_tag], h_app1,eax,txt_buf,80
stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb0
inc eax
add ebx,10
cmp byte[txt_buf],0
jne .cycle_0
;áç¨â뢠¥¬ ¤®ç¥à­¨¥ ⥣¨ ¤«ï 0x8769
stdcall [exif_get_app1_child], h_app1,h_child,0x8769
cmp dword[h_child],0
je .no_found_child
;áç¨â뢠¥¬ ¤®ç¥à­¨¥ ⥣¨ ¤«ï 0xa005
stdcall [exif_get_app1_child], h_child,h_child,0xa005
cmp dword[h_child],0
je .no_found_child
mov eax,1
sub ebx,5
.cycle_1:
stdcall [exif_get_app1_tag], h_child,eax,txt_buf,80
stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,ebx,0xb00000
inc eax
add ebx,10
cmp byte[txt_buf],0
jne .cycle_1
jmp @f
.no_found_child:
stdcall [buf2d_draw_text], buf_0, buf_1,txt_nochild,3,ebx,0xb000
jmp @f
.open_file: .open_file:
stdcall [buf2d_draw_text], buf_0, buf_1,txt_openfile,3,3,0xb000 stdcall [buf2d_draw_text], buf_0, buf_1,txt_openfile,3,3,0xb000
@@: @@:
@ -378,14 +482,17 @@ but_save_file:
align 4 align 4
but_1: but_1:
stdcall [exif_get_app1_tag], [h_app1],1,txt_buf,80 call draw_file_1 ;®á­®¢­ ï ¨­ä®à¬ æ¨ï
notify_window_run txt_buf
ret ret
align 4 align 4
but_2: but_2:
stdcall [exif_get_app1_tag], [h_app1],2,txt_buf,80 call draw_file_2 ;¨­ä®à¬ æ¨ï ¯® GPS
notify_window_run txt_buf ret
align 4
but_3:
call draw_file_3 ;¥é¥ ª ª ï-â® ¨­ä®à¬ æ¨ï ...
ret ret
;¤ ­­ë¥ ¤«ï ¤¨ «®£  ®âªàëâ¨ï ä ©«®¢ ;¤ ­­ë¥ ¤«ï ¤¨ «®£  ®âªàëâ¨ï ä ©«®¢
@ -545,12 +652,10 @@ import_exif: ;
exif_get_app1 dd sz_exif_get_app1 exif_get_app1 dd sz_exif_get_app1
exif_get_app1_tag dd sz_exif_get_app1_tag exif_get_app1_tag dd sz_exif_get_app1_tag
exif_get_app1_child dd sz_exif_get_app1_child exif_get_app1_child dd sz_exif_get_app1_child
exif_get_app1_child_tag dd sz_exif_get_app1_child_tag
dd 0,0 dd 0,0
sz_exif_get_app1 db 'exif_get_app1',0 sz_exif_get_app1 db 'exif_get_app1',0
sz_exif_get_app1_tag db 'exif_get_app1_tag',0 sz_exif_get_app1_tag db 'exif_get_app1_tag',0
sz_exif_get_app1_child db 'exif_get_app1_child',0 sz_exif_get_app1_child db 'exif_get_app1_child',0
sz_exif_get_app1_child_tag db 'exif_get_app1_child_tag',0
;exif_get_image_160_120 ;exif_get_image_160_120
sc system_colors sc system_colors
@ -563,7 +668,7 @@ buf_0: dd 0 ;㪠
dw 5 ;+4 left dw 5 ;+4 left
dw 31 ;+6 top dw 31 ;+6 top
.w: dd 456 ;+8 w .w: dd 456 ;+8 w
.h: dd 350 ;+12 h .h: dd 480 ;+12 h
.color: dd 0xffffd0 ;+16 color .color: dd 0xffffd0 ;+16 color
db 24 ;+20 bit in pixel db 24 ;+20 bit in pixel
@ -577,9 +682,10 @@ buf_1:
dd 0 ;+16 color dd 0 ;+16 color
db 24 ;+20 bit in pixel db 24 ;+20 bit in pixel
h_app1 dd 0 ;㪠§ â¥«ì ­  § £®«®¢®ª £« ¢­ëå ⥣®¢ h_app1 dd 0,0,0 ;áâàãªâãà  ¤«ï § £®«®¢ª  £« ¢­ëå ⥣®¢
h_child dd 0 ;㪠§ â¥«ì ­  § £®«®¢®ª ¤®ç¥à­¨å ⥣®¢ h_child dd 0,0,0 ;áâàãªâãà  ¤«ï § £®«®¢ª  ¤®ç¥à­¨å ⥣®¢
txt_openfile db 'Žâªà®©â¥ ä ©« ¨§®¡à ¦¥­¨ï ¢ ä®à¬ â¥ *.jpg.',0 txt_openfile db 'Žâªà®©â¥ ä ©« ¨§®¡à ¦¥­¨ï ¢ ä®à¬ â¥ *.jpg.',0
txt_nochild db 'ˆ­ä®à¬ æ¨ï ¯® í⮩ ª­®¯ª¥ ­¥ ­ ©¤¥­ .',0
txt_buf rb 80 txt_buf rb 80
i_end: i_end:

View File

@ -0,0 +1,132 @@
<html>
<head>
<title>библиотека для получения информации из формата Exif</title>
<meta http-equiv="content-type" content="text/html; charset=WINDOWS-1251">
<style>
body
{
font-size: 15px;
font-family: "Bookman Old Style";
color: black;
text-align: justify;
}
h1 { color: green; font-size: 23px; }
h2 { color: green; font-size: 21px; }
h3 { color: green; font-size: 19px; }
h4 { color: #803f00; font-size: 17px; }
i { color: #0099cc; }
b { color: #0099cc; }
p {
text-indent: 1em;
margin-top: 3px;
margin-bottom: 2px;
margin-left: 0px;
margin-right: 0px;
}
ol, ul, dl{
margin-top: 3px;
margin-bottom: 2px;
}
pre
{
padding: 2px;
padding-left: 20px;
margin-top: 5px;
margin-bottom: 5px;
margin-left: 0px;
margin-right: 0px;
font-family: "Courier New";
font-size: 15px;
color: #004000;
background-color: #ffd0ff;
}
table { font-size: 15px; }
</style>
</head>
<body>
<h1>Оглавление</h1>
<ul>
<li>Вступление</li>
<li><a href="#fun">Функции</a></li>
<ul>
<li><a href="#f_1">exif_get_app1</a></li>
<li><a href="#f_2">exif_get_app1_tag</a></li>
<li><a href="#f_3">exif_get_app1_child</a></li>
</ul>
</li>
<li><a href="#const">Константы для функции exif_get_app1_child</a></li>
<li><a href="#tabl_e">Таблица экспорта</a></li>
<li><a href="#hist">История</a></li>
</ul>
<h1>Вступление</h1>
<p>Документация к свободной библиотеке <b>exif.obj</b>, для <b>ОС Колибри</b>.
Эта библиотека создана для просмотра информации находящейся в изображениях в формате Exif. Информация эта создается цифровыми фотокамерами и содержит разные параметры например такие как: название фирмы производителя, модель камеры, и т.д.</p>
<p>Последнее обновление библиотеки 18.07.14.</p>
<h1><a name="fun">Функции</a></h1>
<p>Функции работают с указателями на структуры app1 или на app1_child. Пример структуры:</p>
<pre>align 4
h_app1:
dd 0 ;+0 указатель на количество тегов и на сами теги
dd 0 ;+4 смещение добавляемое к указателям в тегах
dd 0 ;+8 параметр, отвечающий за порядок следования байтов</pre>
<h4><a name="f_1">exif_get_app1</a></h4>
<p>Эта функция ищет начало Exif данных. Если они найдены то заполняется структура app1. Если не найдены, то первый параметр в структуре делается равным 0. Пример:</p>
<pre>stdcall [exif_get_app1], [open_file],h_app1
...
h_app1 dd 0,0,0</pre>
<p>где open_file - указатель на данные файла изображения (пока поддерживаются только *.jpg и *.jpeg).</p>
<p>h_app1 - структура для запоминания начала Exif данных.</p>
<h4><a name="f_2">exif_get_app1_tag</a></h4>
<p>Заполняет текстовую строку именем параметра из Exif и его значением. Пример:</p>
<pre>stdcall [exif_get_app1_tag], h_app1,3,txt_buf,80
...
h_app1 dd 0,0,0
txt_buf rb 80</pre>
<p>где h_app1 - структура заполенная в exif_get_app1 или в exif_get_app1_child.</p>
<p>3 - порядковый номер параметра.</p>
<p>txt_buf - текстовый буфер для заполнения.</p>
<p>80 - максимальная длина текста.</p>
<h4><a name="f_3">exif_get_app1_child</a></h4>
<p>Есть простые теги с информацией а есть теги указывающие на списки других тегов. Эта функция берет указатель на начало списка дочерних тегов. Пример:</p>
<pre>stdcall [exif_get_app1_child], h_app1,h_child,0x8769
...
h_app1 dd 0,0,0
h_child dd 0,0,0</pre>
<p>где h_app1 - структура заполенная в exif_get_app1 или в exif_get_app1_child.</p>
<p>h_child - структура для заполения данных списка дочерних тегов.</p>
<p>0x8769 - код тега (находящегося в списке тегов h_app1), который является указателем на список других дочерних тегов.</p>
<p>В даном примере функция берет тег 0x8769 и пытается найти его в списке h_app1, если находит то заполняет по нему значения в структуре h_child. Далее к списку h_child можно применять функцию exif_get_app1_tag для взятия значения этих тегов. С помощью этой функции мы как бы переходим внутрь некой &quot;папки&quot; с тегами, которые сразу достать не можем.</p>
<h1><a name="const">Константы для функции exif_get_app1_child</a></h1>
<p>Здесь приведены некоторые константы, которые могут использоватся как 3-й параметр для функции exif_get_app1_child. Эти константы обозначают специальные теги, которые содержат смещение на дочерние параметры, которые находятся в Exif.</p>
<h4>0x8769</h4>
<p>Обозначает дополнительные параметры Exif.</p>
<h4>0x8825</h4>
<p>Обозначает параметры GPS.</p>
<h1><a name="tabl_e">Таблица экспорта</a></h1>
<p>Пример таблицы экспорта, расчитанной на использование макроса <b>@use_library_mem</b>:</p>
<pre>align 4
import_exif:
exif_get_app1 dd sz_exif_get_app1
exif_get_app1_tag dd sz_exif_get_app1_tag
exif_get_app1_child dd sz_exif_get_app1_child
dd 0,0
sz_exif_get_app1 db 'exif_get_app1',0
sz_exif_get_app1_tag db 'exif_get_app1_tag',0
sz_exif_get_app1_child db 'exif_get_app1_child',0</pre>
<h1><a name="hist">История</a></h1>
<p>15.07.14 - первая версия библиотеки, пример использования.</p>
</body>
</html>

View File

@ -9,10 +9,8 @@ include '../../../../proc32.inc'
;--------- ;---------
offs_m_or_i equ 8 ;ᬥ饭¨¥ ¯ à ¬¥âà  'MM' ¨«¨ 'II' (Motorola, Intel) offs_m_or_i equ 8 ;ᬥ饭¨¥ ¯ à ¬¥âà  'MM' ¨«¨ 'II' (Motorola, Intel)
offs_tag_count equ 16 ;ᬥ饭¨¥ ª®«¨ç¥á⢠ ⥣®¢ offs_tag_0 equ 2 ;ᬥ饭¨¥ 0-£® ⥣ 
offs_tag_0 equ 18 ;ᬥ饭¨¥ 0-£® ⥣ 
tag_size equ 12 ;à §¬¥à áâàãªâãàë ⥣  tag_size equ 12 ;à §¬¥à áâàãªâãàë ⥣ 
offs_tag_child_0 equ 2 ;ᬥ饭¨¥ 0-£® ¤®ç¥à­¥£® ⥣ 
;ä®à¬ âë ¤ ­­ëå ;ä®à¬ âë ¤ ­­ëå
tag_format_ui1b equ 1 ;unsigned integer 1 byte tag_format_ui1b equ 1 ;unsigned integer 1 byte
tag_format_text equ 2 ;ascii string tag_format_text equ 2 ;ascii string
@ -466,7 +464,9 @@ db 0xfe,0x56,'Sharpness',0
db 0xfe,0x57,'Smoothness',0 db 0xfe,0x57,'Smoothness',0
db 0xfe,0x58,'Moire filter',0 db 0xfe,0x58,'Moire filter',0
dw 0 db 0x00,0x00,'GPS version ID',0
dd 0
;input: ;input:
; bof - 㪠§ â¥«ì ­  ­ ç «® ä ©«  ; bof - 㪠§ â¥«ì ­  ­ ç «® ä ©« 
@ -496,8 +496,16 @@ proc exif_get_app1 uses eax ebx edi, bof:dword, app1:dword
cmp word[eax],0xe1ff cmp word[eax],0xe1ff
jne .no_exif jne .no_exif
add eax,2 xor ebx,ebx
cmp word[eax+10],'II'
je @f
inc ebx ;if 'MM' edx=1
@@:
mov [edi+offs_m_or_i],ebx
add eax,18
mov [edi],eax mov [edi],eax
sub eax,8
mov [edi+4],eax
jmp @f jmp @f
.no_exif: .no_exif:
@ -520,130 +528,15 @@ pushad
xor edx,edx xor edx,edx
mov byte[edi],dl mov byte[edi],dl
cmp eax,edx cmp [eax],edx
je .end_f ;¥á«¨ ­¥ ­ ©¤¥­ 㪠§ â¥«ì ­  ­ ç «® exif.app1 je .end_f ;¥á«¨ ­¥ ­ ©¤¥­ 㪠§ â¥«ì ­  ­ ç «® exif.app1
cmp ecx,edx cmp ecx,edx
jle .end_f ;¥á«¨ ¯®à浪®¢ë© ­®¬¥à ⥣  <= 0 jle .end_f ;¥á«¨ ¯®à浪®¢ë© ­®¬¥à ⥣  <= 0
cmp word[eax+offs_m_or_i],'II' movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1
je @f
inc edx ;if 'MM' edx=1
@@:
;¯à®¢¥à塞 ç¨á«® ⥣®¢ ;¯à®¢¥à塞 ç¨á«® ⥣®¢
movzx ebx,word[eax+offs_tag_count] mov eax,[eax]
bt edx,0
jnc @f
ror bx,8
@@:
cmp ecx,ebx
jg .end_f ;¥á«¨ ­®¬¥à ⥣  ¡®«ìè¥ ç¥¬ ¨å ¥áâì ¢ ä ©«¥
;¯¥à¥å®¤¨¬ ­  § ¤ ­­ë© ⥣
dec ecx
imul ecx,tag_size
add eax,offs_tag_0
add eax,ecx
stdcall read_tag_value,[app1],[t_max]
.end_f:
popad
ret
endp
;input:
; app1 - 㪠§ â¥«ì ­  exif.app1
; child - 㪠§ â¥«ì ¤«ï § ¯®«­¥­¨ï ­ ç «  ¤®ç¥à­¨å ⥣®¢ exif.app1.child
; c_tag - ⥣ ¤«ï ª®â®à®£® ¤¥« ¥âáï ¯®¨áª ¤®ç¥à­¨å
;output:
; child - 㪠§ â¥«ì ­  ­ ç «® ¤®ç¥à­¨å ⥣®¢
align 4
proc exif_get_app1_child, app1:dword, child:dword , c_tag:dword
pushad
mov eax,[app1]
mov edi,[child]
xor edx,edx
mov dword[edi],edx
cmp eax,edx
je .end_f ;¥á«¨ ­¥ ­ ©¤¥­ 㪠§ â¥«ì ­  ­ ç «® exif.app1
cmp word[eax+offs_m_or_i],'II'
je @f
inc edx ;if 'MM' edx=1
@@:
;­ ç «® ¯®¨áª 
mov ebx,[c_tag]
bt edx,0
jnc @f
ror bx,8
@@:
;¯à®¢¥à塞 ç¨á«® ⥣®¢
movzx ecx,word[eax+offs_tag_count]
bt edx,0
jnc @f
ror cx,8
@@:
cmp ecx,1
jl .end_f ;¥á«¨ ç¨á«® ⥣®¢ <1
;¯¥à¥å®¤¨¬ ­  1-© ⥣
add eax,offs_tag_0
@@:
cmp word[eax],bx
je @f
add eax,tag_size
loop @b
jmp .end_f ;¥á«¨ ­¥ ­ ©¤¥­®
@@: ;¥á«¨ ­ ©¤¥­®
mov ebx,dword[eax+8]
bt edx,0
jnc @f
ror bx,8
ror ebx,16
ror bx,8
@@:
add ebx,[app1]
add ebx,offs_m_or_i
mov dword[edi],ebx
.end_f:
popad
ret
endp
;input:
; app1 - 㪠§ â¥«ì ­  ­ ç «® exif.app1
; child - 㪠§ â¥«ì ­  ­ ç «® ¤®ç¥à­¨å ⥣®¢ exif.app1.child
; num - ¯®à浪®¢ë© ­®¬¥à ⥣  (­ ç¨­ ¥âáï á 1)
; txt - 㪠§ â¥«ì ­  ⥪áâ, ªã¤  ¡ã¤¥â § ¯¨á ­® §­ ç¥­¨¥
; t_max - ¬ ªá¨¬ «ì­ë© à §¬¥à ⥪áâ 
align 4
proc exif_get_app1_child_tag, app1:dword, child:dword, num:dword, txt:dword, t_max:dword
pushad
mov eax,[app1]
mov edi,[txt]
mov ecx,[num]
xor edx,edx
mov byte[edi],dl
cmp eax,edx
je .end_f ;¥á«¨ ­¥ ­ ©¤¥­ 㪠§ â¥«ì ­  ­ ç «® exif.app1
cmp ecx,edx
jle .end_f ;¥á«¨ ¯®à浪®¢ë© ­®¬¥à ⥣  <= 0
cmp word[eax+offs_m_or_i],'II'
je @f
inc edx ;if 'MM' edx=1
@@:
mov eax,[child]
cmp eax,0
je .end_f ;¥á«¨ ­¥ ­ ©¤¥­ 㪠§ â¥«ì ­  ­ ç «® exif.app1.child
;¯à®¢¥à塞 ç¨á«® ⥣®¢
movzx ebx,word[eax] movzx ebx,word[eax]
bt edx,0 bt edx,0
jnc @f jnc @f
@ -655,7 +548,7 @@ pushad
;¯¥à¥å®¤¨¬ ­  § ¤ ­­ë© ⥣ ;¯¥à¥å®¤¨¬ ­  § ¤ ­­ë© ⥣
dec ecx dec ecx
imul ecx,tag_size imul ecx,tag_size
add eax,offs_tag_child_0 add eax,offs_tag_0
add eax,ecx add eax,ecx
stdcall read_tag_value,[app1],[t_max] stdcall read_tag_value,[app1],[t_max]
@ -665,6 +558,71 @@ popad
ret ret
endp endp
;input:
; app1 - 㪠§ â¥«ì ­  exif.app1 ¨«¨ ­  exif.app1.child
; child - 㪠§ â¥«ì ¤«ï § ¯®«­¥­¨ï ­ ç «  ¤®ç¥à­¨å ⥣®¢ exif.app1.child
; c_tag - ⥣ ¤«ï ª®â®à®£® ¤¥« ¥âáï ¯®¨áª ¤®ç¥à­¨å
;output:
; child - 㪠§ â¥«ì ­  ­ ç «® ¤®ç¥à­¨å ⥣®¢
align 4
proc exif_get_app1_child, app1:dword, child:dword , c_tag:dword
pushad
mov eax,[app1]
mov edi,[child]
xor edx,edx
cmp [eax],edx
je .no_found ;¥á«¨ ­¥ ­ ©¤¥­ 㪠§ â¥«ì ­  ­ ç «® exif.app1
movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1
;­ ç «® ¯®¨áª 
mov ebx,[c_tag]
bt edx,0
jnc @f
ror bx,8
@@:
;¯à®¢¥à塞 ç¨á«® ⥣®¢
mov eax,[eax]
movzx ecx,word[eax]
bt edx,0
jnc @f
ror cx,8
@@:
cmp ecx,1
jl .no_found ;¥á«¨ ç¨á«® ⥣®¢ <1
;¯¥à¥å®¤¨¬ ­  1-© ⥣
add eax,offs_tag_0
@@:
cmp word[eax],bx
je @f
add eax,tag_size
loop @b
jmp .no_found ;¥á«¨ ­¥ ­ ©¤¥­®
@@: ;¥á«¨ ­ ©¤¥­®
mov ebx,dword[eax+8]
bt edx,0
jnc @f
ror bx,8
ror ebx,16
ror bx,8
@@:
mov eax,[app1]
add ebx,[eax+4]
mov dword[edi],ebx
m2m dword[edi+4],dword[eax+4]
mov dword[edi+offs_m_or_i],edx
jmp .end_f
.no_found:
mov dword[edi],0
.end_f:
popad
ret
endp
;description: ;description:
; ¢á¯®¬®£ â¥«ì­ ï äã­ªæ¨ï ¤«ï ç⥭¨ï ­ §­ ç¥­¨© ⥣®¢ ; ¢á¯®¬®£ â¥«ì­ ï äã­ªæ¨ï ¤«ï ç⥭¨ï ­ §­ ç¥­¨© ⥣®¢
;input: ;input:
@ -677,7 +635,11 @@ proc read_tag_value, app1:dword, t_max:dword
.next_tag: .next_tag:
mov bx,word[esi] mov bx,word[esi]
cmp bx,0 cmp bx,0
je .tag_unknown ;⥣ ­¥ ®¯®§­ ­ jne @f
cmp dword[esi],0
jne @f
jmp .tag_unknown ;⥣ ­¥ ®¯®§­ ­
@@:
bt edx,0 bt edx,0
jc @f jc @f
ror bx,8 ror bx,8
@ -729,8 +691,9 @@ proc read_tag_value, app1:dword, t_max:dword
ror esi,16 ror esi,16
ror si,8 ror si,8
@@: @@:
add esi,offs_m_or_i mov eax,[app1]
add esi,[app1] mov eax,[eax+4]
add esi,eax
stdcall str_n_cat,edi,esi,[t_max] stdcall str_n_cat,edi,esi,[t_max]
jmp .end_f jmp .end_f
.tag_02: .tag_02:
@ -809,8 +772,9 @@ proc read_tag_value, app1:dword, t_max:dword
@@: @@:
stdcall str_len,edi stdcall str_len,edi
add edi,eax add edi,eax
add ebx,offs_m_or_i mov eax,[app1]
add ebx,[app1] mov eax,[eax+4]
add ebx,eax
mov eax,[ebx] mov eax,[ebx]
bt edx,0 bt edx,0
jnc @f jnc @f
@ -832,9 +796,77 @@ proc read_tag_value, app1:dword, t_max:dword
call convert_int_to_str ;áâ ¢¨¬ 2-¥ ç¨á«® call convert_int_to_str ;áâ ¢¨¬ 2-¥ ç¨á«®
;.over4b_05: ;.over4b_05:
;... ;...
;jmp .end_f jmp .end_f
.tag_05: .tag_05:
mov bx,tag_format_si2b
bt edx,0
jnc @f
ror bx,8
@@:
cmp word[eax+2],bx
jne .tag_08
stdcall str_n_cat,edi,txt_dp,[t_max]
call get_tag_data_size
cmp ebx,1
jg .over4b_08
;¥á«¨ ®¤­® 2 ¡ ©â®¢®¥ ç¨á«®
movzx ebx,word[eax+8]
bt edx,0
jnc @f
ror bx,8
@@:
stdcall str_len,edi
add edi,eax
bt bx,15
jnc @f
mov byte[edi],'-'
inc edi
neg bx
inc bx
@@:
mov eax,ebx
call convert_int_to_str ;[t_max]
.over4b_08:
;...
jmp .end_f
.tag_08:
mov bx,tag_format_si4b
bt edx,0
jnc @f
ror bx,8
@@:
cmp word[eax+2],bx
jne .tag_09
stdcall str_n_cat,edi,txt_dp,[t_max]
call get_tag_data_size
cmp ebx,1
jg .over4b_09
;¥á«¨ ®¤­® 4 ¡ ©â®¢®¥ ç¨á«®
mov ebx,dword[eax+8]
bt edx,0
jnc @f
ror bx,8
ror ebx,16
ror bx,8
@@:
stdcall str_len,edi
add edi,eax
bt ebx,31
jnc @f
mov byte[edi],'-'
inc edi
neg ebx
inc ebx
@@:
mov eax,ebx
call convert_int_to_str ;[t_max]
.over4b_09:
;...
jmp .end_f
.tag_09:
.end_f: .end_f:
ret ret
endp endp
@ -920,9 +952,7 @@ EXPORTS:
dd sz_exif_get_app1, exif_get_app1 dd sz_exif_get_app1, exif_get_app1
dd sz_exif_get_app1_tag, exif_get_app1_tag dd sz_exif_get_app1_tag, exif_get_app1_tag
dd sz_exif_get_app1_child, exif_get_app1_child dd sz_exif_get_app1_child, exif_get_app1_child
dd sz_exif_get_app1_child_tag, exif_get_app1_child_tag
dd 0,0 dd 0,0
sz_exif_get_app1 db 'exif_get_app1',0 sz_exif_get_app1 db 'exif_get_app1',0
sz_exif_get_app1_tag db 'exif_get_app1_tag',0 sz_exif_get_app1_tag db 'exif_get_app1_tag',0
sz_exif_get_app1_child db 'exif_get_app1_child',0 sz_exif_get_app1_child db 'exif_get_app1_child',0
sz_exif_get_app1_child_tag db 'exif_get_app1_child_tag',0