Subversion Repositories Kolibri OS

Rev

Rev 2883 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2748 IgorA 1
;
2
 
3
BUF_STRUCT_SIZE equ 21
4
buf2d_data equ dword[edi] ;данные буфера изображения
5
buf2d_w equ dword[edi+8] ;ширина буфера
6
buf2d_h equ dword[edi+12] ;высота буфера
7
buf2d_l equ word[edi+4]
8
buf2d_t equ word[edi+6] ;отступ сверху
9
buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера
10
buf2d_color equ dword[edi+16] ;цвет фона буфера
11
buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения
12
 
13
vox_offs_tree_table equ 4
14
vox_offs_data equ 12
15
 
16
;output:
2758 IgorA 17
; eax - (event shl 30) + position
2748 IgorA 18
align 4
2758 IgorA 19
proc get_mouse_ev_scale uses ebx ecx edx, h_br:dword, coord_x:dword, coord_y:dword, scale_obj:dword, scale_img:dword
20
	mov ecx,[scale_obj]
21
	stdcall [buf2d_vox_obj_get_img_h_3g], [h_br],ecx
22
	cmp eax,[coord_y]
23
	jle .test_x
24
	stdcall [buf2d_vox_obj_get_img_w_3g], [h_br],ecx
25
	cmp eax,[coord_x]
26
	jle .test_z
2748 IgorA 27
 
2758 IgorA 28
	.no_change:
29
	xor eax,eax
30
	jmp .end_f
2748 IgorA 31
 
2758 IgorA 32
	.test_x:
33
	mov ebx,[h_br]
34
	movzx ebx,byte[ebx+1]
35
	add eax,ebx
36
	cmp eax,[coord_y]
37
	jl .no_change
38
	stdcall [buf2d_vox_obj_get_img_w_3g], [h_br],ecx
39
	cmp eax,[coord_x]
40
	jl .no_change
41
	mov ebx,eax
42
	mov ecx,[scale_img]
43
	inc ecx
44
	shr ebx,cl
45
	xor edx,edx
46
	mov eax,[coord_x]
47
	div ebx
48
	dec ecx
49
	xor ebx,ebx
50
	inc ebx
51
	shl ebx,cl
52
	cmp eax,ebx
53
	jge @f
54
		or eax,1 shl 30
2748 IgorA 55
		jmp .end_f
56
	@@:
2758 IgorA 57
	sub eax,ebx
58
	or eax,2 shl 30
59
	jmp .end_f
2748 IgorA 60
 
2758 IgorA 61
	.test_z:
62
	mov ebx,[h_br]
63
	movzx ebx,byte[ebx]
64
	add eax,ebx
65
	cmp eax,[coord_x]
66
	jl .no_change
67
	mov ebx,[h_br]
68
	movzx ebx,byte[ebx+1]
69
	mov ecx,[scale_obj]
70
	shl ebx,cl
71
	mov ecx,[scale_img]
72
	shr ebx,cl
73
	mov eax,[coord_y]
74
	xor edx,edx
75
	div ebx
76
	;инверсия координаты y
77
	xor edx,edx
78
	inc edx
79
	shl edx,cl
80
	dec edx
81
	sub edx,eax
82
	mov eax,edx
83
	or eax,3 shl 30
2748 IgorA 84
 
85
	.end_f:
86
	ret
87
endp
88
 
89
;
90
;output:
91
; eax - число узлов в объекте v_obj
92
align 4
93
proc vox_obj_get_nodes uses edi, v_obj:dword
94
	mov edi,[v_obj]
95
	add edi,vox_offs_data
96
	xor eax,eax
97
	stdcall vox_obj_rec0
98
	ret
99
endp
100
 
2758 IgorA 101
;???
2748 IgorA 102
;input:
103
; edi - указатель на данные воксельного объекта
104
;output:
105
; eax - eax + число узлов в данных вокс. объекта
106
; edi - указатель на смещенные данные вокс. объекта
107
align 4
108
proc vox_obj_rec0
109
	inc eax
110
	cmp byte[edi+3],0 ;смотрим есть ли поддеревья
111
	je .sub_trees
112
 
113
		;рекурсивный перебор поддеревьев
114
		push ebx ecx
115
		mov bh,byte[edi+3]
116
		add edi,4
117
		mov bl,8
118
		.cycle:
119
			bt bx,8 ;тестируем только bh
