kolibrios/programs/media/img_transform/select_points.inc

359 lines
11 KiB
PHP
Raw Permalink Normal View History

;
; файл для работы с выделенными точками,
; по которым делается преобразование изображения
;[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