update program

git-svn-id: svn://kolibrios.org@7986 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2020-05-26 09:00:49 +00:00
parent ba500c0f89
commit 7a7a049046
3 changed files with 134 additions and 40 deletions

View File

@ -45,13 +45,14 @@ table { font-size: 15px; }
</head> </head>
<body> <body>
<h1>Image transform 16.05.20</h1> <h1>Image transform 26.05.20</h1>
<h2>Оглавление</h2> <h2>Оглавление</h2>
<ul> <ul>
<li>О программе</li> <li>О программе</li>
<li>Панель инструментов</li> <li>Панель инструментов</li>
<li>Клавиатура</Li> <li>Клавиатура</li>
<li>Алгоритм работы программы</li>
<li>Автор</li> <li>Автор</li>
</ul> </ul>
@ -62,7 +63,7 @@ table { font-size: 15px; }
<p>Рис. 1. Внешний вид программы</p> <p>Рис. 1. Внешний вид программы</p>
<p>Использование программы:</p> <p>Использование программы:</p>
<p>Программу можно использовать для выравнивания искаженных изображений изаначально прямоугольной (квадратной) формы, для создания текстур и т.д. После открытия файла изображения нужно указать 4 точки, которые станут углами преобразованого изображения. Для выбора точки нужно навести курсор мыши в нужное место и нажать кнопку на клавиатуре цифру от 1 до 4, в зависимости от того какую точку нужно установить в выбранное место. Для более точной установки координат можно выделить точку нажатием на ней курсором мыши, а потом курсорами на клавиатуре двигать точку в нужное место.</p> <p>Программу можно использовать для выравнивания искаженных изображений изначально прямоугольной (квадратной) формы, для создания текстур и т.д. После открытия файла изображения нужно указать 4 точки, которые станут углами преобразованного изображения. Для выбора точки нужно навести курсор мыши в нужное место и нажать на клавиатуре цифру от 1 до 4, в зависимости от того какую точку нужно установить в выбранное место. Также можно передвигать точки перетаскиванием мышей. Для более точной установки координат можно выделить точку нажатием на ней курсором мыши, а потом курсорами на клавиатуре двигать точку в нужное место.</p>
<p><img src="img_02.png"></p> <p><img src="img_02.png"></p>
<p>Рис. 2. Окно с исходным изображением</p> <p>Рис. 2. Окно с исходным изображением</p>
@ -83,6 +84,13 @@ table { font-size: 15px; }
<p><b>1, 2, 3, 4</b> - установка координат указанной точки.</p> <p><b>1, 2, 3, 4</b> - установка координат указанной точки.</p>
<p><b>&uarr;</b>, <b>&darr;</b>, <b>&larr;</b>, <b>&rarr;</b> - навигация по изображению или пермещение выделенной точки.</p> <p><b>&uarr;</b>, <b>&darr;</b>, <b>&larr;</b>, <b>&rarr;</b> - навигация по изображению или пермещение выделенной точки.</p>
<h2>Алгоритм работы программы</h2>
<p>Открывается изображение и из него делается текстура для библиотеки TinyGL. (Если ширина изображения не кратна 2-м в какой-либо степени то оно дополняется пустыми полями с двух сторон до нужной ширины).
Пользователь задает 4 контрольные точки, 5-я точка вычисляется как среднее арифметическое от этих 4-х точек.
Вычисляются текстурные координаты для точек (в пределах от 0 до 1).
Рисуются 4 треугольника по выпрямленным координатам.
Если все устраивает можно сохранять полученное изображение.</p>
<h2>Автор</h2> <h2>Автор</h2>
<p>IgorA</p> <p>IgorA</p>
</body> </body>

View File

