Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2051 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 '../../macros.inc'
13
include '../../proc32.inc'
14
include '../../develop/libraries/box_lib/load_lib.mac'
15
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
3014 dunkaist 16
include '../../dll.inc'
2051 IgorA 17
include 'lang.inc'
2165 IgorA 18
include 'info_fun_float.inc'
2051 IgorA 19
 
20
debug equ 0
21
 
22
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
23
 
24
struct FileInfoBlock
25
	Function dd ?
26
	Position dd ?
27
	Flags	 dd ?
28
	Count	 dd ?
29
	Buffer	 dd ?
30
		db ?
31
	FileName dd ?
32
ends
33
 
34
run_file_70 FileInfoBlock
35
image_data dd 0 ;указатель на временную память. для нужен преобразования изображения
36
open_file_lif dd 0 ;указатель на память для открытия файлов 3ds
4332 IgorA 37
open_file_size dd 0 ;размер открытого файла
2051 IgorA 38
 
39
;
40
fn_toolbar db 'toolbar.png',0
41
IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
42
IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*7
43
image_data_toolbar dd 0
44
;
45
TREE_ICON_SYS16_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*11+54 ;размер bmp файла с системными иконками
46
icon_tl_sys dd 0 ;указатеель на память для хранения системных иконок
47
icon_toolbar dd 0 ;указатеель на память для хранения иконок объектов
4332 IgorA 48
TOOLBAR_ICON_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*8+54 ;размер bmp файла с иконками объектов
2051 IgorA 49
;
2080 IgorA 50
IMAGE_FILE1_SIZE equ 128*144*3+54 ;размер файла с изображением
2051 IgorA 51
 
52
macro load_image_file path,buf,size { ;макрос для загрузки изображений
53
	;path - может быть переменной или строковым параметром
54
	if path eqtype '' ;проверяем задан ли строкой параметр path
55
		jmp @f
56
			local .path_str
57
			.path_str db path ;формируем локальную переменную
58
			db 0
59
		@@:
60
		;32 - стандартный адрес по которому должен быть буфер с системным путем
61
		copy_path .path_str,[32],file_name,0x0
62
	else
63
		copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
64
	end if
65
 
66
	stdcall mem.Alloc, dword size ;выделяем память для изображения
67
	mov [buf],eax
68
 
69
	mov eax,70 ;70-я функция работа с файлами
70
	mov [run_file_70.Function], 0
71
	mov [run_file_70.Position], 0
72
	mov [run_file_70.Flags], 0
73
	mov [run_file_70.Count], dword size
74
	m2m [run_file_70.Buffer], [buf]
75
	mov byte[run_file_70+20], 0
76
	mov [run_file_70.FileName], file_name
77
	mov ebx,run_file_70
78
	int 0x40 ;загружаем файл изображения
79
	cmp ebx,0xffffffff
80
	je @f
81
		;определяем вид изображения и переводим его во временный буфер image_data
82
		stdcall dword[img_decode], dword[buf],ebx,0
83
		mov dword[image_data],eax
84
		;преобразуем изображение к формату rgb
85
		stdcall dword[img_to_rgb2], dword[image_data],dword[buf]
86
		;удаляем временный буфер image_data
87
		stdcall dword[img_destroy], dword[image_data]
88
	@@:
89
}
90
 
91
;--------------------------------------
2107 IgorA 92
include 'data.inc'
2051 IgorA 93
 
94
level_stack dd 0
95
offs_last_timer dd 0 ;последний сдвиг показаный в функции таймера
96
 
2052 IgorA 97
ID_ICON_CHUNK_MAIN equ 0 ;иконка главного блока
98
ID_ICON_CHUNK_NOT_FOUND equ 1 ;иконка не известного блока
99
ID_ICON_DATA equ 2 ;иконка для данных блока, не определенной структуры
2051 IgorA 100
 
2052 IgorA 101
FILE_ERROR_CHUNK_SIZE equ -3 ;ошибка в размере блока
102
 
2051 IgorA 103
align 4
4332 IgorA 104
file_3ds: ;переменные используемые при открытии файла
2051 IgorA 105
.offs: dd 0 ;+0 указатель на начало блока
106
.size: dd 0 ;+4 размер блока (для 1-го параметра = размер файла 3ds)
2080 IgorA 107
rb 8*MAX_FILE_LEVEL
2051 IgorA 108
 
4332 IgorA 109
size_one_list equ 42
110
list_offs_chunk_del equ 8 ;может ли блок удалятся
111
list_offs_chunk_lev equ 9 ;уровень блока (прописан в данные узла)
112
list_offs_p_data equ 10 ;указатель на подпись блока
113
list_offs_text equ 14 ;сдвиг начала текста в листе
2051 IgorA 114
buffer rb size_one_list ;буфер для добавления структур в список tree1
115
 
116
txt_3ds_symb db 0,0
117
;--------------------------------------
118
 
2165 IgorA 119
include 'info_wnd_coords.inc'
2051 IgorA 120
 
121
align 4
122
start:
123
	load_libraries l_libs_start,l_libs_end
124
	;проверка на сколько удачно загузилась наша либа
125
	mov	ebp,lib_7
126
	cmp	dword [ebp+ll_struc_size-4],0
127
	jz	@f
128
		mcall -1 ;exit not correct
129
	@@:
130
	mcall 48,3,sc,sizeof.system_colors
131
	mcall 40,0x27
132
	stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
133
 
134
	stdcall dword[tl_data_init], tree1
135
	;системные иконки 16*16 для tree_list
136
	load_image_file 'tl_sys_16.png', icon_tl_sys,TREE_ICON_SYS16_BMP_SIZE
137
	;если изображение не открылось, то в icon_tl_sys будут
138
	;не инициализированные данные, но ошибки не будет, т. к. буфер нужного размера
139
	mov eax,dword[icon_tl_sys]
140
	mov dword[tree1.data_img_sys],eax
141
 
142
	load_image_file 'objects.png', icon_toolbar,TOOLBAR_ICON_BMP_SIZE
143
	mov eax,dword[icon_toolbar]
144
	mov dword[tree1.data_img],eax
145
 
146
	stdcall [buf2d_create], buf_0 ;создание буфера
147
 
148
	load_image_file 'font8x9.bmp', image_data_toolbar,IMAGE_FILE1_SIZE
149
	stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер
150
	stdcall mem.Free,[image_data_toolbar] ;освобождаем память
151
	stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит
152
	stdcall [buf2d_convert_text_matrix], buf_1
153
 
154
	load_image_file fn_toolbar, image_data_toolbar,IMAGE_TOOLBAR_SIZE
155
 
156
	stdcall mem.Alloc,MAX_FILE_SIZE
157
	mov dword[open_file_lif],eax
158
 
159
	mcall 26,9
160
	mov [last_time],eax
161
 
