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 $
17 * $Date: 2001-01-31 15:18:04 $
19 * Routines to draw the texture mapped scanlines.
21 * $Log: not supported by cvs2svn $
22 * Revision 1.1.1.1 2001/01/19 03:30:16 bradleyb
25 * Revision 1.4 1999/10/18 00:31:01 donut
26 * more alpha fixes from Falk Hueffner
28 * Revision 1.3 1999/10/14 04:48:21 donut
29 * alpha fixes, and gl_font args
31 * Revision 1.2 1999/09/21 07:22:40 sekmu
32 * remove unused var warning
34 * Revision 1.1.1.1 1999/06/14 22:14:08 donut
35 * Import of d1x 1.37 source.
37 * Revision 1.2 1995/02/20 18:23:39 john
38 * Added new module for C versions of inner loops.
40 * Revision 1.1 1995/02/20 17:42:27 john
51 static char rcsid[] = "$Id: scanline.c,v 1.2 2001-01-31 15:18:04 bradleyb Exp $";
68 void c_tmap_scanline_flat()
73 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y ) );
75 /* for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
76 *dest++ = tmap_flat_color;
78 memset(dest,tmap_flat_color,fx_xright-fx_xleft+1);
81 void c_tmap_scanline_shaded()
87 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
89 fade = tmap_flat_shade_value<<8;
90 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
91 *dest++ = gr_fade_table[ fade |(*dest)];
95 void c_tmap_scanline_lin_nolight()
107 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
109 if (!Transparency_on) {
110 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
111 *dest++ = (uint)pixptr[ (f2i(v)&(64*63)) + (f2i(u)&63) ];
116 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
117 c = (uint)pixptr[ (f2i(v)&(64*63)) + (f2i(u)&63) ];
129 void c_tmap_scanline_lin()
134 fix u,v,l,dudx, dvdx, dldx;
143 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
145 if (!Transparency_on) {
146 ubyte* pixPtrLocalCopy = pixptr;
147 ubyte* fadeTableLocalCopy = gr_fade_table;
148 unsigned long destlong;
150 x = fx_xright-fx_xleft+1;
152 if ((j = (unsigned long) dest & 3) != 0)
161 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
162 *dest++ = (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint) pixPtrLocalCopy[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ];
175 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
176 destlong = (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint) pixPtrLocalCopy[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ] << 24;
181 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
182 destlong |= (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint) pixPtrLocalCopy[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ] << 16;
187 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
188 destlong |= (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint) pixPtrLocalCopy[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ] << 8;
193 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
194 destlong |= (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint) pixPtrLocalCopy[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ];
199 *((unsigned long *) dest) = destlong;
207 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
208 *dest++ = (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint) pixPtrLocalCopy[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ];
216 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
217 c = (uint)pixptr[ (f2i(v)&(64*63)) + (f2i(u)&63) ];
218 if ( c!=TRANSPARENCY_COLOR)
219 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
220 *dest = gr_fade_table[ (l&(0x7f00)) + c ];
231 void c_tmap_scanline_lin()
236 fix u,v,l,dudx, dvdx, dldx;
245 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
247 if (!Transparency_on) {
248 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
249 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
250 *dest++ = gr_fade_table[ (l&(0x7f00)) + (uint)pixptr[ (f2i(v)&(64*63)) + (f2i(u)&63) ] ];
257 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
258 c = (uint)pixptr[ (f2i(v)&(64*63)) + (f2i(u)&63) ];
260 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
261 *dest = gr_fade_table[ (l&(0x7f00)) + c ];
273 void c_tmap_scanline_per_nolight()
278 double u, v, z, dudx, dvdx, dzdx, rec_z;
282 v = f2db(fx_v) * 64.0;
284 dudx = f2db(fx_du_dx);
285 dvdx = f2db(fx_dv_dx) * 64.0;
286 dzdx = f2db(fx_dz_dx);
290 dest = (ubyte *) (write_buffer + fx_xleft + (bytes_per_row * fx_y));
292 x = fx_xright - fx_xleft + 1;
293 if (!Transparency_on) {
295 if ((j = (size_t) dest & 7) != 0) {
300 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
301 (((int) (u * rec_z)) & 63)];
313 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
314 (((int) (u * rec_z)) & 63)];
320 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
321 (((int) (u * rec_z)) & 63)] << 8;
327 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
328 (((int) (u * rec_z)) & 63)] << 16;
334 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
335 (((int) (u * rec_z)) & 63)] << 24;
341 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
342 (((int) (u * rec_z)) & 63)] << 32;
348 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
349 (((int) (u * rec_z)) & 63)] << 40;
355 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
356 (((int) (u * rec_z)) & 63)] << 48;
362 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
363 (((int) (u * rec_z)) & 63)] << 56;
369 *((u_int64_t *) dest) = destlong;
377 (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
378 (((int) (u * rec_z)) & 63)];
385 x = fx_xright - fx_xleft + 1;
388 if ((j = (size_t) dest & 7) != 0) {
393 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
394 (((int) (u * rec_z)) & 63)];
409 destlong = *((u_int64_t *) dest);
410 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
411 (((int) (u * rec_z)) & 63)];
413 destlong &= ~(u_int64_t)0xFF;
414 destlong |= (u_int64_t) c;
420 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
421 (((int) (u * rec_z)) & 63)];
423 destlong &= ~((u_int64_t)0xFF << 8);
424 destlong |= (u_int64_t) c << 8;
430 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
431 (((int) (u * rec_z)) & 63)];
433 destlong &= ~((u_int64_t)0xFF << 16);
434 destlong |= (u_int64_t) c << 16;
440 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
441 (((int) (u * rec_z)) & 63)];
443 destlong &= ~((u_int64_t)0xFF << 24);
444 destlong |= (u_int64_t) c << 24;
450 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
451 (((int) (u * rec_z)) & 63)];
453 destlong &= ~((u_int64_t)0xFF << 32);
454 destlong |= (u_int64_t) c << 32;
460 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
461 (((int) (u * rec_z)) & 63)];
463 destlong &= ~((u_int64_t)0xFF << 40);
464 destlong |= (u_int64_t) c << 40;
470 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
471 (((int) (u * rec_z)) & 63)];
473 destlong &= ~((u_int64_t)0xFF << 48);
474 destlong |= (u_int64_t) c << 48;
480 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
481 (((int) (u * rec_z)) & 63)];
483 destlong &= ~((u_int64_t)0xFF << 56);
484 destlong |= (u_int64_t) c << 56;
491 *((u_int64_t *) dest) = destlong;
498 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
499 (((int) (u * rec_z)) & 63)];
511 void c_tmap_scanline_per_nolight()
516 fix u,v,z,dudx, dvdx, dzdx;
525 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
527 if (!Transparency_on) {
528 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
529 *dest++ = (uint)pixptr[ ( (v/z)&(64*63) ) + ((u/z)&63) ];
535 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
536 c = (uint)pixptr[ ( (v/z)&(64*63) ) + ((u/z)&63) ];
549 void c_tmap_scanline_per()
554 double u, v, z, l, dudx, dvdx, dzdx, dldx, rec_z;
558 v = f2db(fx_v) * 64.0;
561 dudx = f2db(fx_du_dx);
562 dvdx = f2db(fx_dv_dx) * 64.0;
563 dzdx = f2db(fx_dz_dx);
564 dldx = f2db(fx_dl_dx);
566 rec_z = 1.0 / z; // gcc 2.95.2 is won't do this optimization itself
568 dest = (ubyte *) (write_buffer + fx_xleft + (bytes_per_row * fx_y));
569 x = fx_xright - fx_xleft + 1;
571 if (!Transparency_on) {
573 if ((j = (size_t) dest & 7) != 0) {
578 gr_fade_table[((int) fabs(l)) * 256 +
579 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
580 (((int) (u * rec_z)) & 63)]];
594 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
595 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
596 (((int) (u * rec_z)) & 63)]];
603 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
604 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
605 (((int) (u * rec_z)) & 63)]] << 8;
612 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
613 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
614 (((int) (u * rec_z)) & 63)]] << 16;
621 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
622 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
623 (((int) (u * rec_z)) & 63)]] << 24;
630 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
631 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
632 (((int) (u * rec_z)) & 63)]] << 32;
639 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
640 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
641 (((int) (u * rec_z)) & 63)]] << 40;
648 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
649 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
650 (((int) (u * rec_z)) & 63)]] << 48;
657 (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
658 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
659 (((int) (u * rec_z)) & 63)]] << 56;
666 *((u_int64_t *) dest) = destlong;
674 gr_fade_table[((int) fabs(l)) * 256 +
675 (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]];
684 if ((j = (size_t) dest & 7) != 0) {
688 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
690 *dest = gr_fade_table[((int) fabs(l)) * 256 + c];
704 destlong = *((u_int64_t *) dest);
705 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
707 destlong &= ~(u_int64_t)0xFF;
708 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c];
715 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
717 destlong &= ~((u_int64_t)0xFF << 8);
718 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 8;
725 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
727 destlong &= ~((u_int64_t)0xFF << 16);
728 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 16;
735 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
737 destlong &= ~((u_int64_t)0xFF << 24);
738 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 24;
745 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
747 destlong &= ~((u_int64_t)0xFF << 32);
748 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 32;
755 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
757 destlong &= ~((u_int64_t)0xFF << 40);
758 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 40;
765 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
767 destlong &= ~((u_int64_t)0xFF << 48);
768 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 48;
775 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
777 destlong &= ~((u_int64_t)0xFF << 56);
778 destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 56;
786 *((u_int64_t *) dest) = destlong;
793 c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
795 *dest = gr_fade_table[((int) fabs(l)) * 256 + c];
807 // note the unrolling loop is broken. It is never called, and uses big endian. -- FH
808 void c_tmap_scanline_per()
814 fix dudx, dvdx, dzdx, dldx;
825 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
827 if (!Transparency_on) {
828 ubyte* pixPtrLocalCopy = pixptr;
829 ubyte* fadeTableLocalCopy = gr_fade_table;
830 unsigned long destlong;
832 x = fx_xright-fx_xleft+1;
834 if ((j = (unsigned long) dest & 3) != 0)
843 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
844 *dest++ = fadeTableLocalCopy[ (l&(0x7f00)) + (uint)pixPtrLocalCopy[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ];
858 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
859 destlong = (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint)pixPtrLocalCopy[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ] << 24;
865 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
866 destlong |= (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint)pixPtrLocalCopy[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ] << 16;
872 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
873 destlong |= (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint)pixPtrLocalCopy[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ] << 8;
879 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
880 destlong |= (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint)pixPtrLocalCopy[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ];
886 *((unsigned long *) dest) = destlong;
894 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
895 *dest++ = (unsigned long) fadeTableLocalCopy[ (l&(0x7f00)) + (uint)pixPtrLocalCopy[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ];
904 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
905 c = (uint)pixptr[ ( (v/z)&(64*63) ) + ((u/z)&63) ];
906 if ( c!=TRANSPARENCY_COLOR)
907 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
908 *dest = gr_fade_table[ (l&(0x7f00)) + c ];
920 void c_tmap_scanline_per()
925 fix u,v,z,l,dudx, dvdx, dzdx, dldx;
936 dest = (ubyte *)(write_buffer + fx_xleft + (bytes_per_row * fx_y) );
938 if (!Transparency_on) {
939 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
940 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
941 *dest++ = gr_fade_table[ (l&(0x7f00)) + (uint)pixptr[ ( (v/z)&(64*63) ) + ((u/z)&63) ] ];
949 for (x= fx_xright-fx_xleft+1 ; x > 0; --x ) {
950 c = (uint)pixptr[ ( (v/z)&(64*63) ) + ((u/z)&63) ];
952 //edited 05/18/99 Matt Mueller - changed from 0xff00 to 0x7f00 to fix glitches
953 *dest = gr_fade_table[ (l&(0x7f00)) + c ];