From f787c9d578ebfe9379e7ab7cc8eeefc62f3fb074 Mon Sep 17 00:00:00 2001 From: IgorA Date: Fri, 18 Jul 2014 17:43:40 +0000 Subject: [PATCH] update 'exif.obj': 1) optimize code 2) add documentation git-svn-id: svn://kolibrios.org@5007 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../libraries/exif/examples/viev_exif.asm | 146 +++++++-- .../develop/libraries/exif/trunk/about.htm | 132 ++++++++ .../develop/libraries/exif/trunk/exif.asm | 294 ++++++++++-------- 3 files changed, 420 insertions(+), 152 deletions(-) create mode 100644 programs/develop/libraries/exif/trunk/about.htm diff --git a/programs/develop/libraries/exif/examples/viev_exif.asm b/programs/develop/libraries/exif/examples/viev_exif.asm index f40f94257..049613ffb 100644 --- a/programs/develop/libraries/exif/examples/viev_exif.asm +++ b/programs/develop/libraries/exif/examples/viev_exif.asm @@ -16,7 +16,7 @@ include '../../../../develop/libraries/box_lib/trunk/box_lib.mac' include '../../../../dll.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'Просмотр информации Exif 17.07.14',0 ;подпись окна +caption db 'Просмотр информации Exif 18.07.14',0 ;подпись окна struct FileInfoBlock Function dd ? @@ -33,7 +33,7 @@ image_data dd 0 ;ука fn_toolbar db 'toolbar.png',0 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_FILE1_SIZE equ 128*144*3+54 ;размер файла с изображением @@ -137,9 +137,9 @@ pushad ; *** рисование главного окна (выполняется 1 раз при запуске) *** xor eax,eax mov ebx,(20 shl 16)+480 - mov ecx,(20 shl 16)+410 + mov ecx,(20 shl 16)+540 mov edx,[sc.work] - or edx,(3 shl 24)+0x10000000+0x20000000 + or edx,(3 shl 24)+0x30000000 mov edi,caption int 0x40 @@ -167,6 +167,10 @@ pushad mov edx,7 int 0x40 + mov ebx,(135 shl 16)+20 + mov edx,8 + int 0x40 + ; *** рисование иконок на кнопках *** mov eax,7 mov ebx,[image_data_toolbar] @@ -187,6 +191,9 @@ pushad add ebx,IMAGE_TOOLBAR_ICON_SIZE add edx,(25 shl 16) ; int 0x40 + ;add ebx,IMAGE_TOOLBAR_ICON_SIZE + ;add edx,(25 shl 16) ; + ;int 0x40 ; *** рисование буфера *** stdcall [buf2d_draw], buf_0 @@ -228,6 +235,10 @@ button: jne @f call but_2 @@: + cmp ah,8 + jne @f + call but_3 + @@: cmp ah,1 jne still .exit: @@ -241,7 +252,7 @@ button: align 4 but_new_file: mov dword[open_file_size],0 - call draw_file + call draw_file_1 ret align 4 @@ -301,13 +312,13 @@ but_open_file: stdcall [exif_get_app1], [open_file],h_app1 mcall 71,1,openfile_path - call draw_file + call draw_file_1 .end_open_file: popad ret align 4 -draw_file: +draw_file_1: pushad stdcall [buf2d_clear], buf_0, [buf_0.color] cmp dword[open_file_size],0 @@ -316,7 +327,7 @@ pushad mov eax,1 mov ebx,1 .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 inc eax add ebx,10 @@ -324,14 +335,14 @@ pushad jne .cycle_0 ;считываем дочерние теги для 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 - je @f + je .no_found_child mov eax,1 sub ebx,5 .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 inc eax add ebx,10 @@ -339,6 +350,99 @@ pushad 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_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: stdcall [buf2d_draw_text], buf_0, buf_1,txt_openfile,3,3,0xb000 @@: @@ -378,14 +482,17 @@ but_save_file: align 4 but_1: - stdcall [exif_get_app1_tag], [h_app1],1,txt_buf,80 - notify_window_run txt_buf + call draw_file_1 ;основная информация ret align 4 but_2: - stdcall [exif_get_app1_tag], [h_app1],2,txt_buf,80 - notify_window_run txt_buf + call draw_file_2 ;информация по GPS + ret + +align 4 +but_3: + call draw_file_3 ;еще какая-то информация ... ret ;данные для диалога открытия файлов @@ -545,12 +652,10 @@ 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 - exif_get_app1_child_tag dd sz_exif_get_app1_child_tag 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 - sz_exif_get_app1_child_tag db 'exif_get_app1_child_tag',0 ;exif_get_image_160_120 sc system_colors @@ -563,7 +668,7 @@ buf_0: dd 0 ;ука dw 5 ;+4 left dw 31 ;+6 top .w: dd 456 ;+8 w -.h: dd 350 ;+12 h +.h: dd 480 ;+12 h .color: dd 0xffffd0 ;+16 color db 24 ;+20 bit in pixel @@ -577,9 +682,10 @@ buf_1: dd 0 ;+16 color db 24 ;+20 bit in pixel -h_app1 dd 0 ;указатель на заголовок главных тегов -h_child dd 0 ;указатель на заголовок дочерних тегов +h_app1 dd 0,0,0 ;структура для заголовка главных тегов +h_child dd 0,0,0 ;структура для заголовка дочерних тегов txt_openfile db 'Откройте файл изображения в формате *.jpg.',0 +txt_nochild db 'Информация по этой кнопке не найдена.',0 txt_buf rb 80 i_end: diff --git a/programs/develop/libraries/exif/trunk/about.htm b/programs/develop/libraries/exif/trunk/about.htm new file mode 100644 index 000000000..5ae9ac2ae --- /dev/null +++ b/programs/develop/libraries/exif/trunk/about.htm @@ -0,0 +1,132 @@ + + +сшсышюЄхър фы  яюыєўхэш  шэЇюЁьрЎшш шч ЇюЁьрЄр Exif + + + + + + +