@ -12,10 +12,8 @@ include '../../../programs/develop/libraries/TinyGL/asm_fork/opengl_const.inc'
include '../../../programs/develop/libraries/libs-dev/libimg/libimg.inc' include '../../../programs/develop/libraries/libs-dev/libimg/libimg.inc'
include '../../../programs/develop/info3ds/info_fun_float.inc' include '../../../programs/develop/info3ds/info_fun_float.inc'
txt_buf rb 8
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
caption db 'Image transform 16.05.20',0 ;¯®¤¯¨áì ®ª­  caption db 'Image transform 26.05.20',0 ;¯®¤¯¨áì ®ª­ 
offs_zbuf_pbuf equ 24 ;const. from 'zbuffer.inc' offs_zbuf_pbuf equ 24 ;const. from 'zbuffer.inc'
@ -201,7 +199,6 @@ pushad
jmp .end2 jmp .end2
.end1: .end1:
push buf_ogl push buf_ogl
;call [kosglSwapBuffers]
.end2: .end2:
stdcall [buf2d_bit_blt], buf_0, [nav_x],[nav_y] ;,... stdcall [buf2d_bit_blt], buf_0, [nav_x],[nav_y] ;,...
@ -221,6 +218,13 @@ pushad
stdcall convert_int_to_str, 16 stdcall convert_int_to_str, 16
stdcall str_cat, edi,ebx stdcall str_cat, edi,ebx
stdcall str_cat, edi,txt_space ;§ ¢¥àè î騩 ¯à®¡¥« stdcall str_cat, edi,txt_space ;§ ¢¥àè î騩 ¯à®¡¥«
;è¨à¨­  ¨ ¢ëá®â  ¨§®¡à ¦¥­¨ï
mov eax,[buf_i0.w]
mov edi,txt_img_w.size
stdcall convert_int_to_str, 16
mov eax,[buf_i0.h]
mov edi,txt_img_h.size
stdcall convert_int_to_str, 16
mov byte[calc],0 mov byte[calc],0
.end0: .end0:
; *** à¨á®¢ ­¨¥ ¡ãä¥à  *** ; *** à¨á®¢ ­¨¥ ¡ãä¥à  ***
@ -229,7 +233,11 @@ pushad
mov ecx,[sc.work_text] mov ecx,[sc.work_text]
or ecx,0x80000000 or (1 shl 30) or ecx,0x80000000 or (1 shl 30)
mov edi,[sc.work] ;梥â ä®­  ®ª­  mov edi,[sc.work] ;梥â ä®­  ®ª­ 
mcall SF_DRAW_TEXT,(275 shl 16)+7,,txt_f_size mcall SF_DRAW_TEXT,(275 shl 16)+4,,txt_f_size
add ebx,9
mcall ,,,txt_img_w
add ebx,9
mcall ,,,txt_img_h
popad popad
ret ret
endp endp
@ -491,13 +499,48 @@ popad
ret ret
align 4 align 4
proc mouse_left_u uses eax proc mouse_left_u uses eax ebx
call buf_get_mouse_coord call buf_get_mouse_coord
cmp eax,-1 cmp eax,-1
je .end0 je .end0
sub [mouse_down_x],eax sub [mouse_down_x],eax
sub [mouse_down_y],ebx sub [mouse_down_y],ebx
cmp dword[sel_act],-1
je .end1
;¤¢¨£ ¥¬ â®çª¨
mov eax,[sel_act]
imul eax,sizeof.point2d
add eax,sel_pt
;coord x
mov ebx,dword[eax+point2d.x]
sub ebx,[mouse_down_x]
cmp ebx,0
jge @f
xor ebx,ebx
@@:
cmp ebx,[buf_i0.w]
jle @f
mov ebx,[buf_i0.w]
@@:
mov dword[eax+point2d.x],ebx
;coord y
mov ebx,dword[eax+point2d.y]
sub ebx,[mouse_down_y]
cmp ebx,0
jge @f
xor ebx,ebx
@@:
cmp ebx,[buf_i0.h]
jle @f
mov ebx,[buf_i0.h]
@@:
mov dword[eax+point2d.y],ebx
call points_update_prop
jmp .end2
.end1:
;¤¢¨£ ¥¬ ¨§®¡à ¦¥­¨¥
mov eax,[nav_y] mov eax,[nav_y]
sub eax,[mouse_down_y] sub eax,[mouse_down_y]
cmp eax,[nav_y_min] cmp eax,[nav_y_min]
@ -521,9 +564,8 @@ proc mouse_left_u uses eax
mov eax,[nav_x_max] mov eax,[nav_x_max]
@@: @@:
mov [nav_x],eax mov [nav_x],eax
.end2:
mov byte[calc],1 mov byte[calc],1
.end0: .end0:
ret ret
endp endp
@ -620,11 +662,6 @@ proc but_open_file
mov dword[run_file_70.FileName], openfile_path mov dword[run_file_70.FileName], openfile_path
mcall SF_FILE,run_file_70 mcall SF_FILE,run_file_70
;mov eax,dword[open_b+32]
;mov edi,txt_buf
;stdcall convert_int_to_str,20
;notify_window_run txt_buf
mov ecx,dword[open_b+32] ;+32 qword: à §¬¥à ä ©«  ¢ ¡ ©â å mov ecx,dword[open_b+32] ;+32 qword: à §¬¥à ä ©«  ¢ ¡ ©â å
mov [open_file_size],ecx mov [open_file_size],ecx
stdcall mem.ReAlloc,[open_file_img],ecx ;¢ë¤¥«ï¥¬ ¯ ¬ïâì ¤«ï ¨§®¡à ¦¥­¨ï stdcall mem.ReAlloc,[open_file_img],ecx ;¢ë¤¥«ï¥¬ ¯ ¬ïâì ¤«ï ¨§®¡à ¦¥­¨ï
@ -684,13 +721,22 @@ proc but_open_file
jg @f jg @f
mov eax,[ebx+4] mov eax,[ebx+4]
@@: @@:
mov ecx,eax mov ecx,eax ;à §¬¥à ¯® x
mov edx,[ebx+8] stdcall getNextPowerOfTwo,[ebx+8]
cmp eax,[ebx+8]
jg @f
mov eax,[ebx+8]
@@:
mov edx,eax ;à §¬¥à ¯® y
stdcall [buf2d_resize], edi, ecx,edx,1 ;¨§¬¥­ï¥¬ à §¬¥àë ¡ãä¥à  stdcall [buf2d_resize], edi, ecx,edx,1 ;¨§¬¥­ï¥¬ à §¬¥àë ¡ãä¥à 
stdcall [buf2d_clear], edi, buf2d_color
sub ecx,[ebx+4] sub ecx,[ebx+4]
shr ecx,1 shr ecx,1
mov [buf_cop.l],cx mov [buf_cop.l],cx
stdcall [buf2d_bit_blt], edi, ecx,0, buf_cop sub edx,[ebx+8]
shr edx,1
mov [buf_cop.t],dx
stdcall [buf2d_bit_blt], edi, ecx,edx, buf_cop
.end_1: .end_1:
;ᮧ¤ ¥¬ ¡ãä¥à ¤«ï ¯à¥®¡à §®¢ ­­®£® ¨§®¡à ¦¥­¨ï ;ᮧ¤ ¥¬ ¡ãä¥à ¤«ï ¯à¥®¡à §®¢ ­­®£® ¨§®¡à ¦¥­¨ï
@ -742,26 +788,11 @@ proc but_open_file
stdcall [img_destroy], ebx stdcall [img_destroy], ebx
movzx eax,word[buf_cop.l] movzx eax,word[buf_cop.l]
stdcall points_init_2,eax movzx ebx,word[buf_cop.t]
stdcall points_init_2,eax,ebx
call calc_nav_params call calc_nav_params
xor eax,eax stdcall nav_to_point, dword[sel_pt+point2d.x],dword[sel_pt+point2d.y]
mov [nav_x],eax
mov ebx,[nav_x_max]
cmp ebx,0
jle @f
;¥á«¨ ¬ «¥­ìª®¥ ¨§®¡à ¦¥­¨¥ â® áâ ¢¨¬ ¯® 業âàã
shr ebx,1
mov [nav_x],ebx
@@:
mov [nav_y],eax
mov ebx,[nav_y_max]
cmp ebx,0
jle @f
;¥á«¨ ¬ «¥­ìª®¥ ¨§®¡à ¦¥­¨¥ â® áâ ¢¨¬ ¯® 業âàã
shr ebx,1
mov [nav_y],ebx
@@:
mov byte[view_b],0 mov byte[view_b],0
mov dword[sel_act],-1 ;á­¨¬ ¥¬ ¢ë¤¥«¥­¨¥ á â®ç¥ª mov dword[sel_act],-1 ;á­¨¬ ¥¬ ¢ë¤¥«¥­¨¥ á â®ç¥ª
mov byte[calc],1 mov byte[calc],1
@ -772,6 +803,51 @@ proc but_open_file
ret ret
endp endp
align 4
proc nav_to_point, coord_x:dword, coord_y:dword
;coord x
mov eax,[nav_x_max]
cmp eax,0
jle @f
;¥á«¨ ¬ «¥­ìª®¥ ¨§®¡à ¦¥­¨¥ â® áâ ¢¨¬ ¯® 業âàã
shr eax,1
jmp .end0
@@:
mov eax,[buf_0.w]
shr eax,1
sub eax,[coord_x]
cmp eax,[nav_x_min]
jge @f
mov eax,[nav_x_min]
@@:
cmp eax,[nav_x_max]
jle .end0
mov eax,[nav_x_max]
.end0:
mov [nav_x],eax
;coord y
mov eax,[nav_y_max]
cmp eax,0
jle @f
;¥á«¨ ¬ «¥­ìª®¥ ¨§®¡à ¦¥­¨¥ â® áâ ¢¨¬ ¯® 業âàã
shr eax,1
jmp .end1
@@:
mov eax,[buf_0.h]
shr eax,1
sub eax,[coord_y]
cmp eax,[nav_y_min]
jge @f
mov eax,[nav_y_min]
@@:
cmp eax,[nav_y_max]
jle .end1
mov eax,[nav_y_max]
.end1:
mov [nav_y],eax
ret
endp
align 4 align 4
proc getNextPowerOfTwo uses ebx, n:dword proc getNextPowerOfTwo uses ebx, n:dword
mov ebx,[n] mov ebx,[n]
@ -1090,6 +1166,10 @@ if lang eq ru
'ª®â®àë¥ áâ ­ãâ 㣫 ¬¨ ¯à¥®¡à §®¢ ­®£® ¨§®¡à ¦¥­¨ï." -tI',0 'ª®â®àë¥ áâ ­ãâ 㣫 ¬¨ ¯à¥®¡à §®¢ ­®£® ¨§®¡à ¦¥­¨ï." -tI',0
txt_pref db ' ¡ ',0,' Š¡',0,' Œ¡',0,' ƒ¡',0 ;¯à¨áâ ¢ª¨: ª¨«®, ¬¥£ , £¨£  txt_pref db ' ¡ ',0,' Š¡',0,' Œ¡',0,' ƒ¡',0 ;¯à¨áâ ¢ª¨: ª¨«®, ¬¥£ , £¨£ 
txt_f_size db '<27> §¬¥à: ' txt_f_size db '<27> §¬¥à: '
.size: rb 16
txt_img_w db '˜¨à¨­ : '
.size: rb 16
txt_img_h db '‚ëá®â : '
else else
txt_err_save_img_file db 'Can',39,'t save *.png file.',0 txt_err_save_img_file db 'Can',39,'t save *.png file.',0
txt_about db '"About',13,10,\ txt_about db '"About',13,10,\
@ -1098,6 +1178,10 @@ else
'that will become the corners of the converted image." -tI',0 'that will become the corners of the converted image." -tI',0
txt_pref db ' b ',0,' Kb',0,' Mb',0,' Gb',0 ;¯à¨áâ ¢ª¨: ª¨«®, ¬¥£ , £¨£  txt_pref db ' b ',0,' Kb',0,' Mb',0,' Gb',0 ;¯à¨áâ ¢ª¨: ª¨«®, ¬¥£ , £¨£ 
txt_f_size db 'Size: ' txt_f_size db 'Size: '
.size: rb 16
txt_img_w db 'Width: '
.size: rb 16
txt_img_h db 'Height: '
end if end if
.size: rb 16 .size: rb 16
@ -1283,7 +1367,7 @@ buf_0: dd 0
.t: dw 35 ;+6 top .t: dw 35 ;+6 top
.w: dd 6*64 ;+8 w .w: dd 6*64 ;+8 w
.h: dd 7*64 ;+12 h .h: dd 7*64 ;+12 h
.color: dd 0xffffff ;+16 color .color: dd 0x808080 ;+16 color
db 24 ;+20 bit in pixel db 24 ;+20 bit in pixel
align 4 align 4
@ -1333,6 +1417,7 @@ mouse_down_y dd ?
sel_act dd ? ;â®çª  ¢ë¡à ­­ ï ¤«ï । ªâ¨à®¢ ­¨ï á ª« ¢¨ âãàë sel_act dd ? ;â®çª  ¢ë¡à ­­ ï ¤«ï । ªâ¨à®¢ ­¨ï á ª« ¢¨ âãàë
sel_pt rb 8*sizeof.point2d ;â®çª¨ ¤«ï ¢ë¡®à  4-å 㣫®¢ sel_pt rb 8*sizeof.point2d ;â®çª¨ ¤«ï ¢ë¡®à  4-å 㣫®¢
last_time dd 0 last_time dd 0
txt_buf rb 8
procinfo process_information procinfo process_information
sc system_colors sc system_colors
run_file_70 FileInfoBlock run_file_70 FileInfoBlock

View File

@ -34,8 +34,8 @@ points_init:
;настройка точек при открытии изображения ;настройка точек при открытии изображения
;(точки ставятся по углам изображения) ;(точки ставятся по углам изображения)
align 4 align 4
proc points_init_2 uses eax ecx edx edi, ot_x:dword proc points_init_2 uses eax ecx edx edi, ot_x:dword, ot_y:dword
xor eax,eax mov eax,[ot_y]
mov edi,sel_pt mov edi,sel_pt
mov edx,[ot_x] mov edx,[ot_x]
mov [edi+point2d.x],edx ;1 mov [edi+point2d.x],edx ;1
@ -48,6 +48,7 @@ proc points_init_2 uses eax ecx edx edi, ot_x:dword
add edi,sizeof.point2d add edi,sizeof.point2d
mov [edi+point2d.x],ecx ;3 mov [edi+point2d.x],ecx ;3
mov ecx,[buf_i0.h] mov ecx,[buf_i0.h]
sub ecx,eax
mov [edi+point2d.y],ecx ;3 mov [edi+point2d.y],ecx ;3
add edi,sizeof.point2d add edi,sizeof.point2d
mov [edi+point2d.x],edx ;4 mov [edi+point2d.x],edx ;4