Subversion Repositories Kolibri OS

Rev

Rev 5159 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5159 Rev 6172
Line 5... Line 5...
5
;
5
;
6
;include 'zbuffer.inc'
6
;include 'zbuffer.inc'
Line 7... Line 7...
7
 
7
 
8
;output:
8
;output:
9
; eax - указатель на ZBuffer (0 если не удача)
9
; eax - указатель на ZBuffer (0 если не удача)
10
align 4
10
align 16
11
proc ZB_open uses ecx edi, xsize:dword, ysize:dword, mode:dword,\
11
proc ZB_open uses ecx edi, xsize:dword, ysize:dword, mode:dword,\
Line 12... Line 12...
12
		nb_colors:dword, color_indexes:dword, color_table:dword, frame_buffer:dword
12
		nb_colors:dword, color_indexes:dword, color_table:dword, frame_buffer:dword
13
 
13
 
Line 28... Line 28...
28
	and eax,not 3
28
	and eax,not 3
29
	mov [edi+offs_zbuf_linesize],eax
29
	mov [edi+offs_zbuf_linesize],eax
30
	mov eax,[mode]
30
	mov eax,[mode]
31
	mov [edi+offs_zbuf_mode],eax
31
	mov [edi+offs_zbuf_mode],eax
Line 32... Line -...
32
 
-
 
33
if TGL_FEATURE_8_BITS eq 1
-
 
34
	cmp eax,ZB_MODE_INDEX
-
 
35
	jne @f
-
 
36
;ZB_initDither(edi, nb_colors, color_indexes, color_table);
-
 
37
		jmp .end_s
-
 
38
	@@:
-
 
39
end if
32
 
40
if TGL_FEATURE_32_BITS eq 1
33
if TGL_FEATURE_32_BITS eq 1
41
	cmp eax,ZB_MODE_RGBA
34
	cmp eax,ZB_MODE_RGBA
42
	je .correct
35
	je .correct
43
end if
36
end if
Line 81... Line 74...
81
	ret
74
	ret
82
endp
75
endp
Line 83... Line 76...
83
 
76
 
84
;void ZB_close(ZBuffer * zb)
77
;void ZB_close(ZBuffer * zb)
85
;{
-
 
86
if TGL_FEATURE_8_BITS eq 1
-
 
87
;    if (zb->mode == ZB_MODE_INDEX)
-
 
88
;	ZB_closeDither(zb);
-
 
89
end if
-
 
90
;
78
;{
91
;    if (zb->frame_buffer_allocated)
79
;    if (zb->frame_buffer_allocated)
92
;	gl_free(zb->pbuf);
80
;	gl_free(zb->pbuf);
93
;
81
 
94
;    gl_free(zb->zbuf);
82
;    gl_free(zb->zbuf);
95
;    gl_free(zb);
83
;    gl_free(zb);
Line 96... Line 84...
96
;}
84
;}
97
 
85
 
98
align 4
86
align 16
Line 99... Line 87...
99
proc ZB_resize uses eax ebx ecx edi esi, zb:dword, frame_buffer:dword, xsize:dword, ysize:dword
87
proc ZB_resize uses eax ebx ecx edi esi, zb:dword, frame_buffer:dword, xsize:dword, ysize:dword
100
	mov ebx,[zb]
88
	mov ebx,[zb]
Line 147... Line 135...
147
;                          int linesize)
135
;                          int linesize)
148
;{
136
;{
149
;    unsigned char *p1;
137
;    unsigned char *p1;
150
;    PIXEL *q;
138
;    PIXEL *q;
151
;    int y, n;
139
;    int y, n;
152
;
140
 
153
;    q = zb->pbuf;
141
;    q = zb->pbuf;
154
;    p1 = buf;
142
;    p1 = buf;
155
;    n = zb->xsize * PSZB;
143
;    n = zb->xsize * PSZB;
156
;    for (y = 0; y < zb->ysize; y++) {
144
;    for (y = 0; y < zb->ysize; y++) {
157
;	memcpy(p1, q, n);
145
;	memcpy(p1, q, n);
158
;	p1 += linesize;
146
;	p1 += linesize;
159
;	q = (PIXEL *) ((char *) q + zb->linesize);
147
;	q = (PIXEL *) ((char *) q + zb->linesize);
160
;    }
148
;    }
161
;}
149
;}
162
;
150
 
