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'
|
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:
|
||||||
|
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_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]
|
|
||||||
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]
|
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
|
|
||||||
|
Loading…
Reference in New Issue
Block a user