╬уыртыхэшх

+ + +

┬ёЄєяыхэшх

+

─юъєьхэЄрЎш  ъ ётюсюфэющ сшсышюЄхъх exif.obj, фы  ╬╤ ╩юышсЁш. + ▌Єр сшсышюЄхър ёючфрэр фы  яЁюёьюЄЁр шэЇюЁьрЎшш эрїюф ∙хщё  т шчюсЁрцхэш ї т ЇюЁьрЄх Exif. ╚эЇюЁьрЎш  ¤Єр ёючфрхЄё  ЎшЇЁют√ьш ЇюЄюърьхЁрьш ш ёюфхЁцшЄ Ёрчэ√х ярЁрьхЄЁ√ эряЁшьхЁ Єръшх ъръ: эрчтрэшх ЇшЁь√ яЁюшчтюфшЄхы , ьюфхы№ ърьхЁ√, ш Є.ф.

+ +

╧юёыхфэхх юсэютыхэшх сшсышюЄхъш 18.07.14.

+ +

╘єэъЎшш

+ +

╘єэъЎшш ЁрсюЄр■Є ё єърчрЄхы ьш эр ёЄЁєъЄєЁ√ app1 шыш эр app1_child. ╧ЁшьхЁ ёЄЁєъЄєЁ√:

+
align 4
+h_app1:
+	dd 0 ;+0 єърчрЄхы№ эр ъюышўхёЄтю Єхуют ш эр ёрьш Єхуш
+	dd 0 ;+4 ёьх∙хэшх фюсрты хьюх ъ єърчрЄхы ь т Єхурї
+	dd 0 ;+8 ярЁрьхЄЁ, юЄтхўр■∙шщ чр яюЁ фюъ ёыхфютрэш  срщЄют
+ +

exif_get_app1

+

▌Єр ЇєэъЎш  ш∙хЄ эрўрыю Exif фрээ√ї. ┼ёыш юэш эрщфхэ√ Єю чряюыэ хЄё  ёЄЁєъЄєЁр app1. ┼ёыш эх эрщфхэ√, Єю яхЁт√щ ярЁрьхЄЁ т ёЄЁєъЄєЁх фхырхЄё  Ёртэ√ь 0. ╧ЁшьхЁ:

+
stdcall [exif_get_app1], [open_file],h_app1
+...
+h_app1 dd 0,0,0
+

