7a7a049046
git-svn-id: svn://kolibrios.org@7986 a494cfbc-eb01-0410-851d-a64ba20cac60
359 lines
11 KiB
PHP
359 lines
11 KiB
PHP
;
|
||
; файл для работы с выделенными точками,
|
||
; по которым делается преобразование изображения
|
||
;[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
|