163
;#if TGL_FEATURE_RENDER_BITS == 16
151
;#if TGL_FEATURE_RENDER_BITS == 16
Line 164... Line 152...
164
 
152
 
Line 165... Line 153...
165
;/* 32 bpp copy */
153
;/* 32 bpp copy */
Line 181... Line 169...
181
;                                    int linesize)
169
;                                    int linesize)
182
;{
170
;{
183
;    unsigned short *q;
171
;    unsigned short *q;
184
;    unsigned int *p, *p1, v, w0, w1;
172
;    unsigned int *p, *p1, v, w0, w1;
185
;    int y, n;
173
;    int y, n;
186
;
174
 
187
;    q = zb->pbuf;
175
;    q = zb->pbuf;
188
;    p1 = (unsigned int *) buf;
176
;    p1 = (unsigned int *) buf;
189
;
177
 
190
;    for (y = 0; y < zb->ysize; y++) {
178
;    for (y = 0; y < zb->ysize; y++) {
191
;	p = p1;
179
;	p = p1;
192
;	n = zb->xsize >> 2;
180
;	n = zb->xsize >> 2;
193
;	do {
181
;	do {
194
;	    v = *(unsigned int *) q;
182
;	    v = *(unsigned int *) q;
Line 197... Line 185...
197
;#else
185
;#else
198
;	    RGB16_TO_RGB32(w0, w1, v);
186
;	    RGB16_TO_RGB32(w0, w1, v);
199
;#endif
187
;#endif
200
;	    p[0] = w0;
188
;	    p[0] = w0;
201
;	    p[1] = w1;
189
;	    p[1] = w1;
202
;
190
 
203
;	    v = *(unsigned int *) (q + 2);
191
;	    v = *(unsigned int *) (q + 2);
204
;#if BYTE_ORDER == BIG_ENDIAN
192
;#if BYTE_ORDER == BIG_ENDIAN
205
;	    RGB16_TO_RGB32(w1, w0, v);
193
;	    RGB16_TO_RGB32(w1, w0, v);
206
;#else
194
;#else
207
;	    RGB16_TO_RGB32(w0, w1, v);
195
;	    RGB16_TO_RGB32(w0, w1, v);
208
;#endif
196
;#endif
209
;	    p[2] = w0;
197
;	    p[2] = w0;
210
;	    p[3] = w1;
198
;	    p[3] = w1;
211
;
199
 
212
;	    q += 4;
200
;	    q += 4;
213
;	    p += 4;
201
;	    p += 4;
214
;	} while (--n > 0);
202
;	} while (--n > 0);
215
;
203
 
216
;	p1 += linesize;
204
;	p1 += linesize;
217
;    }
205
;    }
218
;}
206
;}
Line 219... Line 207...
219
 
207
 