162
align 4
163
red_win:
164
	call draw_window
165
 
166
align 4
167
still:
168
	mcall 26,9
169
	mov ebx,[last_time]
170
	add ebx,10 ;задержка
171
	cmp ebx,eax
172
	jge @f
173
		mov ebx,eax
174
	@@:
175
	sub ebx,eax
176
	;cmp ebx,10 ;задержка
177
	;ja timer_funct
178
	;test ebx,ebx
179
	;jz timer_funct
180
	mcall 23
181
	cmp eax,0
182
	je timer_funct
183
 
184
	cmp al,1
185
	jz red_win
186
	cmp al,2
187
	jz key
188
	cmp al,3
189
	jz button
190
	cmp al,6
2125 IgorA 191
	jne @f
192
		mcall 9,procinfo,-1
193
		cmp ax,word[procinfo+4]
194
		jne @f ;окно не активно
2051 IgorA 195
		call mouse
196
	@@:
197
	jmp still
198
 
199
align 4
200
mouse:
201
	stdcall [tl_mouse], dword tree1
202
	ret
203
 
204
align 4
205
timer_funct:
206
	pushad
2080 IgorA 207
if debug
208
	mov eax,4
209
	mov ebx,(5 shl 16)+8
210
	mov ecx,0xff+0x80000000
211
	mov edx,txt_0002
212
	int 0x40
213
end if
2051 IgorA 214
	mcall 26,9
215
	mov [last_time],eax
216
 
217
	;
218
	stdcall [tl_node_get_data],tree1
219
	pop ebx
220
	cmp ebx,0
221
	je @f
222
		mov eax,dword[ebx] ;получаем значение сдвига выбранного блока относительно начала файла
2125 IgorA 223
		mov ecx,dword[ebx+4] ;размер блока
2051 IgorA 224
		stdcall hex_in_str, txt_3ds_offs.dig, eax,8
2125 IgorA 225
		stdcall hex_in_str, txt_3ds_offs.siz, ecx,8
2051 IgorA 226
 
227
		add eax,dword[open_file_lif] ;получаем значение сдвига в памяти
228
		cmp dword[offs_last_timer],eax
229
		je @f
230
			mov dword[offs_last_timer],eax
231
			call buf_draw_beg
2080 IgorA 232
			stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_offs,5,35,0xb000
4332 IgorA 233
			mov edx,dword[ebx+list_offs_p_data]
2080 IgorA 234
			cmp edx,0 ;смотрим есть ли описание блока
235
			je .no_info
236
				stdcall [buf2d_draw_text], buf_0, buf_1,edx,5,45,0xb000
237
			.no_info:
2051 IgorA 238
			add ecx,eax ;получаем размер блока
239
			stdcall buf_draw_hex_table,eax,ecx ;добавление 16-ричных данных
240
			stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
241
	@@:
242
	popad
243
	jmp still
244
 
245
align 4
246
buf_draw_beg:
247
	stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
248
	stdcall [buf2d_draw_text], buf_0, buf_1,txt_open_3ds,5,5,0xff
249
	stdcall [buf2d_draw_text], buf_0, buf_1,openfile_path,5,15,0xff
2052 IgorA 250
	cmp dword[level_stack],FILE_ERROR_CHUNK_SIZE ;возможна ошибка файла
251
	jne @f
252
		stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_err_sizes,5,25,0xff0000
253
	@@:
2051 IgorA 254
	ret
255
 
256
align 4
257
proc buf_draw_hex_table, offs:dword, size_line:dword
258
	pushad
259
	locals
2080 IgorA 260
		coord_y dd 55 ;координата y для начала вывода таблицы
2051 IgorA 261
	endl
262
		mov esi,dword[offs]
263
		mov edi,dword[open_file_lif]
2080 IgorA 264
		add edi,dword[file_3ds.size] ;edi - указатель на конец файла в памяти
2051 IgorA 265
		mov dword[txt_3ds_offs.dig],0
266
		cld
267
		.cycle_rows:
268
			mov ebx,5 ;отступ слева для цифр
269
			mov edx,5+10*24 ;отступ слева для текста
270
			mov ecx,10
271
			@@:
272
				stdcall hex_in_str, txt_3ds_offs.dig, dword[esi],2
273
				stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_offs.dig,ebx,[coord_y],0
274
 
275
				mov al,byte[esi]
276
				mov byte[txt_3ds_symb],al
277
				stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_symb,edx,[coord_y],0x808080
278
				inc esi
279
				cmp esi,dword[size_line]
280
				jne .end_block
281
					stdcall draw_block_end_line, dword[coord_y]
282
				.end_block:
283
				cmp esi,edi
284
				jge @f ;jg ???
285
				add ebx,24
286
				add edx,9 ;ширина 1-го символа +1pix
287
				loop @b
288
			add dword[coord_y],10 ;высота 1-го символа (или интервал между строками)
289
			mov ebx,dword[buf_0.h]
290
			cmp dword[coord_y],ebx
291
			jl .cycle_rows
292
		@@:
293
	popad
294
	ret
295
endp
296
 
297
align 4
298
proc draw_block_end_line, coord_y:dword
299
	push eax ebx ecx
300
		add ebx,20 ;20 = width 2.5 symbols
301
		mov eax,[coord_y]
302
		sub eax,2
303
		mov ecx,eax
304
		add ecx,10
305
		stdcall [buf2d_line], buf_0, 0,ecx,ebx,ecx ,0xff
306
		stdcall [buf2d_line], buf_0, ebx,ecx,ebx,eax ,0xff
307
		stdcall [buf2d_line], buf_0, ebx,eax,5+10*24-4,eax ,0xff
308
	pop ecx ebx eax
309
	ret
310
endp
311
 
312
align 4
313
draw_window:
314
pushad
315
	mcall 12,1
316
	xor eax,eax
2052 IgorA 317
	mov ebx,(20 shl 16)+560
2051 IgorA 318
	mov ecx,(20 shl 16)+315
319
	mov edx,[sc.work]
320
	or  edx,(3 shl 24)+0x10000000+0x20000000
321
	mov edi,capt
322
	int 0x40
323
 
2125 IgorA 324
	mcall 9,procinfo,-1
325
	mov eax,dword[procinfo.box.height]
326
	cmp eax,250
327
	jge @f
328
		mov eax,250
329
	@@:
330
	sub eax,65
331
	mov dword[tree1.box_height],eax
332
	mov word[w_scr_t1+4],ax ;новые размеры скроллинга
2136 IgorA 333
	cmp eax,dword[buf_0.h] ;увеличиваем высоту буфера
334
	jle @f
335
		stdcall [buf2d_resize],buf_0,0,eax
336
		mov dword[offs_last_timer],0 ;для обновления буфера в таймере
337
	@@:
2125 IgorA 338
 
2136 IgorA 339
	mov eax,dword[procinfo.box.width]