уфх open_file - єърчрЄхы№ эр фрээ√х Їрщыр шчюсЁрцхэш  (яюър яюффхЁцштр■Єё  Єюы№ъю *.jpg ш *.jpeg).

+

h_app1 - ёЄЁєъЄєЁр фы  чряюьшэрэш  эрўрыр Exif фрээ√ї.

+ +

exif_get_app1_tag

+

╟ряюыэ хЄ ЄхъёЄютє■ ёЄЁюъє шьхэхь ярЁрьхЄЁр шч Exif ш хую чэрўхэшхь. ╧ЁшьхЁ:

+
stdcall [exif_get_app1_tag], h_app1,3,txt_buf,80
+...
+h_app1 dd 0,0,0
+txt_buf rb 80
+

уфх h_app1 - ёЄЁєъЄєЁр чряюыхээр  т exif_get_app1 шыш т exif_get_app1_child.

+

3 - яюЁ фъют√щ эюьхЁ ярЁрьхЄЁр.

+

txt_buf - ЄхъёЄют√щ сєЇхЁ фы  чряюыэхэш .

+

80 - ьръёшьры№эр  фышэр ЄхъёЄр.

+ +

exif_get_app1_child

+

┼ёЄ№ яЁюёЄ√х Єхуш ё шэЇюЁьрЎшхщ р хёЄ№ Єхуш єърч√тр■∙шх эр ёяшёъш фЁєушї Єхуют. ▌Єр ЇєэъЎш  схЁхЄ єърчрЄхы№ эр эрўрыю ёяшёър фюўхЁэшї Єхуют. ╧ЁшьхЁ:

+
stdcall [exif_get_app1_child], h_app1,h_child,0x8769
+...
+h_app1  dd 0,0,0
+h_child dd 0,0,0
+

уфх h_app1 - ёЄЁєъЄєЁр чряюыхээр  т exif_get_app1 шыш т exif_get_app1_child.

+

h_child - ёЄЁєъЄєЁр фы  чряюыхэш  фрээ√ї ёяшёър фюўхЁэшї Єхуют.

+

0x8769 - ъюф Єхур (эрїюф ∙хуюё  т ёяшёъх Єхуют h_app1), ъюЄюЁ√щ  ты хЄё  єърчрЄхыхь эр ёяшёюъ фЁєушї фюўхЁэшї Єхуют.

+

┬ фрэюь яЁшьхЁх ЇєэъЎш  схЁхЄ Єху 0x8769 ш я√ЄрхЄё  эрщЄш хую т ёяшёъх h_app1, хёыш эрїюфшЄ Єю чряюыэ хЄ яю эхьє чэрўхэш  т ёЄЁєъЄєЁх h_child. ─рыхх ъ ёяшёъє h_child ьюцэю яЁшьхэ Є№ ЇєэъЎш■ exif_get_app1_tag фы  тч Єш  чэрўхэш  ¤Єшї Єхуют. ╤ яюью∙№■ ¤Єющ ЇєэъЎшш ь√ ъръ с√ яхЁхїюфшь тэєЄЁ№ эхъющ "яряъш" ё Єхурьш, ъюЄюЁ√х ёЁрчє фюёЄрЄ№ эх ьюцхь.

+ +

╩юэёЄрэЄ√ фы  ЇєэъЎшш exif_get_app1_child

+

╟фхё№ яЁштхфхэ√ эхъюЄюЁ√х ъюэёЄрэЄ√, ъюЄюЁ√х ьюуєЄ шёяюы№чютрЄё  ъръ 3-щ ярЁрьхЄЁ фы  ЇєэъЎшш exif_get_app1_child. ▌Єш ъюэёЄрэЄ√ юсючэрўр■Є ёяхЎшры№э√х Єхуш, ъюЄюЁ√х ёюфхЁцрЄ ёьх∙хэшх эр фюўхЁэшх ярЁрьхЄЁ√, ъюЄюЁ√х эрїюф Єё  т Exif.

+

0x8769

+

╬сючэрўрхЄ фюяюыэшЄхы№э√х ярЁрьхЄЁ√ Exif.

+

0x8825

+

╬сючэрўрхЄ ярЁрьхЄЁ√ GPS.

+ +