120
			jnc .c_next
121
				stdcall vox_obj_rec0
122
			.c_next:
123
			shr bh,1
124
			dec bl
125
			jnz .cycle
126
		pop ecx ebx
127
 
128
		jmp .end_f
129
	.sub_trees:
130
		add edi,4
131
	.end_f:
132
	ret
133
endp
134
 
135
;
136
;output:
137
; eax - размер в байтах занимаемый объектом v_obj
138
align 4
139
proc buf2d_vox_obj_get_size, v_obj:dword
140
	stdcall vox_obj_get_nodes,[v_obj]
141
	shl eax,2
142
	add eax,vox_offs_data
143
	ret
144
endp
145
 
146
; создание вокселя в 3 этапа:
147
; 1) ищем место в структуре дерева, куда надо вставить (если ветвь существует, 2-й этап пропускаем)
148
; 2) вставляем новую ветвь с вокселем (3-й этап уже не делаем)
149
; 3) меняем цвет вокселя
150
align 4
151
proc buf2d_vox_obj_create_node, v_obj:dword,coord_x:dword,coord_y:dword,\
2758 IgorA 152
coord_z:dword,k_scale:dword,color:dword
2748 IgorA 153
pushad
154
locals
155
	p_node dd 0 ;родительский узел
156
endl
157
 
158
	mov edi,[v_obj]
159
	add edi,vox_offs_data
160
	mov esi,[k_scale]
161
	cmp esi,1
162
	jl .change
163
	; *** (1) ***
164
	.found:
165
	stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
166
	movzx bx,byte[edi+3]
167
	mov [p_node],edi
168
	add edi,4
2758 IgorA 169
 
2748 IgorA 170
	cmp eax,0
171
	je .end_1
172
	mov ecx,eax
173
	cld
2758 IgorA 174
	@@: ;цикл для пропуска предыдущих поддеревьев в узле
2748 IgorA 175
		bt bx,0 ;проверяем есть ли дочерние узлы
176
		jnc .end_0
177
			xor eax,eax
178
			stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви
179
		.end_0:
180
		shr bx,1
181
		loop @b
182
	.end_1:
183
	bt bx,0
184
	jnc .creat ;если поддерева не существует, переходим к созданию
185
	dec esi
186
	cmp esi,0
187
	jg .found
188
	jmp .change
189
 
190
	; *** (2) ***
191
	.creat:
192
	mov edx,[color] ;меняем цвет
193
	and edx,0xffffff ;для профилактики
194
	mov ecx,esi
195
	stdcall vox_obj_add_nodes_mem, [v_obj],edi,ecx ;расширяем место занимаемое объектом, для добавления новых узлов
196
	mov ebx,[p_node]
197
	cld
198
	@@:
199
		mov dword[edi],edx
200
		stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi
201
		or byte[ebx+3],al
202
 
203
		mov ebx,edi
204
		add edi,4
205
		dec esi
206
		loop @b
207
	jmp .end_2
208
 
209
	; *** (3) ***
210
	.change:
211
	mov eax,[color] ;меняем цвет
212
	mov word[edi],ax
213
	shr eax,16
214
	mov byte[edi+2],al
215
 
216
	.end_2:
217
popad
218
	ret
219
endp
220
 
2758 IgorA 221
; удаление вокселя в 2 этапа:
2748 IgorA 222
; 1) ищем место в структуре дерева, где есть удаляемый узел (если ветвь не существует, выходим из функции)
2758 IgorA 223
; 2) удаляем ветвь с вокселем
2748 IgorA 224
align 4
225
proc buf2d_vox_obj_delete_node, v_obj:dword,coord_x:dword,coord_y:dword,\
226
coord_z:dword,k_scale:dword
227
pushad
228
locals
229
	p_node dd 0 ;родительский узел
230
endl
231
	mov edi,[v_obj]
232
	add edi,vox_offs_data
233
	mov esi,[k_scale]
234
	cmp esi,1
235
	jl .end_2
236
	; *** (1) ***
237
	.found:
238
	stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
239
	movzx bx,byte[edi+3]
240
	mov [p_node],edi
241
	add edi,4
242
	cmp eax,0
243
	je .end_1
244
	mov ecx,eax
245
	cld
2758 IgorA 246
	@@: ;цикл для пропуска предыдущих поддеревьев в узле
2748 IgorA 247
		bt bx,0 ;проверяем есть ли дочерние узлы
248
		jnc .end_0
249
			xor eax,eax
250
			stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви
251
		.end_0:
252
		shr bx,1
253
		loop @b
254
	.end_1:
255
	bt bx,0
256
	jnc .end_2 ;если поддерева не существует
257
	dec esi
258
	cmp esi,0
259
	jg .found
260
 
261
	; *** (2) ***
262
	;delete
263
	stdcall vox_obj_del_nodes_mem, [v_obj],edi ;сужаем место занимаемое объектом, при удалении узла
264
	mov ebx,[p_node]
265
 
266
	stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi
267
	xor byte[ebx+3],al
268
 
269
	.end_2:
270
popad
271
	ret
272
endp
273
 
2883 IgorA 274
; взять цвет вокселя в 2 этапа:
275
; 1) ищем место в структуре дерева, где есть узел (если ветвь не существует, выходим из функции)
276
; 2) берем цвет вокселя
277
;output:
278
; eax - цвет вокселя
279
align 4
280
proc buf2d_vox_obj_node_get_color, v_obj:dword,coord_x:dword,coord_y:dword,\
281
coord_z:dword,k_scale:dword
282
push ebx ecx edi esi
283
locals
284
	p_node dd 0 ;родительский узел
285
endl
286
	mov edi,[v_obj]
287
	add edi,vox_offs_data
288
	mov esi,[k_scale]
289
	cmp esi,1
290
	jl .end_2
291
	; *** (1) ***
292
	.found:
293
	stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
294
	movzx bx,byte[edi+3]
295
	mov [p_node],edi
296
	add edi,4
297
	cmp eax,0
298
	je .end_1
299
	mov ecx,eax
300
	cld
301
	@@: ;цикл для пропуска предыдущих поддеревьев в узле
302
		bt bx,0 ;проверяем есть ли дочерние узлы
303
		jnc .end_0
304
			xor eax,eax
305
			stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви
306
		.end_0:
307
		shr bx,1
308
		loop @b
309
	.end_1:
310
	bt bx,0
311
	jnc .end_2 ;если поддерева не существует
312
	dec esi
313
	cmp esi,0
314
	jg .found
315
 
316
	; *** (2) ***
317
	;get
318
		mov eax,dword[edi]
319
		and eax,0xffffff
320
		jmp .end_3
321
	.end_2:
322
		mov eax,1 shl 31
323
	.end_3:
324
pop esi edi ecx ebx
325
	ret
326
endp
327
 
2748 IgorA 328
; сдвигает узлы для добавления новых узлов
329
;input:
330
; p_insert - позиция для вставки
331
; count - колличество вставляемых узлов
332
align 4
333
proc vox_obj_add_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword,count:dword
334
	stdcall buf2d_vox_obj_get_size,[v_obj]
335
	mov esi,[v_obj]
336
	add esi,eax ;esi - указатель на конец файла
337
	mov edi,[count]
338
	shl edi,2
339
	add edi,esi ;edi - указатель на будущий конец файла
340
	mov ecx,esi
341
	sub ecx,[p_insert]
342
	shr ecx,2 ;ecx - число циклов для копирования
343
	sub esi,4 ;esi - указатель на последний узел
344
	sub edi,4 ;edi - указатель на будущий последний узел
345
	std
346
	rep movsd ;сдвигаем память
347
	ret
348
endp
349
 
350
;input:
351
; p_insert - позиция для ...
352
align 4
353
proc vox_obj_del_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword
354
	stdcall buf2d_vox_obj_get_size,[v_obj]
355
	mov ecx,eax
356
	mov edi,[p_insert]
357
	add ecx,[v_obj]
358
	sub ecx,edi
359
	xor eax,eax
360
	stdcall vox_obj_rec0
361
	shr ecx,2
362
	sub ecx,eax ;ecx - число циклов для копирования
363
	shl eax,2
364
	add eax,[p_insert]
365
	mov esi,eax
366
	mov edi,[p_insert]
367
	cld
368
	rep movsd ;сдвигаем память
369
	ret
370
endp
371
 
2758 IgorA 372
;???
2748 IgorA 373
; определение позиции узла в дереве (от 0 до 7)
374
align 4
375
proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\
376
coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
377
	mov ecx,[k_scale]
378
	dec ecx
379
	mov eax,[coord_x]
380
	mov ebx,[coord_y]
381
	mov edi,[coord_z]
382
	cmp ecx,1
383
	jl .end_0
384
		shr eax,cl
385
		shr ebx,cl
386
		shr edi,cl
387
	.end_0:
388
	and eax,1
389
	bt ebx,0
390
	jnc @f
391
		bts eax,1
392
	@@:
393
	bt edi,0
394
	jnc @f
395
		bts eax,2
396
	@@:
397
 
398
	mov edi,[v_obj]
399
	add edi,vox_offs_tree_table
400
	@@:
401
		cmp al,byte[edi]
402
		je @f
403
		inc edi
404
		jmp @b
405
	@@:
406
	sub edi,[v_obj]
407
	sub edi,vox_offs_tree_table
408
	mov eax,edi
409
 
410
	ret
411
endp
412
 
413
;output:
414
; eax - 1,2,4,8,16, ... ,128
415
align 4
416
proc vox_obj_get_node_bit_mask uses ebx ecx edi, v_obj:dword,\
417
coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
418
	mov ecx,[k_scale]
419
	dec ecx
420
	mov eax,[coord_x]
421
	mov ebx,[coord_y]
422
	mov edi,[coord_z]
423
	cmp ecx,1
424
	jl .end_0
425
		shr eax,cl
426
		shr ebx,cl
427
		shr edi,cl
428
	.end_0:
429
	and eax,1
430
	bt ebx,0
431
	jnc @f
432
		bts eax,1
433
	@@:
434
	bt edi,0
435
	jnc @f
436
		bts eax,2
437
	@@:
438
 
439
	mov ecx,[v_obj]
440
	add ecx,vox_offs_tree_table
441
	@@:
442
		cmp al,byte[ecx]
443
		je @f
444
		inc ecx
445
		jmp @b
446
	@@:
447
	mov eax,1 ;устанавливаем первоначальное значение бита
448
	sub ecx,[v_obj]
449
	sub ecx,vox_offs_tree_table
450
	jz @f
451
		shl eax,cl ;сдвигаем бит
452
	@@:
453
 
454
	ret
455
endp
456
 
457
;функция для рисования палитры
458
align 4
459
proc buf2d_draw_palete, buf:dword, coord_x:dword, coord_y:dword,\
460
cell_w:dword, cell_h:dword, colors_w:dword, colors:dword
461
pushad
462
	mov ebx,[coord_x]
463
	mov edx,[coord_y]
464
	mov ecx,[colors]
465
	xor edi,edi
466
	mov esi,[cell_h]
467
	cld
468
	.cycle_0:
469
		stdcall get_palete_color, ecx,3
470
		stdcall [buf2d_filled_rect_by_size], [buf], ebx,edx, [cell_w],esi,eax
471
		inc edi
472
		cmp edi,[colors_w]
473
		jl @f
474
			mov ebx,[coord_x]
475
			sub ebx,[cell_w]
476
			dec ebx
477
			add edx,esi ;высота ячейки
478
			inc edx ;отступ между ячейками
479
			xor edi,edi
480
		@@:
481
		add ebx,[cell_w]
482
		inc ebx
483
		loop .cycle_0
484
popad
485
	ret
486
endp
487
 
488
;input:
489
; если r = 1 то функция возвращает 8 цветов, 2 - 64, 3 - 512
490
;output:
491
; eax - color
492
align 4
493
proc get_palete_color uses ebx ecx edx edi, ind:dword, r:dword
494
	mov ecx,[r]
495
	xor edi,edi
496
	inc edi
497
 
498
	mov ebx,[ind]
499
	;b = b xor (b shr 1)
500
	;преобразуем индекс в кодировку Грея для получения более плавных цветовых переходов
501
	mov eax,ebx
502
	shr eax,1
503
	xor ebx,eax
504
 
505
	mov edx,ebx
506
	shr edx,cl
507
	mov eax,edx
508
	shr eax,cl
509
 
510
	mov ch,8
511
	sub ch,cl
512
	shr ecx,8
513
	shl ebx,cl
514
	shl edx,cl
515
	shl eax,cl
516
 
517
	shl edi,cl
518
	dec edi ;edi - 1...1b
519
 
520
	or ebx,edi
521
	or edx,edi
522
	or eax,edi
523
 
524
	shl eax,8
525
	mov al,dl
526
	shl eax,8
527
	mov al,bl
528
	and eax,0xffffff
529
	ret
530
endp
531