340
	cmp eax,400
341
	jge @f
342
		mov eax,400
343
	@@:
344
	sub eax,[buf_0.w]
345
	sub eax,41
346
	mov dword[tree1.box_width],eax
347
	add ax,word[tree1.box_left]
348
	mov word[w_scr_t1.start_x],ax
349
	add ax,16+5
350
	mov word[buf_0.l],ax
351
 
2051 IgorA 352
	mov eax,8
353
	mov ebx,(5 shl 16)+20
354
	mov ecx,(5 shl 16)+20
355
	mov edx,3
356
	mov esi,[sc.work_button]
357
	int 0x40
358
 
359
	mov ebx,(30 shl 16)+20
360
	mov edx,4
361
	int 0x40
362
 
2173 IgorA 363
	cmp byte[can_save],0
364
	je @f
365
		mov ebx,(55 shl 16)+20
366
		mov edx,5
367
		int 0x40
368
	@@:
2051 IgorA 369
 
2165 IgorA 370
	mov ebx,(85 shl 16)+20
371
	mov edx,6 ;окно с координатами
372
	int 0x40
2051 IgorA 373
 
4332 IgorA 374
	mov ebx,(110 shl 16)+20
375
	mov edx,7 ;удаление блока
376
	int 0x40
377
 
2051 IgorA 378
	mov eax,7
379
	mov ebx,[image_data_toolbar]
380
	mov ecx,(16 shl 16)+16
381
	mov edx,(7 shl 16)+7 ;new
382
	int 0x40
383
 
384
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
385
	mov edx,(32 shl 16)+7 ;open
386
	int 0x40
387
 
2173 IgorA 388
	cmp byte[can_save],0
389
	je @f
390
		add ebx,IMAGE_TOOLBAR_ICON_SIZE
391
		mov edx,(57 shl 16)+7 ;save
392
		int 0x40
4332 IgorA 393
		sub ebx,IMAGE_TOOLBAR_ICON_SIZE
2173 IgorA 394
	@@:
2051 IgorA 395
 
4332 IgorA 396
	add ebx,4*IMAGE_TOOLBAR_ICON_SIZE
397
	mov edx,(87 shl 16)+7
398
	int 0x40
399
 
400
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
401
	mov edx,(112 shl 16)+7
402
	int 0x40
403
 
2051 IgorA 404
	mov dword[w_scr_t1.all_redraw],1
405
	stdcall [tl_draw],dword tree1
406
 
407
	stdcall [buf2d_draw], buf_0
408
 
409
	mcall 12,2
410
popad
411
	ret
412
 
413
align 4
414
key:
415
	mcall 2
416
	stdcall [tl_key], dword tree1
417
	jmp still
418
 
419
 
420
align 4
421
button:
422
	mcall 17
423
	cmp ah,3
424
	jne @f
425
		call but_new_file
426
	@@:
427
	cmp ah,4
428
	jne @f
429
		call but_open_file
430
	@@:
431
	cmp ah,5
432
	jne @f
433
		call but_save_file
434
	@@:
2165 IgorA 435
	cmp ah,6
436
	jne @f
437
		call but_wnd_coords
438
	@@:
4332 IgorA 439
	cmp ah,7
440
	jne @f
441
		call but_delete_chunk
442
	@@:
2051 IgorA 443
 
444
	cmp ah,1
445
	jne still
446
.exit:
447
	mov dword[tree1.data_img],0
448
	mov dword[tree1.data_img_sys],0
449
	stdcall dword[tl_data_clear], tree1
450
	stdcall [buf2d_delete],buf_0
451
	stdcall [buf2d_delete],buf_1 ;удаляем буфер
452
	stdcall mem.Free,[image_data_toolbar]
453
	stdcall mem.Free,[open_file_lif]
454
	mcall -1
455
 
456
 
457
align 4
458
but_new_file:
2173 IgorA 459
	mov byte[can_save],0
2051 IgorA 460
	stdcall [tl_info_clear], tree1 ;очистка списка объектов
461
	stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
462
	stdcall [tl_draw], tree1
463
	stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
464
	ret
465
 
466
align 4
467
but_open_file:
468
	pushad
469
	copy_path open_dialog_name,communication_area_default_path,file_name,0
470
	mov [OpenDialog_data.type],0
471
	stdcall [OpenDialog_Start],OpenDialog_data
472
	cmp [OpenDialog_data.status],2
473
	je .end_open_file
474
	;код при удачном открытии диалога
475
 
476
	mov eax,70 ;70-я функция работа с файлами
477
	mov [run_file_70.Function], 0
478
	mov [run_file_70.Position], 0
479
	mov [run_file_70.Flags], 0
480
	mov dword[run_file_70.Count], MAX_FILE_SIZE
481
	m2m [run_file_70.Buffer], dword[open_file_lif]
482
	mov byte[run_file_70+20], 0
483
	mov dword[run_file_70.FileName], openfile_path
484
	mov ebx,run_file_70
485
	int 0x40 ;загружаем файл изображения
486
	cmp ebx,0xffffffff
487
	je .end_open_file
488
 
4332 IgorA 489
	mov [open_file_size],ebx
2051 IgorA 490
	;mcall 71,1,openfile_path
491
 
2173 IgorA 492
	mov byte[can_save],0
4332 IgorA 493
	call init_tree
494
	stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
495
 
496
	.end_open_file:
497
	popad
498
	ret
499
 
500
align 4
501
init_tree:
2051 IgorA 502
	stdcall [tl_info_clear], tree1 ;очистка списка объектов
503
 
504
	mov esi,dword[open_file_lif]
505
	cmp word[esi],CHUNK_MAIN
506
	je @f
507
		call buf_draw_beg
508
		stdcall [buf2d_draw_text], buf_0, buf_1,txt_no_3ds,5,25,0xff0000 ;рисуем строку с текстом
509
		jmp .end_open
510
	@@:
511
	cmp dword[esi+2],MAX_FILE_SIZE
512
	jle @f
513
		call buf_draw_beg
514
		stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_big_file,5,25,0xff0000 ;рисуем строку с текстом
515
		jmp .end_open
516
	@@:
517
	;--- обработка открытого *.3ds файла
518
	mov eax,file_3ds
519
	mov dword[level_stack],0 ;обнуляем уровень стека
520
	mov dword[offs_last_timer],0
521
	;--- добавление главного блока в список
2080 IgorA 522
	stdcall add_3ds_object, ID_ICON_CHUNK_MAIN,0,dword[esi+2],0
2051 IgorA 523
	call block_children ;вход в дочерний блок
524
 
2052 IgorA 525
	mov edi,dword[file_3ds.offs]
526
	add edi,dword[file_3ds.size]
2051 IgorA 527
	.cycle_main:
528
		cmp dword[level_stack],0
2052 IgorA 529
		jle .end_cycle
