Subversion Repositories Kolibri OS

Rev

Rev 2915 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2897 IgorA 1
use32
2
	org 0x0
3
	db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
4
	dd 0x1
5
	dd start
6
	dd i_end ;размер приложения
7
	dd mem
8
	dd stacktop
9
	dd 0
10
	dd sys_path
11
 
12
include '../../../../programs/macros.inc'
13
include '../../../../programs/proc32.inc'
14
include '../../../../programs/develop/libraries/box_lib/load_lib.mac'
15
include '../trunk/mem.inc'
16
include '../trunk/dll.inc'
17
 
18
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
19
caption db 'Voxel creator 1.08.12',0 ;подпись окна
20
 
21
struct FileInfoBlock
22
	Function dd ?
23
	Position dd ?
24
	Flags	 dd ?
25
	Count	 dd ?
26
	Buffer	 dd ?
27
		db ?
28
	FileName dd ?
29
ends
30
 
31
BUF_STRUCT_SIZE equ 21
32
buf2d_data equ dword[edi] ;данные буфера изображения
33
buf2d_w equ dword[edi+8] ;ширина буфера
34
buf2d_h equ dword[edi+12] ;высота буфера
35
buf2d_l equ word[edi+4]
36
buf2d_t equ word[edi+6] ;отступ сверху
37
buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера
38
buf2d_color equ dword[edi+16] ;цвет фона буфера
39
buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения
40
 
41
vox_offs_tree_table equ 4
42
vox_offs_data equ 12
43
 
44
run_file_70 FileInfoBlock
45
image_data dd 0 ;указатель на временную память. для нужен преобразования изображения
46
vox_obj_size dd 0 ;размер воксельного объекта (для ускорения вставки)
47
 
48
fn_toolbar db 'toolbar.png',0
49
IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
50
IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*9
51
image_data_toolbar dd 0
52
 
53
max_open_file_size equ 1024*1024 ;1 Mb
54
 
55
macro load_image_file path,buf,size { ;макрос для загрузки изображений
56
	;path - может быть переменной или строковым параметром
57
	if path eqtype '' ;проверяем задан ли строкой параметр path
58
		jmp @f
59
			local .path_str
60
			.path_str db path ;формируем локальную переменную
61
			db 0
62
		@@:
63
		;32 - стандартный адрес по которому должен быть буфер с системным путем
64
		copy_path .path_str,[32],file_name,0x0
65
	else
66
		copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
67
	end if
68
 
69
	stdcall mem.Alloc, dword size ;выделяем память для изображения
70
	mov [buf],eax
71
 
72
	mov eax,70 ;70-я функция работа с файлами
73
	mov [run_file_70.Function], 0
74
	mov [run_file_70.Position], 0
75
	mov [run_file_70.Flags], 0
76
	mov [run_file_70.Count], dword size
77
	m2m [run_file_70.Buffer], [buf]
78
	mov byte[run_file_70+20], 0
79
	mov [run_file_70.FileName], file_name
80
	mov ebx,run_file_70
81
	int 0x40 ;загружаем файл изображения
82
	cmp ebx,0xffffffff
83
	je @f
84
		;определяем вид изображения и переводим его во временный буфер image_data
85
		stdcall dword[img_decode], dword[buf],ebx,0
86
		mov dword[image_data],eax
87
		;преобразуем изображение к формату rgb
88
		stdcall dword[img_to_rgb2], dword[image_data],dword[buf]
89
		;удаляем временный буфер image_data
90
		stdcall dword[img_destroy], dword[image_data]
91
	@@:
92
}
93
 
94
 
95
 
96
align 4
97
start:
98
	load_libraries l_libs_start,l_libs_end
99
	;проверка на сколько удачно загузилась библиотека
100
	mov	ebp,lib_0
101
	cmp	dword [ebp+ll_struc_size-4],0
102
	jz	@f
103
		mcall -1 ;exit not correct
104
	@@:
105
	mcall 48,3,sc,sizeof.system_colors
106
	mcall 40,0x27
107
	stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
108
 
109
	stdcall [buf2d_create], buf_0 ;создание буфера
110
	stdcall [buf2d_create], buf_0z
111
	stdcall [buf2d_vox_brush_create], buf_vox, vox_6_7_z
112
 
113
	load_image_file fn_toolbar, image_data_toolbar,IMAGE_TOOLBAR_SIZE
114
 
115
	stdcall mem.Alloc,max_open_file_size
116
	mov dword[open_file_vox],eax
117
	stdcall mem.Alloc,max_open_file_size
118
	mov dword[open_file_img],eax
119
 
120
	mcall 26,9
121
	mov [last_time],eax
122
 
123
align 4
124
red_win:
125
	call draw_window
126
 
127
align 4
128
still:
129
	mcall 26,9
130
	mov ebx,[last_time]
131
	add ebx,10 ;задержка
132
	cmp ebx,eax
133
	jge @f
134
		mov ebx,eax
135
	@@:
136
	sub ebx,eax
137
	;cmp ebx,10 ;задержка
138
	;ja timer_funct
139
	;test ebx,ebx
140
	;jz timer_funct
141
	mcall 23
142
	cmp eax,0
143
	je timer_funct
144
 
145
	cmp al,1
146
	jz red_win
147
	cmp al,2
148
	jz key
149
	cmp al,3
150
	jz button
151
 
152
	jmp still
153
 
154
align 4
155
timer_funct:
156
	cmp byte[calc],0
157
	je still
158
 
159
	pushad
160
	mcall 26,9
161
	mov [last_time],eax
162
 
163
	; скидываем указатели буферов buf_npl_p, buf_npl, buf_npl_n
164
	mov edi,buf_npl_p
165
	mov eax,buf2d_data
166
	mov edi,buf_npl
167
	mov ebx,buf2d_data
168
	mov edi,buf_npl_n
169
	mov ecx,buf2d_data
170
	; change buffer data pointers
171
	mov buf2d_data,eax
172
	mov edi,buf_npl_p
173
	mov buf2d_data,ebx
174
	mov edi,buf_npl
175
	mov buf2d_data,ecx
176
 
177
	mov eax,[n_plane]
178
	mov ebx,buf2d_w
179
	dec ebx
180
 
181
	cmp ebx,eax
182
	jg @f
183
		stdcall create_obj_from_plane,buf_npl,eax ;создаем завершающее сечение
184
		;вывод конечного результата
185
		call draw_object
186
		mov byte[calc],0
187
		jmp .end_f
188
	@@:
189
 
190
	inc eax
191
	stdcall create_plane, buf_npl_n,eax
192
 
193
	; создание воскельного сечения на основе буфера buf_npl
194
	mov edi,buf_npl
195
	mov edx,[bby_min] ;0
196
	.cycle_0:
197
	mov ecx,[btx_min] ;0
198
	.cycle_1:
199
		stdcall [buf2d_get_pixel], edi,ecx,edx
200
		cmp eax,buf2d_color
201
		je @f
202
			mov esi,eax
203
			call need_node
204
			cmp eax,buf2d_color
205
			jne @f ;отсеиваем внутренние воксели, для оптимизации модели
206
			mov eax,ebx
207
			sub eax,edx
208
			stdcall buf2d_vox_obj_create_node, [open_file_vox],ecx,[n_plane],\
209
				eax,[k_scale],esi
210
		@@:
211
		inc ecx
212
		cmp ecx,ebx
