2020-05-16 16:36:52 +02:00
|
|
|
|
;
|
|
|
|
|
; файл для работы с выделенными точками,
|
|
|
|
|
; по которым делается преобразование изображения
|
|
|
|
|
;[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
|
2020-05-26 11:00:49 +02:00
|
|
|
|
proc points_init_2 uses eax ecx edx edi, ot_x:dword, ot_y:dword
|
|
|
|
|
mov eax,[ot_y]
|
2020-05-16 16:36:52 +02:00
|
|
|
|
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]
|
2020-05-26 11:00:49 +02:00
|
|
|
|
sub ecx,eax
|
2020-05-16 16:36:52 +02:00
|
|
|
|
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
|