╥рсышЎр ¤ъёяюЁЄр

+

╧ЁшьхЁ ЄрсышЎ√ ¤ъёяюЁЄр, ЁрёўшЄрээющ эр шёяюы№чютрэшх ьръЁюёр @use_library_mem:

+
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
+ +

╚ёЄюЁш 

+

15.07.14 - яхЁтр  тхЁёш  сшсышюЄхъш, яЁшьхЁ шёяюы№чютрэш .

+ + \ No newline at end of file diff --git a/programs/develop/libraries/exif/trunk/exif.asm b/programs/develop/libraries/exif/trunk/exif.asm index 86bd36fe9..4a3127222 100644 --- a/programs/develop/libraries/exif/trunk/exif.asm +++ b/programs/develop/libraries/exif/trunk/exif.asm @@ -9,10 +9,8 @@ include '../../../../proc32.inc' ;--------- offs_m_or_i equ 8 ;смещение параметра 'MM' или 'II' (Motorola, Intel) -offs_tag_count equ 16 ;смещение количества тегов -offs_tag_0 equ 18 ;смещение 0-го тега +offs_tag_0 equ 2 ;смещение 0-го тега tag_size equ 12 ;размер структуры тега -offs_tag_child_0 equ 2 ;смещение 0-го дочернего тега ;форматы данных tag_format_ui1b equ 1 ;unsigned integer 1 byte tag_format_text equ 2 ;ascii string @@ -466,7 +464,9 @@ db 0xfe,0x56,'Sharpness',0 db 0xfe,0x57,'Smoothness',0 db 0xfe,0x58,'Moire filter',0 -dw 0 +db 0x00,0x00,'GPS version ID',0 + +dd 0 ;input: ; bof - указатель на начало файла @@ -496,8 +496,16 @@ proc exif_get_app1 uses eax ebx edi, bof:dword, app1:dword cmp word[eax],0xe1ff 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 + sub eax,8 + mov [edi+4],eax jmp @f .no_exif: @@ -520,130 +528,15 @@ pushad xor edx,edx mov byte[edi],dl - cmp eax,edx + 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 - @@: + movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1 ;проверяем число тегов - movzx ebx,word[eax+offs_tag_count] - 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 - - ;проверяем число тегов + mov eax,[eax] movzx ebx,word[eax] bt edx,0 jnc @f @@ -655,7 +548,7 @@ pushad ;переходим на заданный тег dec ecx imul ecx,tag_size - add eax,offs_tag_child_0 + add eax,offs_tag_0 add eax,ecx stdcall read_tag_value,[app1],[t_max] @@ -665,6 +558,71 @@ popad ret 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: ; вспомогательная функция для чтения назначений тегов ;input: @@ -677,7 +635,11 @@ proc read_tag_value, app1:dword, t_max:dword .next_tag: mov bx,word[esi] cmp bx,0 - je .tag_unknown ;тег не опознан + jne @f + cmp dword[esi],0 + jne @f + jmp .tag_unknown ;тег не опознан + @@: bt edx,0 jc @f ror bx,8 @@ -729,8 +691,9 @@ proc read_tag_value, app1:dword, t_max:dword ror esi,16 ror si,8 @@: - add esi,offs_m_or_i - add esi,[app1] + mov eax,[app1] + mov eax,[eax+4] + add esi,eax stdcall str_n_cat,edi,esi,[t_max] jmp .end_f .tag_02: @@ -809,8 +772,9 @@ proc read_tag_value, app1:dword, t_max:dword @@: stdcall str_len,edi add edi,eax - add ebx,offs_m_or_i - add ebx,[app1] + mov eax,[app1] + mov eax,[eax+4] + add ebx,eax mov eax,[ebx] bt edx,0 jnc @f @@ -832,9 +796,77 @@ proc read_tag_value, app1:dword, t_max:dword call convert_int_to_str ;ставим 2-е число ;.over4b_05: ;... - ;jmp .end_f + jmp .end_f .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: ret endp @@ -920,9 +952,7 @@ EXPORTS: dd sz_exif_get_app1, exif_get_app1 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_tag, exif_get_app1_child_tag 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 - sz_exif_get_app1_child_tag db 'exif_get_app1_child_tag',0