213
		jle .cycle_1
214
		inc edx
215
		cmp edx,ebx
216
		jle .cycle_0
217
 
218
	stdcall [buf2d_draw], buf_npl
219
	inc dword[n_plane] ;перемещаем плоскость сечения
220
	.end_f:
221
	popad
222
	jmp still
223
 
224
align 4
225
proc create_plane, buf_img:dword, n_plane:dword
226
	pushad
227
	; копируем лицевое изображение в буфер buf_img
228
	; bby_min - используем для оптимизации (если сверху изображение пустое)
229
	mov eax,[bby_min]
230
	mov esi,buf_i2
231
	mov esi,[esi] ;buf2d_data
232
	mov edi,[buf_img]
233
	mov ecx,buf2d_w
234
	imul eax,ecx
235
	mov ebx,ecx
236
	imul ecx,ebx
237
	sub ecx,eax
238
	lea ecx,[ecx+ecx*2]
239
	mov edi,buf2d_data
240
	lea eax,[eax+eax*2]
241
	add edi,eax
242
	add esi,eax
243
	cld
244
	rep movsb
245
 
246
	mov ecx,ebx
247
	dec ebx
248
	mov edi,buf_i0
249
	.cycle_0:
250
		mov eax,ebx
251
		sub eax,[n_plane] ;eax - перевернутая координата n_plane
252
		stdcall [buf2d_get_pixel], edi,ecx,eax ;[n_plane]
253
		cmp eax,buf2d_color
254
		jne @f
255
			;вычеркивание вертикальной линии из сечения buf_img
256
			stdcall [buf2d_line], [buf_img],ecx,[bby_min],ecx,ebx, buf2d_color
257
			jmp .end_1
258
		@@:
259
			mov edx,[bby_min] ;xor edx,edx
260
			mov esi,eax
261
			.cycle_1: ;цикл для наложения верхней текстуры
262
			stdcall [buf2d_get_pixel], [buf_img],ecx,edx
263
			cmp eax, buf2d_color
264
			je .end_0
265
				stdcall [buf2d_set_pixel], [buf_img],ecx,edx, esi ;наложение верхней текстуры
266
				jmp .end_1
267
			.end_0:
268
			inc edx
269
			cmp edx,ebx
270
			jle .cycle_1
271
		.end_1:
272
		loop .cycle_0
273
 
274
	;горизонтальные линии на основе боковой грани
275
	mov ecx,[bby_min]
276
	mov edi,buf_i1
277
	.cycle_2:
278
		stdcall [buf2d_get_pixel], edi,[n_plane],ecx
279
		cmp eax,buf2d_color
280
		jne @f
281
			;вычеркивание горизонтальной линии из сечения buf_img
282
			stdcall [buf2d_line], [buf_img],[btx_min],ecx,[btx_max],ecx, buf2d_color
283
			jmp .end_3
284
		@@:
285
			mov edx,[btx_max] ;ebx
286
			mov esi,eax
287
			.cycle_3: ;цикл для наложения боковой текстуры
288
			stdcall [buf2d_get_pixel], [buf_img],edx,ecx
289
			cmp eax, buf2d_color
290
			je .end_2
291
				stdcall [buf2d_set_pixel], [buf_img],edx,ecx, esi ;наложение боковой текстуры
292
				jmp .end_3
293
			.end_2:
294
			dec edx
295
			cmp edx,[btx_min]
296
			jge .cycle_3
297
		.end_3:
298
		inc ecx
299
		cmp ecx,ebx
300
		jle .cycle_2
301
	popad
302
	ret
303
endp
304
 
305
align 4
306
proc create_obj_from_plane, buf_img:dword, n_plane:dword
307
pushad
308
	; создание воскельного сечения на основе буфера buf_img
309
	mov edi,[buf_img]
310
	mov ebx,buf2d_w
311
	dec ebx
312
	mov edx,[bby_min] ;0
313
	.cycle_0:
314
	mov ecx,[btx_min] ;0
315
	.cycle_1:
316
		stdcall [buf2d_get_pixel], edi,ecx,edx
317
		cmp eax,buf2d_color
318
		je @f
319
			mov esi,eax
320
			;call need_node
321
			;cmp eax,buf2d_color
322
			;jne @f ;отсеиваем внутренние воксели, для оптимизации модели
323
			mov eax,ebx
324
			sub eax,edx
325
			stdcall buf2d_vox_obj_create_node, [open_file_vox],ecx,[n_plane],\
326
				eax,[k_scale],esi
327
		@@:
328
		inc ecx
329
		cmp ecx,ebx
330
		jle .cycle_1
331
		inc edx
332
		cmp edx,ebx
333
		jle .cycle_0
334
	ret
335
popad
336
endp
337
 
338
;description:
339
; функция проверяет нужно ли отсеивать воксель с координатами [n_plane],ecx,edx
340
;input:
341
; ebx = max size y - 1
342
;output:
343
; eax = buf2d_color if node need
344
align 4
345
need_node:
346
	mov eax,buf2d_color
347
	cmp ecx,[btx_min] ;0
348
	jle .end_f
349
	cmp ecx,[btx_max] ;0
350
	jge .end_f
351
	cmp edx,[bby_min] ;0
352
	jle .end_f
353
	cmp edx,ebx ;max-1
354
	jge .end_f
355
		push ecx edx
356
		stdcall [buf2d_get_pixel], buf_npl_p,ecx,edx ;проверка предыдущего сечения
357
		cmp eax,buf2d_color
358
		je @f
359
		stdcall [buf2d_get_pixel], buf_npl_n,ecx,edx ;проверка последующего сечения
360
		cmp eax,buf2d_color
361
		je @f
362
		dec ecx
363
		stdcall [buf2d_get_pixel], edi,ecx,edx
364
		cmp eax,buf2d_color
365
		je @f
366
		add ecx,2
367
		stdcall [buf2d_get_pixel], edi,ecx,edx
368
		cmp eax,buf2d_color
369
		je @f
370
		dec ecx
371
		dec edx
372
		stdcall [buf2d_get_pixel], edi,ecx,edx
373
		cmp eax,buf2d_color
374
		je @f
375
		add edx,2
376
		stdcall [buf2d_get_pixel], edi,ecx,edx
377
		;cmp eax,buf2d_color
378
		;je @f
379
		@@:
380
		pop edx ecx
381
	.end_f:
382
	ret
383
 
384
;
385
;x0y0 - x1y0
386
;x1y0 - x1y1
387
;x0y1 - x0y0
388
;x1y1 - x0y1
389
align 4
390
proc vox_obj_rot_z uses eax ebx ecx, v_obj:dword
391
	mov ebx,[v_obj]
392
	add ebx,vox_offs_tree_table
393
	mov ecx,2
394
	cld
395
	@@:
396
		mov eax,dword[ebx]
397
		mov byte[ebx+1],al
398
		mov byte[ebx+3],ah
399
		shr eax,16
400
		mov byte[ebx],al
401
		mov byte[ebx+2],ah
402
		add ebx,4
403
		loop @b
404
	ret
405
endp
406
 
407
align 4
408
draw_window:
409
pushad
410
	mcall 12,1
411
 
412
	; *** рисование главного окна (выполняется 1 раз при запуске) ***
413
	xor eax,eax
414
	mov ebx,(20 shl 16)+410
415
	mov ecx,(20 shl 16)+520