Line 270... Line 258...
270
;                                    void *buf, int linesize)
258
;                                    void *buf, int linesize)
271
;{
259
;{
272
;    unsigned short *q;
260
;    unsigned short *q;
273
;    unsigned int *p, *p1, w0, w1, w2, v0, v1;
261
;    unsigned int *p, *p1, w0, w1, w2, v0, v1;
274
;    int y, n;
262
;    int y, n;
275
;
263
 
276
;    q = zb->pbuf;
264
;    q = zb->pbuf;
277
;    p1 = (unsigned int *) buf;
265
;    p1 = (unsigned int *) buf;
278
;    linesize = linesize * 3;
266
;    linesize = linesize * 3;
279
;
267
 
280
;    for (y = 0; y < zb->ysize; y++) {
268
;    for (y = 0; y < zb->ysize; y++) {
281
;	p = p1;
269
;	p = p1;
282
;	n = zb->xsize >> 2;
270
;	n = zb->xsize >> 2;
283
;	do {
271
;	do {
284
;	    v0 = *(unsigned int *) q;
272
;	    v0 = *(unsigned int *) q;
Line 300... Line 288...
300
 
288
 
301
;void ZB_copyFrameBuffer(ZBuffer * zb, void *buf,
289
;void ZB_copyFrameBuffer(ZBuffer * zb, void *buf,
302
;			int linesize)
290
;			int linesize)
303
;{
291
;{
304
;    switch (zb->mode) {
-
 
305
;#ifdef TGL_FEATURE_8_BITS
-
 
306
;    case ZB_MODE_INDEX:
-
 
307
;	ZB_ditherFrameBuffer(zb, buf, linesize >> 1);
-
 
308
;	break;
-
 
309
;#endif
-
 
310
;#ifdef TGL_FEATURE_16_BITS
-
 
311
;    case ZB_MODE_5R6G5B:
-
 
312
;	ZB_copyBuffer(zb, buf, linesize);
-
 
313
;	break;
-
 
314
;#endif
292
;    switch (zb->mode) {
315
;#ifdef TGL_FEATURE_32_BITS
293
;#ifdef TGL_FEATURE_32_BITS
316
;    case ZB_MODE_RGBA:
294
;    case ZB_MODE_RGBA:
317
;	ZB_copyFrameBufferRGB32(zb, buf, linesize >> 1);
295
;	ZB_copyFrameBufferRGB32(zb, buf, linesize >> 1);
318
;	break;
296
;	break;
Line 339... Line 317...
339
;                                     void *buf, int linesize) 
317
;                                     void *buf, int linesize) 
340
;{
318
;{
341
;    PIXEL *q;
319
;    PIXEL *q;
342
;    unsigned short *p, *p1;
320
;    unsigned short *p, *p1;
343
;    int y, n;
321
;    int y, n;
344
;
322
 
345
;    q = zb->pbuf;
323
;    q = zb->pbuf;
346
;    p1 = (unsigned short *) buf;
324
;    p1 = (unsigned short *) buf;
347
;
325
 
348
;    for (y = 0; y < zb->ysize; y++) {
326
;    for (y = 0; y < zb->ysize; y++) {
349
;	p = p1;
327
;	p = p1;
350
;	n = zb->xsize >> 2;
328
;	n = zb->xsize >> 2;
351
;	do {
329
;	do {
352
;            p[0] = RGB24_TO_RGB16(q[0], q[1], q[2]);
330
;            p[0] = RGB24_TO_RGB16(q[0], q[1], q[2]);
Line 362... Line 340...
362
 
340
 
363
;void ZB_copyFrameBuffer(ZBuffer * zb, void *buf,
341
;void ZB_copyFrameBuffer(ZBuffer * zb, void *buf,
364
;			int linesize)
342
;			int linesize)
365
;{
343
;{
366
;    switch (zb->mode) {
-
 
367
;#ifdef TGL_FEATURE_16_BITS
-
 
368
;    case ZB_MODE_5R6G5B:
-
 
369
;	ZB_copyFrameBuffer5R6G5B(zb, buf, linesize);
-
 
370
;	break;
-
 
371
;#endif
344
;    switch (zb->mode) {
372
;#ifdef TGL_FEATURE_24_BITS
345
;#ifdef TGL_FEATURE_24_BITS
373
;    case ZB_MODE_RGB24:
346
;    case ZB_MODE_RGB24:
374
;	ZB_copyBuffer(zb, buf, linesize);
347
;	ZB_copyBuffer(zb, buf, linesize);
375
;	break;
348
;	break;
Line 391... Line 364...
391
;                                     void *buf, int linesize) 
364
;                                     void *buf, int linesize) 
392
;{
365
;{
393
;    PIXEL *q;
366
;    PIXEL *q;
394
;    unsigned short *p, *p1;
367
;    unsigned short *p, *p1;
395
;    int y, n;
368
;    int y, n;
396
;
369
 
397
;    q = zb->pbuf;
370
;    q = zb->pbuf;
398
;    p1 = (unsigned short *) buf;
371
;    p1 = (unsigned short *) buf;
399
;
372
 
400
;    for (y = 0; y < zb->ysize; y++) {
373
;    for (y = 0; y < zb->ysize; y++) {
401
;	p = p1;
374
;	p = p1;
402
;	n = zb->xsize >> 2;
375
;	n = zb->xsize >> 2;
403
;	do {
376
;	do {
404
;            p[0] = RGB32_TO_RGB16(q[0]);
377
;            p[0] = RGB32_TO_RGB16(q[0]);
Line 409... Line 382...
409
;	    p += 4;
382
;	    p += 4;
410
;	} while (--n > 0);
383
;	} while (--n > 0);
411
;	p1 = (unsigned short *)((char *)p1 + linesize);
384
;	p1 = (unsigned short *)((char *)p1 + linesize);
412
;    }
385
;    }
413
;}
386
;}
414
;
387
 
415
;void ZB_copyFrameBuffer(ZBuffer * zb, void *buf,
388
;void ZB_copyFrameBuffer(ZBuffer * zb, void *buf,
416
;			int linesize)
389
;			int linesize)
417
;{
390
;{
418
;    switch (zb->mode) {
391
;    switch (zb->mode) {
419
;#ifdef TGL_FEATURE_16_BITS
-
 
420
;    case ZB_MODE_5R6G5B:
-
 
421
;	ZB_copyFrameBuffer5R6G5B(zb, buf, linesize);
-
 
422
;	break;
-
 
423
;#endif
-
 
424
;#ifdef TGL_FEATURE_32_BITS
392
;#ifdef TGL_FEATURE_32_BITS
425
;    case ZB_MODE_RGBA:
393
;    case ZB_MODE_RGBA:
426
;	ZB_copyBuffer(zb, buf, linesize);
394
;	ZB_copyBuffer(zb, buf, linesize);
427
;	break;
395
;	break;
428
;#endif
396
;#endif
429
;    default:
397
;    default:
430
;	assert(0);
398
;	assert(0);
431
;    }
399
;    }
432
;}
400
;}
433
;
401
 
434
;#endif /* TGL_FEATURE_RENDER_BITS == 32 */
402
;#endif /* TGL_FEATURE_RENDER_BITS == 32 */
Line 435... Line 403...
435
 
403
 
436
 
404
 
437
;
405
;
-
 
406
; adr must be aligned on an 'int'
-
 
407
;
438
; adr must be aligned on an 'int'
408
;destroy:
439
;
409
; ecx, edi
440
align 4
410
align 16
441
proc memset_s uses eax ecx edi, adr:dword, val:dword, count:dword
411
proc memset_s uses eax, adr:dword, val:dword, count:dword
442
	mov eax,[val]
412
	mov eax,[val]
443
	mov di,ax
413
	mov di,ax
444
	ror eax,16
414
	ror eax,16
Line 453... Line 423...
453
		stosw
423
		stosw
454
	@@:
424
	@@:
455
	ret
425
	ret
456
endp
426
endp
Line 457... Line 427...
457
 
427
 
458
align 4
428
align 16
459
proc memset_l uses eax ecx edi, adr:dword, val:dword, count:dword
429
proc memset_l uses eax ecx edi, adr:dword, val:dword, count:dword
460
	mov eax,[val]
430
	mov eax,[val]
461
	mov ecx,[count]
431
	mov ecx,[count]
462
	mov edi,[adr]
432
	mov edi,[adr]
463
	rep stosd
433
	rep stosd
464
	ret
434
	ret
Line 465... Line 435...
465
endp
435
endp
-
 
436
 
-
 
437
; count must be a multiple of 4 and >= 4
466
 
438
;destroy:
467
; count must be a multiple of 4 and >= 4
439
; edi, esi
468
align 4
440
align 16
469
proc memset_RGB24 uses eax ecx edi esi, adr:dword, r:dword, g:dword, b:dword, count:dword
441
proc memset_RGB24 uses eax ecx, adr:dword, r:dword, g:dword, b:dword, count:dword
470
	mov esi,[adr]
442
	mov esi,[adr]
471
	mov eax,[r] ;копируем в буфер первые 12 байт (минимальное число кратное 3 и 4)
443
	mov eax,[r] ;копируем в буфер первые 12 байт (минимальное число кратное 3 и 4)
472
	mov byte[esi],al
444
	mov byte[esi],al
Line 499... Line 471...
499
		mov esi,ecx
471
		mov esi,ecx
500
		shl ecx,2
472
		shl ecx,2
501
		sub ecx,esi ;ecx*=3
473
		sub ecx,esi ;ecx*=3
502
		rep stosd
474
		rep stosd
503
		jmp .end_f
475
		jmp .end_f
504
	@@:
476
align 16
505
 
-
 
506
	;если r!=g или g!=b или b!=r
477
	@@: ;если r!=g или g!=b или b!=r
507
	@@:
-
 
508
		movsd
478
		movsd
509
		movsd
479
		movsd
510
		movsd
480
		movsd
511
		sub esi,12
481
		sub esi,12
512
	loop @b
482
	loop @b
513
	.end_f:
483
	.end_f:
514
	ret
484
	ret
515
endp
485
endp
Line 516... Line 486...
516
 
486
 
517
align 4
487
align 16
518
proc ZB_clear uses eax ebx ecx, zb:dword, clear_z:dword, z:dword, clear_color:dword,\
488
proc ZB_clear uses eax ebx ecx edi esi, zb:dword, clear_z:dword, z:dword,\
519
	r:dword, g:dword, b:dword
489
	clear_color:dword, r:dword, g:dword, b:dword
520
;if TGL_FEATURE_RENDER_BITS != 24
490
;if TGL_FEATURE_RENDER_BITS != 24
521
;	color dd ?
491
;	color dd ?
Line 522... Line 492...
522
;end if
492
;end if
Line 544... Line 514...
544
		push ebx
514
		push ebx
545
		add esp,16
515
		add esp,16
546
end if
516
end if
547
		mov ebx,[eax+offs_zbuf_pbuf]
517
		mov ebx,[eax+offs_zbuf_pbuf]
548
		mov ecx,[eax+offs_zbuf_ysize]
518
		mov ecx,[eax+offs_zbuf_ysize]
-
 
519
align 4
549
		.cycle_0:
520
		.cycle_0:
550
if (TGL_FEATURE_RENDER_BITS eq 15) ;or (TGL_FEATURE_RENDER_BITS eq 16)
-
 
551
			;color = RGB_TO_PIXEL(r, g, b);
-
 
552
			;memset_s(ebx, color, zb->xsize);
-
 
553
end if
-
 
554
if TGL_FEATURE_RENDER_BITS eq 32
521
if TGL_FEATURE_RENDER_BITS eq 32
555
			;color = RGB_TO_PIXEL(r, g, b);
522
			;color = RGB_TO_PIXEL(r, g, b)
556
			;memset_l(ebx, color, zb->xsize);
523
			;memset_l(ebx, color, zb->xsize)
557
end if
524
end if
558
if TGL_FEATURE_RENDER_BITS eq 24
525
if TGL_FEATURE_RENDER_BITS eq 24
559
			sub esp,16
526
			sub esp,16
560
			stdcall memset_RGB24,ebx
527
			stdcall memset_RGB24,ebx
561
end if
528
end if