Subversion Repositories Kolibri OS

Rev

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