416
	mov edx,[sc.work]
417
	or  edx,(3 shl 24)+0x30000000
418
	mov edi,caption
419
	int 0x40
420
 
421
	; *** создание кнопок на панель ***
422
	mov eax,8
423
	mov ebx,(5 shl 16)+20
424
	mov ecx,(5 shl 16)+20
425
	mov edx,3
426
	mov esi,[sc.work_button]
427
	int 0x40
428
 
429
	mov ebx,(30 shl 16)+20
430
	mov edx,4
431
	int 0x40
432
 
433
	mov ebx,(55 shl 16)+20
434
	mov edx,5
435
	int 0x40
436
 
437
	mov ebx,(85 shl 16)+20
438
	mov edx,6
439
	int 0x40
440
 
441
	add ebx,25 shl 16
442
	mov edx,7
443
	int 0x40
444
 
445
	add ebx,25 shl 16
446
	mov edx,8
447
	int 0x40
448
 
449
	add ebx,25 shl 16
450
	mov edx,9
451
	int 0x40
452
 
453
	add ebx,25 shl 16
454
	mov edx,10
455
	int 0x40
456
 
457
	add ebx,25 shl 16
458
	mov edx,11
459
	int 0x40
460
 
461
	add ebx,25 shl 16
462
	mov edx,12
463
	int 0x40
464
 
465
	; *** рисование иконок на кнопках ***
466
	mov eax,7
467
	mov ebx,[image_data_toolbar]
468
	mov ecx,(16 shl 16)+16
469
	mov edx,(7 shl 16)+7 ;icon new
470
	int 0x40
471
 
472
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
473
	add edx,(25 shl 16) ;icon open
474
	int 0x40
475
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
476
	add edx,(25 shl 16) ;icon save
477
	int 0x40
478
 
479
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
480
	add edx,(30 shl 16) ;
481
	int 0x40
482
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
483
	add edx,(25 shl 16) ;
484
	int 0x40
485
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
486
	add edx,(25 shl 16) ;
487
	int 0x40
488
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
489
	add edx,(25 shl 16) ;
490
	int 0x40
491
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
492
	add edx,(25 shl 16) ;
493
	int 0x40
494
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
495
	add edx,(25 shl 16) ;
496
	int 0x40
497
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
498
	add edx,(25 shl 16) ;
499
	int 0x40
500
 
501
	call draw_buffers
502
 
503
	mcall 12,2
504
popad
505
	ret
506
 
507
align 4
508
draw_buffers:
509
	; *** рисование буфера ***
510
	stdcall [buf2d_draw], buf_0
511
	stdcall [buf2d_draw], buf_i0
512
	stdcall [buf2d_draw], buf_i1
513
	stdcall [buf2d_draw], buf_i2
514
	ret
515
 
516
align 4
517
key:
518
	mcall 2
519
	jmp still
520
 
521
 
522
align 4
523
button:
524
	mcall 17
525
	cmp ah,3
526
	jne @f
527
		call but_new_file
528
	@@:
529
	cmp ah,4
530
	jne @f
531
		call but_open_file
532
	@@:
533
	cmp ah,5
534
	jne @f
535
		call but_save_file
536
	@@:
537
	cmp ah,6
538
	jne @f
539
		call but_1
540
	@@:
541
	cmp ah,7
542
	jne @f
543
		call but_2
544
	@@:
545
	cmp ah,8
546
	jne @f
547
		call but_3
548
	@@:
549
	cmp ah,9
550
	jne @f
551
		stdcall but_run, 0
552
	@@:
553
	cmp ah,10
554
	jne @f
555
		stdcall but_run, 1
556
	@@:
557
	cmp ah,11
558
	jne @f
559
		call but_5
560
	@@:
561
	cmp ah,12
562
	jne @f
563
		call but_rot_z
564
	@@:
565
	cmp ah,1
566
	jne still
567
.exit:
568
	stdcall [buf2d_delete],buf_0
569
	stdcall [buf2d_delete],buf_0z
570
	stdcall [buf2d_vox_brush_delete],buf_vox
571
	stdcall [buf2d_delete],buf_i0
572
	stdcall [buf2d_delete],buf_i1
573
	stdcall [buf2d_delete],buf_i2
574
	stdcall [buf2d_delete],buf_npl_p
575
	stdcall [buf2d_delete],buf_npl
576
	stdcall [buf2d_delete],buf_npl_n
577
	stdcall mem.Free,[image_data_toolbar]
578
	stdcall mem.Free,[open_file_vox]
579
	stdcall mem.Free,[open_file_img]
580
	mcall -1
581
 
582
 
583
align 4
584
vox_new_data:
585
	db 2,0,0,0
586
	db 000b,001b,010b,011b, 100b,101b,110b,111b ;default table
587
	dd 0 ;null node
588
 
589
align 4
590
proc but_new_file uses ecx edi esi
591
	mov ecx,vox_offs_data+4
592
	mov [vox_obj_size],ecx
593
	mov esi,vox_new_data
594
	mov edi,[open_file_vox]
595
	cld
596
	rep movsb
597
	ret
598
endp
599
 
600
align 4
601
open_file_vox dd 0 ;указатель на память для открытия файлов
602
open_file_img dd 0 ;указатель на память для открытия текстур
603
 
604
align 4
605
but_open_file:
606
	pushad
607
	copy_path open_dialog_name,communication_area_default_path,file_name,0
608
	mov [OpenDialog_data.type],0
609
	stdcall [OpenDialog_Start],OpenDialog_data
610
	cmp [OpenDialog_data.status],2
611
	je .end_open_file
612
	;код при удачном открытии диалога
613
 
614
	mov eax,70 ;70-я функция работа с файлами
615
	mov [run_file_70.Function], 0
616
	mov [run_file_70.Position], 0
617
	mov [run_file_70.Flags], 0
618
	mov [run_file_70.Count], dword max_open_file_size
619
	m2m [run_file_70.Buffer],dword[open_file_vox]
620
	mov byte[run_file_70+20], 0
621
	mov dword[run_file_70.FileName], openfile_path
622
	mov ebx,run_file_70
623
	int 0x40 ;загружаем файл изображения
624
	cmp ebx,0xffffffff
625
	je .end_open_file
626
		; проверка на правильность воксельного формата
627
		mov edi,[open_file_vox]
628
		add edi,vox_offs_tree_table
629
		xor bx,bx
630
		mov ecx,8
631
		cld
632
		@@:
633
			movzx ax,byte[edi]
634
			add bx,ax
635
			inc edi
636
			loop @b
637
		cmp bx,28 ;28=0+1+2+...+7
638
		jne .err_open
639
 
640
		mcall 71,1,openfile_path
641
		stdcall buf2d_vox_obj_get_size,[open_file_vox]
642
		mov [vox_obj_size],eax
643
		call draw_object
644
 
645
		jmp .end_open_file
646
	.err_open:
647
		call but_new_file
648
		stdcall [mb_create],msgbox_4,thread
649
	.end_open_file:
650
	popad
651
	ret
652
 
653
align 4
654
but_save_file:
655
	pushad
656
		copy_path open_dialog_name,communication_area_default_path,file_name,0
657
		mov [OpenDialog_data.type],1
658
		stdcall [OpenDialog_Start],OpenDialog_data
659
		cmp [OpenDialog_data.status],2
660
		je .end_save_file
661
		;код при удачном открытии диалога
662
 
663
		mov eax,6 ;dword[v_zoom] ;задаем масштаб по умолчанию
664
		mov ebx,[open_file_vox]
665
		mov byte[ebx],al
666
 
667
		stdcall buf2d_vox_obj_get_size, ebx
668
		mov dword[run_file_70.Count], eax ;размер файла
669
		mov eax,70 ;70-я функция работа с файлами
670
		mov [run_file_70.Function], 2
671
		mov [run_file_70.Position], 0
672
		mov [run_file_70.Flags], 0
673
		mov ebx, dword[open_file_vox]
674
		mov [run_file_70.Buffer], ebx
675
		mov byte[run_file_70+20], 0
676
		mov dword[run_file_70.FileName], openfile_path
677
		mov ebx,run_file_70
678
		int 0x40 ;загружаем файл изображения
679
		cmp ebx,0xffffffff
680
		je .end_save_file
681
 
682
		.end_save_file:
683
	popad
684
	ret
685
 
686
align 4
687
but_1:
688
	stdcall open_image_in_buf, buf_i0
689
	ret
690
 
691
align 4
692
but_2:
693
	stdcall open_image_in_buf, buf_i1
694
	call set_buf_tabs
695
	ret
696
 
697
align 4
698
but_3:
699
	stdcall open_image_in_buf, buf_i2
700
	call set_buf_tabs
701
	ret
702
 
703
;description:
704
; в зависимости от ширины 1-го буфера устанавливаем отступы для 2-го и 3-го буферов
705
align 4
706
set_buf_tabs:
707
push eax ebx edi
708
	mov edi,buf_i0
709
	cmp buf2d_data,0
710
	je @f
711
		movzx eax,buf2d_l
712
		mov ebx,buf2d_w
713
		cmp ebx,128
714
		jle .end_0
715
			mov ebx,128
716
		.end_0:
717
		mov edi,buf_i1
718
		mov buf2d_l,ax
719
		add buf2d_l,bx
720
		add buf2d_l,2
721
		shl ebx,1
722
		mov edi,buf_i2
723
		mov buf2d_l,ax
724
		add buf2d_l,bx
725
		add buf2d_l,4
726
	@@:
727
pop edi ebx eax
728
	ret
729
 
730
align 4
731
get_scale:
732
push eax edi
733
	mov edi,buf_i0
734
	mov eax,buf2d_w
735
 
736
	mov dword[k_scale],-1
737
	.cycle_s:
738
	cmp eax,0
739
	je @f
740
		shr eax,1
741
		inc dword[k_scale]
742
		jmp .cycle_s
743
	@@:
744
pop edi eax
745
	ret
746
 
747
align 4
748
proc set_borders uses eax ebx ecx edx edi
749
	mov ecx,dword[k_scale]
750
	mov edx,1
751
	shl edx,cl
752
 
753
	;определяем минимальную координату y на лицевой грани
754
	mov edi,buf_i2
755
	mov dword[bby_min],0
756
	xor ecx,ecx
757
	.cycle_0:
758
	xor ebx,ebx
759
	.cycle_1:
760
		stdcall [buf2d_get_pixel],edi,ebx,ecx
761
		cmp eax,buf2d_color
762
		jne @f
763
		inc ebx
764
		cmp ebx,edx
765
		jl .cycle_1
766
		inc dword[bby_min]
767
		inc ecx
768
		cmp ecx,edx
769
		jl .cycle_0
770
	@@:
771
 
772
	;определяем минимальную координату x на лицевой грани
773
	mov dword[btx_min],0
774
	xor ebx,ebx
775
	.cycle_2:
776
	mov ecx,[bby_min]
777
	.cycle_3:
778
		stdcall [buf2d_get_pixel],edi,ebx,ecx
779
		cmp eax,buf2d_color
780
		jne @f
781
		inc ecx
782
		cmp ecx,edx
783
		jl .cycle_3
784
		inc dword[btx_min]
785
		inc ebx
786
		cmp ebx,edx
787
		jl .cycle_2
788
	@@:
789
 
790
	;определяем максимальную координату x на лицевой грани
791
	mov [btx_max],edx
792
	dec dword[btx_max]
793
	mov ebx,[btx_max]
794
	.cycle_4:
795
	mov ecx,[bby_min]
796
	.cycle_5:
797
		stdcall [buf2d_get_pixel],edi,ebx,ecx
798
		cmp eax,buf2d_color
799
		jne @f
800
		inc ecx
801
		cmp ecx,edx
802
		jl .cycle_5
803
		dec dword[btx_max]
804
		dec ebx
805
		cmp ebx,[btx_min]
806
		jg .cycle_4
807
	@@:
808
 
809
	;stdcall [buf2d_line], edi, 0,[bby_min],50,[bby_min],255
810
	ret
811
endp
812
 
813
align 4
814
btx_min dd 0 ;буфер верхний мин. x
815
btx_max dd 0
816
bty_min dd 0 ;буфер верхний мин. y
817
bty_max dd 0
818
;bbx_min dd 0
819
;bbx_max dd 0
820
bby_min dd 0 ;буфер боковой мин. y
821
bby_max dd 0
822
k_scale dd 0
823
n_plane dd 0
824
 
825
calc db 0
826
 
827
; создание вокселя в 3 этапа:
828
; 1) ищем место в структуре дерева, куда надо вставить (если ветвь существует, 2-й этап пропускаем)
829
; 2) вставляем новую ветвь с вокселем (3-й этап уже не делаем)
830
; 3) меняем цвет вокселя
831
align 4
832
proc buf2d_vox_obj_create_node, v_obj:dword,coord_x:dword,coord_y:dword,\
833
coord_z:dword,k_scale:dword,color:dword
834
pushad
835
locals
836
	p_node dd 0 ;родительский узел
837
endl
838
 
839
	mov edi,[v_obj]
840
	add edi,vox_offs_data
841
	mov esi,[k_scale]
842
	cmp esi,1
843
	jl .change
844
	; *** (1) ***
845
	.found:
846
	stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
847
	movzx bx,byte[edi+3]
848
	mov [p_node],edi
849
	add edi,4
850
 
851
	cmp eax,0
852
	je .end_1
853
	mov ecx,eax
854
	cld
855
	@@: ;цикл для пропуска предыдущих поддеревьев в узле
856
		bt bx,0 ;проверяем есть ли дочерние узлы
857
		jnc .end_0
858
			xor eax,eax
859
			stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви
860
		.end_0:
861
		shr bx,1
862
		loop @b
863
	.end_1:
864
	bt bx,0
865
	jnc .creat ;если поддерева не существует, переходим к созданию
866
	dec esi
867
	cmp esi,0
868
	jg .found
869
	jmp .change
870
 
871
	; *** (2) ***
872
	.creat:
873
	mov edx,[color] ;меняем цвет
874
	and edx,0xffffff ;для профилактики
875
	mov ecx,esi
876
	stdcall vox_obj_add_nodes_mem, [v_obj],edi,ecx ;расширяем место занимаемое объектом, для добавления новых узлов
877
	mov ebx,[p_node]
878
	cld
879
	@@:
880
		mov dword[edi],edx
881
		stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi
882
		or byte[ebx+3],al
883
 
884
		mov ebx,edi
885
		add edi,4
886
		dec esi
887
		loop @b
888
	jmp .end_2
889
 
890
	; *** (3) ***
891
	.change:
892
	mov eax,[color] ;меняем цвет
893
	mov word[edi],ax
894
	shr eax,16
895
	mov byte[edi+2],al
896
 
897
	.end_2:
898
popad
899
	ret
900
endp
901
 
902
; сдвигает узлы для добавления новых узлов
903
;input:
904
; p_insert - позиция для вставки
905
; count - колличество вставляемых узлов
906
align 4
907
proc vox_obj_add_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword,count:dword
908
	mov esi,[v_obj]
909
	;stdcall buf2d_vox_obj_get_size,esi
910
	add esi,[vox_obj_size] ;esi - указатель на конец файла
911
	mov edi,[count]
912
	shl edi,2
913
	add [vox_obj_size],edi
914
	add edi,esi ;edi - указатель на будущий конец файла
915
	mov ecx,esi
916
	sub ecx,[p_insert]
917
	shr ecx,2 ;ecx - число циклов для копирования
918
	sub esi,4 ;esi - указатель на последний узел
919
	sub edi,4 ;edi - указатель на будущий последний узел
920
	std
921
	rep movsd ;сдвигаем память
922
	ret
923
endp
924
 
925
;???
926
; определение позиции узла в дереве (от 0 до 7)
927
align 4
928
proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\
929
coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
930
	mov ecx,[k_scale]
931
	dec ecx
932
	mov eax,[coord_x]
933
	mov ebx,[coord_y]
934
	mov edi,[coord_z]
935
	cmp ecx,1
936
	jl .end_0
937
		shr eax,cl
938
		shr ebx,cl
939
		shr edi,cl
940
	.end_0:
941
	and eax,1
942
	bt ebx,0
943
	jnc @f
944
		bts eax,1
945
	@@:
946
	bt edi,0
947
	jnc @f
948
		bts eax,2
949
	@@:
950
 
951
	mov edi,[v_obj]
952
	add edi,vox_offs_tree_table
953
	@@:
954
		cmp al,byte[edi]
955
		je @f
956
		inc edi
957
		jmp @b
958
	@@:
959
	sub edi,[v_obj]
960
	sub edi,vox_offs_tree_table
961
	mov eax,edi
962
 
963
	ret
964
endp
965
 
966
;???
967
;input:
968
; edi - указатель на данные воксельного объекта
969
;output:
970
; eax - eax + число узлов в данных вокс. объекта
971
; edi - указатель на смещенные данные вокс. объекта
972
align 4
973
proc vox_obj_rec0
974
	inc eax
975
	cmp byte[edi+3],0 ;смотрим есть ли поддеревья
976
	je .sub_trees
977
 
978
		;рекурсивный перебор поддеревьев
979
		push ebx ecx
980
		mov bh,byte[edi+3]
981
		add edi,4
982
		mov bl,8
983
		.cycle:
984
			bt bx,8 ;тестируем только bh
985
			jnc .c_next
986
				stdcall vox_obj_rec0
987
			.c_next:
988
			shr bh,1
989
			dec bl
990
			jnz .cycle
991
		pop ecx ebx
992
 
993
		jmp .end_f
994
	.sub_trees:
995
		add edi,4
996
	.end_f:
997
	ret
998
endp
999
 
1000
;output:
1001
; eax - 1,2,4,8,16, ... ,128
1002
align 4
1003
proc vox_obj_get_node_bit_mask uses ebx ecx edi, v_obj:dword,\
1004
coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
1005
	mov ecx,[k_scale]
1006
	dec ecx
1007
	mov eax,[coord_x]
1008
	mov ebx,[coord_y]
1009
	mov edi,[coord_z]
1010
	cmp ecx,1
1011
	jl .end_0
1012
		shr eax,cl
1013
		shr ebx,cl
1014
		shr edi,cl
1015
	.end_0:
1016
	and eax,1
1017
	bt ebx,0
1018
	jnc @f
1019
		bts eax,1
1020
	@@:
1021
	bt edi,0
1022
	jnc @f
1023
		bts eax,2
1024
	@@:
1025
 
1026
	mov ecx,[v_obj]
1027
	add ecx,vox_offs_tree_table
1028
	@@:
1029
		cmp al,byte[ecx]
1030
		je @f
1031
		inc ecx
1032
		jmp @b
1033
	@@:
1034
	mov eax,1 ;устанавливаем первоначальное значение бита
1035
	sub ecx,[v_obj]
1036
	sub ecx,vox_offs_tree_table
1037
	jz @f
1038
		shl eax,cl ;сдвигаем бит
1039
	@@:
1040
 
1041
	ret
1042
endp
1043
 
1044
;
1045
;output:
1046
; eax - размер в байтах занимаемый объектом v_obj
1047
align 4
1048
proc buf2d_vox_obj_get_size uses edi, v_obj:dword
1049
	mov edi,[v_obj]
1050
	add edi,vox_offs_data
1051
	xor eax,eax
1052
	stdcall vox_obj_rec0 ;eax - число узлов в объекте v_obj
1053
	shl eax,2
1054
	add eax,vox_offs_data
1055
	ret
1056
endp
1057
 
1058
;input:
1059
; mode_add - если не равно 0 тогда создание в режиме добавления вокселей
1060
align 4
1061
proc but_run uses eax ebx edi, mode_add:dword
1062
	; проверка размеров изображений (текстур)
1063
	mov edi,buf_i0
1064
	mov ebx,buf2d_h
1065
	cmp ebx,2
1066
	jle .err_size_t
1067
	cmp buf2d_w,ebx
1068
	jne .err_size_t
1069
	;
1070
	mov edi,buf_i1
1071
	cmp ebx,buf2d_h
1072
	jne .err_size_tb
1073
	mov ebx,buf2d_h
1074
	cmp ebx,2
1075
	jle .err_size_b
1076
	cmp buf2d_w,ebx
1077
	jne .err_size_b
1078
 
1079
		cmp dword[vox_obj_size],vox_offs_data
1080
		jl .n_file ;если раньше не было открытых файлов
1081
		cmp dword[mode_add],0
1082
		jne @f
1083
		.n_file:
1084
			call but_new_file
1085
		@@:
1086
 
1087
		mov edi,buf_i0
1088
		mov eax,buf2d_w
1089
		mov edi,buf_npl
1090
		cmp buf2d_data,0
1091
		jne @f
1092
			; *** создаем буфера
1093
			m2m buf2d_w,eax
1094
			m2m buf2d_h,eax
1095
			stdcall [buf2d_create],edi
1096
			mov edi,buf_npl_p
1097
			m2m buf2d_w,eax
1098
			m2m buf2d_h,eax
1099
			stdcall [buf2d_create],edi
1100
			mov edi,buf_npl_n
1101
			m2m buf2d_w,eax
1102
			m2m buf2d_h,eax
1103
			stdcall [buf2d_create],edi
1104
			jmp .end_0
1105
		@@:
1106
			; *** изменяем размеры буферов
1107
			stdcall [buf2d_resize], edi, eax,eax
1108
			mov edi,buf_npl_p
1109
			stdcall [buf2d_resize], edi, eax,eax
1110
			mov edi,buf_npl_n
1111
			stdcall [buf2d_resize], edi, eax,eax
1112
		.end_0:
1113
		mov dword[n_plane],1
1114
		mov byte[calc],1
1115
		call get_scale
1116
		call set_borders
1117
 
1118
		stdcall create_plane,buf_npl,0
