/* 3DKIT version 1.3 High speed 3D graphics and rendering library for Linux. Copyright (C) 1996, 1997 Paul Sheer psheer@icon.co.za This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef lookup #undef lookup #endif #if (TRI_BPP==8) || !defined(INTERP) #define lookup(x) x #else #define lookup(x) _color_lookup[x] #endif #ifdef assignvp #undef declarevp #undef assignvp #undef assignvpoffset #undef incvp #undef incvpoffset #undef decvp #undef decvpoffset #endif #if TRI_BPP==8 #define declarevp declarevp8 #define assignvp assignvp8 #define assignvpoffset assignvpoffset8 #define incvp incvp8 #define incvpoffset incvpoffset8 #define decvp decvp8 #define decvpoffset decvpoffset8 #endif #if TRI_BPP==16 #define declarevp declarevp16 #define assignvp assignvp16 #define assignvpoffset assignvpoffset16 #define incvp incvp16 #define incvpoffset incvpoffset16 #define decvp decvp16 #define decvpoffset decvpoffset16 #endif #if TRI_BPP==24 #define declarevp declarevp24 #define assignvp assignvp24 #define assignvpoffset assignvpoffset24 #define incvp incvp24 #define incvpoffset incvpoffset24 #define decvp decvp24 #define decvpoffset decvpoffset24 #endif #if TRI_BPP==32 #define declarevp declarevp32 #define assignvp assignvp32 #define assignvpoffset assignvpoffset32 #define incvp incvp32 #define incvpoffset incvpoffset32 #define decvp decvp32 #define decvpoffset decvpoffset32 #endif #ifdef color #undef color #endif #ifdef WRAP #ifdef INTERP #define color \ (dat[(xd >> SHLB) + (yd & S_MASK)] + (c >> (SHLB + SHC))) #else #define color \ (dat[(xd >> SHLB) + (yd & S_MASK)] + c) #endif #else #ifdef INTERP #define color \ (c >> (SHLB + SHC)) #else #define color \ c #endif #endif /* these are actually all the same except for 8 */ #if TRI_BPP==8 static void colhline_neg_setpixel8 (void) #endif #if TRI_BPP==16 static void colhline_neg_setpixel16 (void) #endif #if TRI_BPP==24 static void colhline_neg_setpixel24 (void) #endif #if TRI_BPP==32 static void colhline_neg_setpixel32 (void) #endif { int count, y = py + dy0, x1 = px1 + dx0, x2 = px2 + dx0; if (__clip) { if (y < __clipy1 || y > __clipy2) return; if (x1 > __clipx2 + 1) { #ifdef WRAP xd -= (x1 - __clipx2 - 1) * xd_x; yd -= (x1 - __clipx2 - 1) * yd_x; #endif #ifdef INTERP c -= (x1 - __clipx2 - 1) * c_x; #endif x1 = __clipx2 + 1; } if (x2 < __clipx1) { x2 = __clipx1; } } count = x1 - x2; if (count > 0) { do { _tri_drawpoint (--x1, y, lookup(color)); #ifdef WRAP yd -= yd_x; xd -= xd_x; #endif #ifdef INTERP c -= c_x; #endif } while (--count); } } #if TRI_BPP==8 static void colhline_pos_setpixel8 (void) #endif #if TRI_BPP==16 static void colhline_pos_setpixel16 (void) #endif #if TRI_BPP==24 static void colhline_pos_setpixel24 (void) #endif #if TRI_BPP==32 static void colhline_pos_setpixel32 (void) #endif { int count, y = py + dy0, x1 = px1 + dx0, x2 = px2 + dx0; if (__clip) { if (y < __clipy1 || y > __clipy2) return; if (x1 < __clipx1) { #ifdef WRAP xd += (__clipx1 - x1) * xd_x; yd += (__clipx1 - x1) * yd_x; #endif #ifdef INTERP c += (__clipx1 - x1) * c_x; #endif x1 = __clipx1; } if (x2 > __clipx2 + 1) { x2 = __clipx2 + 1; } } count = x2 - x1; if (count > 0) { do { _tri_drawpoint (x1++, y, lookup(color)); #ifdef WRAP yd += yd_x; xd += xd_x; #endif #ifdef INTERP c += c_x; #endif } while (--count); } } #ifndef DO_NOT_USE_VGALIB /*draw to 64k vga buffer setting vga page appropriately: */ #if TRI_BPP==8 static void colhline_neg_paged8 (void) #endif #if TRI_BPP==16 static void colhline_neg_paged16 (void) #endif #if TRI_BPP==24 static void colhline_neg_paged24 (void) #endif #if TRI_BPP==32 static void colhline_neg_paged32 (void) #endif { int count, y = py + dy0, x1 = px1 + dx0, x2 = px2 + dx0; unsigned short offst; int pg; declarevp; int vp = 0; if (__clip) { if (y < __clipy1 || y > __clipy2) return; if (x1 > __clipx2 + 1) { #ifdef WRAP xd -= (x1 - __clipx2 - 1) * xd_x; yd -= (x1 - __clipx2 - 1) * yd_x; #endif #ifdef INTERP c -= (x1 - __clipx2 - 1) * c_x; #endif x1 = __clipx2 + 1; } if (x2 < __clipx1) { x2 = __clipx1; } } count = x1 - x2; assignvpoffset (x1, y, vp); pg = vp >> 16; vga_setpage (pg); offst = vp; if (count > 0) { do { decvpoffset; #ifdef WRAP yd -= yd_x; xd -= xd_x; #endif #ifdef INTERP c -= c_x; #endif } while (--count); } } #if TRI_BPP==8 static void colhline_pos_paged8 (void) #endif #if TRI_BPP==16 static void colhline_pos_paged16 (void) #endif #if TRI_BPP==24 static void colhline_pos_paged24 (void) #endif #if TRI_BPP==32 static void colhline_pos_paged32 (void) #endif { int count, y = py + dy0, x1 = px1 + dx0, x2 = px2 + dx0; unsigned short offst; int pg; declarevp; int vp = 0; if (__clip) { if (y < __clipy1 || y > __clipy2) return; if (x1 < __clipx1) { #ifdef WRAP xd += (__clipx1 - x1) * xd_x; yd += (__clipx1 - x1) * yd_x; #endif #ifdef INTERP c += (__clipx1 - x1) * c_x; #endif x1 = __clipx1; } if (x2 > __clipx2 + 1) { x2 = __clipx2 + 1; } } count = x2 - x1; assignvpoffset (x1, y, vp); pg = vp >> 16; vga_setpage (pg); offst = vp; if (count > 0) { do { incvpoffset; #ifdef WRAP yd += yd_x; xd += xd_x; #endif #ifdef INTERP c += c_x; #endif } while (--count); } } #else /*draw to 64k vga buffer setting vga page appropriately: */ #if TRI_BPP==8 static void colhline_neg_paged8 (void) #endif #if TRI_BPP==16 static void colhline_neg_paged16 (void) #endif #if TRI_BPP==24 static void colhline_neg_paged24 (void) #endif #if TRI_BPP==32 static void colhline_neg_paged32 (void) #endif { } #if TRI_BPP==8 static void colhline_pos_paged8 (void) #endif #if TRI_BPP==16 static void colhline_pos_paged16 (void) #endif #if TRI_BPP==24 static void colhline_pos_paged24 (void) #endif #if TRI_BPP==32 static void colhline_pos_paged32 (void) #endif { } #endif /*draw to a linear address space (320x200 or virtual screen): */ #if TRI_BPP==8 static void colhline_neg_direct8 (void) #endif #if TRI_BPP==16 static void colhline_neg_direct16 (void) #endif #if TRI_BPP==24 static void colhline_neg_direct24 (void) #endif #if TRI_BPP==32 static void colhline_neg_direct32 (void) #endif { int count, y = py + dy0, x1 = px1 + dx0, x2 = px2 + dx0; declarevp; if (__clip) { if (y < __clipy1 || y > __clipy2) return; if (x1 > __clipx2 + 1) { #ifdef WRAP xd -= (x1 - __clipx2 - 1) * xd_x; yd -= (x1 - __clipx2 - 1) * yd_x; #endif #ifdef INTERP c -= (x1 - __clipx2 - 1) * c_x; #endif x1 = __clipx2 + 1; } if (x2 < __clipx1) x2 = __clipx1; } count = x1 - x2; assignvp (x1, y, vp); if (count > 0) { do { decvp; #ifdef WRAP yd -= yd_x; xd -= xd_x; #endif #ifdef INTERP c -= c_x; #endif } while (--count); } } #if TRI_BPP==8 static void colhline_pos_direct8 (void) #endif #if TRI_BPP==16 static void colhline_pos_direct16 (void) #endif #if TRI_BPP==24 static void colhline_pos_direct24 (void) #endif #if TRI_BPP==32 static void colhline_pos_direct32 (void) #endif { int count, y = py + dy0, x1 = px1 + dx0, x2 = px2 + dx0; declarevp; if (__clip) { if (y < __clipy1 || y > __clipy2) return; if (x1 < __clipx1) { #ifdef WRAP xd += (__clipx1 - x1) * xd_x; yd += (__clipx1 - x1) * yd_x; #endif #ifdef INTERP c += (__clipx1 - x1) * c_x; #endif x1 = __clipx1; } if (x2 > __clipx2 + 1) x2 = __clipx2 + 1; } count = x2 - x1; assignvp (x1, y, vp); if (count > 0) { do { incvp; #ifdef WRAP yd += yd_x; xd += xd_x; #endif #ifdef INTERP c += c_x; #endif } while (--count); } } /*The following have not yet been implemented */ /* Draws to planar 256 (these could be complicated) */ /*static void colhline_neg_planar (void); static void colhline_pos_planar (void);*/ /* Draws using accelerated */ /*static void colhline_neg_accel (void); static void colhline_pos_accel (void);*/