0,0 → 1,1728 |
|
;FigureInit, (¢à¥¬. áâà.), (Object.FigData) |
|
;add_object_in_list, ___, ___, (¢à¥¬. áâà.), (Object.FigData) |
; mov [Object.FigData], (tl_node_add(¢à¥¬. áâà.),tl_node_get_data) |
|
;draw_fig2d_litl, ___, pobj, (Object.FigData), ___, ___, ___ |
|
struct Object |
OType dd ? |
FigCount dd ? |
FigData dd ? ;array pointers to Figures |
MinX dq ? |
MinY dq ? |
SizeX dq ? |
SizeY dq ? |
WScale dq ? ;prewiew window scale |
MScale dq ? ;mouse scale (show partition figure) |
MCentrX dd ? ;mouse centr X |
MCentrY dd ? ;mouse centr Y |
Caption rb 32 |
ends |
|
struct Figure |
OType dd ? |
PoiCount dd ? |
PoiData dd ? |
MinX dq ? |
MinY dq ? |
SizeX dq ? |
SizeY dq ? |
WScale dq ? ;prewiew window scale (show all figure) |
MScale dq ? ;mouse scale (show partition figure) |
MCentrX dd ? ;mouse centr X |
MCentrY dd ? ;mouse centr Y |
Caption rb 32 |
ends |
|
struct Point |
Prop dd ? ;prorerties |
CoordX dq ? ;coord X |
CoordY dq ? ;coord Y |
ends |
|
txt_err_1 db '訡ª ¯à¨ áç¨âë¢ ¨¨ ®¡ê¥ªâ ',0 |
txt_err_2 db '訡ª ¯à¨ áç¨âë¢ ¨¨ 䨣ãàë',0 |
txt_err_3 db '¥ ©¤¥ â®çª ¢ 䨣ãà¥',0 |
txt_err_no_figure_select db '¥ ¢ë¡à ª®¬ ¤ ¤«ï ¯¥à¥¬¥é¥¨ï',0 |
txt_err_figure_is_0 db '®¬ ¤ ¥ ¬®¦¥â ¡ëâì ᤢ¨ãâ ¢¢¥àå,',13,10,'® ¢ ç «¥ ᯨ᪠.',0 |
txt_err_figure_is_last db '®¬ ¤ ¥ ¬®¦¥â ¡ëâì ᤢ¨ãâ ¢¨§,',13,10,'® ¢ ª®æ¥ ᯨ᪠.',0 |
txt_err_no_point_del db '¥ ¬®¦ 㤠«¨âì ¢á¥ â®çª¨ ¨§ 䨣ãàë.',0 |
txt_err_poi_is_0 db '¥ ¬®¦ ¯¥à¥¬¥áâ¨âì â®çªã ¢¢¥àå,',13,10,'® ¢ ç «¥ ᯨ᪠.',0 |
txt_err_poi_is_last db '¥ ¬®¦ ¯¥à¥¬¥áâ¨âì â®çªã ¢¨§,',13,10,'® ¢ ª®æ¥ ᯨ᪠.',0 |
txt_err_no_1_point_sel db 'ë¡¥à¨â¥ ¥ ¡®«ìè¥ ®¤®© â®çª¨.',0 |
|
txt_min_x db 'min x: ',0 |
txt_min_y db 'min y: ',0 |
|
if lang eq ru |
; |
; rus |
; |
txt_err_no_point_sel db '¥ ¢ë¡à ë â®çª¨.',0 |
txt_err_no_point_sel_1 db 'ë¡¥à¨â¥ ®¤ã â®çªã.',0 |
txt_but_cancel db '⬥ ',0 |
txt_but_apply db 'ਬ¥¨âì',0 |
txt_but_create db '®§¤ âì',0 |
txt_size_x db 'à §¬¥à x: ',0 |
txt_size_y db 'à §¬¥à y: ',0 |
txt_poi_sel: db 'ë¡à ® â®ç¥ª: ' |
.end db 0 |
txt_err_save_txt_file_0: |
db '¥ ¬®£ã á®åà ¨âì *.nc ä ©«.',0 |
txt_err_save_txt_file_1: |
db '¥ 㤠«®áì á®åà ¨âì ¢¥áì *.nc ä ©«.',0 |
txt_err_save_img_file: |
db '¥ ¬®£ã á®åà ¨âì *.png ä ©«.',0 |
txt_obj: db '¡ê¥ªâ: ',39 |
.end db 0 |
else |
; |
; eng |
; |
txt_err_no_point_sel db 'No select points.',0 |
txt_err_no_point_sel_1 db 'Select one point.',0 |
txt_but_cancel db 'Cancel',0 |
txt_but_apply db 'Apply',0 |
txt_but_create db 'Create',0 |
txt_size_x db 'size x: ',0 |
txt_size_y db 'size y: ',0 |
txt_poi_sel: db 'Select points: ' |
.end db 0 |
txt_err_save_txt_file_0: |
txt_err_save_txt_file_1: |
db 'Can',39,'t save *.nc file.',0 |
txt_err_save_img_file: |
db 'Can',39,'t save *.png file.',0 |
txt_obj: db 'Object: ',39 |
.end db 0 |
end if |
|
align 4 |
txt_s_39 db 39,' ',0 |
txt_s_poi db 'X',0 |
txt_s_poi_Y db ' Y',0 |
txt_s_poi_Z db ' Z',0 |
txt_coma db ',' |
txt_space db ' ',0 ;¥ ®âàë¢ âì ®â § ¯ï⮩ |
txt_nl db 13,10,0 |
txt_n db 13,0 |
txt_ls db ' (',0 |
txt_rs db ')',0 |
txt_len db ' len=',0 |
txt_39 db 39,0 |
|
use_mem_array_figure equ 0 ;1 - ¨á¯®«ì§®¢ âì ¤¨ ¬¨ç¥áª¨© ¬ áᨢ ¤«ï áâàãªâãà á ®¯¨á ¨ï¬¨ 䨣ãà |
|
;᢮©á⢠¤«ï à¨á®¢ ¨ï â®ç¥ª |
PROP_BIT_SELECT equ 30 ;â®çª ¯®¤ ¢ë¤¥«¥¨¥¬ |
|
align 4 |
zoom_plus dq 1.25992105 |
mouse_prop_x dd 0 ;ªãàá®à ¬ëè¨ ®â®á¨â¥«ì® æ¥âà ®ª buf_0 (¤«ï ¨§¬¥. ¬ áèâ ¡ ) |
mouse_prop_y dd 0 |
mouse_down_x dd 0 ;ªãàá®à ¬ëè¨ ®â®á¨â¥«ì® «¥¢®£® ¢¥à奣® 㣫 ®ª buf_0 (¤«ï ᤢ¨£ 䨣ãàë) |
mouse_down_y dd 0 |
opt_draw dd 1 |
graf_margin_left dd 3 ;margin in pixels |
graf_margin_right dd 3+6 ;margin in pixels |
graf_margin_top dd 3+9 ;margin in pixels |
graf_margin_bot dd 3+9 ;margin in pixels |
png_data dd ? |
png_size dd ? |
|
;global variables: |
ObjData Object |
FigData Figure ;¢à¥¬¥ ï áâàãªâãà ¤«ï § ¯®«¥¨ï tree1 |
PoiData Point |
|
size_one_list equ sizeof.Figure ;max (sizeof.Figure, sizeof.Object) |
|
if sizeof.Object > sizeof.Figure |
... need fix size_one_list |
end if |
|
if (Object.FigCount <> Figure.PoiCount) | (Object.FigData <> Figure.PoiData) | (Object.MScale <> Figure.MScale) | (Object.MCentrX <> Figure.MCentrX) | (Object.MCentrY <> Figure.MCentrY) |
... need fix offsets |
end if |
|
align 4 |
Scale1mm dq 11.81102362204724 ;pixels in 1 mm -> 300 dpi |
;5.905511811023622 ;pixels in 1 mm -> 150 dpi |
|
txt_buf rb 80 ;??? |
txt_sp db ' ',0 |
|
;input: |
; esi - text pointer |
align 4 |
proc txt_next_line uses eax ecx edi, mlen:dword |
mov al,13 |
mov ecx,[mlen] |
mov edi,esi |
repne scasb |
cmp byte[edi],10 |
jne @f |
inc edi |
@@: |
mov esi,edi |
ret |
endp |
|
;input: |
; edi - destination buffer |
; esi - source text string: '...\nl |
; mlen - maximum len destination buffer |
align 4 |
proc txt_load_line uses eax ebx ecx esi, mlen:dword |
mov byte[edi],0 |
mov al,13 |
cmp byte[esi],al |
je .end_f |
mov ecx,[mlen] |
mov ebx,edi |
mov edi,esi |
repne scasb ;found end of string |
mov ecx,edi |
sub ecx,esi |
dec ecx ;ecx = string len |
mov edi,ebx |
rep movsb ;copy caption string |
cmp byte[esi],13 |
je @f |
.cycle0: |
inc esi |
cmp byte[esi],13 |
jne .cycle0 |
@@: |
mov byte[edi],0 |
inc esi |
.end_f: |
ret |
endp |
|
;input: |
; itxt - input description text |
; msize - max size |
align 4 |
proc FileInit uses eax ebx ecx edi esi, itxt:dword, msize:dword |
stdcall [tl_node_poi_get_info], tree1,0 |
or eax,eax |
jz @f |
mov ebx,eax |
stdcall [tl_node_poi_get_data], tree1,ebx |
stdcall clear_object_in_list, eax |
@@: |
stdcall [tl_info_clear], tree1 ;®ç¨á⪠ᯨ᪠®¡ê¥ªâ®¢ |
mov dword[offs_last_timer],0 |
|
mov esi,[itxt] |
mov ebx,esi |
add ebx,[msize] |
stdcall ObjectInit,ObjData,ebx |
stdcall [tl_cur_beg], tree1 |
ret |
endp |
|
;input: |
; esi - input description text |
; pobj - pointer to object struct |
; etxt - pointer to end of input text |
align 4 |
proc ObjectInit uses eax ebx ecx edi, pobj:dword, etxt:dword |
mov ebx,[pobj] |
mov [ebx+Object.OType],'Obj' |
mov edi,ebx |
add edi,Object.Caption |
mov dword[edi],'CNC' |
|
stdcall get_max_lines |
test eax,eax |
jz .err_init |
mov [ebx+Object.FigCount],eax |
mov ecx,eax |
|
shl eax,2 |
stdcall mem.Alloc,eax |
mov [ebx+Object.FigData],eax |
push ecx |
mov edi,eax |
xor eax,eax |
rep stosd ;clear memory |
pop ecx |
|
stdcall add_object_in_list,0,0,ebx,0 |
;eax -> pointer to object node |
mov edi,[ebx+Object.FigData] |
align 4 |
.cycle0: |
stdcall FigureInit,FigData,edi |
cmp esi,[etxt] |
jge .cycle0end |
add edi,4 |
loop .cycle0 |
.cycle0end: |
inc dword[ebx+Object.FigCount] ;??? |
or ecx,ecx |
jz @f |
;㬥ìè ¥¬ ®¡ê¥¬ ¯ ¬ï⨠¢ë¤¥«¥ë© ¤«ï ª®¬ ¤ |
sub [ebx+Object.FigCount],ecx |
mov eax,[ebx+Object.FigCount] |
shl eax,2 |
stdcall mem.ReAlloc,[ebx+Object.FigData],eax |
mov [ebx+Object.FigData],eax |
@@: |
|
stdcall ObjCalculateScale,ebx |
|
jmp .end_f |
.err_init: |
notify_window_run txt_err_1 |
.end_f: |
ret |
endp |
|
align 4 |
proc ObjCalculateScale uses eax ebx ecx edi, pobj:dword |
mov ebx,[pobj] |
|
;*** Calculate scale for object *** |
finit |
|
;found min coord X |
mov ecx,[ebx+Object.FigCount] |
jecxz .cycle2end |
mov edi,[ebx+Object.FigData] |
push edi esi ;copy first min X |
@@: |
mov eax,[edi] |
dec ecx |
jecxz .cycle2end |
add edi,4 |
or eax,eax |
jz @b |
cmp [eax+Figure.PoiCount],0 |
je @b |
lea esi,[eax+Figure.MinX] |
lea edi,[ebx+Object.MinX] |
movsd |
movsd |
pop esi edi |
align 4 |
.cycle2: |
mov eax,[edi] |
or eax,eax |
jz @f |
cmp [eax+Figure.PoiCount],0 |
je @f |
fld qword[eax+Figure.MinX] |
fcomp qword[ebx+Object.MinX] |
fstsw ax |
sahf |
ja @f |
push edi esi |
mov eax,[edi] |
lea esi,[eax+Figure.MinX] |
lea edi,[ebx+Object.MinX] |
movsd |
movsd |
pop esi edi |
@@: |
add edi,4 |
loop .cycle2 |
.cycle2end: |
|
;found min coord Y |
mov ecx,[ebx+Object.FigCount] |
jecxz .cycle3end |
mov edi,[ebx+Object.FigData] |
push edi esi ;copy first min Y |
@@: |
mov eax,[edi] |
dec ecx |
jecxz .cycle3end |
add edi,4 |
or eax,eax |
jz @b |
cmp [eax+Figure.PoiCount],0 |
je @b |
lea esi,[eax+Figure.MinY] |
lea edi,[ebx+Object.MinY] |
movsd |
movsd |
pop esi edi |
align 4 |
.cycle3: |
mov eax,[edi] |
or eax,eax |
jz @f |
cmp [eax+Figure.PoiCount],0 |
je @f |
fld qword[eax+Figure.MinY] |
fcomp qword[ebx+Object.MinY] |
fstsw ax |
sahf |
ja @f |
push edi esi |
mov eax,[edi] |
lea esi,[eax+Figure.MinY] |
lea edi,[ebx+Object.MinY] |
movsd |
movsd |
pop esi edi |
@@: |
add edi,4 |
loop .cycle3 |
.cycle3end: |
|
;found max coord X |
mov ecx,[ebx+Object.FigCount] |
jecxz .cycle4end |
mov edi,[ebx+Object.FigData] |
;copy first min X |
mov eax,[edi] |
fld qword[eax+Figure.MinX] |
fadd qword[eax+Figure.SizeX] |
fstp qword[ebx+Object.SizeX] |
dec ecx |
jecxz .cycle4end |
align 4 |
.cycle4: |
add edi,4 |
mov eax,[edi] |
or eax,eax |
jz @f |
cmp [eax+Figure.PoiCount],0 |
je @f |
fld qword[eax+Figure.MinX] |
fadd qword[eax+Figure.SizeX] |
fcomp qword[ebx+Object.SizeX] |
fstsw ax |
sahf |
jbe @f |
mov eax,[edi] |
fld qword[eax+Figure.MinX] |
fadd qword[eax+Figure.SizeX] |
fstp qword[ebx+Object.SizeX] |
@@: |
loop .cycle4 |
.cycle4end: |
|
;found max coord Y |
mov ecx,[ebx+Object.FigCount] |
jecxz .cycle5end |
mov edi,[ebx+Object.FigData] |
;copy first min Y |
mov eax,[edi] |
fld qword[eax+Figure.MinY] |
fadd qword[eax+Figure.SizeY] |
fstp qword[ebx+Object.SizeY] |
dec ecx |
jecxz .cycle5end |
align 4 |
.cycle5: |
add edi,4 |
mov eax,[edi] |
or eax,eax |
jz @f |
cmp [eax+Figure.PoiCount],0 |
je @f |
fld qword[eax+Figure.MinY] |
fadd qword[eax+Figure.SizeY] |
fcomp qword[ebx+Object.SizeY] |
fstsw ax |
sahf |
jbe @f |
mov eax,[edi] |
fld qword[eax+Figure.MinY] |
fadd qword[eax+Figure.SizeY] |
fstp qword[ebx+Object.SizeY] |
@@: |
loop .cycle5 |
.cycle5end: |
|
;found size X |
fld qword[ebx+Object.SizeX] |
fsub qword[ebx+Object.MinX] |
fstp qword[ebx+Object.SizeX] |
;found size Y |
fld qword[ebx+Object.SizeY] |
fsub qword[ebx+Object.MinY] |
fstp qword[ebx+Object.SizeY] |
|
;*** Calculate scale *** |
fld1 |
fstp qword[ebx+Object.WScale] ;set default scale |
|
fld qword[ebx+Object.SizeX] |
ftst |
fstsw ax |
sahf |
jne .els_0 ;if (SizeX == 0.0) |
ffree st0 |
fincstp |
jmp .els_1 |
.els_0: ;else if (SizeX != 0.0) |
fild dword[buf_0.w] |
fisub dword[graf_margin_left] |
fisub dword[graf_margin_right] |
fxch st1 |
fdivp |
fstp qword[ebx+Object.WScale] |
.els_1: |
|
fld qword[ebx+Object.SizeY] |
ftst |
fstsw ax |
sahf |
jne .els_2 ;if (SizeY == 0.0) |
ffree st0 |
fincstp |
jmp .els_3 |
.els_2: ;else if (SizeY != 0.0) |
fild dword[buf_0.h] |
fisub dword[graf_margin_top] |
fisub dword[graf_margin_bot] |
fxch st1 |
fdivp |
fcom qword[ebx+Object.WScale] |
fstsw ax |
sahf |
jbe @f |
ffree st0 |
fincstp |
jmp .els_3 |
@@: |
fstp qword[ebx+Object.WScale] |
.els_3: |
|
fld1 |
fstp qword[ebx+Figure.MScale] |
mov dword[ebx+Figure.MCentrX],0 |
mov dword[ebx+Figure.MCentrY],0 |
ret |
endp |
|
;input: |
; esi - input description text |
; pmem - pointer to memory for struct |
; pfig - pointer to figure struct |
;output: |
; esi - output description text |
align 4 |
proc FigureInit uses eax ebx ecx edx edi, pmem:dword, pfig:dword |
mov ebx,[pmem] |
mov [ebx+Figure.OType],'Fig' |
mov edi,ebx |
add edi,Figure.Caption |
stdcall txt_load_line,32 |
|
xor eax,eax |
mov [ebx+Figure.PoiCount],eax |
mov [ebx+Figure.PoiData],eax |
cmp byte[esi],'X' |
jne .end0 |
stdcall get_max_points |
mov [ebx+Figure.PoiCount],eax |
or eax,eax |
jz .end0 |
mov ecx,eax |
imul eax,sizeof.Point |
stdcall mem.Alloc,eax |
mov [ebx+Figure.PoiData],eax |
or eax,eax |
jz .err_init |
mov edi,eax |
align 4 |
.cycle0: |
stdcall PointInit,edi |
or eax,eax |
jz .cycle0end |
add edi,sizeof.Point |
loop .cycle0 |
.cycle0end: |
or ecx,ecx |
jz .end1 |
;㬥ìè ¥¬ ®¡ê¥¬ ¯ ¬ï⨠¢ë¤¥«¥ë© ¤«ï â®ç¥ª |
sub [ebx+Figure.PoiCount],ecx |
mov eax,[ebx+Figure.PoiCount] |
imul eax,sizeof.Point |
stdcall mem.ReAlloc,[ebx+Figure.PoiData],eax |
mov [ebx+Figure.PoiData],eax |
jmp .end1 |
.err_init: |
notify_window_run txt_err_2 |
.end0: |
;command |
stdcall txt_next_line, 80 |
cmp byte[esi],13 |
jne @f |
;if null line |
inc esi |
cmp byte[esi],10 |
jne .end2 |
inc esi |
.end2: |
mov dword[edi],(10 shl 8)+13 ;new line |
@@: |
stdcall add_object_in_list,1,1,ebx,[pfig] |
jmp .end_f |
.end1: |
;coords |
stdcall add_object_in_list,2,1,ebx,[pfig] |
or eax,eax |
jz .end_f |
stdcall FigCalculateSizes,eax,1 |
.end_f: |
ret |
endp |
|
;input: |
; esi - pointer to file |
;output: |
; eax - max lines in file |
align 4 |
proc get_max_lines uses esi |
xor eax,eax |
.cycle0: |
cmp byte[esi],13 |
jne @f |
inc eax |
@@: |
inc esi |
cmp byte[esi],0 |
jne .cycle0 |
ret |
endp |
|
;input: |
; esi - pointer to file |
;output: |
; eax - max point coords in file |
align 4 |
proc get_max_points uses esi |
xor eax,eax |
.cycle0: |
cmp word[esi],' Y' |
jne @f |
inc eax |
@@: |
inc esi |
cmp byte[esi+1],0 |
jne .cycle0 |
ret |
endp |
|
;input: |
; opt_calc - ¥á«¨ 0 - ¯¥à¥áç¨â âì ¬ áèâ ¡ 䨣ãàë, |
; 1 - ¯¥à¥áç¨â âì à §¬¥àë ¨ ¬ áèâ ¡ 䨣ãàë |
align 4 |
proc FigCalculateSizes uses eax ebx ecx edi esi, pfig:dword, opt_calc:dword |
mov ebx,[pfig] |
or ebx,ebx |
jz .end_f |
|
finit |
bt dword[opt_calc],0 |
jnc .calc_scale |
|
;*** Calculate sizes *** |
mov esi,[ebx+Figure.PoiData] |
or esi,esi |
jz .end_f |
|
lea esi,[esi+Point.CoordX] |
lea edi,[ebx+Figure.MinX] |
movsd |
movsd ;Figure.MinX = Point[0].CoordX |
sub esi,8 |
lea edi,[ebx+Figure.SizeX] |
movsd |
movsd ;Figure.SizeX = Point[0].CoordX |
mov esi,[ebx+Figure.PoiData] |
lea esi,[esi+Point.CoordY] |
lea edi,[ebx+Figure.MinY] |
movsd |
movsd ;Figure.MinY = Point[0].CoordY |
sub esi,8 |
lea edi,[ebx+Figure.SizeY] |
movsd |
movsd ;Figure.SizeY = Point[0].CoordY |
|
;found min coord X |
mov ecx,[ebx+Figure.PoiCount] |
jecxz .cycle2end |
mov edi,[ebx+Figure.PoiData] |
align 4 |
.cycle2: |
fld qword[edi+Point.CoordX] |
fcomp qword[ebx+Figure.MinX] |
fstsw ax |
sahf |
ja @f |
push edi esi |
lea esi,[edi+Point.CoordX] |
lea edi,[ebx+Figure.MinX] |
movsd |
movsd |
pop esi edi |
@@: |
add edi,sizeof.Point |
loop .cycle2 |
.cycle2end: |
|
;found min coord Y |
mov ecx,[ebx+Figure.PoiCount] |
jecxz .cycle3end |
mov edi,[ebx+Figure.PoiData] |
align 4 |
.cycle3: |
fld qword[edi+Point.CoordY] |
fcomp qword[ebx+Figure.MinY] |
fstsw ax |
sahf |
ja @f |
push edi esi |
lea esi,[edi+Point.CoordY] |
lea edi,[ebx+Figure.MinY] |
movsd |
movsd |
pop esi edi |
@@: |
add edi,sizeof.Point |
loop .cycle3 |
.cycle3end: |
|
;found max coord X |
mov ecx,[ebx+Figure.PoiCount] |
jecxz .cycle4end |
mov edi,[ebx+Figure.PoiData] |
align 4 |
.cycle4: |
fld qword[edi+Point.CoordX] |
fcomp qword[ebx+Figure.SizeX] |
fstsw ax |
sahf |
jbe @f |
push edi esi |
lea esi,[edi+Point.CoordX] |
lea edi,[ebx+Figure.SizeX] |
movsd |
movsd |
pop esi edi |
@@: |
add edi,sizeof.Point |
loop .cycle4 |
.cycle4end: |
|
;found max coord Y |
mov ecx,[ebx+Figure.PoiCount] |
jecxz .cycle5end |
mov edi,[ebx+Figure.PoiData] |
align 4 |
.cycle5: |
fld qword[edi+Point.CoordY] |
fcomp qword[ebx+Figure.SizeY] |
fstsw ax |
sahf |
jbe @f |
push edi esi |
lea esi,[edi+Point.CoordY] |
lea edi,[ebx+Figure.SizeY] |
movsd |
movsd |
pop esi edi |
@@: |
add edi,sizeof.Point |
loop .cycle5 |
.cycle5end: |
|
;found size X |
fld qword[ebx+Figure.SizeX] |
fsub qword[ebx+Figure.MinX] |
fstp qword[ebx+Figure.SizeX] |
;found size Y |
fld qword[ebx+Figure.SizeY] |
fsub qword[ebx+Figure.MinY] |
fstp qword[ebx+Figure.SizeY] |
|
;*** Calculate scale *** |
align 4 |
.calc_scale: |
mov dword[ebx+Figure.MCentrX],0 |
mov dword[ebx+Figure.MCentrY],0 |
fld1 |
fst qword[ebx+Figure.MScale] ;??? |
fstp qword[ebx+Figure.WScale] ;set default scale |
|
fld qword[ebx+Figure.SizeX] |
ftst |
fstsw ax |
sahf |
jne .els_0 ;if (SizeX == 0.0) |
ffree st0 |
fincstp |
jmp .els_1 |
.els_0: ;else if (SizeX != 0.0) |
fild dword[buf_0.w] |
fisub dword[graf_margin_left] |
fisub dword[graf_margin_right] |
fxch st1 |
fdivp |
fstp qword[ebx+Figure.WScale] |
.els_1: |
|
fld qword[ebx+Figure.SizeY] |
ftst |
fstsw ax |
sahf |
jne .els_2 ;if (SizeY == 0.0) |
ffree st0 |
fincstp |
jmp .els_3 |
.els_2: ;else if (SizeY != 0.0) |
fild dword[buf_0.h] |
fisub dword[graf_margin_top] |
fisub dword[graf_margin_bot] |
fxch st1 |
fdivp |
fcom qword[ebx+Figure.WScale] |
fstsw ax |
sahf |
jbe @f |
ffree st0 |
fincstp |
jmp .els_3 |
@@: |
fstp qword[ebx+Figure.WScale] |
.els_3: |
|
.end_f: |
ret |
endp |
|
;input: |
; esi - input description text |
; ppoi - pointer to point struct |
;output: |
; eax - 0 (if error init) or 1 |
; esi - output description text |
align 4 |
proc PointInit uses ebx ecx edi, ppoi:dword |
mov ecx,64 ;§ é¨â ®â § 横«¨¢ ¨ï |
@@: |
lodsb |
cmp al,' ' |
jne @f |
loop @b |
@@: |
dec esi |
cmp byte[esi],'X' |
jne .err_init |
inc esi |
stdcall conv_str_to_int, esi |
mov ebx,[ppoi] |
|
;Data_String <- esi |
push esi |
mov ecx,32 |
mov edi,esi |
@@: |
lodsb |
or al,al |
jz @f |
cmp al,' ' |
je @f |
cmp al,13 |
je @f |
loop @b |
@@: |
mov esi,edi |
sub ecx,32 |
neg ecx |
mov edi,Data_String |
rep movsb |
mov byte[edi],0 |
pop esi |
stdcall String_to_DoubleFloat |
;Data_Double -> Point.CoordX |
push esi |
mov esi,Data_Double |
lea edi,[ebx+Point.CoordX] |
movsd |
movsd |
pop esi |
|
push edi |
mov al,'Y' |
mov ecx,80 |
mov edi,esi |
repne scasb |
mov esi,edi |
pop edi |
;Data_String <- esi |
push esi |
mov ecx,32 |
mov edi,esi |
@@: |
lodsb |
or al,al |
jz @f |
cmp al,' ' |
je @f |
cmp al,13 |
je @f |
loop @b |
@@: |
mov esi,edi |
sub ecx,32 |
neg ecx |
mov edi,Data_String |
rep movsb |
mov byte[edi],0 |
pop esi |
stdcall String_to_DoubleFloat |
;Data_Double -> Point.CoordY |
push esi |
mov esi,Data_Double |
lea edi,[ebx+Point.CoordY] |
movsd |
movsd |
pop esi |
|
stdcall txt_next_line, 80 |
jmp @f |
.err_init: |
xor eax,eax |
jmp .end_f |
@@: |
xor eax,eax |
inc eax |
.end_f: |
ret |
endp |
|
;input: |
; icon - ®¬¥à ¨ª®ª¨ |
; level - ã஢¥ì ¢«®¦¥®á⨠㧫 |
; buffer - ¤®¡ ¢«ï¥¬ë¥ ¤ ë¥ |
; pfig - 㪠§ â¥«ì ¤®¡ ¢«¥ãî 䨣ãàã (¤«ï ª®â஫ï á® áâ®à®ë த¨â¥«ì᪮£® ®¡ê¥ªâ ) |
;output: |
; eax - object data pointer |
align 4 |
proc add_object_in_list uses ebx, icon:dword,level:dword,buffer:dword, pfig:dword |
mov ax,word[icon] |
shl eax,16 |
mov ax,word[level] |
|
stdcall [tl_node_add], tree1, eax, [buffer] |
stdcall [tl_node_get_data],tree1 |
mov ebx,[pfig] |
or ebx,ebx |
jz @f |
mov [ebx],eax |
@@: |
stdcall [tl_cur_next], tree1 |
ret |
endp |
|
align 4 |
proc clear_object_in_list uses eax, buffer:dword |
mov eax,[buffer] |
cmp dword[eax+Object.FigCount],0 ;or Figure.PoiCount |
je .end_f |
stdcall mem.Free,[eax+Object.FigData] ;or Figure.PoiData |
.end_f: |
ret |
endp |
|
;description: |
; äãªæ¨ï ¤«ï à¨á®¢ ¨ï ¢ë¡à ®£® ®¡ê¥ªâ |
align 4 |
proc draw_obj2d, pobj:dword |
locals |
CentrX dd ? |
CentrY dd ? |
endl |
pushad |
mov ebx,[pobj] |
stdcall [buf2d_clear], buf_0, [buf_0.color] |
mov ecx,[ebx+Object.FigCount] |
or ecx,ecx |
jz .end_f |
;;jecxz .end_f |
mov edi,[ebx+Object.FigData] |
finit |
fld qword[ebx+Object.SizeY] |
fmul qword[ebx+Object.WScale] |
fmul qword[ebx+Object.MScale] |
fchs |
fistp dword[CentrY] |
mov eax,[CentrY] |
sub eax,[graf_margin_top] |
sub eax,[graf_margin_bot] |
add eax,[buf_0.h] |
sar eax,1 |
add eax,[graf_margin_bot] ;_bot ¥ _top - ¢ á¢ï§¨ á ⥬ çâ® ª®®à¤. Y ¯¥à¥¢¥àãâ |
add eax,[ebx+Object.MCentrY] |
mov [CentrY],eax |
fld qword[ebx+Object.SizeX] |
fmul qword[ebx+Object.WScale] |
fmul qword[ebx+Object.MScale] |
fchs |
fistp dword[CentrX] |
mov edx,[CentrX] |
sub edx,[graf_margin_left] |
sub edx,[graf_margin_right] |
add edx,[buf_0.w] |
sar edx,1 |
add edx,[graf_margin_left] |
add edx,[ebx+Object.MCentrX] |
mov [CentrX],edx |
align 4 |
.cycle0: |
stdcall draw_fig2d_litl, buf_0,ebx,[edi],0,edx,eax |
add edi,4 |
loop .cycle0 |
stdcall [buf2d_flip_v], buf_0 |
|
bt dword[opt_draw],0 |
jnc .end_f |
; draw min & sizes |
mov word[NumberSymbolsAD],8 |
stdcall mem_copy, txt_buf,txt_size_x,20 |
fld qword[ebx+Object.SizeX] |
fstp qword[Data_Double] |
call DoubleFloat_to_String |
call String_crop_0 |
stdcall str_cat,txt_buf,Data_String |
stdcall str_cat,txt_buf,txt_n |
stdcall str_cat,txt_buf,txt_size_y |
fld qword[ebx+Object.SizeY] |
fstp qword[Data_Double] |
call DoubleFloat_to_String |
call String_crop_0 |
stdcall str_cat,txt_buf,Data_String |
stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,23,0 |
|
fld qword[ebx+Object.MinX] |
fstp qword[Data_Double] |
stdcall mem_copy, txt_buf,txt_min_x,20 |
call DoubleFloat_to_String |
call String_crop_0 |
stdcall str_cat,txt_buf,Data_String |
stdcall str_cat,txt_buf,txt_n |
stdcall str_cat,txt_buf,txt_min_y |
fld qword[ebx+Object.MinY] |
fstp qword[Data_Double] |
call DoubleFloat_to_String |
call String_crop_0 |
stdcall str_cat,txt_buf,Data_String |
stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,3,0 |
.end_f: |
popad |
ret |
endp |
|
align 4 |
proc draw_obj2d_png uses eax ebx ecx edi esi, pobj:dword |
mov ebx,[pobj] |
mov ecx,[ebx+Object.FigCount] |
cmp dword[ebx+Object.FigCount],0 |
or ecx,ecx |
jz .end_f |
;;jecxz .end_f |
mov edi,[ebx+Object.FigData] |
stdcall [buf2d_delete], buf_png |
finit |
fld qword[ebx+Object.SizeY] |
fmul qword[Scale1mm] |
fiadd dword[graf_margin_top] |
fiadd dword[graf_margin_bot] |
fistp dword[buf_png.h] |
fld qword[ebx+Object.SizeX] |
fmul qword[Scale1mm] |
fiadd dword[graf_margin_left] |
fiadd dword[graf_margin_right] |
fistp dword[buf_png.w] |
stdcall [buf2d_create], buf_png |
align 4 |
.cycle0: |
stdcall draw_fig2d_litl, buf_png,ebx,[edi],Scale1mm,[graf_margin_left],[graf_margin_bot] ;_bot ¥ _top - ¢ á¢ï§¨ á ⥬ çâ® ª®®à¤. Y ¯¥à¥¢¥àãâ |
add edi,4 |
loop .cycle0 |
stdcall [buf2d_flip_v], buf_png |
.end_f: |
ret |
endp |
|
;input: |
; pbuf - pointer to buffer 2d |
;description: |
; äãªæ¨ï ¤«ï à¨á®¢ ¨ï ®¡ê¥ªâ ¯® ç áâï¬ |
align 4 |
proc draw_fig2d_litl, pbuf:dword, pobj:dword, pfig:dword, Scale:dword, CentrX:dword, CentrY:dword |
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 |
pushad |
mov ebx,[pfig] |
test ebx,ebx |
jz .end_f |
mov ecx,[ebx+Figure.PoiCount] |
;;jecxz .end_f |
test ecx,ecx |
jz .end_f |
mov edi,[ebx+Figure.PoiData] |
mov edx,[pobj] |
|
fld1 |
mov eax,[Scale] |
or eax,eax |
jnz @f |
lea eax,[edx+Object.MScale] |
fmul qword[eax] |
lea eax,[edx+Object.WScale] |
@@: |
fmul qword[eax] |
align 4 |
.cycle0: |
fld qword[edi+Point.CoordX] |
fsub qword[edx+Object.MinX] |
fmul st0,st1 |
fiadd dword[CentrX] |
fistp dword[ebp-8] |
fld qword[edi+Point.CoordY] |
fsub qword[edx+Object.MinY] |
fmul st0,st1 |
fiadd dword[CentrY] |
fistp dword[ebp-4] |
stdcall [buf2d_set_pixel], [pbuf], [GrafX],[GrafY], 0xff0000 |
cmp ecx,[ebx+Figure.PoiCount] |
je @f |
stdcall [buf2d_line_sm], [pbuf], [PervX],[PervY], [GrafX],[GrafY], 0x80 |
;sub esp,24 |
;call [buf2d_line] |
stdcall [buf2d_line], [pbuf], [PervX],[PervY], [GrafX],[GrafY], 0x80 |
@@: |
mov eax,[GrafX] |
mov [PervX],eax |
mov eax,[GrafY] |
mov [PervY],eax |
add edi,sizeof.Point |
;;loop .cycle0 |
dec ecx |
jnz .cycle0 |
ffree st0 |
fincstp |
|
.end_f: |
popad |
ret |
endp |
|
;description: |
; äãªæ¨ï ¤«ï à¨á®¢ ¨ï ¢ë¡à ®© 䨣ãàë |
align 4 |
proc draw_fig2d, pfig:dword |
locals |
n dd 0 |
col_lin dd 0 ;梥⠫¨¨© 䨣ãàë |
CentrX dd ? |
CentrY dd ? |
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 |
old_tl dd 0 ;old text coord X0 |
old_tt dd 0 ;old text coord Y0 |
old_tw dd 0 ;old text coord X1 |
old_th dd 0 ;old text coord Y1 |
new_tl dd 0 ;new text coord X0 |
;new_tt dd 0 ;new text coord Y0 |
new_tw dd 0 ;new text coord X1 |
;new_th dd 0 ;new text coord Y1 |
endl |
pushad |
stdcall [buf2d_clear], buf_0, [buf_0.color] |
mov ebx,[pfig] |
test ebx,ebx |
jz .end_f |
mov ecx,[ebx+Figure.PoiCount] |
;;jecxz .end_f |
test ecx,ecx |
jz .end_f |
mov edi,[ebx+Figure.PoiData] |
finit |
fld qword[ebx+Figure.SizeY] |
fmul qword[ebx+Figure.WScale] |
fmul qword[ebx+Figure.MScale] |
fchs |
fistp dword[CentrY] |
mov eax,[CentrY] |
sub eax,[graf_margin_top] |
sub eax,[graf_margin_bot] |
add eax,[buf_0.h] |
sar eax,1 |
add eax,[graf_margin_bot] |
add eax,[ebx+Figure.MCentrY] |
mov [CentrY],eax |
;CentrY = (-(Figure.SizeY * Figure.WScale) - graf_margin_top - graf_margin_bot + buf_0.h) / 2 + graf_margin_bot |
fld qword[ebx+Figure.SizeX] |
fmul qword[ebx+Figure.WScale] |
fmul qword[ebx+Figure.MScale] |
fchs |
fistp dword[CentrX] |
mov eax,[CentrX] |
sub eax,[graf_margin_left] |
sub eax,[graf_margin_right] |
add eax,[buf_0.w] |
sar eax,1 |
add eax,[graf_margin_left] |
add eax,[ebx+Figure.MCentrX] |
mov [CentrX],eax |
;CentrX = (-(Figure.SizeX * Figure.WScale) - graf_margin_left - graf_margin_right + buf_0.w) / 2 + graf_margin_left |
|
align 4 |
.cycle0: |
fld qword[edi+Point.CoordX] |
fsub qword[ebx+Figure.MinX] |
fmul qword[ebx+Figure.WScale] |
fmul qword[ebx+Figure.MScale] |
fiadd dword[CentrX] |
fistp dword[GrafX] |
;GrafX = (Point.CoordX - Figure.MinX) * Figure.WScale + CentrX |
fld qword[edi+Point.CoordY] |
fsub qword[ebx+Figure.MinY] |
fmul qword[ebx+Figure.WScale] |
fmul qword[ebx+Figure.MScale] |
fiadd dword[CentrY] |
fisub dword[buf_0.h] ;invert coord Y |
fchs |
fistp dword[GrafY] |
;GrafY = -((Point.CoordY - Figure.MinY) * Figure.WScale + CentrY - buf_0.h) |
|
stdcall [buf2d_set_pixel], buf_0, [GrafX],[GrafY], 0xff0000 |
mov dword[col_lin],0x80 |
bt dword[edi+Point.Prop],PROP_BIT_SELECT |
jnc @f |
stdcall [buf2d_circle], buf_0, [GrafX],[GrafY], 3, 0xff0000 |
@@: |
cmp ecx,[ebx+Figure.PoiCount] |
je @f |
stdcall [buf2d_line_sm], buf_0, [PervX],[PervY], [GrafX],[GrafY], [col_lin] |
stdcall [buf2d_line], buf_0, [PervX],[PervY], [GrafX],[GrafY], [col_lin] |
@@: |
mov eax,[GrafX] |
mov [PervX],eax |
mov edx,[GrafY] |
mov [PervY],edx |
add edi,sizeof.Point |
|
bt dword[opt_draw],0 |
jnc .end0 |
; draw number points |
;mov eax,[GrafX] |
;mov edx,[GrafY] |
add eax,2 |
add edx,2 |
push eax edi |
mov eax,[n] |
mov edi,txt_buf |
stdcall convert_int_to_str,20 |
pop edi eax |
|
inc dword[n] |
;calculate new text coords |
mov [new_tl],eax |
mov esi,eax |
stdcall str_len,txt_buf |
imul eax,[buf_1.w] |
add eax,esi |
mov [new_tw],eax |
;rect compare coords |
cmp [old_tl],eax |
jg .no_comp |
cmp [old_tw],esi |
jl .no_comp |
;calculate new text coord Y1 |
mov esi,edx |
add esi,[font_h] |
cmp [old_tt],esi |
jg .no_comp |
cmp [old_th],edx |
;jl .no_comp |
;jmp .end0 |
jge .end0 |
.no_comp: |
mov eax,[new_tl] |
mov [old_tl],eax |
mov eax,[new_tw] |
mov [old_tw],eax |
mov [old_tt],edx |
add edx,[font_h] |
mov [old_th],edx |
stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,[old_tl],[old_tt],0x000000 |
.end0: |
dec ecx |
jnz .cycle0 |
|
stdcall sel_points_get_count,[pfig] |
or eax,eax |
jz .no_point |
stdcall mem_copy, txt_buf,txt_poi_sel,txt_poi_sel.end-txt_poi_sel |
mov edi,txt_buf+txt_poi_sel.end-txt_poi_sel |
stdcall convert_int_to_str, 20 |
mov word[NumberSymbolsAD],8 |
cmp eax,1 |
jne @f |
;¥á«¨ ¢ë¡à ®¤ â®çª , â® ¯® ¥© ¢ë¢®¤ ¡®«¥¥ ¤¥â «ì®© ¨ä®à¬ 樨 |
stdcall sel_points_get_first,[pfig] |
stdcall str_cat,txt_buf,txt_ls |
fld qword[eax+Point.CoordX] |
fstp qword[Data_Double] |
call DoubleFloat_to_String |
call String_crop_0 |
stdcall str_cat,txt_buf,Data_String |
stdcall str_cat,txt_buf,txt_coma |
fld qword[eax+Point.CoordY] |
fstp qword[Data_Double] |
call DoubleFloat_to_String |
call String_crop_0 |
stdcall str_cat,txt_buf,Data_String |
stdcall str_cat,txt_buf,txt_rs |
jmp .end1 |
@@: |
cmp eax,2 |
jne .end1 |
;¥á«¨ ¢ë¡à ® 2 â®çª¨ |
stdcall sel_points_get_first,[pfig] |
fld qword[eax+Point.CoordX] |
fld qword[eax+Point.CoordY] |
stdcall sel_points_get_last,[pfig] |
fsub qword[eax+Point.CoordY] |
fmul st0,st0 |
fxch st1 |
fsub qword[eax+Point.CoordX] |
fmul st0,st0 |
faddp st1,st0 |
fsqrt |
fstp qword[Data_Double] |
call DoubleFloat_to_String |
call String_crop_0 |
stdcall str_cat,txt_buf,txt_len |
stdcall str_cat,txt_buf,Data_String |
.end1: |
stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,3,0 |
jmp .end_f ;¥ ¢ë¢®¤¨¬ ¨ä®à¬ æ¨î ® à §¬¥à å |
.no_point: |
|
bt dword[opt_draw],0 |
jnc .end_f |
; draw min & sizes |
mov word[NumberSymbolsAD],8 |
stdcall mem_copy, txt_buf,txt_size_x,20 |
fld qword[ebx+Figure.SizeX] |
fstp qword[Data_Double] |
call DoubleFloat_to_String |
call String_crop_0 |
stdcall str_cat,txt_buf,Data_String |
stdcall str_cat,txt_buf,txt_n |
stdcall str_cat,txt_buf,txt_size_y |
fld qword[ebx+Figure.SizeY] |
fstp qword[Data_Double] |
call DoubleFloat_to_String |
call String_crop_0 |
stdcall str_cat,txt_buf,Data_String |
stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,23,0 |
|
fld qword[ebx+Figure.MinX] |
fstp qword[Data_Double] |
stdcall mem_copy, txt_buf,txt_min_x,20 |
call DoubleFloat_to_String |
call String_crop_0 |
stdcall str_cat,txt_buf,Data_String |
stdcall str_cat,txt_buf,txt_n |
stdcall str_cat,txt_buf,txt_min_y |
fld qword[ebx+Figure.MinY] |
fstp qword[Data_Double] |
call DoubleFloat_to_String |
call String_crop_0 |
stdcall str_cat,txt_buf,Data_String |
stdcall [buf2d_draw_text], buf_0, buf_1,txt_buf,3,3,0 |
.end_f: |
popad |
ret |
endp |
|
;input: |
; pnode - 㪠§ â¥«ì ¤ ë¥ ã§« |
align 4 |
proc get_object_data, pnode:dword |
mov ecx,[pnode] |
cmp [ecx+Object.OType],'Obj' |
jne .end0 |
mov ecx,ObjData |
jmp .end_f |
.end0: |
xor ecx,ecx |
.end_f: |
ret |
endp |
|
;input: |
; pfig - pointer to figure |
;output: |
; eax - 㪠§ ⥫ì த¨â¥«ì᪨© ®¡ê¥ªâ ¨«¨ 0 ¥á«¨ ¥ ©¤¥® |
; ecx - ®¬¥à 䨣ãàë ¢ãâਠ®¡ê¥ªâ |
align 4 |
proc found_parent_obj uses ebx edx edi, pfig:dword |
mov eax,ObjData |
mov edx,[eax+Object.FigCount] |
or edx,edx |
jz .cycle1end |
mov edi,[eax+Object.FigData] |
xor ecx,ecx |
.cycle1: ;横« ¯® 䨣ãà ¬ |
mov ebx,[edi] |
cmp ebx,[pfig] |
je .end_f ;¥á«¨ ©¤¥® |
add edi,4 |
inc ecx |
dec edx |
jnz .cycle1 |
.cycle1end: |
xor eax,eax |
.end_f: |
ret |
endp |
|
;description: |
; áç¨â ¥â ª®««¨ç¥á⢮ ¢ë¤¥«¥ëå â®ç¥ª |
align 4 |
proc sel_points_get_count uses ebx ecx, pFig:dword |
xor eax,eax |
mov ebx,[pFig] |
mov ecx,[ebx+Figure.PoiCount] |
or ecx,ecx |
jz .no_point |
mov ebx,[ebx+Figure.PoiData] |
.cycle0: |
bt dword[ebx+Point.Prop],PROP_BIT_SELECT |
jnc @f |
inc eax |
@@: |
add ebx,sizeof.Point |
loop .cycle0 |
.no_point: |
ret |
endp |
|
;description: |
; ¡¥à¥â 㪠§ â¥«ì ¯¥à¢ãî ¢ë¤¥«¥ãî â®çªã |
;output: |
; eax - 㪠§ ⥫ì â®çªã ¨«¨ 0 ¥á«¨ ¥ ¢ë¤¥«¥® |
align 4 |
proc sel_points_get_first uses ecx, pFig:dword |
mov eax,[pFig] |
mov ecx,[eax+Figure.PoiCount] |
or ecx,ecx |
jz .no_point |
mov eax,[eax+Figure.PoiData] |
.cycle0: |
bt dword[eax+Point.Prop],PROP_BIT_SELECT |
jc .end_f |
add eax,sizeof.Point |
loop .cycle0 |
.no_point: |
xor eax,eax |
.end_f: |
ret |
endp |
|
;input: |
; pObj - 㪠§ â¥«ì ®¡ê¥ªâ |
; FigN - ®¬¥à ª®¬¬ ¤ë |
;description: |
; ¯¥à¥áç¥â 䨣ãà ¯®á«¥ ®¡®¢«¥¨ï ª®®à¤¨ â â®çª¨ |
align 4 |
proc figure_update_coords uses eax ecx edx, pObj:dword, FigN:dword |
mov eax,[pObj] |
mov ecx,[eax+Object.FigCount] |
mov eax,[eax+Object.FigData] |
mov edx,[FigN] |
cmp ecx,edx |
jle @f |
stdcall FigCalculateSizes,[eax+4*edx],1 |
stdcall ObjCalculateScale,[pObj] |
@@: |
ret |
endp |
|
;description: |
; ¡¥à¥â 㪠§ â¥«ì ¯®á«¥¤îî ¢ë¤¥«¥ãî â®çªã |
align 4 |
proc sel_points_get_last uses ebx ecx, pFig:dword |
mov ebx,[pFig] |
mov ecx,[ebx+Figure.PoiCount] |
or ecx,ecx |
jz .no_point |
mov eax,ecx |
dec eax |
imul eax,sizeof.Point |
add eax,[ebx+Figure.PoiData] |
.cycle0: |
bt dword[eax+Point.Prop],PROP_BIT_SELECT |
jc .end_f |
sub eax,sizeof.Point |
loop .cycle0 |
.no_point: |
xor eax,eax |
.end_f: |
ret |
endp |
|
;description: |
; ᨬ ¥â ¢ë¤¥«¥¨¥ á â®ç¥ª |
align 4 |
proc sel_points_clear uses ebx ecx, pFig:dword |
mov ebx,[pFig] |
mov ecx,[ebx+Figure.PoiCount] |
or ecx,ecx |
jz .no_point |
mov ebx,[ebx+Figure.PoiData] |
.cycle0: |
btr dword[ebx+Point.Prop],PROP_BIT_SELECT |
add ebx,sizeof.Point |
loop .cycle0 |
.no_point: |
ret |
endp |
|
;description: |
; ¨¢¥àâ¨àã¥â 㪠§ ë© ¡¨â ¢ ᢮©áâ¢ å ¢ë¤¥«¥ëå â®ç¥ª |
align 4 |
proc sel_points_invert_bit uses eax ebx ecx, pFig:dword, iBit:dword |
mov ecx,[iBit] |
xor eax,eax |
inc eax |
shl eax,cl |
mov ebx,[pFig] |
mov ecx,[ebx+Figure.PoiCount] |
or ecx,ecx |
jz .no_point |
mov ebx,[ebx+Figure.PoiData] |
.cycle0: |
bt dword[ebx+Point.Prop],PROP_BIT_SELECT |
jnc @f |
xor dword[ebx+Point.Prop],eax |
@@: |
add ebx,sizeof.Point |
loop .cycle0 |
.no_point: |
ret |
endp |
|
;input: |
; pPoi - 㪠§ â¥«ì ¤ ë¥ â®çª¨ |
align 4 |
proc point_move_up, pObj:dword,pFig:dword,idFig:dword,pPoi:dword |
pushad |
;¨§¬¥¥¨¥ ááë«®ª â®çª¨ |
mov eax,[pObj] |
mov ecx,[idFig] |
mov edx,[eax+Object.FigCount] |
or edx,edx |
jz .end_f |
mov edi,[eax+Object.FigData] |
|
;¬¥ï¥¬ â®çª¨ ¬¥áâ ¬¨ |
mov ecx,sizeof.Point |
mov esi,[pPoi] |
sub esi,ecx |
mov edi,PoiData |
rep movsb ;p(-1) > p_s |
mov ecx,sizeof.Point |
mov edi,[pPoi] |
sub edi,ecx |
rep movsb ;p(0) > p(-1) |
mov esi,PoiData |
mov ecx,sizeof.Point |
rep movsb ;p_s > p(0) |
.end_f: |
popad |
ret |
endp |
|
align 4 |
proc mouse_left_d uses eax ebx |
stdcall [tl_node_get_data],tree1 |
or eax,eax |
jz .end_f |
|
cmp [eax+Figure.OType],'Fig' |
je @f |
cmp [eax+Figure.OType],'Obj' |
je .end0 |
jmp .end_f |
.end0: |
mov eax,ObjData |
@@: |
call buf_get_mouse_coord |
cmp eax,-1 |
je .end_f |
mov [mouse_down_x],eax |
mov [mouse_down_y],ebx |
.end_f: |
ret |
endp |
|
align 4 |
proc mouse_left_u uses eax ebx ecx |
stdcall [tl_node_get_data],tree1 |
or eax,eax |
jz .end_f |
|
cmp [eax+Figure.OType],'Fig' |
je @f |
cmp [eax+Figure.OType],'Obj' |
je .end0 |
jmp .end_f |
.end0: |
mov eax,ObjData |
@@: |
mov ecx,eax |
|
call buf_get_mouse_coord |
cmp eax,-1 |
je .end_f |
sub eax,[mouse_down_x] |
sub ebx,[mouse_down_y] |
add [ecx+Figure.MCentrX],eax |
sub [ecx+Figure.MCentrY],ebx |
mov dword[offs_last_timer],0 |
.end_f: |
ret |
endp |
|
;output: |
; eax, ebx - ¯®àâïâáï |
align 4 |
proc mouse_right_d uses ecx edx edi |
locals |
BufX dd ? |
BufY dd ? |
CentrX dd ? |
CentrY dd ? |
GrafX dd ? ;active point coord X |
GrafY dd ? ;active point coord Y |
endl |
call buf_get_mouse_coord |
cmp eax,-1 |
je .end_f |
mov [BufX],eax |
mov [BufY],ebx |
|
;¯à®á¬ âਢ ¥¬ ¢ë¤¥«¥ë© ¡«®ª ¤ ëå |
stdcall [tl_node_get_data],tree1 |
or eax,eax |
jz .end_f |
|
cmp [eax+Figure.OType],'Fig' |
jne .end_fblo |
|
mov ecx,eax |
mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS ;¯à®¢¥àª Shift |
bt eax,0 |
jc @f |
bt eax,1 |
jc @f |
;¥á«¨ ¥ ¦ â Shift |
stdcall sel_points_clear,ecx |
@@: |
mov ebx,ecx |
mov ecx,[ebx+Figure.PoiCount] |
;;jecxz .end_f |
test ecx,ecx |
jz .end_f |
|
mov edi,[ebx+Figure.PoiData] |
finit |
fld qword[ebx+Figure.SizeY] |
fmul qword[ebx+Figure.WScale] |
fmul qword[ebx+Figure.MScale] |
fchs |
fistp dword[CentrY] |
mov eax,[CentrY] |
sub eax,[graf_margin_top] |
sub eax,[graf_margin_bot] |
add eax,[buf_0.h] |
sar eax,1 |
add eax,[graf_margin_bot] |
add eax,[ebx+Figure.MCentrY] |
mov [CentrY],eax |
fld qword[ebx+Figure.SizeX] |
fmul qword[ebx+Figure.WScale] |
fmul qword[ebx+Figure.MScale] |
fchs |
fistp dword[CentrX] |
mov eax,[CentrX] |
sub eax,[graf_margin_left] |
sub eax,[graf_margin_right] |
add eax,[buf_0.w] |
sar eax,1 |
add eax,[graf_margin_left] |
add eax,[ebx+Figure.MCentrX] |
mov [CentrX],eax |
|
align 4 |
.cycle0: |
fld qword[edi+Point.CoordX] |
fsub qword[ebx+Figure.MinX] |
fmul qword[ebx+Figure.WScale] |
fmul qword[ebx+Figure.MScale] |
fiadd dword[CentrX] |
fistp dword[GrafX] |
fld qword[edi+Point.CoordY] |
fsub qword[ebx+Figure.MinY] |
fmul qword[ebx+Figure.WScale] |
fmul qword[ebx+Figure.MScale] |
fiadd dword[CentrY] |
fisub dword[buf_0.h] ;invert coord Y |
fchs |
fistp dword[GrafY] |
|
mov eax,[GrafX] |
sub eax,[BufX] |
bt eax,31 |
jnc @f |
neg eax |
@@: |
mov edx,[GrafY] |
sub edx,[BufY] |
bt edx,31 |
jnc @f |
neg edx |
@@: |
add eax,edx |
cmp eax,7 ;¯à¨¡«¨§¨â¥«ì®¥ à ááâ®ï¨¥ ¤® â®çª¨ |
jg @f |
;¢ë¤¥«ï¥¬ ¨«¨ ᨬ ¥¬ ¢ë¤¥«¥¨¥ á â®ç¥ª |
xor dword[edi+Point.Prop],(1 shl PROP_BIT_SELECT) |
@@: |
|
add edi,sizeof.Point |
dec ecx |
jnz .cycle0 |
|
mov dword[offs_last_timer],0 |
;jmp .end_f |
.end_fblo: |
|
.end_f: |
ret |
endp |