530
 
531
		cmp esi,edi ;если конец файла
532
		jge .end_cycle
2051 IgorA 533
 
2080 IgorA 534
		mov edx,dword[esi+2] ;размер блока
2051 IgorA 535
		call block_analiz
2080 IgorA 536
		cmp dword[bl_found],0
2051 IgorA 537
		jne @f
538
			;объект не известного вида
2080 IgorA 539
			stdcall add_3ds_object, ID_ICON_CHUNK_NOT_FOUND,dword[level_stack],edx,0
2051 IgorA 540
			call block_next
541
			jmp .cycle_main
542
		@@:
543
			;объект известного вида
2080 IgorA 544
			mov ecx,dword[bl_found]
2051 IgorA 545
			mov bx,word[ecx+2] ;номер иконки для объекта
2080 IgorA 546
			stdcall add_3ds_object, ebx,dword[level_stack],edx,dword[ecx+5]
2051 IgorA 547
			cmp byte[ecx+4],1
548
			je .bl_data
549
				;блок содержит дочерние блоки
550
				call block_children ;вход в дочерний блок
551
				jmp .cycle_main
552
			.bl_data:
553
				;блок содержит данные
554
				call block_analiz_data
555
				jmp .cycle_main
556
	.end_cycle:
557
		stdcall [tl_cur_beg], tree1
558
		stdcall [tl_draw], tree1
559
	.end_open:
560
	ret
561
 
562
;анализ данных блока
563
;input:
564
; esi - memory pointer
2080 IgorA 565
;output:
566
; eax - new stack pointer
567
; esi - new memory pointer
2051 IgorA 568
align 4
569
block_analiz_data:
2080 IgorA 570
	push ebx ecx edx edi
571
		mov dx,word[esi]
2052 IgorA 572
		mov ecx,dword[esi+2]
573
		sub ecx,6 ;размер данных в блоке
2051 IgorA 574
		add esi,6
575
		mov ebx,dword[level_stack]
576
		inc ebx
2080 IgorA 577
		; *** анализ блоков с разными данными и выделением подблоков
578
		cmp dx,CHUNK_OBJBLOCK ;объект
579
		jne @f
2136 IgorA 580
			push ax
581
				cld
582
				xor al,al
583
				mov edi,esi
584
				repne scasb
585
			pop ax
586
			sub edi,esi ;edi - strlen
587
			stdcall add_3ds_object, ID_ICON_DATA,ebx,edi,0 ;название объекта
588
			add esi,edi
589
			;sub ecx,edi ;уже сделано в repne
2080 IgorA 590
			jmp .next_bl
591
		@@:
2125 IgorA 592
		cmp dx,CHUNK_VERTLIST ;список вершин
593
		je .vertexes
594
		cmp dx,0x4111 ;флаги вершин
595
		je .vertexes
2136 IgorA 596
		cmp dx,CHUNK_MAPLIST ;текстурные координаты
2125 IgorA 597
		je .vertexes
598
		jmp @f
599
		.vertexes: ;обработка блоков, содержащих данные вершин
2136 IgorA 600
			stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;число вершин
2125 IgorA 601
			add esi,2
602
			sub ecx,2
603
			stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;данные вершин
604
			sub esi,8 ;восстановление esi
605
			call block_next
606
			jmp .end_f
607
		@@:
2136 IgorA 608
		cmp dx,CHUNK_FACELIST ;список граней
609
		jne @f
610
			stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;число граней
611
			push eax
612
			xor eax,eax
613
			mov ax,[esi]
614
			shl eax,3
615
			add esi,2
616
			sub ecx,2
617
			stdcall add_3ds_object, ID_ICON_DATA,ebx,eax,0 ;данные вершин
618
 
619
			sub ecx,eax
620
			cmp ecx,1
621
			jl .data_3 ;проверяем есть ли блок описывающий материал, применяемый к объекту
622
				add esi,eax
623
				pop eax
624
				jmp .next_bl
625
				;stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;данные материала
626
				;sub esi,eax ;восстановление esi
627
			.data_3:
628
 
629
			sub esi,8 ;восстановление esi
630
			pop eax
631
			call block_next
632
			jmp .end_f
633
		@@:
634
		cmp dx,CHUNK_FACEMAT ;материалы граней
635
		jne @f
636
			push ax
637
				cld
638
				xor al,al
639
				mov edi,esi
640
				repne scasb
641
			pop ax
642
			sub edi,esi ;edi - strlen
643
			stdcall add_3ds_object, ID_ICON_DATA,ebx,edi,0 ;название объекта
644
			add esi,edi
645
			;sub ecx,edi ;уже сделано в repne
646
			stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;число граней
647
			add esi,2
648
			sub ecx,2
649
			stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;номера граней, к которым применен материал
650
			sub esi,edi ;восстановление esi (1)
651
			sub esi,8   ;восстановление esi (2)
652
			call block_next
653
			jmp .end_f
654
		@@:
2080 IgorA 655
		; *** анализ блока с данными по умолчанию (без выделения подблоков)
656
			stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0
657
			sub esi,6 ;восстановление esi
658
			call block_next
659
			jmp .end_f
660
		.next_bl:
661
		; *** настройки для анализа оставшихся подблоков
662
			mov dword[eax],esi ;указатель на начало блока
663
			mov ebx,dword[esi+2]
664
			mov dword[eax+4],ebx ;размер блока
665
			inc dword[level_stack]
666
			add eax,8
2051 IgorA 667
		.end_f:
2080 IgorA 668
	pop edi edx ecx ebx
2051 IgorA 669
	ret
670
 
2052 IgorA 671
;вход в 1-й дочерний блок
672
;output:
673
; edx - destroy
2051 IgorA 674
align 4
675
block_children:
2052 IgorA 676
	push ecx
677
		;проверка правильности размеров дочернего блока
678
		mov ebx,esi ;смещение начала родительского блока
679
		add ebx,6 ;переход на начало дочернего блока
680
		add ebx,dword[ebx+2] ;добавляем размер дочернего блока
681
		mov ecx,esi ;смещение начала родительского блока
682
		add ecx,dword[esi+2] ;добавляем размер родительского блока
683
		cmp ebx,ecx ;учитывать заголовки не нужно, т. к. сравниваются только данные блоков
684
		jle @f
685
			;диагностировали ошибку файла, дочерний блок выходит за пределы родительского
686
			mov dword[level_stack],FILE_ERROR_CHUNK_SIZE
687
			jmp .end_f
688
		@@:
689
		mov dword[eax],esi ;указатель на начало блока
690
		mov ebx,dword[esi+2]
691
		mov dword[eax+4],ebx ;размер блока
692
		add esi,6 ;переходим к данным блока
693
		inc dword[level_stack]
694
		add eax,8
695
	.end_f:
696
	pop ecx
2051 IgorA 697
	ret
