Subversion Repositories Kolibri OS

Rev

Rev 8442 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7427 theonlymir 1
;CNC CONTROL
8442 IgorA 2
;Igor Afanasyev (aka IgorA) and Sergey Efremenkov (aka theonlymirage), 2020
7427 theonlymir 3
 
4
;02.10.18 - Only prototype UI
7440 theonlymir 5
;08.10.18 - Add ComboBox (Button + KMenu), small text
7427 theonlymir 6
 
7
format binary as ""
8
use32
7662 IgorA 9
	org 0
10
	db 'MENUET01'
11
	dd 1,start,i_end,mem,stacktop,file_name,sys_path
7427 theonlymir 12
 
13
include '../../macros.inc'
14
include '../../proc32.inc'
15
include '../../KOSfuncs.inc'
16
include '../../load_img.inc'
8442 IgorA 17
include '../../load_lib.mac'
7427 theonlymir 18
include '../../develop/libraries/libs-dev/libimg/libimg.inc'
19
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
20
include 'lang.inc'
21
include 'cnc_control.inc'
22
include '../../develop/info3ds/info_fun_float.inc'
23
 
7440 theonlymir 24
KMENUITEM_NORMAL equ 0
25
KMENUITEM_SUBMENU equ 1
26
KMENUITEM_SEPARATOR equ 2
27
 
8442 IgorA 28
@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
29
caption db 'CNC Control 18.12.20',0 ;подпись окна
7427 theonlymir 30
 
31
run_file_70 FileInfoBlock
32
 
33
offs_last_timer dd 0 ;последний сдвиг показаный в функции таймера
34
 
35
IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
36
image_data_toolbar dd 0 ;указатель на временную память. для нужен преобразования изображения
37
icon_tl_sys dd 0 ;указатель на память для хранения системных иконок
38
icon_toolbar dd 0 ;указатель на память для хранения иконок объектов
39
 
40
align 4
41
start:
7662 IgorA 42
	;--- copy cmd line ---
43
	mov esi,file_name
44
	mov edi,openfile_path
45
@@:
46
	lodsd
47
	or eax,eax
48
	jz @f ;выход, если 0
49
	stosd
50
	jmp @b
51
@@:
52
	stosd
7427 theonlymir 53
 
7662 IgorA 54
	load_libraries l_libs_start,l_libs_end
55
	;проверка на сколько удачно загузилась библиотека
56
	mov	ebp,lib_0
57
	cmp	dword [ebp+ll_struc_size-4],0
58
	jz	@f
59
		mcall SF_TERMINATE_PROCESS
60
	@@:
61
	mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
62
	mcall SF_SET_EVENTS_MASK,0xC0000027
63
	stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
7427 theonlymir 64
 
7662 IgorA 65
	stdcall [buf2d_create], buf_0 ;создание буфера
7427 theonlymir 66
 
7662 IgorA 67
	;шрифт делаем до создания панели (для экономии указателя image_data_toolbar)
68
	include_image_file '..\..\fs\kfar\trunk\font6x9.bmp', image_data_toolbar, buf_1.w,buf_1.h
69
	stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер
70
	stdcall mem.Free,[image_data_toolbar] ;освобождаем память
71
	stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит
72
	stdcall [buf2d_convert_text_matrix], buf_1
73
	mov eax,[buf_1.h]
74
	shr eax,8
75
	mov [font_h],eax
7427 theonlymir 76
 
7662 IgorA 77
	include_image_file 'toolbar.png', image_data_toolbar
7427 theonlymir 78
 
7662 IgorA 79
	;*** установка времени для таймера
80
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
81
	mov [last_time],eax
82
 
7427 theonlymir 83
        ;call but_new_file
84
        option_boxes_set_sys_color sc,opt_grlist1
85
 
7440 theonlymir 86
        ;progress bar
7427 theonlymir 87
        mov    [pb.left],           dword  50
88
        mov    [pb.top],            dword  30
89
        mov    [pb.width],          dword  350
90
        mov    [pb.height],         dword  17
91
        mov    [pb.max],            dword  100;599
92
        mov    [pb.min],            dword  0 ;-397
7441 IgorA 93
        mov    [pb.value],          dword  0 ;-397
7427 theonlymir 94
        mov    [pb.back_color],     dword 00C8D0D4h
95
        mov    [pb.progress_color], dword 8072B7EBh
96
        mov    [pb.frame_color],    dword 00406175h
97
 
7440 theonlymir 98
        ;port menu
99
        stdcall [kmenu_init], sc    ;kmenu initialisation
100
        ;stdcall [ksubmenu_new]
101
        ;mov [main_menu], eax
102
 
103
        stdcall [ksubmenu_new]
104
        mov [port_menu], eax
105
        stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_COMport, 110
106
        stdcall [ksubmenu_add], [port_menu], eax
107
        stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_USBport, 111
108
        stdcall [ksubmenu_add], [port_menu], eax
109
        ;stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
110
        ;stdcall [ksubmenu_add], [port_menu], eax
111
        ;stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_OTHERport, 112
112
        ;stdcall [ksubmenu_add], [port_menu], eax
113
        stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_PortMenu, [port_menu]
114
        ;stdcall [ksubmenu_add], [main_menu], eax
115
 
7662 IgorA 116
	;open file from cmd line
117
	cmp dword[openfile_path],0
118
	je @f
119
		call but_open_file.no_dlg
120
	@@:
121
 
7427 theonlymir 122
align 4
123
red_win:
7662 IgorA 124
	call draw_window
7427 theonlymir 125
 
