kolibrios/programs/media/img_transform/select_points.inc
IgorA 7a7a049046 update program
git-svn-id: svn://kolibrios.org@7986 a494cfbc-eb01-0410-851d-a64ba20cac60
2020-05-26 09:00:49 +00:00

359 lines
11 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
; файл для работы с выделенными точками,
; по которым делается преобразование изображения
;[0-3] - рамка (исх. и.)
;[4] - средняя точка (исх. и.)
;[5-6] - рамка (вых. и.)
;[7] - средняя точка (вых. и.)
;
struct point2d
x dd ? ;координата относит изображения
y dd ?
tx dd ? ;координата для текстуры
ty dd ?
captx rb 6
capty rb 6
ends
;настройка точек при загрузке программы
;(точки не активны)
align 4
points_init:
xor eax,eax
dec eax
mov ecx,8
mov edi,sel_pt
@@:
mov [edi+point2d.x],eax
mov [edi+point2d.y],eax
add edi,sizeof.point2d
loop @b
ret
;настройка точек при открытии изображения
;(точки ставятся по углам изображения)
align 4
proc points_init_2 uses eax ecx edx edi, ot_x:dword, ot_y:dword
mov eax,[ot_y]
mov edi,sel_pt
mov edx,[ot_x]
mov [edi+point2d.x],edx ;1
mov [edi+point2d.y],eax ;1
add edi,sizeof.point2d
mov ecx,[buf_i0.w]
sub ecx,edx
mov [edi+point2d.x],ecx ;2
mov [edi+point2d.y],eax ;2
add edi,sizeof.point2d
mov [edi+point2d.x],ecx ;3
mov ecx,[buf_i0.h]
sub ecx,eax
mov [edi+point2d.y],ecx ;3
add edi,sizeof.point2d
mov [edi+point2d.x],edx ;4
mov [edi+point2d.y],ecx ;4
call points_update_prop
ret
endp
align 4
proc points_update_prop uses eax ebx ecx edi esi
;вычисление координат средней точки
mov edi,sel_pt
xor eax,eax
xor ebx,ebx
mov ecx,4
@@:
add eax,[edi+point2d.x]
add ebx,[edi+point2d.y]
add edi,sizeof.point2d
loop @b
shr eax,2
mov [edi+point2d.x],eax
shr ebx,2
mov [edi+point2d.y],ebx
add edi,sizeof.point2d
cmp byte[trans_a],0 ;проверяем алгоритм растягивания текстуры
je @f
;на весь буфер
xor eax,eax
mov ebx,edi
mov edi,buf_i0
mov [ebx+point2d.x],eax
mov [ebx+point2d.y],eax
add ebx,sizeof.point2d
mov eax,buf2d_w
mov [ebx+point2d.x],eax
mov ecx,buf2d_h
mov [ebx+point2d.y],ecx
add ebx,sizeof.point2d
shr eax,1
mov [ebx+point2d.x],eax
shr ecx,1
mov [ebx+point2d.y],ecx
jmp .end0
@@:
;на часть буфера
mov eax,[edi+point2d.x-5*sizeof.point2d]
add eax,[edi+point2d.x-2*sizeof.point2d]
shr eax,1
mov [edi+point2d.x],eax
mov eax,[edi+point2d.x-4*sizeof.point2d]
add eax,[edi+point2d.x-3*sizeof.point2d]
shr eax,1
mov [edi+point2d.x+sizeof.point2d],eax
mov eax,[edi+point2d.y-5*sizeof.point2d]
add eax,[edi+point2d.y-4*sizeof.point2d]
shr eax,1
mov [edi+point2d.y],eax
mov eax,[edi+point2d.y-3*sizeof.point2d]
add eax,[edi+point2d.y-2*sizeof.point2d]
shr eax,1
mov [edi+point2d.y+sizeof.point2d],eax
lea esi,[edi-sizeof.point2d]
add edi,2*sizeof.point2d
movsd ;copy coord x
movsd ;copy coord y
.end0:
mov edi,buf_i0
mov ebx,sel_pt
mov ecx,8
finit
.cycle0:
fild dword[ebx+point2d.x]
fidiv buf2d_w
fst dword[ebx+point2d.tx]
fstp qword[Data_Double]
call DoubleFloat_to_String
call String_crop_0
m2m dword[ebx+point2d.captx],dword[Data_String]
mov al,byte[Data_String+4]
mov byte[ebx+point2d.captx+4],al
fild dword[ebx+point2d.y]
fidiv buf2d_h
fst dword[ebx+point2d.ty]
fstp qword[Data_Double]
call DoubleFloat_to_String
call String_crop_0
m2m dword[ebx+point2d.capty],dword[Data_String]
mov al,byte[Data_String+4]
mov byte[ebx+point2d.capty+4],al
add ebx,sizeof.point2d
loop .cycle0
call draw_transf_texture
ret
endp
;рисование выбранных точек
align 4
proc points_draw
locals
PervX dd 0 ;pervios point coord X
PervY dd 0 ;pervios point coord Y
GrafX dd ? ;active point coord X
GrafY dd ? ;active point coord Y
endl
mov edi,buf_ogl
cmp buf2d_data,0
je .endf
xor ecx,ecx
mov edi,sel_pt
mov dword[txt_buf],'0'
cmp byte[view_b],1
je .cycle0end
;берем координаты последней точки
mov eax,[edi+3*sizeof.point2d+point2d.x]
add eax,[nav_x]
mov [PervX],eax
mov ebx,[edi+3*sizeof.point2d+point2d.y]
add ebx,[nav_y]
mov [PervY],ebx
align 4
.cycle0:
cmp dword[edi+point2d.x],-1
je .end0
mov eax,[edi+point2d.x]
add eax,[nav_x]
mov [GrafX],eax
sub eax,3
mov ebx,[edi+point2d.y]
add ebx,[nav_y]
mov [GrafY],ebx
sub ebx,3
cmp ecx,[sel_act]
je @f
stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx, 5,5, 0xffff00
@@:
dec eax
dec ebx
stdcall [buf2d_rect_by_size], buf_0, eax,ebx, 7,7, 0x808000
call point_draw_info
;рисование линии
stdcall [buf2d_line], buf_0, [PervX],[PervY], [GrafX],[GrafY], 0x808000
mov eax,[GrafX]
mov [PervX],eax
mov eax,[GrafY]
mov [PervY],eax
.end0:
add edi,sizeof.point2d
inc ecx
cmp ecx,4
jl .cycle0
jmp .cycle1end
.cycle0end:
add edi,5*sizeof.point2d
align 4
.cycle1:
cmp dword[edi+point2d.x],-1
je .end1
mov eax,[GrafX]
mov [PervX],eax
mov eax,[GrafY]
mov [PervY],eax
mov eax,[edi+point2d.x]
add eax,[nav_x]
mov [GrafX],eax
sub eax,3
mov ebx,[edi+point2d.y]
add ebx,[nav_y]
mov [GrafY],ebx
sub ebx,3
stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx, 5,5, 0xffff00
dec eax
dec ebx
stdcall [buf2d_rect_by_size], buf_0, eax,ebx, 7,7, 0x808000
call point_draw_info
.end1:
add edi,sizeof.point2d
inc ecx
cmp ecx,2
jl .cycle1
mov eax,[GrafX]
sub eax,[PervX]
mov [GrafX],eax
mov eax,[GrafY]
sub eax,[PervY]
mov [GrafY],eax
stdcall [buf2d_rect_by_size], buf_0, [PervX],[PervY], [GrafX],[GrafY], 0x808000
.cycle1end:
;средняя точка
mov eax,[edi+point2d.x]
add eax,[nav_x]
sub eax,3
mov ebx,[edi+point2d.y]
add ebx,[nav_y]
sub ebx,3
stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx, 5,5, 0xff0000
dec eax
dec ebx
stdcall [buf2d_rect_by_size], buf_0, eax,ebx, 7,7, 0x808000
add ebx,9
inc byte[txt_buf]
stdcall [buf2d_draw_text], buf_0, buf_font,txt_buf,eax,ebx,0
.endf:
ret
endp
;input:
; eax - coord x
; ebx - coord y
; edi - указатель на структуру point2d
align 4
point_draw_info:
;вывод текста
add ebx,9
inc byte[txt_buf]
inc eax
stdcall [buf2d_draw_text], buf_0, buf_font,txt_buf,eax,ebx,0xffffff
sub eax,2
stdcall [buf2d_draw_text], buf_0, buf_font,txt_buf,eax,ebx,0xffffff
inc eax
inc ebx
stdcall [buf2d_draw_text], buf_0, buf_font,txt_buf,eax,ebx,0xffffff
;dec ebx
sub ebx,2
stdcall [buf2d_draw_text], buf_0, buf_font,txt_buf,eax,ebx,0xffffff
inc ebx
stdcall [buf2d_draw_text], buf_0, buf_font,txt_buf,eax,ebx,0
add ebx,9
lea edx,[edi+point2d.captx]
inc eax
stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
sub eax,2
stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
inc eax
inc ebx
stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
;dec ebx
sub ebx,2
stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
inc ebx
stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0
add ebx,9
lea edx,[edi+point2d.capty]
inc eax
stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
sub eax,2
stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
inc eax
inc ebx
stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
;dec ebx
sub ebx,2
stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
inc ebx
stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0
ret
;рисование преобразованной текстуры
align 4
draw_transf_texture:
cmp dword[buf_ogl],0
je .endf
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
stdcall [glBegin],GL_TRIANGLES
stdcall [glTexCoord2f], dword[sel_pt+4*sizeof.point2d+point2d.tx], dword[sel_pt+4*sizeof.point2d+point2d.ty] ;5
stdcall [glVertex3f], dword[sel_pt+7*sizeof.point2d+point2d.tx], dword[sel_pt+7*sizeof.point2d+point2d.ty], 0.1 ;8
stdcall [glTexCoord2f], dword[sel_pt+point2d.tx], dword[sel_pt+point2d.ty] ;1
stdcall [glVertex3f], dword[sel_pt+5*sizeof.point2d+point2d.tx], dword[sel_pt+5*sizeof.point2d+point2d.ty], 0.1 ;6
stdcall [glTexCoord2f], dword[sel_pt+sizeof.point2d+point2d.tx], dword[sel_pt+sizeof.point2d+point2d.ty] ;2
stdcall [glVertex3f], dword[sel_pt+6*sizeof.point2d+point2d.tx], dword[sel_pt+5*sizeof.point2d+point2d.ty], 0.1 ;7|6
stdcall [glTexCoord2f], dword[sel_pt+4*sizeof.point2d+point2d.tx], dword[sel_pt+4*sizeof.point2d+point2d.ty] ;5
stdcall [glVertex3f], dword[sel_pt+7*sizeof.point2d+point2d.tx], dword[sel_pt+7*sizeof.point2d+point2d.ty], 0.1 ;8
stdcall [glTexCoord2f], dword[sel_pt+sizeof.point2d+point2d.tx], dword[sel_pt+sizeof.point2d+point2d.ty] ;2
stdcall [glVertex3f], dword[sel_pt+6*sizeof.point2d+point2d.tx], dword[sel_pt+5*sizeof.point2d+point2d.ty], 0.1 ;7|6
stdcall [glTexCoord2f], dword[sel_pt+2*sizeof.point2d+point2d.tx], dword[sel_pt+2*sizeof.point2d+point2d.ty] ;3
stdcall [glVertex3f], dword[sel_pt+6*sizeof.point2d+point2d.tx], dword[sel_pt+6*sizeof.point2d+point2d.ty], 0.1 ;7
stdcall [glTexCoord2f], dword[sel_pt+4*sizeof.point2d+point2d.tx], dword[sel_pt+4*sizeof.point2d+point2d.ty] ;5
stdcall [glVertex3f], dword[sel_pt+7*sizeof.point2d+point2d.tx], dword[sel_pt+7*sizeof.point2d+point2d.ty], 0.1 ;8
stdcall [glTexCoord2f], dword[sel_pt+2*sizeof.point2d+point2d.tx], dword[sel_pt+2*sizeof.point2d+point2d.ty] ;3
stdcall [glVertex3f], dword[sel_pt+6*sizeof.point2d+point2d.tx], dword[sel_pt+6*sizeof.point2d+point2d.ty], 0.1 ;7
stdcall [glTexCoord2f], dword[sel_pt+3*sizeof.point2d+point2d.tx], dword[sel_pt+3*sizeof.point2d+point2d.ty] ;4
stdcall [glVertex3f], dword[sel_pt+5*sizeof.point2d+point2d.tx], dword[sel_pt+6*sizeof.point2d+point2d.ty], 0.1 ;6|7
stdcall [glTexCoord2f], dword[sel_pt+4*sizeof.point2d+point2d.tx], dword[sel_pt+4*sizeof.point2d+point2d.ty] ;5
stdcall [glVertex3f], dword[sel_pt+7*sizeof.point2d+point2d.tx], dword[sel_pt+7*sizeof.point2d+point2d.ty], 0.1 ;8
stdcall [glTexCoord2f], dword[sel_pt+3*sizeof.point2d+point2d.tx], dword[sel_pt+3*sizeof.point2d+point2d.ty] ;4
stdcall [glVertex3f], dword[sel_pt+5*sizeof.point2d+point2d.tx], dword[sel_pt+6*sizeof.point2d+point2d.ty], 0.1 ;6|7
stdcall [glTexCoord2f], dword[sel_pt+point2d.tx], dword[sel_pt+point2d.ty] ;1
stdcall [glVertex3f], dword[sel_pt+5*sizeof.point2d+point2d.tx], dword[sel_pt+5*sizeof.point2d+point2d.ty], 0.1 ;6
stdcall [glEnd]
.endf:
ret