1119
		stdcall create_plane,buf_npl_n,1
1120
		stdcall create_obj_from_plane,buf_npl,0 ;создаем начальное сечение
1121
 
1122
		jmp @f
1123
	.err_size_t:
1124
		stdcall [mb_create],msgbox_0,thread
1125
		jmp @f
1126
	.err_size_b:
1127
		stdcall [mb_create],msgbox_1,thread
1128
		jmp @f
1129
	.err_size_tb:
1130
		stdcall [mb_create],msgbox_3,thread
1131
		;jmp @f
1132
	@@:
1133
	ret
1134
endp
1135
 
1136
align 4
1137
but_5:
1138
	cmp byte[calc],0
1139
	je @f
1140
		call draw_object
1141
		mov byte[calc],0
1142
	@@:
1143
	ret
1144
 
1145
align 4
1146
but_rot_z:
1147
	stdcall vox_obj_rot_z, [open_file_vox]
1148
	call draw_object
1149
	ret
1150
 
1151
align 4
1152
draw_object:
1153
	;вывод результата на экран
1154
	stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
1155
	stdcall [buf2d_clear], buf_0z, 0 ;чистим буфер
1156
	stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_0z, buf_vox,\
1157
		[open_file_vox], 0,0, 0, 6 ;[k_scale]
1158
	stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
1159
	ret
1160
 
1161
align 4
1162
proc open_image_in_buf, buf:dword
1163
	pushad
1164
	copy_path open_dialog_name,communication_area_default_path,file_name,0
1165
	mov [OpenDialog_data.type],0
1166
	stdcall [OpenDialog_Start],OpenDialog_data
1167
	cmp [OpenDialog_data.status],2
1168
	je .end_open_file
1169
 
1170
	;stdcall mem.Alloc, dword size ;выделяем память для изображения
1171
	;mov [buf],eax
1172
 
1173
	mov eax,70 ;70-я функция работа с файлами
1174
	mov [run_file_70.Function], 0
1175
	mov [run_file_70.Position], 0
1176
	mov [run_file_70.Flags], 0
1177
	mov [run_file_70.Count], dword max_open_file_size
1178
	m2m [run_file_70.Buffer],dword[open_file_img]
1179
	mov byte[run_file_70+20], 0
1180
	mov [run_file_70.FileName], openfile_path
1181
	mov ebx,run_file_70
1182
	int 0x40 ;загружаем файл изображения
1183
	cmp ebx,0xffffffff
1184
	je .end_0
1185
		;определяем вид изображения и переводим его во временный буфер image_data
1186
		stdcall dword[img_decode], dword[open_file_img],ebx,0
1187
		cmp eax,0
1188
		je .end_0 ;если нарушен формат файла
1189
		mov dword[image_data],eax
1190
		;преобразуем изображение к формату rgb
1191
		stdcall dword[img_to_rgb2], dword[image_data],dword[open_file_img]
1192
 
1193
		mov eax,dword[image_data]
1194
		mov edi,[buf]
1195
		cmp buf2d_data,0
1196
		jne @f
1197
			m2m buf2d_w,dword[eax+4] ;+4 = image width
1198
			m2m buf2d_h,dword[eax+8] ;+8 = image heihht
1199
			stdcall [buf2d_create_f_img], edi,[open_file_img]
1200
			jmp .end_1
1201
		@@:
1202
			mov ebx,dword[eax+4]
1203
			mov ecx,dword[eax+8]
1204
			stdcall [buf2d_resize], edi, ebx,ecx ;изменяем размеры буфера
1205
			imul ecx,ebx
1206
			lea ecx,[ecx+ecx*2]
1207
			mov edi,buf2d_data
1208
			mov esi,[open_file_img]
1209
			cld
1210
			rep movsb ;copy image
1211
		.end_1:
1212
 
1213
		;удаляем временный буфер image_data
1214
		stdcall dword[img_destroy], dword[image_data]
1215
	.end_0:
1216
 
1217
	call draw_buffers
1218
	.end_open_file:
1219
	popad
1220
	ret
1221
endp
1222
 
1223
;input:
1224
; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
1225
;output:
1226
; eax - число
1227
align 4
1228
proc conv_str_to_int, buf:dword
1229
	xor eax,eax
1230
	push ebx ecx esi
1231
	xor ebx,ebx
1232
	mov esi,[buf]
1233
	;определение отрицательных чисел
1234
	xor ecx,ecx
1235
	inc ecx
1236
	cmp byte[esi],'-'
1237
	jne @f
1238
		dec ecx
1239
		inc esi
1240
	@@:
1241
 
1242
	cmp word[esi],'0x'
1243
	je .load_digit_16
1244
 
1245
	.load_digit_10: ;считывание 10-тичных цифр
1246
		mov bl,byte[esi]
1247
		cmp bl,'0'
1248
		jl @f
1249
		cmp bl,'9'
1250
		jg @f
1251
			sub bl,'0'
1252
			imul eax,10
1253
			add eax,ebx
1254
			inc esi
1255
			jmp .load_digit_10
1256
	jmp @f
1257
 
1258
	.load_digit_16: ;считывание 16-ричных цифр
1259
		add esi,2
1260
	.cycle_16:
1261
		mov bl,byte[esi]
1262
		cmp bl,'0'
1263
		jl @f
1264
		cmp bl,'f'
1265
		jg @f
1266
		cmp bl,'9'
1267
		jle .us1
1268
			cmp bl,'A'
1269
			jl @f ;отсеиваем символы >'9' и <'A'
1270
		.us1: ;составное условие
1271
		cmp bl,'F'
1272
		jle .us2
1273
			cmp bl,'a'
1274
			jl @f ;отсеиваем символы >'F' и <'a'
1275
			sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
1276
		.us2: ;составное условие
1277
			sub bl,'0'
1278
			cmp bl,9
1279
			jle .cor1
1280
				sub bl,7 ;convert 'A' to '10'
1281
			.cor1:
1282
			shl eax,4
1283
			add eax,ebx
1284
			inc esi
1285
			jmp .cycle_16
1286
	@@:
1287
	cmp ecx,0 ;если число отрицательное
1288
	jne @f
1289
		sub ecx,eax
1290
		mov eax,ecx
1291
	@@:
1292
	pop esi ecx ebx
1293
	ret
1294
endp
1295
 
1296
msgbox_0:
1297
	db 1,0
1298
	db 'Внимание',0
1299
	db 'Размер верхнего изображения не коректный',0
1300
	db 'Закрыть',0
1301
	db 0
1302
 
1303
msgbox_1:
1304
	db 1,0
1305
	db 'Внимание',0
1306
	db 'Размер бокового изображения не коректный',0
1307
	db 'Закрыть',0
1308
	db 0
1309
 
1310
msgbox_2:
1311
	db 1,0
1312
	db 'Внимание',0
1313
	db 'Размер переднего изображения не коректный',0
1314
	db 'Закрыть',0
1315
	db 0
1316
 
1317
msgbox_3:
1318
	db 1,0
1319
	db 'Внимание',0
1320
	db 'Размеры верхнего и бокового изображений не совпадают',13,\
1321
		'Откройте изображения одинаковых размеров',0
1322
	db 'Закрыть',0
1323
	db 0
1324
 
1325
msgbox_4:
1326
	db 1,0
1327
	db 'Внимание',0
1328
	db 'Открываемый файл содержит не воксельный формат',0
1329
	db 'Закрыть',0
1330
	db 0
1331
 
1332
;данные для диалога открытия файлов
1333
align 4
1334
OpenDialog_data:
1335
.type			dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
1336
.procinfo		dd procinfo	;+4
1337
.com_area_name		dd communication_area_name	;+8
1338
.com_area		dd 0	;+12
1339
.opendir_path		dd plugin_path	;+16
1340
.dir_default_path	dd default_dir ;+20
1341
.start_path		dd file_name ;+24 путь к диалогу открытия файлов
1342
.draw_window		dd draw_window	;+28
1343
.status 		dd 0	;+32
1344
.openfile_path		dd openfile_path	;+36 путь к открываемому файлу
1345
.filename_area		dd filename_area	;+40
1346
.filter_area		dd Filter
1347
.x:
1348
.x_size 		dw 420 ;+48 ; Window X size
1349
.x_start		dw 10 ;+50 ; Window X position
1350
.y:
1351
.y_size 		dw 320 ;+52 ; Window y size
1352
.y_start		dw 10 ;+54 ; Window Y position
1353
 
1354
default_dir db '/rd/1',0
1355
 
1356
communication_area_name:
1357
	db 'FFFFFFFF_open_dialog',0
1358
open_dialog_name:
1359
	db 'opendial',0
1360
communication_area_default_path:
1361
	db '/rd/1/File managers/',0
1362
 
1363
Filter:
1364
dd Filter.end - Filter ;.1
1365
.1:
1366
db 'PNG',0
1367
db 'JPG',0
1368
db 'JPEG',0
1369
db 'BMP',0
1370
db 'GIF',0
1371
db 'VOX',0
1372
.end:
1373
db 0
1374
 
1375
 
1376
 
1377
head_f_i:
1378
head_f_l db 'Системная ошибка',0
1379
 
1380
system_dir_0 db '/sys/lib/'
1381
lib_name_0 db 'proc_lib.obj',0
1382
err_message_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0
1383
err_message_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
1384
 
1385
system_dir_1 db '/sys/lib/'
1386
lib_name_1 db 'libimg.obj',0
1387
err_message_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,0
1388
err_message_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,0
1389
 
1390
system_dir_2 db '/sys/lib/'
1391
lib_name_2 db 'buf2d.obj',0
1392
err_msg_found_lib_2 db 'Не найдена библиотека ',39,'buf2d.obj',39,0
1393
err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,0
1394
 
1395
system_dir_3 db '/sys/lib/'
1396
lib_name_3 db 'msgbox.obj',0
1397
err_msg_found_lib_3 db 'Не найдена библиотека ',39,'msgbox.obj',39,0
1398
err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'msgbox',39,0
1399
 
1400
l_libs_start:
1401
	lib_0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
1402
		err_message_found_lib_0, head_f_l, proclib_import,err_message_import_0, head_f_i
1403
	lib_1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\
1404
		err_message_found_lib_1, head_f_l, import_libimg, err_message_import_1, head_f_i
1405
	lib_2 l_libs lib_name_2, sys_path, library_path, system_dir_2,\
1406
		err_msg_found_lib_2,head_f_l,import_buf2d,err_msg_import_2,head_f_i
1407
	lib_3 l_libs lib_name_3, sys_path, library_path, system_dir_3,\
1408
		err_msg_found_lib_3,head_f_l,import_msgbox_lib,err_msg_import_3,head_f_i
1409
l_libs_end:
1410
 
1411
align 4
1412
import_libimg:
1413
	dd alib_init1
1414
	img_is_img  dd aimg_is_img
1415
	img_info    dd aimg_info
1416
	img_from_file dd aimg_from_file
1417
	img_to_file dd aimg_to_file
1418
	img_from_rgb dd aimg_from_rgb
1419
	img_to_rgb  dd aimg_to_rgb
1420
	img_to_rgb2 dd aimg_to_rgb2
1421
	img_decode  dd aimg_decode
1422
	img_encode  dd aimg_encode
1423
	img_create  dd aimg_create
1424
	img_destroy dd aimg_destroy
1425
	img_destroy_layer dd aimg_destroy_layer
1426
	img_count   dd aimg_count
1427
	img_lock_bits dd aimg_lock_bits
1428
	img_unlock_bits dd aimg_unlock_bits
1429
	img_flip    dd aimg_flip
1430
	img_flip_layer dd aimg_flip_layer
1431
	img_rotate  dd aimg_rotate
1432
	img_rotate_layer dd aimg_rotate_layer
1433
	img_draw    dd aimg_draw
1434
 
1435
	dd 0,0
1436
	alib_init1   db 'lib_init',0
1437
	aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
1438
	aimg_info    db 'img_info',0
1439
	aimg_from_file db 'img_from_file',0
1440
	aimg_to_file db 'img_to_file',0
1441
	aimg_from_rgb db 'img_from_rgb',0
1442
	aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
1443
	aimg_to_rgb2 db 'img_to_rgb2',0
1444
	aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
1445
	aimg_encode  db 'img_encode',0
1446
	aimg_create  db 'img_create',0
1447
	aimg_destroy db 'img_destroy',0
1448
	aimg_destroy_layer db 'img_destroy_layer',0
1449
	aimg_count   db 'img_count',0
1450
	aimg_lock_bits db 'img_lock_bits',0
1451
	aimg_unlock_bits db 'img_unlock_bits',0
1452
	aimg_flip    db 'img_flip',0
1453
	aimg_flip_layer db 'img_flip_layer',0
1454
	aimg_rotate  db 'img_rotate',0
1455
	aimg_rotate_layer db 'img_rotate_layer',0
1456
	aimg_draw    db 'img_draw',0
1457
 
1458
align 4
1459
proclib_import: ;описание экспортируемых функций
1460
	OpenDialog_Init dd aOpenDialog_Init
1461
	OpenDialog_Start dd aOpenDialog_Start
1462
dd 0,0
1463
	aOpenDialog_Init db 'OpenDialog_init',0
1464
	aOpenDialog_Start db 'OpenDialog_start',0
1465
 
1466
align 4
1467
import_buf2d:
1468
	init dd sz_init
1469
	buf2d_create dd sz_buf2d_create
1470
	buf2d_create_f_img dd sz_buf2d_create_f_img
1471
	buf2d_clear dd sz_buf2d_clear
1472
	buf2d_draw dd sz_buf2d_draw
1473
	buf2d_delete dd sz_buf2d_delete
1474
	buf2d_resize dd sz_buf2d_resize
1475
	buf2d_line dd sz_buf2d_line
1476
	buf2d_rect_by_size dd sz_buf2d_rect_by_size
1477
	buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
1478
	buf2d_circle dd sz_buf2d_circle
1479
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
1480
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
1481
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
1482
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
1483
	buf2d_bit_blt dd sz_buf2d_bit_blt
1484
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
1485
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
1486
	buf2d_curve_bezier dd sz_buf2d_curve_bezier
1487
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
1488
	buf2d_draw_text dd sz_buf2d_draw_text
1489
	buf2d_crop_color dd sz_buf2d_crop_color
1490
	buf2d_offset_h dd sz_buf2d_offset_h
1491
	buf2d_flood_fill dd sz_buf2d_flood_fill
1492
	buf2d_set_pixel dd sz_buf2d_set_pixel
1493
	buf2d_get_pixel dd sz_buf2d_get_pixel
