2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
14 * $Source: /cvs/cvsroot/d2x/texmap/scanline.c,v $
15 * $Revision: 1.1.1.1 $
17 * $Date: 2001-01-19 03:30:16 $
19 * Routines to draw the texture mapped scanlines.
21 * $Log: not supported by cvs2svn $
22 * Revision 1.4 1999/10/18 00:31:01 donut
23 * more alpha fixes from Falk Hueffner
25 * Revision 1.3 1999/10/14 04:48:21 donut
26 * alpha fixes, and gl_font args
28 * Revision 1.2 1999/09/21 07:22:40 sekmu
29 * remove unused var warning
31 * Revision 1.1.1.1 1999/06/14 22:14:08 donut
32 * Import of d1x 1.37 source.
34 * Revision 1.2 1995/02/20 18:23:39 john
35 * Added new module for C versions of inner loops.
37 * Revision 1.1 1995/02/20 17:42:27 john
45 static char rcsid[] = "$Id: scanline.c,v 1.1.1.1 2001-01-19 03:30:16 bradleyb Exp $";
63 void c_tmap_scanline_flat()
68 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y ) );
70 /* for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
71 *dest++ = tmap_flat_color;
73 memset(dest,tmap_flat_color,fx_xright-fx_xleft+1);
76 void c_tmap_scanline_shaded()
82 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
84 fade = tmap_flat_shade_value<<8;
85 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
86 *dest++ = gr_fade_table[ fade |(*dest)];
90 void c_tmap_scanline_lin_nolight()
102 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
104 if (!Transparency_on) {
105 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
106 *dest++ = (uint)pixptr[ (f2i(v)&(64*63)) + (f2i(u)&63) ];
111 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
112 c = (uint)pixptr[ (f2i(v)&(64*63)) + (f2i(u)&63) ];
124 void c_tmap_scanline_lin()
129 fix u,v,l,dudx, dvdx, dldx;
138 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
140 if (!Transparency_on) {
141 ubyte* pixPtrLocalCopy = pixptr;
142 ubyte* fadeTableLocalCopy = gr_fade_table;
143 unsigned long destlong;
145 x = fx_xright-fx_xleft+1;
147 if ((j = (unsigned long) dest & 3) != 0)
156 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
157 *dest++ = (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint) pixPtrLocalCopy[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ];
170 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
171 destlong = (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint) pixPtrLocalCopy[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ] << 24;
176 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
177 destlong |= (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint) pixPtrLocalCopy[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ] << 16;
182 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
183 destlong |= (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint) pixPtrLocalCopy[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ] << 8;
188 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
189 destlong |= (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint) pixPtrLocalCopy[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ];
194 *((unsigned long *) dest) = destlong;
202 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
203 *dest++ = (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint) pixPtrLocalCopy[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ];
211 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
212 c = (uint)pixptr[ (f2i(v)&(64*63)) + (f2i(u)&63) ];
213 if ( c!=TRANSPARENCY_COLOR)
214 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
215 *dest = gr_fade_table[ (l&(0x7f00)) + c ];
226 void c_tmap_scanline_lin()
231 fix u,v,l,dudx, dvdx, dldx;
240 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
242 if (!Transparency_on) {
243 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
244 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
245 *dest++ = gr_fade_table[ (l&(0x7f00)) + (uint)pixptr[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ];
252 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
253 c = (uint)pixptr[ (f2i(v)&(64*63)) + (f2i(u)&63) ];
255 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
256 *dest = gr_fade_table[ (l&(0x7f00)) + c ];
268 void c_tmap_scanline_per_nolight()
273 double u, v, z, dudx, dvdx, dzdx, rec_z;
277 v = f2db(fx_v) * 64.0;
279 dudx = f2db(fx_du_dx);
280 dvdx = f2db(fx_dv_dx) * 64.0;
281 dzdx = f2db(fx_dz_dx);
285 dest = (ubyte *) (write_buffer + fx_xleft + (bytes_per_row * fx_y));
287 x = fx_xright - fx_xleft + 1;
288 if (!Transparency_on) {
290 if ((j = (size_t) dest & 7) != 0) {
295 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
296 (((int) (u * rec_z)) & 63)];
308 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
309 (((int) (u * rec_z)) & 63)];
315 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
316 (((int) (u * rec_z)) & 63)] << 8;
322 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
323 (((int) (u * rec_z)) & 63)] << 16;
329 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
330 (((int) (u * rec_z)) & 63)] << 24;
336 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
337 (((int) (u * rec_z)) & 63)] << 32;
343 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
344 (((int) (u * rec_z)) & 63)] << 40;
350 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
351 (((int) (u * rec_z)) & 63)] << 48;
357 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
358 (((int) (u * rec_z)) & 63)] << 56;
364 *((u_int64_t *) dest) = destlong;
372 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
373 (((int) (u * rec_z)) & 63)];
380 x = fx_xright - fx_xleft + 1;
383 if ((j = (size_t) dest & 7) != 0) {
388 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
389 (((int) (u * rec_z)) & 63)];
404 destlong = *((u_int64_t *) dest);
405 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
406 (((int) (u * rec_z)) & 63)];
408 destlong &= ~(u_int64_t)0xFF;
409 destlong |= (u_int64_t) c;
415 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
416 (((int) (u * rec_z)) & 63)];
418 destlong &= ~((u_int64_t)0xFF << 8);
419 destlong |= (u_int64_t) c << 8;
425 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
426 (((int) (u * rec_z)) & 63)];
428 destlong &= ~((u_int64_t)0xFF << 16);
429 destlong |= (u_int64_t) c << 16;
435 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
436 (((int) (u * rec_z)) & 63)];
438 destlong &= ~((u_int64_t)0xFF << 24);
439 destlong |= (u_int64_t) c << 24;
445 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
446 (((int) (u * rec_z)) & 63)];
448 destlong &= ~((u_int64_t)0xFF << 32);
449 destlong |= (u_int64_t) c << 32;
455 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
456 (((int) (u * rec_z)) & 63)];
458 destlong &= ~((u_int64_t)0xFF << 40);
459 destlong |= (u_int64_t) c << 40;
465 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
466 (((int) (u * rec_z)) & 63)];
468 destlong &= ~((u_int64_t)0xFF << 48);
469 destlong |= (u_int64_t) c << 48;
475 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
476 (((int) (u * rec_z)) & 63)];
478 destlong &= ~((u_int64_t)0xFF << 56);
479 destlong |= (u_int64_t) c << 56;
486 *((u_int64_t *) dest) = destlong;
493 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
494 (((int) (u * rec_z)) & 63)];
506 void c_tmap_scanline_per_nolight()
511 fix u,v,z,dudx, dvdx, dzdx;
520 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
522 if (!Transparency_on) {
523 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
524 *dest++ = (uint)pixptr[ ( (v/z)&(64*63) ) + ((u/z)&63) ];
530 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
531 c = (uint)pixptr[ ( (v/z)&(64*63) ) + ((u/z)&63) ];
544 void c_tmap_scanline_per()
549 double u, v, z, l, dudx, dvdx, dzdx, dldx, rec_z;
553 v = f2db(fx_v) * 64.0;
556 dudx = f2db(fx_du_dx);
557 dvdx = f2db(fx_dv_dx) * 64.0;
558 dzdx = f2db(fx_dz_dx);
559 dldx = f2db(fx_dl_dx);
561 rec_z = 1.0 / z; // gcc 2.95.2 is won't do this optimization itself
563 dest = (ubyte *) (write_buffer + fx_xleft + (bytes_per_row * fx_y));
564 x = fx_xright - fx_xleft + 1;
566 if (!Transparency_on) {
568 if ((j = (size_t) dest & 7) != 0) {
573 gr_fade_table[((int) fabs(l)) * 256 +
574 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
575 (((int) (u * rec_z)) & 63)]];
589 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
590 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
591 (((int) (u * rec_z)) & 63)]];
598 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
599 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
600 (((int) (u * rec_z)) & 63)]] << 8;
607 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
608 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
609 (((int) (u * rec_z)) & 63)]] << 16;
616 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
617 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
618 (((int) (u * rec_z)) & 63)]] << 24;
625 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
626 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
627 (((int) (u * rec_z)) & 63)]] << 32;
634 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
635 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
636 (((int) (u * rec_z)) & 63)]] << 40;
643 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
644 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
645 (((int) (u * rec_z)) & 63)]] << 48;
652 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
653 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
654 (((int) (u * rec_z)) & 63)]] << 56;
661 *((u_int64_t *) dest) = destlong;
669 gr_fade_table[((int) fabs(l)) * 256 +
670 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]];
679 if ((j = (size_t) dest & 7) != 0) {
683 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
685 *dest = gr_fade_table[((int) fabs(l)) * 256 + c];
699 destlong = *((u_int64_t *) dest);
700 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
702 destlong &= ~(u_int64_t)0xFF;
703 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c];
710 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
712 destlong &= ~((u_int64_t)0xFF << 8);
713 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 8;
720 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
722 destlong &= ~((u_int64_t)0xFF << 16);
723 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 16;
730 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
732 destlong &= ~((u_int64_t)0xFF << 24);
733 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 24;
740 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
742 destlong &= ~((u_int64_t)0xFF << 32);
743 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 32;
750 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
752 destlong &= ~((u_int64_t)0xFF << 40);
753 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 40;
760 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
762 destlong &= ~((u_int64_t)0xFF << 48);
763 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 48;
770 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
772 destlong &= ~((u_int64_t)0xFF << 56);
773 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 56;
781 *((u_int64_t *) dest) = destlong;
788 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
790 *dest = gr_fade_table[((int) fabs(l)) * 256 + c];
802 // note the unrolling loop is broken. It is never called, and uses big endian. -- FH
803 void c_tmap_scanline_per()
809 fix dudx, dvdx, dzdx, dldx;
820 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
822 if (!Transparency_on) {
823 ubyte* pixPtrLocalCopy = pixptr;
824 ubyte* fadeTableLocalCopy = gr_fade_table;
825 unsigned long destlong;
827 x = fx_xright-fx_xleft+1;
829 if ((j = (unsigned long) dest & 3) != 0)
838 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
839 *dest++ = fadeTableLocalCopy[ (l&(0x7f00)) + (uint)pixPtrLocalCopy[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ];
853 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
854 destlong = (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint)pixPtrLocalCopy[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ] << 24;
860 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
861 destlong |= (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint)pixPtrLocalCopy[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ] << 16;
867 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
868 destlong |= (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint)pixPtrLocalCopy[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ] << 8;
874 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
875 destlong |= (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint)pixPtrLocalCopy[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ];
881 *((unsigned long *) dest) = destlong;
889 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
890 *dest++ = (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint)pixPtrLocalCopy[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ];
899 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
900 c = (uint)pixptr[ ( (v/z)&(64*63) ) + ((u/z)&63) ];
901 if ( c!=TRANSPARENCY_COLOR)
902 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
903 *dest = gr_fade_table[ (l&(0x7f00)) + c ];
915 void c_tmap_scanline_per()
920 fix u,v,z,l,dudx, dvdx, dzdx, dldx;
931 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
933 if (!Transparency_on) {
934 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
935 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
936 *dest++ = gr_fade_table[ (l&(0x7f00)) + (uint)pixptr[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ];
944 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
945 c = (uint)pixptr[ ( (v/z)&(64*63) ) + ((u/z)&63) ];
947 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
948 *dest = gr_fade_table[ (l&(0x7f00)) + c ];