698
 
699
;переход к следущему блоку текущего уровня
4332 IgorA 700
;input:
701
; eax - адрес структуры с переменными
2051 IgorA 702
align 4
703
block_next:
704
push ebx
705
	add esi,dword[esi+2] ;пропускаем данные блока
706
 
707
	;проверка размеров родительского блока, для возможного выхода на верхний уровень если конец блока
2080 IgorA 708
	@@:
2051 IgorA 709
	mov ebx,dword[eax-8]
710
	add ebx,dword[eax-4]
711
	cmp esi,ebx
712
	jl @f
713
		dec dword[level_stack]
714
		sub eax,8
2080 IgorA 715
		cmp dword[level_stack],0
716
		jg @b
2051 IgorA 717
	@@:
718
pop ebx
719
	ret
720
 
2080 IgorA 721
;функция поиска структуры описывающей блок
2051 IgorA 722
;input:
723
;esi - memory pointer
724
;output:
2080 IgorA 725
;dword[bl_found] - pointer to chunk struct (= 0 if not found)
2051 IgorA 726
align 4
2080 IgorA 727
bl_found dd 0
2051 IgorA 728
block_analiz:
729
pushad
2080 IgorA 730
	mov dword[bl_found],0
2051 IgorA 731
	mov ecx,type_bloks
732
	@@:
733
		mov bx,word[ecx]
734
		cmp word[esi],bx
735
		je .found
736
		add ecx,sizeof.block_3ds
737
		cmp ecx,type_bloks.end
738
		jl @b
739
	jmp .no_found
740
	.found:
2080 IgorA 741
		mov dword[bl_found],ecx
2051 IgorA 742
	.no_found:
743
popad
744
	ret
745
 
746
;input:
747
; esi - указатель на анализируемые данные
4332 IgorA 748
; level - уровень вложенности узла
749
; size_bl - размер блока
2051 IgorA 750
align 4
2080 IgorA 751
proc add_3ds_object, icon:dword,level:dword,size_bl:dword,info_bl:dword
2051 IgorA 752
	pushad
753
		mov bx,word[icon]
754
		shl ebx,16
755
		mov bx,word[level]
756
 
757
		mov eax,esi
758
		sub eax,dword[open_file_lif]
759
		mov dword[buffer],eax ;смещение блока
760
		mov ecx,dword[size_bl]
761
		mov dword[buffer+4],ecx ;размер блока (используется в функции buf_draw_hex_table для рисования линии)
4332 IgorA 762
		mov ecx,dword[bl_found]
763
		cmp ecx,0
764
		je @f
765
			;... здесь нужен другой алгоритм защиты от удаления
766
			mov cl,byte[ecx+4]
767
		@@:
768
		mov byte[buffer+list_offs_chunk_del],cl
769
		mov ecx,[level]
770
		mov byte[buffer+list_offs_chunk_lev],cl
2080 IgorA 771
		mov ecx,dword[info_bl]
4332 IgorA 772
		mov dword[buffer+list_offs_p_data],ecx
2080 IgorA 773
		stdcall hex_in_str, buffer+list_offs_text,dword[esi+1],2
774
		stdcall hex_in_str, buffer+list_offs_text+2,dword[esi],2 ;код 3ds блока
775
		cmp ecx,0
776
		jne @f
4332 IgorA 777
			mov byte[buffer+list_offs_text+4],0 ;0 - символ конца строки
2080 IgorA 778
			jmp .no_capt
779
		@@:
780
			mov byte[buffer+list_offs_text+4],' '
781
			mov esi,ecx
782
			mov edi,buffer+list_offs_text+5
783
			mov ecx,size_one_list-(list_offs_text+5)
784
			cld
785
			rep movsb
786
			mov byte[buffer+size_one_list-1],0 ;0 - символ конеца строки
787
		.no_capt:
2051 IgorA 788
		stdcall [tl_node_add], buffer, ebx, tree1
789
		stdcall [tl_cur_next], tree1
790
		if debug
2080 IgorA 791
			stdcall print_err,sz_add_3ds_object,buffer+list_offs_text
2051 IgorA 792
		end if
793
	popad
794
	ret
795
endp
796
 
797
if debug
798
sz_add_3ds_object db 13,10,'3ds_object',0
799
 
800
align 4
801
proc print_err, fun:dword, mes:dword ;выводим сообщение об шибке на доску отладки
802
	pushad
803
	mov eax,63
804
	mov ebx,1
805
 
806
	mov esi,[fun]
807
	@@:
808
		mov cl,byte[esi]
809
		int 0x40
810
		inc esi
811
		cmp byte[esi],0
812
		jne @b
813
	mov cl,':'
814
	int 0x40
815
	mov cl,' '
816
	int 0x40
817
	mov esi,[mes]
818
	@@:
819
		mov cl,byte[esi]
820
		int 0x40
821
		inc esi
822
		cmp byte[esi],0
823
		jne @b
824
	popad
825
	ret
826
endp
827
end if
828
 
829
align 4
830
proc hex_in_str, buf:dword,val:dword,zif:dword
831
	pushad
832
		mov edi,dword[buf]
833
		mov ecx,dword[zif]
834
		add edi,ecx
835
		dec edi
836
		mov ebx,dword[val]
837
 
838
		.cycle:
839
			mov al,bl
840
			and al,0xf
841
			cmp al,10
842
			jl @f
843
				add al,'a'-'0'-10
844
			@@:
845
			add al,'0'
846
			mov byte[edi],al
847
			dec edi
848
			shr ebx,4
849
		loop .cycle
850
 
851
	popad
852
	ret
853
endp
854
 
855
align 4
856
but_save_file:
2173 IgorA 857
	pushad
858
	copy_path open_dialog_name,communication_area_default_path,file_name,0
859
	mov [OpenDialog_data.type],1
860
	stdcall [OpenDialog_Start],OpenDialog_data
861
	cmp [OpenDialog_data.status],2
862
	je .end_save_file
863
	;код при удачном открытии диалога
864
 
865
	mov eax,70 ;70-я функция работа с файлами
866
	mov [run_file_70.Function], 2
867
	mov [run_file_70.Position], 0
868
	mov [run_file_70.Flags], 0
869
	mov ebx, dword[open_file_lif]
870
	mov [run_file_70.Buffer], ebx
871
	mov ebx,dword[ebx+2]
872
	mov dword[run_file_70.Count], ebx ;размер файла
873
	mov byte[run_file_70+20], 0
874
	mov dword[run_file_70.FileName], openfile_path
875
	mov ebx,run_file_70
876
	int 0x40 ;загружаем файл изображения
877
	cmp ebx,0xffffffff
878
	je .end_save_file
879
 
880
	.end_save_file:
881
	popad
2051 IgorA 882
	ret
883
 