126
align 4
127
still:
7662 IgorA 128
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
129
	mov ebx,[last_time]
130
	add ebx,10 ;задержка
131
	cmp ebx,eax
132
	jge @f
133
		mov ebx,eax
134
	@@:
135
	sub ebx,eax
136
	mcall SF_WAIT_EVENT_TIMEOUT
137
	cmp eax,0
138
	jne @f
139
		call timer_funct
140
		jmp still
141
	@@:
7427 theonlymir 142
 
7662 IgorA 143
	cmp al,1
144
	jz red_win
145
	cmp al,2
146
	jz key
147
	cmp al,3
148
	jz button
149
	cmp al,6
150
	jne @f
151
		mcall SF_THREAD_INFO,procinfo,-1
152
		cmp ax,word[procinfo.window_stack_position]
153
		jne @f ;окно не активно
154
		call mouse
155
	@@:
156
	jmp still
7427 theonlymir 157
 
158
align 4
159
mouse:
160
        stdcall [option_box_mouse], opt_grlist1
161
        stdcall [edit_box_mouse], editFileName
162
        stdcall [edit_box_mouse], editCommand
7440 theonlymir 163
        stdcall [kmainmenu_dispatch_cursorevent], [port_menu] ;[main_menu]
7427 theonlymir 164
 
7662 IgorA 165
	push eax ebx ecx
166
	mcall SF_MOUSE_GET,SSF_BUTTON_EXT
167
	bt eax,8
168
	jnc @f
169
		;mouse l. but. press
170
		call mouse_left_d
171
		jmp .end_l
172
	@@:
173
	bt eax,16
174
	jnc .end_l
175
		;mouse l. but. up
176
		call mouse_left_u
177
		;jmp .end_l
178
	.end_l:
7427 theonlymir 179
 
7441 IgorA 180
 
7662 IgorA 181
	call buf_get_mouse_coord
182
	cmp eax,-1
183
	je .end0
184
		shl eax,1
185
		sub eax,[buf_0.w]
186
		sar eax,1
187
		mov [mouse_prop_x],eax
188
		mov ecx,ObjData
189
		shl ebx,1
190
		sub ebx,[buf_0.h]
191
		sar ebx,1
192
		mov [mouse_prop_y],ebx
7427 theonlymir 193
 
7662 IgorA 194
		mcall SF_MOUSE_GET,SSF_SCROLL_DATA
195
		test ax,ax
196
		jz .end0
197
		finit
198
		fld qword[zoom_plus]
199
		fld1
200
		fsubp
201
		fld st0 ;for Y coord
7427 theonlymir 202
 
7662 IgorA 203
		;for X coord
204
		fild dword[mouse_prop_x]
205
		fmulp st1,st0
7427 theonlymir 206
 
7662 IgorA 207
		mov ebx,eax
208
		test ax,0x8000
209
		jnz .decr
210
			;увеличение масштаба
211
			fchs
212
			fild dword[ecx+Figure.MCentrX] ;add old value
213
			fmul qword[zoom_plus]
214
			faddp
7427 theonlymir 215
 
7662 IgorA 216
			fld qword[ecx+Figure.MScale]
217
			fmul qword[zoom_plus]
218
			;if (Figure.MScale>16.0)
219
			;...
220
			jmp @f
221
		.decr:
222
			;уменьшение масштаба
223
			fild dword[ecx+Figure.MCentrX] ;add old value
224
			fdiv qword[zoom_plus]
225
			faddp
7427 theonlymir 226
 
7662 IgorA 227
			fld qword[ecx+Figure.MScale]
228
			fdiv qword[zoom_plus]
229
			fld1
230
			fcomp
231
			fstsw ax
232
			sahf
233
			jbe @f
234
				;if (Figure.MScale<1.0)
235
				ffree st0
236
				fincstp
237
				ffree st0
238
				fincstp
239
				fldz ;default Figure.MCentrX
240
				fld1 ;default Figure.MScale
241
				mov dword[ecx+Figure.MCentrY],0
242
		@@:
243
		fstp qword[ecx+Figure.MScale]
244
		fistp dword[ecx+Figure.MCentrX]
7427 theonlymir 245
 
7662 IgorA 246
		;for Y coord
247
		fild dword[mouse_prop_y]
248
		fmulp st1,st0
249
		test bx,0x8000
250
		jnz .decr_y
251
			;увеличение масштаба
252
			fild dword[ecx+Figure.MCentrY] ;add old value
253
			fmul qword[zoom_plus]
254
			faddp
255
			jmp @f
256
		.decr_y:
257
			;уменьшение масштаба
258
			fchs
259
			fild dword[ecx+Figure.MCentrY] ;add old value
260
			fdiv qword[zoom_plus]
261
			faddp
262
		@@:
263
		fistp dword[ecx+Figure.MCentrY]
7427 theonlymir 264
 
7662 IgorA 265
		mov dword[offs_last_timer],0
266
	.end0:
7427 theonlymir 267
 
7662 IgorA 268
	pop ecx ebx eax
269
	ret
7427 theonlymir 270
 
271
;output:
272
; eax - buffer coord X (если курсор за буфером -1)
273
; ebx - buffer coord Y (если курсор за буфером -1)
274
align 4
275
proc buf_get_mouse_coord
7662 IgorA 276
	mcall SF_MOUSE_GET,SSF_WINDOW_POSITION
277
	cmp ax,word[buf_0.t]
278
	jl .no_buf ;не попали в окно буфера по оси y
279
	mov ebx,eax
280
	shr ebx,16
281
	cmp bx,word[buf_0.l]
282
	jl .no_buf ;не попали в окно буфера по оси x
7427 theonlymir 283
 
7662 IgorA 284
	and eax,0xffff ;оставляем координату y
285
	sub ax,word[buf_0.t]
286
	cmp eax,[buf_0.h]
287
	jg .no_buf
288
	sub bx,word[buf_0.l]
289
	cmp ebx,[buf_0.w]
290
	jg .no_buf
291
	xchg eax,ebx
292
	jmp .end_f
293
	.no_buf:
294
		xor eax,eax
295
		not eax
296
		xor ebx,ebx
297
		not ebx
298
	.end_f:
299
	ret
7427 theonlymir 300
endp
301
 
302
align 4
7441 IgorA 303
proc timer_funct uses eax ebx
7662 IgorA 304
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
305
	mov [last_time],eax
7427 theonlymir 306
 
7662 IgorA 307
	cmp dword[offs_last_timer],ObjData
308
	je @f
309
		mov dword[offs_last_timer],ObjData
310
		stdcall draw_obj2d,ObjData
311
		stdcall [buf2d_draw], buf_0
312
	@@:
313
	ret
7427 theonlymir 314
endp
315
 
7440 theonlymir 316
WINDOW_WIDTH  = 775
317
WINDOW_HEIGHT = 445
318
 
7427 theonlymir 319
align 4
320
draw_window:
321
pushad
7662 IgorA 322
	mcall SF_REDRAW,SSF_BEGIN_DRAW
7427 theonlymir 323
 
7662 IgorA 324
	; *** рисование главного окна (выполняется 1 раз при запуске) ***
325
	mov edx,[sc.work]
326
	or  edx,0x33000000
327
	mov edi,caption
7440 theonlymir 328
        mcall SF_CREATE_WINDOW,(20 shl 16)+WINDOW_WIDTH,(20 shl 16)+WINDOW_HEIGHT
7427 theonlymir 329
 
7662 IgorA 330
	mov ecx,[ObjData.FigCount]
331
	or ecx,ecx
332
	jz .end0
333
		mov eax,[ObjData.FigData]
334
		xor edx,edx
335
		.cycle0:
336
			stdcall FigCalculateSizes,[eax+4*edx],0
337
			inc edx
338
			loop .cycle0
339
		stdcall ObjCalculateScale,ObjData
340
		mov dword[offs_last_timer],0
341
		call timer_funct
342
	.end0:
7427 theonlymir 343
 
7662 IgorA 344
	stdcall [edit_box_draw], editFileName
345
	stdcall [edit_box_draw], editCommand
7427 theonlymir 346
 
347
        stdcall [option_box_draw], opt_grlist1
348
        push   pb
349
        call   [progressbar_draw]
350
 
7662 IgorA 351
	; *** создание кнопок на панель ***
352
	mcall SF_DEFINE_BUTTON,(731 shl 16)+20,(75 shl 16)+20,3, [sc.work_button]
353
	mcall , (15 shl 16)+20,(27 shl 16)+20,4 ;restore
354
	mcall ,(538 shl 16)+20,,5 ;connect
355
	mcall ,(563 shl 16)+20,,6 ;close connect
356
	mcall ,(437 shl 16)+86,(378 shl 16)+20,7 ;cancel
357
	mcall ,(616 shl 16)+136,(378 shl 16)+20,8 ;run
7427 theonlymir 358
 
7662 IgorA 359
	; ***
360
	mov ecx,[sc.work_text]
7440 theonlymir 361
        or ecx,0x80000000 ;0x81000000
362
        textYcoord = 13;5
363
        mcall SF_DRAW_TEXT,(15 shl 16)+textYcoord,,txt_preview
364
        mcall ,(424 shl 16)+textYcoord,,txt_port
7662 IgorA 365
	mov ecx,[sc.work_button_text]
366
	or ecx,0x81000000
367
	mcall ,(440 shl 16)+381,,txt_but_cancel
368
	mcall ,(619 shl 16)+381,,txt_but_run
7427 theonlymir 369
 
7662 IgorA 370
	; *** рисование иконок на кнопках ***
371
	mcall SF_PUT_IMAGE,[image_data_toolbar],(16 shl 16)+16,(733 shl 16)+77 ;icon open
7427 theonlymir 372
 
7662 IgorA 373
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
374
	mcall ,,,(17 shl 16)+29 ;restore scale
375
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
376
	mcall ,,,(540 shl 16)+29 ;connect
377
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
378
	mcall ,,,(565 shl 16)+29 ;close connect
379
	;;add ebx,IMAGE_TOOLBAR_ICON_SIZE
380
	;;mcall ,,,(439 shl 16)+380 ;cancel
381
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
382
	mcall ,,,((638+97) shl 16)+380 ;run
7427 theonlymir 383
 
7662 IgorA 384
	stdcall [buf2d_draw], buf_0
7427 theonlymir 385
 
7440 theonlymir 386
        ;delete port button, if it exist
387
        mov edx, 0x80000008
8442 IgorA 388
        mcall SF_DEFINE_BUTTON
7440 theonlymir 389
        ;draw button PORT
390
        buttonPortX = 433
391
        buttonPortY = 27 ;50
392
        buttonPortTextXoffset = 5
393
        mov esi, 0x00AABBCC       ;color button
8442 IgorA 394
        mcall SF_DEFINE_BUTTON, buttonPortX*65536 + 95, buttonPortY*65536 + 20, 8
7440 theonlymir 395
        ;draw text for button PORT
396
        mov     ebx, (buttonPortX+buttonPortTextXoffset) * 65536 + (buttonPortY+6)    ;(x, y)
397
        mov     esi, 11
8442 IgorA 398
        mcall SF_DRAW_TEXT,, 0xFFFFFF, sz_PortMenu
7440 theonlymir 399
        ;stdcall [kmainmenu_draw], [main_menu]
400
        ;mov word[coord.x], 0
401
        ;mov word[coord.y], 0
402
        ;stdcall [ksubmenu_draw], [port_menu], coord
403
 
7662 IgorA 404
	mcall SF_REDRAW,SSF_END_DRAW
7427 theonlymir 405
popad
7662 IgorA 406
	ret
7427 theonlymir 407
 
408
align 4
409
key:
7662 IgorA 410
	mcall SF_GET_KEY
411
 
7427 theonlymir 412
        stdcall [edit_box_key], editFileName
413
        stdcall [edit_box_key], editCommand
414
 
7662 IgorA 415
	mov ecx,eax
416
	mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS
417
	bt eax,2 ;left Ctrl
418
	jc .key_Ctrl
419
	bt eax,3 ;right Ctrl
420
	jc .key_Ctrl
421
	jmp .end0
422
	.key_Ctrl:
423
		cmp ch,15 ;111 ;Ctrl+O
424
		jne @f
425
			call but_open_file
426
		@@:
427
	.end0:
428
	jmp still
7427 theonlymir 429
 
430
align 4
431
button:
7662 IgorA 432
	mcall SF_GET_BUTTON
7440 theonlymir 433
 
7662 IgorA 434
	cmp ah,3
435
	jne @f
436
		call but_open_file
437
		jmp still
438
	@@:
439
	cmp ah,4
440
	jne @f
441
		call but_restore_zoom
442
		jmp still
443
	@@:
7440 theonlymir 444
        cmp ah, 8
445
        jne @f
446
                push eax ebx ecx
8442 IgorA 447
                mcall SF_THREAD_INFO, pi, -1 ;get window coord
7427 theonlymir 448
 
7440 theonlymir 449
                mov eax, dword[pi+34]
450
                add eax, buttonPortX + 5
451
                mov word[coord.x], ax
452
 
453
                mov eax, dword[pi+38]
454
                add eax, buttonPortY + 42
455
                mov word[coord.y], ax
456
 
457
                stdcall [ksubmenu_draw], [port_menu], coord
458
                pop ecx ebx eax
459
        @@:
7662 IgorA 460
	;cmp ah,5
461
	;jne @f
462
		;call but_...
463
		;jmp still
464
	;@@:
465
	cmp ah,1
466
	jne still
7427 theonlymir 467
.exit:
7662 IgorA 468
	stdcall [buf2d_delete],buf_0
469
	stdcall mem.Free,[image_data_toolbar]
470
	stdcall mem.Free,[open_file_data]
471
	mcall SF_TERMINATE_PROCESS
7427 theonlymir 472
 
473
 
474
 
475
align 4
476
open_file_data dd 0 ;указатель на память для открытия файлов
477
open_file_size dd 0 ;размер открытого файла
478
 
479
align 4
480
but_open_file:
7662 IgorA 481
	copy_path open_dialog_name,communication_area_default_path,file_name,0
482
	pushad
483
	mov [OpenDialog_data.type],0
484
	stdcall [OpenDialog_Start],OpenDialog_data
485
	cmp [OpenDialog_data.status],2
486
	je .end_open_file
487
	;код при удачном открытии диалога
488
	jmp .end0
489
.no_dlg: ;если минуем диалог открытия файла
490
		pushad
491
		mov esi,openfile_path
492
		stdcall str_len,esi
493
		add esi,eax
494
		@@: ;цикл для поиска начала имени файла
495
			dec esi
496
			cmp byte[esi],'/'
497
			je @f
498
			cmp byte[esi],0x5c ;'\'
499
			je @f
500
			cmp esi,openfile_path
501
			jg @b
502
		@@:
503
		inc esi
504
		stdcall [OpenDialog_Set_file_name],OpenDialog_data,esi ;копируем имя файла в диалог сохранения
505
	.end0:
7438 theonlymir 506
        push eax ebx ecx edx    ;copy file name path from OpenDialog
507
        mov eax, openfile_path
7427 theonlymir 508
        mov ebx, fileNameBuffer ;.data
509
        mov ecx, 0
510
      @@:
511
        mov dl, byte[eax]
512
        cmp dl, 0 ;byte[eax], 0
513
        je @f
514
        mov byte[ebx], dl
515
        inc eax
516
        inc ebx
517
        inc ecx
518
        jmp @b
519
      @@:
520
        mov byte[ebx], 0
521
        mov dword[fileNameBuffer.size], ecx
522
        mov dword[editFileName.size], ecx
523
        mov dword[editFileName.pos], ecx
524
        pop edx ecx ebx eax
525
 
7662 IgorA 526
	mov [run_file_70.Function], SSF_GET_INFO
527
	mov [run_file_70.Position], 0
528
	mov [run_file_70.Flags], 0
529
	mov dword[run_file_70.Count], 0
530
	mov dword[run_file_70.Buffer], open_b
531
	mov byte[run_file_70+20], 0
532
	mov dword[run_file_70.FileName], openfile_path
533
	mcall SF_FILE,run_file_70
7427 theonlymir 534
 
7662 IgorA 535
	mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах
536
	inc ecx ;for text files
537
	stdcall mem.ReAlloc,[open_file_data],ecx
538
	mov [open_file_data],eax
539
	dec ecx ;for text files
540
	mov byte[eax+ecx],0 ;for text files
7427 theonlymir 541
 
7662 IgorA 542
	mov [run_file_70.Function], SSF_READ_FILE
543
	mov [run_file_70.Position], 0
544
	mov [run_file_70.Flags], 0
545
	mov dword[run_file_70.Count], ecx
546
	m2m dword[run_file_70.Buffer], dword[open_file_data]
547
	mov byte[run_file_70+20], 0
548
	mov dword[run_file_70.FileName], openfile_path
549
	mcall SF_FILE,run_file_70 ;загружаем файл изображения
550
	test eax,eax
551
	jnz .end_open_file
552
	cmp ebx,0xffffffff
553
	je .end_open_file
554
		mov [open_file_size],ebx
555
		mcall SF_SET_CAPTION,1,openfile_path
7427 theonlymir 556
 
7662 IgorA 557
		stdcall FileInit,[open_file_data],[open_file_size]
558
		stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
559
		stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
560
	.end_open_file:
561
	popad
562
	ret
7427 theonlymir 563
 
564
;output:
565
; ecx - memory size for save file
566
align 4
567
proc get_file_save_size uses eax ebx edx esi
7662 IgorA 568
	mov ecx,100 ;title
569
	mov ebx,ObjData
570
	add ecx,50 ;object
571
	mov edx,[ebx+Object.FigCount]
572
	or edx,edx
573
	jz .cycle1end
574
	mov esi,[ebx+Object.FigData]
7427 theonlymir 575
align 4
7662 IgorA 576
	.cycle1: ; цикл по фигурам
577
		add ecx,80 ;figure
578
		mov eax,[esi]
579
		or eax,eax
580
		jz @f
581
			mov eax,[eax+Figure.PoiCount]
582
			imul eax,70
583
			add ecx,eax ;points
584
		@@:
585
		add esi,4
586
		dec edx
587
		jnz .cycle1
588
	.cycle1end:
589
	ret
7427 theonlymir 590
endp
591
 
592
align 4
593
proc but_restore_zoom
7662 IgorA 594
	finit
595
	fld1
596
	fstp qword[ObjData.MScale]
597
	mov dword[ObjData.MCentrX],0
598
	mov dword[ObjData.MCentrY],0
599
	mov dword[offs_last_timer],0
600
	ret
7427 theonlymir 601
endp
602
 
603
;input:
604
; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
605
;output:
606
; eax - число
607
align 4
608
proc conv_str_to_int uses ebx ecx esi, buf:dword
7662 IgorA 609
	xor eax,eax
610
	xor ebx,ebx
611
	mov esi,[buf]
7427 theonlymir 612
 
7662 IgorA 613
	;на случай если перед числом находятся пробелы
614
	@@:
615
	cmp byte[esi],' '
616
	jne @f
617
		inc esi
618
		jmp @b
619
	@@:
7427 theonlymir 620
 
7662 IgorA 621
	;определение отрицательных чисел
622
	xor ecx,ecx
623
	inc ecx
624
	cmp byte[esi],'-'
625
	jne @f
626
		dec ecx
627
		inc esi
628
	@@:
7427 theonlymir 629
 
7662 IgorA 630
	cmp word[esi],'0x'
631
	je .load_digit_16
7427 theonlymir 632
 
7662 IgorA 633
	.load_digit_10: ;считывание 10-тичных цифр
634
		mov bl,byte[esi]
635
		cmp bl,'0'
636
		jl @f
637
		cmp bl,'9'
638
		jg @f
639
			sub bl,'0'
640
			imul eax,10
641
			add eax,ebx
642
			inc esi
643
			jmp .load_digit_10
644
	jmp @f
7427 theonlymir 645
 
7662 IgorA 646
	.load_digit_16: ;считывание 16-ричных цифр
647
		add esi,2
648
	.cycle_16:
649
		mov bl,byte[esi]
650
		cmp bl,'0'
651
		jl @f
652
		cmp bl,'f'
653
		jg @f
654
		cmp bl,'9'
655
		jle .us1
656
			cmp bl,'A'
657
			jl @f ;отсеиваем символы >'9' и <'A'
658
		.us1: ;составное условие
659
		cmp bl,'F'
660
		jle .us2
661
			cmp bl,'a'
662
			jl @f ;отсеиваем символы >'F' и <'a'
663
			sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
664
		.us2: ;составное условие
665
			sub bl,'0'
666
			cmp bl,9
667
			jle .cor1
668
				sub bl,7 ;convert 'A' to '10'
669
			.cor1:
670
			shl eax,4
671
			add eax,ebx
672
			inc esi
673
			jmp .cycle_16
674
	@@:
8442 IgorA 675
	or ecx,ecx ;если число отрицательное
676
	jnz @f
7662 IgorA 677
		sub ecx,eax
678
		mov eax,ecx
679
	@@:
680
	ret
7427 theonlymir 681
endp
682
 
683
 
684
;данные для диалога открытия файлов
685
align 4
686
OpenDialog_data:
7662 IgorA 687
.type			dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
688
.procinfo		dd procinfo	;+4
689
.com_area_name		dd communication_area_name	;+8
690
.com_area		dd 0	;+12
691
.opendir_path		dd plugin_path	;+16
692
.dir_default_path	dd default_dir ;+20
693
.start_path		dd file_name ;+24 путь к диалогу открытия файлов
694
.draw_window		dd draw_window	;+28
695
.status 		dd 0	;+32
696
.openfile_path		dd openfile_path	;+36 путь к открываемому файлу
697
.filename_area		dd filename_area	;+40
698
.filter_area		dd Filter
7427 theonlymir 699
.x:
7662 IgorA 700
.x_size 		dw 420 ;+48 ; Window X size
701
.x_start		dw 10 ;+50 ; Window X position
7427 theonlymir 702
.y:
7662 IgorA 703
.y_size 		dw 320 ;+52 ; Window y size
704
.y_start		dw 10 ;+54 ; Window Y position
7427 theonlymir 705
 
706
default_dir db '/rd/1',0
707
 
708
communication_area_name:
7662 IgorA 709
	db 'FFFFFFFF_open_dialog',0
7427 theonlymir 710
open_dialog_name:
7662 IgorA 711
	db 'opendial',0
7427 theonlymir 712
communication_area_default_path:
7662 IgorA 713
	db '/rd/1/File managers/',0
7427 theonlymir 714
 
715
Filter:
716
dd Filter.end - Filter ;.1
717
.1:
718
db 'NC',0
719
db 'PNG',0
720
.end:
721
db 0
722
 
723
 
7440 theonlymir 724
;[
725
;for test
726
main_menu dd 0
727
port_menu dd 0
7427 theonlymir 728
 
7440 theonlymir 729
sz_PortMenu  db 'COM 12     ',0
730
sz_COMport   db 'COM port 12',0
731
sz_USBport   db 'USB port   ',0
732
sz_OTHERport db 'Other port ',0
733
 
734
coord:
735
  .x dw 100
736
  .y dw 200
737
;]
738
 
7662 IgorA 739
align 4
7427 theonlymir 740
system_dir_0 db '/sys/lib/'
741
lib_name_0 db 'proc_lib.obj',0
742
system_dir_1 db '/sys/lib/'
743
lib_name_1 db 'libimg.obj',0
744
system_dir_2 db '/sys/lib/'
745
lib_name_2 db 'buf2d.obj',0
746
system_dir_3 db '/sys/lib/'
747
lib_name_3 db 'box_lib.obj',0
7440 theonlymir 748
system_dir_4 db '/sys/lib/'
749
lib_name_4 db 'kmenu.obj',0
750
 
7662 IgorA 751
align 4
7427 theonlymir 752
l_libs_start:
8442 IgorA 753
	lib_0 l_libs lib_name_0, file_name, system_dir_0, import_proclib
754
	lib_1 l_libs lib_name_1, file_name, system_dir_1, import_libimg
755
	lib_2 l_libs lib_name_2, file_name, system_dir_2, import_buf2d
756
	lib_3 l_libs lib_name_3, file_name, system_dir_3, import_box_lib
757
	lib_4 l_libs lib_name_4, file_name, system_dir_4, import_libkmenu
7427 theonlymir 758
l_libs_end:
759
 
760
align 4
761
import_libimg:
7662 IgorA 762
	dd alib_init1
763
	img_is_img  dd aimg_is_img
764
	img_info    dd aimg_info
765
	img_from_file dd aimg_from_file
766
	img_to_file dd aimg_to_file
767
	img_from_rgb dd aimg_from_rgb
768
	img_to_rgb  dd aimg_to_rgb
769
	img_to_rgb2 dd aimg_to_rgb2
770
	img_decode  dd aimg_decode
771
	img_encode  dd aimg_encode
772
	img_create  dd aimg_create
773
	img_destroy dd aimg_destroy
774
	img_destroy_layer dd aimg_destroy_layer
775
	img_count   dd aimg_count
776
	img_lock_bits dd aimg_lock_bits
777
	img_unlock_bits dd aimg_unlock_bits
778
	img_flip    dd aimg_flip
779
	img_flip_layer dd aimg_flip_layer
780
	img_rotate  dd aimg_rotate
781
	img_rotate_layer dd aimg_rotate_layer
782
	img_draw    dd aimg_draw
7427 theonlymir 783
 
7662 IgorA 784
	dd 0,0
785
	alib_init1   db 'lib_init',0
786
	aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
787
	aimg_info    db 'img_info',0
788
	aimg_from_file db 'img_from_file',0
789
	aimg_to_file db 'img_to_file',0
790
	aimg_from_rgb db 'img_from_rgb',0
791
	aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
792
	aimg_to_rgb2 db 'img_to_rgb2',0
793
	aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
794
	aimg_encode  db 'img_encode',0
795
	aimg_create  db 'img_create',0
796
	aimg_destroy db 'img_destroy',0
797
	aimg_destroy_layer db 'img_destroy_layer',0
798
	aimg_count   db 'img_count',0
799
	aimg_lock_bits db 'img_lock_bits',0
800
	aimg_unlock_bits db 'img_unlock_bits',0
801
	aimg_flip    db 'img_flip',0
802
	aimg_flip_layer db 'img_flip_layer',0
803
	aimg_rotate  db 'img_rotate',0
804
	aimg_rotate_layer db 'img_rotate_layer',0
805
	aimg_draw    db 'img_draw',0
7427 theonlymir 806
 
807
align 4
8442 IgorA 808
import_proclib:
7662 IgorA 809
	OpenDialog_Init dd aOpenDialog_Init
810
	OpenDialog_Start dd aOpenDialog_Start
811
	OpenDialog_Set_file_name dd aOpenDialog_Set_file_name
812
	;OpenDialog_Set_file_ext dd aOpenDialog_Set_file_ext
7427 theonlymir 813
dd 0,0
7662 IgorA 814
	aOpenDialog_Init db 'OpenDialog_init',0
815
	aOpenDialog_Start db 'OpenDialog_start',0
816
	aOpenDialog_Set_file_name db 'OpenDialog_set_file_name',0
817
	;aOpenDialog_Set_file_ext db 'OpenDialog_set_file_ext',0
7427 theonlymir 818
 
819
align 4
820
import_buf2d:
7662 IgorA 821
	init dd sz_init
822
	buf2d_create dd sz_buf2d_create
823
	buf2d_create_f_img dd sz_buf2d_create_f_img
824
	buf2d_clear dd sz_buf2d_clear
825
	buf2d_draw dd sz_buf2d_draw
826
	buf2d_delete dd sz_buf2d_delete
827
	buf2d_resize dd sz_buf2d_resize
828
	buf2d_line dd sz_buf2d_line
829
	buf2d_line_sm dd sz_buf2d_line_sm
830
	buf2d_rect_by_size dd sz_buf2d_rect_by_size
831
	buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
832
	buf2d_circle dd sz_buf2d_circle
833
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
834
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
835
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
836
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
837
	buf2d_bit_blt dd sz_buf2d_bit_blt
838
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
839
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
840
	buf2d_curve_bezier dd sz_buf2d_curve_bezier
841
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
842
	buf2d_draw_text dd sz_buf2d_draw_text
843
	buf2d_crop_color dd sz_buf2d_crop_color
844
	buf2d_flip_h dd sz_buf2d_flip_h
845
	buf2d_flip_v dd sz_buf2d_flip_v
846
	buf2d_offset_h dd sz_buf2d_offset_h
847
	buf2d_flood_fill dd sz_buf2d_flood_fill
848
	buf2d_set_pixel dd sz_buf2d_set_pixel
849
	dd 0,0
850
	sz_init db 'lib_init',0
851
	sz_buf2d_create db 'buf2d_create',0
852
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
853
	sz_buf2d_clear db 'buf2d_clear',0
854
	sz_buf2d_draw db 'buf2d_draw',0
855
	sz_buf2d_delete db 'buf2d_delete',0
856
	sz_buf2d_resize db 'buf2d_resize',0
857
	sz_buf2d_line db 'buf2d_line',0
858
	sz_buf2d_line_sm db 'buf2d_line_sm',0
859
	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
860
	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
861
	sz_buf2d_circle db 'buf2d_circle',0
862
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
863
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
864
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
865
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
866
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
867
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
868
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
869
	sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
870
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
871
	sz_buf2d_draw_text db 'buf2d_draw_text',0
872
	sz_buf2d_crop_color db 'buf2d_crop_color',0
873
	sz_buf2d_flip_h db 'buf2d_flip_h',0
874
	sz_buf2d_flip_v db 'buf2d_flip_v',0
875
	sz_buf2d_offset_h db 'buf2d_offset_h',0
876
	sz_buf2d_flood_fill db 'buf2d_flood_fill',0
877
	sz_buf2d_set_pixel db 'buf2d_set_pixel',0
7427 theonlymir 878
 
879
align 4
880
import_box_lib:
7662 IgorA 881
	dd sz_init1
7427 theonlymir 882
 
7662 IgorA 883
	init_checkbox   dd sz_Init_checkbox
884
	check_box_draw  dd sz_Check_box_draw
885
	check_box_mouse dd sz_Check_box_mouse
886
	;version_ch     dd sz_Version_ch
7427 theonlymir 887
 
7662 IgorA 888
	option_box_draw	 dd sz_Option_box_draw
889
	option_box_mouse dd sz_Option_box_mouse
890
	;version_op      dd sz_Version_op
7427 theonlymir 891
 
7662 IgorA 892
	edit_box_draw      dd sz_edit_box_draw
893
	edit_box_key       dd sz_edit_box_key
894
	edit_box_mouse     dd sz_edit_box_mouse
895
	edit_box_set_text  dd sz_edit_box_set_text
896
	scrollbar_ver_draw dd sz_scrollbar_ver_draw
897
	scrollbar_hor_draw dd sz_scrollbar_hor_draw
7427 theonlymir 898
 
899
        progressbar_draw     dd sz_progressbar_draw
900
        progressbar_progress dd sz_progressbar_progress
901
 
7662 IgorA 902
	dd 0,0
903
	sz_init1 db 'lib_init',0
7427 theonlymir 904
 
7662 IgorA 905
	sz_Init_checkbox   db 'init_checkbox2',0
906
	sz_Check_box_draw  db 'check_box_draw2',0
907
	sz_Check_box_mouse db 'check_box_mouse2',0
908
	;sz_Version_ch     db 'version_ch2',0
7427 theonlymir 909
 
7662 IgorA 910
	sz_Option_box_draw	db 'option_box_draw',0
911
	sz_Option_box_mouse	db 'option_box_mouse',0
912
	;sz_Version_op      db 'version_op',0
7427 theonlymir 913
 
9568 IgorA 914
	sz_edit_box_draw      db 'edit_box_draw',0
7662 IgorA 915
	sz_edit_box_key       db 'edit_box_key',0
916
	sz_edit_box_mouse     db 'edit_box_mouse',0
917
	sz_edit_box_set_text  db 'edit_box_set_text',0
918
	sz_scrollbar_ver_draw db 'scrollbar_v_draw',0
919
	sz_scrollbar_hor_draw db 'scrollbar_h_draw',0
7427 theonlymir 920
 
921
        sz_progressbar_draw     db 'progressbar_draw', 0
922
        sz_progressbar_progress db 'progressbar_progress', 0
923
 
924
align 4
7440 theonlymir 925
import_libkmenu:
926
        kmenu_init      dd akmenu_init
927
        kmainmenu_draw  dd akmainmenu_draw
928
        kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
929
        ksubmenu_new    dd aksubmenu_new
930
        ksubmenu_delete dd aksubmenu_delete
931
        ksubmenu_draw   dd aksubmenu_draw
932
        ksubmenu_add    dd aksubmenu_add
933
        kmenuitem_new   dd akmenuitem_new
934
        kmenuitem_delete dd akmenuitem_delete
935
        kmenuitem_draw  dd akmenuitem_draw
936
dd 0,0
937
        akmenu_init     db 'kmenu_init',0
938
        akmainmenu_draw db 'kmainmenu_draw',0
939
        akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
940
        aksubmenu_new   db 'ksubmenu_new',0
941
        aksubmenu_delete db 'ksubmenu_delete',0
942
        aksubmenu_draw  db 'ksubmenu_draw',0
943
        aksubmenu_add   db 'ksubmenu_add',0
944
        akmenuitem_new  db 'kmenuitem_new',0
945
        akmenuitem_delete db 'kmenuitem_delete',0
946
        akmenuitem_draw  db 'kmenuitem_draw',0
947
 
948
button_press  dd 0     ;for kmenu
949
 
950
align 4
7427 theonlymir 951
mouse_dd dd 0
952
last_time dd 0
953
 
954
align 16
955
sc system_colors
956
 
957
align 16
958
procinfo process_information
959
 
960
align 4
961
buf_0: dd 0 ;указатель на буфер изображения
962
.l: dw 15 ;+4 left
963
.t: dw 50 ;+6 top
964
.w: dd 384 ;+8 w
965
.h: dd 350 ;+12 h
966
.color: dd 0xffffd0 ;+16 color
7662 IgorA 967
	db 24 ;+20 bit in pixel
7427 theonlymir 968
 
969
align 4
970
buf_1:
7662 IgorA 971
	dd 0 ;указатель на буфер изображения
972
	dd 0 ;+4 left,top
7427 theonlymir 973
.w: dd 0
974
.h: dd 0,0,24 ;+12 color,bit in pixel
975
 
976
font_h dd 0 ;высота шрифта
977
 
978
;input:
979
; eax - число
980
; edi - буфер для строки
981
; len - длинна буфера
982
;output:
983
align 4
984
proc convert_int_to_str uses eax ecx edx edi esi, len:dword
7662 IgorA 985
	mov esi,[len]
986
	add esi,edi
987
	dec esi
988
	call .str
989
	ret
7427 theonlymir 990
endp
991
 
992
align 4
993
.str:
7662 IgorA 994
	mov ecx,10
995
	cmp eax,ecx
996
	jb @f
997
		xor edx,edx
998
		div ecx
999
		push edx
1000
		;dec edi  ;смещение необходимое для записи с конца строки
1001
		call .str
1002
		pop eax
1003
	@@:
1004
	cmp edi,esi
1005
	jge @f
1006
		or al,0x30
1007
		stosb
1008
		mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор
1009
	@@:
1010
	ret
7427 theonlymir 1011
 
1012
align 4
1013
proc mem_copy uses ecx esi edi, destination:dword, source:dword, len:dword
7662 IgorA 1014
	cld
8442 IgorA 1015
	mov esi, [source]
1016
	mov edi, [destination]
1017
	mov ecx, [len]
7662 IgorA 1018
	rep movsb
1019
	ret
7427 theonlymir 1020
endp
1021
 
1022
edMaxSize = 511
1023
edMax = 0 ;max, size, pos
1024
 
1025
align 4
1026
editFileName  edit_box 270,450,78, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, fileNameBuffer.data, mouse_dd, 0, edMax, edMax
1027
editCommand   edit_box 150,450,121, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, commandBuffer.data, mouse_dd, 0, edMax, edMax
1028
 
1029
opt1 option_box opt_gr1, 433,64, 6,12,0xd0d0ff, 0xff, 0x80ff,txt_filename,txt_filename.end-txt_filename
1030
opt2 option_box opt_gr1, 433,107,6,12,0xd0d0ff, 0xff, 0x80ff,txt_command,txt_command.end-txt_command
1031
opt_gr1 dd opt1
1032
align 4
1033
opt_grlist1 dd opt1,opt2,0 ;end option group
1034
 
1035
pb:
1036
.value          dd 0
1037
.left           dd 0
1038
.top            dd 0
1039
.width          dd 0
1040
.height         dd 0
1041
.style          dd 0
1042
.min            dd 0
1043
.max            dd 0
1044
.back_color     dd 0
1045
.progress_color dd 0
1046
.frame_color    dd 0
1047
 
1048
fileNameBuffer:
1049
.data: rb 512
1050
.size: rd 1
1051
fileNameBufferEnd:
1052
 
1053
commandBuffer:
1054
.data: rb 512
1055
.size: rd 1
1056
commandBufferEnd:
1057
 
1058
align 16
1059
i_end:
7662 IgorA 1060
	rb 2048
7427 theonlymir 1061
thread_coords:
7662 IgorA 1062
	rb 2048
7427 theonlymir 1063
thread_scale:
7662 IgorA 1064
	rb 2048
7427 theonlymir 1065
thread_n_file:
7662 IgorA 1066
	rb 2048
7427 theonlymir 1067
stacktop:
7662 IgorA 1068
	sys_path rb 1024
8442 IgorA 1069
	file_name rb 2048
7662 IgorA 1070
	plugin_path rb 4096
1071
	openfile_path rb 4096
1072
	filename_area rb 256
8442 IgorA 1073
	pi rb 1024
7427 theonlymir 1074
mem:
1075