1494
	buf2d_vox_brush_create dd sz_buf2d_vox_brush_create
1495
	buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete
1496
	buf2d_vox_obj_get_img_w_3g dd sz_buf2d_vox_obj_get_img_w_3g
1497
	buf2d_vox_obj_get_img_h_3g dd sz_buf2d_vox_obj_get_img_h_3g
1498
	buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g
1499
	buf2d_vox_obj_draw_3g dd sz_buf2d_vox_obj_draw_3g
1500
	buf2d_vox_obj_draw_3g_scaled dd sz_buf2d_vox_obj_draw_3g_scaled
1501
	buf2d_vox_obj_draw_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows
1502
	buf2d_vox_obj_draw_pl dd sz_buf2d_vox_obj_draw_pl
1503
	buf2d_vox_obj_draw_pl_scaled dd sz_buf2d_vox_obj_draw_pl_scaled
1504
	dd 0,0
1505
	sz_init db 'lib_init',0
1506
	sz_buf2d_create db 'buf2d_create',0
1507
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
1508
	sz_buf2d_clear db 'buf2d_clear',0
1509
	sz_buf2d_draw db 'buf2d_draw',0
1510
	sz_buf2d_delete db 'buf2d_delete',0
1511
	sz_buf2d_resize db 'buf2d_resize',0
1512
	sz_buf2d_line db 'buf2d_line',0
1513
	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
1514
	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
1515
	sz_buf2d_circle db 'buf2d_circle',0
1516
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
1517
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
1518
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
1519
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
1520
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
1521
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
1522
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
1523
	sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
1524
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
1525
	sz_buf2d_draw_text db 'buf2d_draw_text',0
1526
	sz_buf2d_crop_color db 'buf2d_crop_color',0
1527
	sz_buf2d_offset_h db 'buf2d_offset_h',0
1528
	sz_buf2d_flood_fill db 'buf2d_flood_fill',0
1529
	sz_buf2d_set_pixel db 'buf2d_set_pixel',0
1530
	sz_buf2d_get_pixel db 'buf2d_get_pixel',0
1531
	sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0
1532
	sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0
1533
	sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0
1534
	sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0
1535
	sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0
1536
	sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0
1537
	sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0
1538
	sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0
1539
	sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0
1540
	sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0
1541
 
1542
align 4
1543
import_msgbox_lib:
1544
	mb_create dd amb_create
1545
;	mb_reinit dd amb_reinit
1546
;	mb_setfunctions dd amb_setfunctions
1547
dd 0,0
1548
	amb_create db 'mb_create',0
1549
;	amb_reinit db 'mb_reinit',0
1550
;	amb_setfunctions db 'mb_setfunctions',0
1551
 
1552
mouse_dd dd 0x0
1553
sc system_colors
1554
last_time dd 0
1555
 
1556
align 16
1557
procinfo process_information
1558
 
1559
align 4
1560
buf_0: dd 0
1561
	dw 5 ;+4 left
1562
	dw 35 ;+6 top
1563
.w: dd 6*64 ;+8 w
1564
.h: dd 7*64 ;+12 h
1565
.color: dd 0xffffff ;+16 color
1566
	db 24 ;+20 bit in pixel
1567
 
1568
align 4
1569
buf_0z: dd 0
1570
	dw 5 ;+4 left
1571
	dw 35 ;+6 top
1572
.w: dd 6*64 ;+8 w
1573
.h: dd 7*64 ;+12 h
1574
.color: dd 0 ;+16 color
1575
	db 32 ;+20 bit in pixel
1576
 
1577
align 4
1578
buf_i0: dd 0
1579
	dw 5 ;+4 left
1580
	dw 35 ;+6 top
1581
.w: dd 0 ;+8 w
1582
.h: dd 0 ;+12 h
1583
.color: dd 0 ;+16 color
1584
	db 24 ;+20 bit in pixel
1585
 
1586
align 4
1587
buf_i1: dd 0
1588
	dw 105 ;+4 left
1589
	dw 35 ;+6 top
1590
.w: dd 0 ;+8 w
1591
.h: dd 0 ;+12 h
1592
.color: dd 0 ;+16 color
1593
	db 24 ;+20 bit in pixel
1594
 
1595
align 4
1596
buf_i2: dd 0
1597
	dw 205 ;+4 left
1598
	dw 35 ;+6 top
1599
.w: dd 0 ;+8 w
1600
.h: dd 0 ;+12 h
1601
.color: dd 0 ;+16 color
1602
	db 24 ;+20 bit in pixel
1603
 
1604
align 4
1605
buf_npl_p: dd 0
1606
	dw 0 ;+4 left
1607
	dw 0 ;+6 top
1608
.w: dd 0 ;+8 w
1609
.h: dd 0 ;+12 h
1610
.color: dd 0 ;+16 color
1611
	db 24 ;+20 bit in pixel
1612
 
1613
align 4
1614
buf_npl: dd 0
1615
	dw 5 ;+4 left
1616
	dw 35 ;+6 top
1617
.w: dd 0 ;+8 w
1618
.h: dd 0 ;+12 h
1619
.color: dd 0 ;+16 color
1620
	db 24 ;+20 bit in pixel
1621
 
1622
align 4
1623
buf_npl_n: dd 0
1624
	dw 0 ;+4 left
1625
	dw 0 ;+6 top
1626
.w: dd 0 ;+8 w
1627
.h: dd 0 ;+12 h
1628
.color: dd 0 ;+16 color
1629
	db 24 ;+20 bit in pixel
1630
 
1631
;данные для создания минимального единичного вокселя
1632
align 4
1633
vox_6_7_z:
1634
dd 0,0,1,1,0,0,\
1635
   0,2,2,2,2,0,\
1636
   2,2,2,2,2,2,\
1637
   2,3,2,2,3,2,\
1638
   2,3,3,3,3,2,\
1639
   0,3,3,3,3,0,\
1640
   0,0,3,3,0,0
1641
 
1642
align 4
1643
buf_vox:
1644
	db 6,7,4,3 ;w,h,h_osn,n
1645
	rb BUF_STRUCT_SIZE*(2+1)
1646
 
1647
 
1648
 
1649
;этот код не мой, он преобразует число в строку
1650
;input:
1651
; eax = value
1652
; edi = string buffer
1653
;output:
1654
align 4
1655
tl_convert_to_str:
1656
	pushad
1657
		mov dword[edi+1],0
1658
		call .str
1659
	popad
1660
	ret
1661
 
1662
align 4
1663
.str:
1664
	mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
1665
    ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1666
	cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
1667
	jb @f
1668
		xor edx,edx  ;очистить edx
1669
		div ecx      ;разделить - остаток в edx
1670
		push edx     ;положить в стек
1671
		;dec edi             ;смещение необходимое для записи с конца строки
1672
		call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1673
		pop eax
1674
	@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
1675
	or al,0x30  ;данная команда короче  чем две выше
1676
	stosb	    ;записать элемент из регистра al в ячеку памяти es:edi
1677
	ret	      ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
1678
 
1679
i_end:
1680
		rb 1024
1681
	thread:
1682
		rb 1024
1683
stacktop:
1684
	sys_path rb 1024
1685
	file_name:
1686
		rb 1024 ;4096
1687
	library_path rb 1024
1688
	plugin_path rb 4096
1689
	openfile_path rb 4096
1690
	filename_area rb 256
1691
mem: