forked from KolibriOS/kolibrios
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:
parent
55b3e99585
commit
f787c9d578
@ -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 '<27>à®á¬®âà ¨ä®à¬ 樨 Exif 17.07.14',0 ;¯®¤¯¨áì ®ª
|
||||
caption db '<27>à®á¬®âà ¨ä®à¬ 樨 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:
|
||||
|
132
programs/develop/libraries/exif/trunk/about.htm
Normal file
132
programs/develop/libraries/exif/trunk/about.htm
Normal 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 для взятия значения этих тегов. С помощью этой функции мы как бы переходим внутрь некой "папки" с тегами, которые сразу достать не можем.</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>
|
@ -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 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
|
||||
movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1
|
||||
|
||||
;¯à®¢¥à塞 ç¨á«® ⥣®¢
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user