From 9adefdc19022e6fdaf7aad5f58c07d4b18e6fc2e Mon Sep 17 00:00:00 2001 From: IgorA Date: Tue, 22 Jul 2014 20:43:05 +0000 Subject: [PATCH] update 'exif.obj': 1) add new function exif_get_app2 (found maker from cameras: Nikon, Canon, Panasonic) 2) small fixes git-svn-id: svn://kolibrios.org@5009 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../libraries/exif/examples/viev_exif.asm | 12 +- .../develop/libraries/exif/trunk/about.htm | 18 +- .../develop/libraries/exif/trunk/exif.asm | 155 ++++++++++++++++-- 3 files changed, 165 insertions(+), 20 deletions(-) diff --git a/programs/develop/libraries/exif/examples/viev_exif.asm b/programs/develop/libraries/exif/examples/viev_exif.asm index 049613ffb9..39b65d07ee 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 18.07.14',0 ;Ї®¤ЇЁбм ®Є­  +caption db 'Џа®б¬®ва Ё­д®а¬ жЁЁ Exif 23.07.14',0 ;Ї®¤ЇЁбм ®Є­  struct FileInfoBlock Function dd ? @@ -421,14 +421,10 @@ pushad jne .cycle_0 ;бзЁвлў Ґ¬ ¤®зҐа­ЁҐ ⥣Ё ¤«п 0x8769 - stdcall [exif_get_app1_child], h_app1,h_child,0x8769 + stdcall [exif_get_app2], h_app1,h_child 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: @@ -652,10 +648,12 @@ 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_app2 dd sz_exif_get_app2 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_app2 db 'exif_get_app2',0 ;exif_get_image_160_120 sc system_colors diff --git a/programs/develop/libraries/exif/trunk/about.htm b/programs/develop/libraries/exif/trunk/about.htm index 01556f741e..f8a437c911 100644 --- a/programs/develop/libraries/exif/trunk/about.htm +++ b/programs/develop/libraries/exif/trunk/about.htm @@ -54,7 +54,7 @@ table { font-size: 15px; }
  • exif_get_app1
  • exif_get_app1_tag
  • exif_get_app1_child
  • - +
  • exif_get_app2
  • Константы для функции exif_get_app1_child
  • @@ -66,7 +66,7 @@ table { font-size: 15px; }

    Документация к свободной библиотеке exif.obj, для ОС Колибри. Эта библиотека создана для просмотра информации находящейся в изображениях в формате Exif. Информация эта создается цифровыми фотокамерами и содержит разные параметры например такие как: название фирмы производителя, модель камеры, и т.д.

    -

    Последнее обновление библиотеки 22.07.14.

    +

    Последнее обновление библиотеки 23.07.14.

    Функции

    @@ -108,6 +108,15 @@ h_child dd 0,0,0

    0x8769 - код тега (находящегося в списке тегов h_app1), который является указателем на список других дочерних тегов.

    В даном примере функция берет тег 0x8769 и пытается найти его в списке h_app1, если находит то заполняет по нему значения в структуре h_child. Далее к списку h_child можно применять функцию exif_get_app1_tag для взятия значения этих тегов. С помощью этой функции мы как бы переходим внутрь некой "папки" с тегами, которые сразу достать не можем.

    +

    exif_get_app2

    +

    Эта функция ищет начало данных Exif.app2. Если они найдены то заполняется структура app2. Если не найдены, то первый параметр в структуре делается равным 0. Пример:

    +
    stdcall [exif_get_app2], h_app1,h_app2
    +...
    +h_app1 dd 0,0,0
    +h_app2 dd 0,0,0
    +

    где h_app1 - структура c данными Exif.app1, предварительно заполненная функцией exif_get_app1.

    +

    h_app2 - структура для запоминания начала данных Exif.app2.

    +

    Константы для функции exif_get_app1_child

    Здесь приведены некоторые константы, которые могут использоватся как 3-й параметр для функции exif_get_app1_child. Эти константы обозначают специальные теги, которые содержат смещение на дочерние параметры, которые находятся в Exif.

    0x8769

    @@ -122,12 +131,15 @@ 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_app2 dd sz_exif_get_app2 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 db 'exif_get_app1_child',0 + sz_exif_get_app2 db 'exif_get_app2',0

    История

    15.07.14 - первая версия библиотеки, пример использования.

    +

    23.07.14 - добавлена функция exif_get_app2.

    \ 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 984a533c51..15bc1290bc 100644 --- a/programs/develop/libraries/exif/trunk/exif.asm +++ b/programs/develop/libraries/exif/trunk/exif.asm @@ -28,6 +28,7 @@ tag_format_f8b equ 12 ;float 8 byte align 4 txt_dp db ': ',0 +txt_zap db ', ',0 txt_div db '/',0 ; @@ -212,6 +213,7 @@ db 0x87,0xac,'Image layer',0 db 0x87,0xaf,'Geo tiff directory',0 db 0x87,0xb0,'Geo tiff double params',0 db 0x87,0xb1,'Geo tiff ascii params',0 +db 0x88,0x25,'GPS info',0 db 0x88,0x28,'Opto-Electric conv factor',0 db 0x88,0x29,'Interlace',0 db 0x88,0x5c,'Fax recv params',0 @@ -385,7 +387,6 @@ db 0x82,0x9a,'Exposure time',0 db 0x82,0x9d,'F number',0 db 0x88,0x22,'Exposure program',0 db 0x88,0x24,'Spectral sensitivity',0 -db 0x88,0x25,'GPS info',0 db 0x88,0x27,'ISO',0 db 0x88,0x2a,'Time zone offset',0 db 0x88,0x2b,'Self timer mode',0 @@ -681,6 +682,102 @@ popad ret endp +;output: +; app2 - гЄ § вҐ«м ­  ­ з «® exif.app2 (Ё«Ё 0 Ґб«Ё ­Ґ ­ ©¤Ґ­® Ё«Ё д®а¬ в д ©«  ­Ґ Ї®¤¤Ґа¦Ёў Ґвбп) +align 4 +proc exif_get_app2, app1:dword, app2:dword +pushad + mov eax,[app1] + cmp [eax],edx + je .no_suport ;Ґб«Ё ­Ґ ­ ©¤Ґ­ гЄ § вҐ«м ­  ­ з «® exif.app1 + + mov edi,[app2] + movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1 + + ;­ з «® Ї®ЁбЄ  Їа®Ё§ў®¤ЁвҐ«п Є ¬Ґал + mov ebx,0x010f + 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_suport ;Ґб«Ё зЁб«® ⥣®ў <1 + + ;ЇҐаҐе®¤Ё¬ ­  1-© ⥣ + add eax,offs_tag_0 + @@: + cmp word[eax],bx + je @f + add eax,tag_size + loop @b + jmp .no_suport ;Ґб«Ё ­Ґ ­ ©¤Ґ­® + @@: ;Ґб«Ё ­ ©¤Ґ­® + mov ebx,dword[eax+4] + bt edx,0 + jnc @f + ror bx,8 + ror ebx,16 + ror bx,8 + @@: + cmp ebx,4 + jle .no_suport ;­ §ў ­ЁҐ Їа®Ё§ў®¤ЁвҐ«п ¬Ґ­миҐ 4 бЁ¬ў®«®ў, ­Ґ Ї®¤¤Ґа¦Ё ў Ґвбп + + 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] + cmp dword[ebx],'Cano' + je .suport + cmp dword[ebx],'NIKO' + je .suport + cmp dword[ebx],'Pana' + je .suport + + ;ўбҐ ®бв «м­лҐ ­Ґ Ї®¤¤Ґа¦Ёў овбп + jmp .no_suport + + .suport: + ;­ е®¤Ё¬ ⥣ 0x8769 (а биЁаҐ­­лҐ ¤ ­­лҐ Ї® Exif) + stdcall exif_get_app1_child, eax,edi,0x8769 + cmp dword[edi],0 + je .no_suport + ;­ е®¤Ё¬ ⥣ 0xa005 (¤ ­­лҐ Maker Ї® Є ¬ҐаҐ) + stdcall exif_get_app1_child, edi,edi, 0x927c + cmp dword[edi],0 + je .no_suport + + cmp dword[ebx],'NIKO' + jne @f + add dword[edi],18 ;for Nikon + @@: + cmp dword[ebx],'Pana' + jne @f + add dword[edi],12 ;for Panasonic + @@: + + jmp @f + .no_suport: + mov dword[edi],0 + @@: +popad + ret +endp + ;description: ; ўбЇ®¬®Ј вҐ«м­ п дг­ЄжЁп ¤«п з⥭Ёп ­ §­ зҐ­Ё© ⥣®ў ;input: @@ -732,13 +829,17 @@ proc read_tag_value, app1:dword, t_max:dword add esi,2 stdcall str_n_cat,edi,esi,[t_max] - jmp @f + jmp .start_read .tag_unknown: ;Ґб«Ё ⥣ ­Ґ ­ ©¤Ґ­ бв ўЁ¬ ҐЈ® Є®¤ ў¬Ґбв® ­ §ў ­Ёп movzx ebx,word[eax] + bt edx,0 + jnc @f + ror bx,8 + @@: stdcall hex_in_str, edi, ebx,4 mov byte[edi+4],0 - @@: + .start_read: ;зЁв Ґ¬ Ё­д®а¬ жЁо ў ⥣Ґ mov bx,tag_format_ui1b @@ -750,18 +851,34 @@ proc read_tag_value, app1:dword, t_max:dword jne .tag_01 stdcall str_n_cat,edi,txt_dp,[t_max] call get_tag_data_size - cmp ebx,1 + cmp ebx,4 jg .over4b_01 - ;Ґб«Ё ®¤­® 1 Ў ©в®ў®Ґ зЁб«® + cmp ebx,1 + je @f + or edx,2 ;array data + mov ecx,dword[eax+8] + mov dh,bl + @@: + ;Ґб«Ё 1 ®¤­® Ў ©в®ў®Ґ зЁб«® movzx ebx,byte[eax+8] - ;bt edx,0 - ;jnc @f - ; ror bx,8 - ;@@: stdcall str_len,edi add edi,eax mov eax,ebx call convert_int_to_str ;[t_max] + bt edx,1 + jnc .end_f + @@: + ;Ґб«Ё ®в 2 ¤® 4 ®¤­® Ў ©в®ўле зЁбҐ« + dec dh + cmp dh,0 + je .end_f + shr ecx,8 + stdcall str_n_cat,edi,txt_zap,[t_max] + stdcall str_len,edi + add edi,eax + movzx eax,cl + call convert_int_to_str ;[t_max] + jmp @b .over4b_01: ;... jmp .end_f @@ -808,8 +925,16 @@ proc read_tag_value, app1:dword, t_max:dword jne .tag_03 stdcall str_n_cat,edi,txt_dp,[t_max] call get_tag_data_size - cmp ebx,1 + cmp ebx,2 jg .over4b_03 + jne @f + ;Ґб«Ё ¤ў  2 Ў ©в®ўле зЁб«  + or edx,2 ;array data + movzx ecx,word[eax+10] + bt edx,0 + jnc @f + ror cx,8 + @@: ;Ґб«Ё ®¤­® 2 Ў ©в®ў®Ґ зЁб«® movzx ebx,word[eax+8] bt edx,0 @@ -820,6 +945,14 @@ proc read_tag_value, app1:dword, t_max:dword add edi,eax mov eax,ebx call convert_int_to_str ;[t_max] + bt edx,1 ;array ? + jnc .end_f + ;¤®Ў ў«пҐ¬ 2-Ґ зЁб«® + stdcall str_n_cat,edi,txt_zap,[t_max] + stdcall str_len,edi + add edi,eax + mov eax,ecx + call convert_int_to_str ;[t_max] .over4b_03: ;... jmp .end_f @@ -1079,7 +1212,9 @@ 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_app2, exif_get_app2 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_app2 db 'exif_get_app2',0