2165 IgorA 884
align 4
885
but_wnd_coords:
886
	cmp byte[prop_wnd_run],0
887
	jne @f
888
		pushad
889
		mcall 51,1,prop_start,thread_coords
890
		popad
891
	@@:
892
	ret
2051 IgorA 893
 
4332 IgorA 894
;description:
895
; удаление выбранного блока из открытого файла
896
align 4
897
but_delete_chunk:
898
	pushad
899
	stdcall [tl_node_get_data],tree1
900
	pop ebx
901
	cmp ebx,0
902
	je .end_f
903
	cmp byte[ebx+list_offs_chunk_del],0 ;если блок защищен от удаления
904
	jne .notify
2051 IgorA 905
 
4332 IgorA 906
	;(1) копирование нижней части файла
907
	mov edx,dword[ebx+4] ;размер блока
908
	sub [open_file_size],edx ;изменение размеров файла
909
	mov ecx,[open_file_size]
910
	mov eax,dword[ebx] ;получаем значение сдвига выбранного блока относительно начала файла
911
	sub ecx,eax ;ecx - размер нижней сдвигаемой части файла
912
	add eax,dword[open_file_lif] ;получаем значение сдвига в памяти
913
	mov edi,eax
914
	mov esi,eax
915
	add esi,edx
916
	mov al,byte[ebx+list_offs_chunk_lev] ;берем уровень текущего узла
917
	rep movsb
918
	mov byte[can_save],1
919
 
920
	;(2) изменение размеров родительских блоков
921
	cmp al,0
922
	je .end_2
923
	.cycle_2:
924
	stdcall [tl_cur_perv], tree1
925
	stdcall [tl_node_get_data],tree1
926
	pop ebx
927
	cmp ebx,0
928
	je .end_2
929
		cmp byte[ebx+list_offs_chunk_lev],al
930
		jge .cycle_2
931
		mov al,byte[ebx+list_offs_chunk_lev]
932
		mov ecx,[ebx]
933
		add ecx,[open_file_lif]
934
		sub dword[ecx+2],edx
935
		cmp al,0 ;если самый верхний узел, то al=0
936
		jne .cycle_2
937
	.end_2:
938
 
939
	;(3) обновление списка tree1
940
	call init_tree
941
	call draw_window
942
 
943
	jmp .end_f
944
	.notify:
945
	notify_window_run txt_not_delete
946
	.end_f:
947
	popad
948
	ret
949
 
2051 IgorA 950
;input:
951
; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
952
;output:
953
; eax - число
954
align 4
955
proc conv_str_to_int, buf:dword
956
	xor eax,eax
957
	push ebx ecx esi
958
	xor ebx,ebx
959
	mov esi,[buf]
960
	;определение отрицательных чисел
961
	xor ecx,ecx
962
	inc ecx
963
	cmp byte[esi],'-'
964
	jne @f
965
		dec ecx
966
		inc esi
967
	@@:
968
 
969
	cmp word[esi],'0x'
970
	je .load_digit_16
971
 
972
	.load_digit_10: ;считывание 10-тичных цифр
973
		mov bl,byte[esi]
974
		cmp bl,'0'
975
		jl @f
976
		cmp bl,'9'
977
		jg @f
978
			sub bl,'0'
979
			imul eax,10
980
			add eax,ebx
981
			inc esi
982
			jmp .load_digit_10
983
	jmp @f
984
 
985
	.load_digit_16: ;считывание 16-ричных цифр
986
		add esi,2
987
	.cycle_16:
988
		mov bl,byte[esi]
989
		cmp bl,'0'
990
		jl @f
991
		cmp bl,'f'
992
		jg @f
993
		cmp bl,'9'
994
		jle .us1
995
			cmp bl,'A'
996
			jl @f ;отсеиваем символы >'9' и <'A'
997
		.us1: ;составное условие
998
		cmp bl,'F'
999
		jle .us2
1000
			cmp bl,'a'
1001
			jl @f ;отсеиваем символы >'F' и <'a'
1002
			sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
1003
		.us2: ;составное условие
1004
			sub bl,'0'
1005
			cmp bl,9
1006
			jle .cor1
1007
				sub bl,7 ;convert 'A' to '10'
1008
			.cor1:
1009
			shl eax,4
1010
			add eax,ebx
1011
			inc esi
1012
			jmp .cycle_16
1013
	@@:
1014
	cmp ecx,0 ;если число отрицательное
1015
	jne @f
1016
		sub ecx,eax
1017
		mov eax,ecx
1018
	@@:
1019
	pop esi ecx ebx
1020
	ret
1021
endp
1022
 
1023
;данные для диалога открытия файлов
1024
align 4
1025
OpenDialog_data:
1026
.type			dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
1027
.procinfo		dd procinfo	;+4
1028
.com_area_name		dd communication_area_name	;+8
1029
.com_area		dd 0	;+12
1030
.opendir_path		dd plugin_path	;+16
1031
.dir_default_path	dd default_dir ;+20
1032
.start_path		dd file_name ;+24 путь к диалогу открытия файлов
1033
.draw_window		dd draw_window	;+28
1034
.status 		dd 0	;+32
1035
.openfile_path		dd openfile_path	;+36 путь к открываемому файлу
1036
.filename_area		dd filename_area	;+40
1037
.filter_area		dd Filter
1038
.x:
1039
.x_size 		dw 420 ;+48 ; Window X size
1040
.x_start		dw 10 ;+50 ; Window X position
1041
.y:
1042
.y_size 		dw 320 ;+52 ; Window y size
1043
.y_start		dw 10 ;+54 ; Window Y position
1044
 
1045
default_dir db '/rd/1',0
1046
 
1047
communication_area_name:
1048
	db 'FFFFFFFF_open_dialog',0
1049
open_dialog_name:
1050
	db 'opendial',0
1051
communication_area_default_path:
1052
	db '/rd/1/File managers/',0
1053
 
1054
Filter:
1055
dd Filter.end - Filter.1
1056
.1:
1057
db '3DS',0
1058
db 'TXT',0
1059
.end:
1060
db 0
1061
 
1062
 
1063
 
1064
head_f_i:
1065
head_f_l db 'Системная ошибка',0
1066
 
1067
system_dir_0 db '/sys/lib/'
1068
lib_name_0 db 'proc_lib.obj',0
1069
err_message_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0
1070
err_message_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
1071
 
1072
system_dir_1 db '/sys/lib/'
1073
lib_name_1 db 'libimg.obj',0
1074
err_message_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,0
1075
err_message_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,0
1076
 
1077
system_dir_2 db '/sys/lib/'
1078
lib_name_2 db 'box_lib.obj',0
1079
err_msg_found_lib_2 db 'Не найдена библиотека ',39,'box_lib.obj',39,0
1080
err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'box_lib',39,0
1081
 
1082
system_dir_7 db '/sys/lib/'
1083
lib_name_7 db 'buf2d.obj',0
1084
err_msg_found_lib_7 db 'Не найдена библиотека ',39,'buf2d.obj',39,0
1085
err_msg_import_7 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,0
1086
 
1087
l_libs_start:
1088
	lib0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
1089
		err_message_found_lib_0, head_f_l, proclib_import,err_message_import_0, head_f_i
1090
	lib1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\
1091
		err_message_found_lib_1, head_f_l, import_libimg, err_message_import_1, head_f_i
1092
	lib_2 l_libs lib_name_2, sys_path, library_path, system_dir_2,\
1093
		err_msg_found_lib_2,head_f_l,import_box_lib,err_msg_import_2,head_f_i
1094
	lib_7 l_libs lib_name_7, sys_path, library_path, system_dir_7,\
1095
		err_msg_found_lib_7,head_f_l,import_buf2d,err_msg_import_7,head_f_i
1096
l_libs_end:
1097
 
1098
align 4
1099
import_libimg:
1100
	dd alib_init1
1101
	img_is_img  dd aimg_is_img
1102
	img_info    dd aimg_info
1103
	img_from_file dd aimg_from_file
1104
	img_to_file dd aimg_to_file
1105
	img_from_rgb dd aimg_from_rgb
1106
	img_to_rgb  dd aimg_to_rgb
1107
	img_to_rgb2 dd aimg_to_rgb2
1108
	img_decode  dd aimg_decode
1109
	img_encode  dd aimg_encode
1110
	img_create  dd aimg_create
1111
	img_destroy dd aimg_destroy
1112
	img_destroy_layer dd aimg_destroy_layer
1113
	img_count   dd aimg_count
1114
	img_lock_bits dd aimg_lock_bits
1115
	img_unlock_bits dd aimg_unlock_bits
1116
	img_flip    dd aimg_flip
1117
	img_flip_layer dd aimg_flip_layer
1118
	img_rotate  dd aimg_rotate
1119
	img_rotate_layer dd aimg_rotate_layer
1120
	img_draw    dd aimg_draw
1121
 
1122
	dd 0,0
1123
	alib_init1   db 'lib_init',0
1124
	aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
1125
	aimg_info    db 'img_info',0
1126
	aimg_from_file db 'img_from_file',0
1127
	aimg_to_file db 'img_to_file',0
1128
	aimg_from_rgb db 'img_from_rgb',0
1129
	aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
1130
	aimg_to_rgb2 db 'img_to_rgb2',0
1131
	aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
1132
	aimg_encode  db 'img_encode',0
1133
	aimg_create  db 'img_create',0
1134
	aimg_destroy db 'img_destroy',0
1135
	aimg_destroy_layer db 'img_destroy_layer',0
1136
	aimg_count   db 'img_count',0
1137
	aimg_lock_bits db 'img_lock_bits',0
1138
	aimg_unlock_bits db 'img_unlock_bits',0
1139
	aimg_flip    db 'img_flip',0
1140
	aimg_flip_layer db 'img_flip_layer',0
1141
	aimg_rotate  db 'img_rotate',0
1142
	aimg_rotate_layer db 'img_rotate_layer',0
1143
	aimg_draw    db 'img_draw',0
1144
 
1145
align 4
1146
proclib_import: ;описание экспортируемых функций
1147
	OpenDialog_Init dd aOpenDialog_Init
1148
	OpenDialog_Start dd aOpenDialog_Start
1149
dd 0,0
1150
	aOpenDialog_Init db 'OpenDialog_init',0
1151
	aOpenDialog_Start db 'OpenDialog_start',0
1152
 
1153
align 4
1154
import_buf2d:
1155
	dd sz_init0
1156
	buf2d_create dd sz_buf2d_create
1157
	buf2d_create_f_img dd sz_buf2d_create_f_img
1158
	buf2d_clear dd sz_buf2d_clear
1159
	buf2d_draw dd sz_buf2d_draw
1160
	buf2d_delete dd sz_buf2d_delete
2136 IgorA 1161
	buf2d_resize dd sz_buf2d_resize
2051 IgorA 1162
	buf2d_line dd sz_buf2d_line
1163
	buf2d_rect_by_size dd sz_buf2d_rect_by_size
1164
	buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
1165
	buf2d_circle dd sz_buf2d_circle
1166
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
1167
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
1168
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
1169
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
1170
	buf2d_bit_blt dd sz_buf2d_bit_blt
1171
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
1172
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
1173
	buf2d_curve_bezier dd sz_buf2d_curve_bezier
1174
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
1175
	buf2d_draw_text dd sz_buf2d_draw_text
1176
	buf2d_crop_color dd sz_buf2d_crop_color
1177
	buf2d_offset_h dd sz_buf2d_offset_h
1178
	buf2d_flood_fill dd sz_buf2d_flood_fill
1179
	buf2d_set_pixel dd sz_buf2d_set_pixel
1180
	dd 0,0
1181
	sz_init0 db 'lib_init',0
1182
	sz_buf2d_create db 'buf2d_create',0
1183
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
1184
	sz_buf2d_clear db 'buf2d_clear',0
1185
	sz_buf2d_draw db 'buf2d_draw',0
1186
	sz_buf2d_delete db 'buf2d_delete',0
2136 IgorA 1187
	sz_buf2d_resize db 'buf2d_resize',0
2051 IgorA 1188
	sz_buf2d_line db 'buf2d_line',0
1189
	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
1190
	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
1191
	sz_buf2d_circle db 'buf2d_circle',0
1192
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
1193
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
1194
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
1195
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
1196
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
1197
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
1198
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
1199
	sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
1200
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
1201
	sz_buf2d_draw_text db 'buf2d_draw_text',0
1202
	sz_buf2d_crop_color db 'buf2d_crop_color',0
1203
	sz_buf2d_offset_h db 'buf2d_offset_h',0
1204
	sz_buf2d_flood_fill db 'buf2d_flood_fill',0
1205
	sz_buf2d_set_pixel db 'buf2d_set_pixel',0
1206
 
1207
align 4
1208
import_box_lib:
1209
	dd sz_init1
1210
	init_checkbox dd sz_init_checkbox
1211
	check_box_draw dd sz_check_box_draw
1212
	edit_box_draw dd sz_edit_box_draw
1213
	edit_box_key dd sz_edit_box_key
1214
	edit_box_mouse dd sz_edit_box_mouse
1215
	edit_box_set_text dd sz_edit_box_set_text
1216
	scrollbar_ver_draw dd sz_scrollbar_ver_draw
1217
	scrollbar_hor_draw dd sz_scrollbar_hor_draw
1218
 
1219
	tl_data_init dd sz_tl_data_init
1220
	tl_data_clear dd sz_tl_data_clear
1221
	tl_info_clear dd sz_tl_info_clear
1222
	tl_key dd sz_tl_key
1223
	tl_mouse dd sz_tl_mouse
1224
	tl_draw dd sz_tl_draw
1225
	tl_info_undo dd sz_tl_info_undo
1226
	tl_info_redo dd sz_tl_info_redo
1227
	tl_node_add dd sz_tl_node_add
1228
	tl_node_set_data dd sz_tl_node_set_data
1229
	tl_node_get_data dd sz_tl_node_get_data
1230
	tl_node_delete dd sz_tl_node_delete
1231
	tl_node_move_up dd sz_tl_node_move_up
1232
	tl_node_move_down dd sz_tl_node_move_down
1233
	tl_cur_beg dd sz_tl_cur_beg
1234
	tl_cur_next dd sz_tl_cur_next
1235
	tl_cur_perv dd sz_tl_cur_perv
1236
	tl_node_close_open dd sz_tl_node_close_open
1237
	tl_node_lev_inc dd sz_tl_node_lev_inc
1238
	tl_node_lev_dec dd sz_tl_node_lev_dec
1239
	tl_node_poi_get_info dd sz_tl_node_poi_get_info
1240
	tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info
1241
	tl_node_poi_get_data dd sz_tl_node_poi_get_data
1242
 
1243
	dd 0,0
1244
	sz_init1 db 'lib_init',0
1245
	sz_init_checkbox db 'init_checkbox2',0
1246
	sz_check_box_draw db 'check_box_draw2',0
1247
	sz_edit_box_draw db 'edit_box',0
1248
	sz_edit_box_key db 'edit_box_key',0
1249
	sz_edit_box_mouse db 'edit_box_mouse',0
1250
	sz_edit_box_set_text db 'edit_box_set_text',0
1251
	sz_scrollbar_ver_draw db 'scrollbar_v_draw',0
1252
	sz_scrollbar_hor_draw db 'scrollbar_h_draw',0
1253
 
1254
	sz_tl_data_init db 'tl_data_init',0
1255
	sz_tl_data_clear db 'tl_data_clear',0
1256
	sz_tl_info_clear db 'tl_info_clear',0
1257
	sz_tl_key db 'tl_key',0
1258
	sz_tl_mouse db 'tl_mouse',0
1259
	sz_tl_draw db 'tl_draw',0
1260
	sz_tl_info_undo db 'tl_info_undo',0
1261
	sz_tl_info_redo db 'tl_info_redo',0
1262
	sz_tl_node_add db 'tl_node_add',0
1263
	sz_tl_node_set_data db 'tl_node_set_data',0
1264
	sz_tl_node_get_data db 'tl_node_get_data',0
1265
	sz_tl_node_delete db 'tl_node_delete',0
1266
	sz_tl_node_move_up db 'tl_node_move_up',0
1267
	sz_tl_node_move_down db 'tl_node_move_down',0
1268
	sz_tl_cur_beg db 'tl_cur_beg',0
1269
	sz_tl_cur_next db 'tl_cur_next',0
1270
	sz_tl_cur_perv db 'tl_cur_perv',0
1271
	sz_tl_node_close_open db 'tl_node_close_open',0
1272
	sz_tl_node_lev_inc db 'tl_node_lev_inc',0
1273
	sz_tl_node_lev_dec db 'tl_node_lev_dec',0
1274
	sz_tl_node_poi_get_info db 'tl_node_poi_get_info',0
1275
	sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0
1276
	sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0
1277
 
1278
 
1279
 
1280
mouse_dd dd 0x0
1281
sc system_colors
1282
last_time dd 0
1283
 
1284
align 16
1285
procinfo process_information
1286
 
1287
align 4
1288
buf_0: dd 0 ;указатель на буфер изображения
2136 IgorA 1289
.l: dw 205 ;+4 left
2173 IgorA 1290
.t: dw 35 ;+6 top
2051 IgorA 1291
.w: dd 340 ;+8 w
1292
.h: dd 250 ;+12 h
1293
.color: dd 0xffffd0 ;+16 color
1294
	db 24 ;+20 bit in pixel
1295
 
1296
align 4
1297
buf_1:
1298
	dd 0 ;указатель на буфер изображения
1299
	dw 25 ;+4 left
1300
	dw 25 ;+6 top
1301
	dd 128 ;+8 w
1302
	dd 144 ;+12 h
1303
	dd 0 ;+16 color
1304
	db 24 ;+20 bit in pixel
1305
 
1306
el_focus dd tree1
4332 IgorA 1307
tree1 tree_list size_one_list,300+2, tl_key_no_edit+tl_draw_par_line,\
2080 IgorA 1308
	16,16, 0xffffff,0xb0d0ff,0xd000ff, 5,35,195-16,250, 16,list_offs_text,0, el_focus,\
2051 IgorA 1309
	w_scr_t1,0
1310
 
1311
align 4
1312
w_scr_t1:
1313
.size_x     dw 16 ;+0
2136 IgorA 1314
.start_x    dw 0
1315
rb 2+2
2051 IgorA 1316
.btn_high   dd 15 ;+8
1317
.type	    dd 1  ;+12
1318
.max_area   dd 100  ;+16
1319
rb 4+4
1320
.bckg_col   dd 0xeeeeee ;+28
1321
.frnt_col   dd 0xbbddff ;+32
1322
.line_col   dd 0  ;+36
1323
rb 4+2+2
1324
.run_x:
1325
rb 2+2+2+2+4+4+4+4+4+4
1326
.all_redraw dd 0 ;+80
1327
.ar_offset  dd 1 ;+84
1328
 
1329
 
1330
 
1331
;этот код не мой, он преобразует число в строку
1332
;input:
1333
; eax = value
1334
; edi = string buffer
1335
;output:
1336
align 4
1337
tl_convert_to_str:
1338
	pushad
1339
		mov dword[edi+1],0;0x20202020
1340
		call .str
1341
	popad
1342
	ret
1343
 
1344
align 4
1345
.str:
1346
	mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
1347
    ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1348
	cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
1349
	jb @f
1350
		xor edx,edx  ;очистить edx
1351
		div ecx      ;разделить - остаток в edx
1352
		push edx     ;положить в стек
1353
		;dec edi             ;смещение необходимое для записи с конца строки
1354
		call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1355
		pop eax
1356
	@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
1357
	or al,0x30  ;данная команда короче  чем две выше
1358
	stosb	    ;записать элемент из регистра al в ячеку памяти es:edi
1359
	ret	      ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
1360
 
1361
i_end:
1362
	rb 1024
2165 IgorA 1363
thread_coords:
1364
	rb 1024
2051 IgorA 1365
stacktop:
1366
	sys_path rb 1024
1367
	file_name:
1368
		rb 1024 ;4096
1369
	library_path rb 1024
1370
	plugin_path rb 4096
1371
	openfile_path rb 4096
1372
	filename_area rb 256
1373
mem: