Difference for texmap/scanline.c from version 1.3 to 1.4


version 1.3 version 1.4
Line 19
 
Line 19
  * Routines to draw the texture mapped scanlines.   * Routines to draw the texture mapped scanlines.
  *    *
  * $Log$   * $Log$
    * Revision 1.4  1999/10/18 00:31:01  donut
    * more alpha fixes from Falk Hueffner
    *
  * Revision 1.3  1999/10/14 04:48:21  donut   * Revision 1.3  1999/10/14 04:48:21  donut
  * alpha fixes, and gl_font args   * alpha fixes, and gl_font args
  *   *
Line 260
 
Line 263
 }  }
 #endif  #endif
   
   #ifdef FP_TMAP
   void c_tmap_scanline_per_nolight()
   {
    ubyte        *dest;
    uint c;
    int x, j;
    double u, v, z, dudx, dvdx, dzdx, rec_z;
    u_int64_t destlong;
   
    u = f2db(fx_u);
    v = f2db(fx_v) * 64.0;
    z = f2db(fx_z);
    dudx = f2db(fx_du_dx);
    dvdx = f2db(fx_dv_dx) * 64.0;
    dzdx = f2db(fx_dz_dx);
   
    rec_z = 1.0 / z;
   
    dest = (ubyte *) (write_buffer + fx_xleft + (bytes_per_row * fx_y));
   
    x = fx_xright - fx_xleft + 1;
    if (!Transparency_on) {
    if (x >= 8) {
    if ((j = (size_t) dest & 7) != 0) {
    j = 8 - j;
   
    while (j > 0) {
    *dest++ =
        (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
    (((int) (u * rec_z)) & 63)];
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    x--;
    j--;
    }
    }
   
    while (j >= 8) {
    destlong =
        (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
           (((int) (u * rec_z)) & 63)];
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
           (((int) (u * rec_z)) & 63)] << 8;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
           (((int) (u * rec_z)) & 63)] << 16;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
           (((int) (u * rec_z)) & 63)] << 24;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
           (((int) (u * rec_z)) & 63)] << 32;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
           (((int) (u * rec_z)) & 63)] << 40;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
           (((int) (u * rec_z)) & 63)] << 48;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
           (((int) (u * rec_z)) & 63)] << 56;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
   
    *((u_int64_t *) dest) = destlong;
    dest += 8;
    x -= 8;
    j -= 8;
    }
    }
    while (x-- > 0) {
    *dest++ =
        (u_int64_t) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
           (((int) (u * rec_z)) & 63)];
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    }
    } else {
    x = fx_xright - fx_xleft + 1;
   
    if (x >= 8) {
    if ((j = (size_t) dest & 7) != 0) {
    j = 8 - j;
   
    while (j > 0) {
    c =
        (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
    (((int) (u * rec_z)) & 63)];
    if (c != 255)
    *dest = c;
    dest++;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    x--;
    j--;
    }
    }
   
    j = x;
    while (j >= 8) {
    destlong = *((u_int64_t *) dest);
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
      (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~(u_int64_t)0xFF;
    destlong |= (u_int64_t) c;
    }
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
      (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 8);
    destlong |= (u_int64_t) c << 8;
    }
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
      (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 16);
    destlong |= (u_int64_t) c << 16;
    }
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
      (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 24);
    destlong |= (u_int64_t) c << 24;
    }
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
      (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 32);
    destlong |= (u_int64_t) c << 32;
    }
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
      (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 40);
    destlong |= (u_int64_t) c << 40;
    }
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
      (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 48);
    destlong |= (u_int64_t) c << 48;
    }
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
      (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 56);
    destlong |= (u_int64_t) c << 56;
    }
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
   
    *((u_int64_t *) dest) = destlong;
    dest += 8;
    x -= 8;
    j -= 8;
    }
    }
    while (x-- > 0) {
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
      (((int) (u * rec_z)) & 63)];
    if (c != 255)
    *dest = c;
    dest++;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    }
    }
   }
   #else
 void c_tmap_scanline_per_nolight()  void c_tmap_scanline_per_nolight()
 {  {
  ubyte *dest;   ubyte *dest;
Line 295
 
Line 537
  }   }
  }   }
 }  }
   #endif
   
 #if 1  #ifdef FP_TMAP
   void c_tmap_scanline_per()
   {
    ubyte          *dest;
    uint            c;
    int             x, j;
    double          u, v, z, l, dudx, dvdx, dzdx, dldx, rec_z;
    u_int64_t       destlong;
   
    u = f2db(fx_u);
    v = f2db(fx_v) * 64.0;
    z = f2db(fx_z);
    l = f2db(fx_l);
    dudx = f2db(fx_du_dx);
    dvdx = f2db(fx_dv_dx) * 64.0;
    dzdx = f2db(fx_dz_dx);
    dldx = f2db(fx_dl_dx);
   
    rec_z = 1.0 / z; // gcc 2.95.2 is won't do this optimization itself
   
    dest = (ubyte *) (write_buffer + fx_xleft + (bytes_per_row * fx_y));
    x = fx_xright - fx_xleft + 1;
   
    if (!Transparency_on) {
    if (x >= 8) {
    if ((j = (size_t) dest & 7) != 0) {
    j = 8 - j;
   
    while (j > 0) {
    *dest++ =
        gr_fade_table[((int) fabs(l)) * 256 +
      (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
    (((int) (u * rec_z)) & 63)]];
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    x--;
    j--;
    }
    }
   
    j = x;
    while (j >= 8) {
    destlong =
        (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
          (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
        (((int) (u * rec_z)) & 63)]];
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
          (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
        (((int) (u * rec_z)) & 63)]] << 8;
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
          (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
        (((int) (u * rec_z)) & 63)]] << 16;
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
          (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
        (((int) (u * rec_z)) & 63)]] << 24;
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
          (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
        (((int) (u * rec_z)) & 63)]] << 32;
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
          (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
        (((int) (u * rec_z)) & 63)]] << 40;
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
          (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
        (((int) (u * rec_z)) & 63)]] << 48;
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    destlong |=
        (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 +
          (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) +
        (((int) (u * rec_z)) & 63)]] << 56;
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
   
    *((u_int64_t *) dest) = destlong;
    dest += 8;
    x -= 8;
    j -= 8;
    }
    }
    while (x-- > 0) {
    *dest++ =
        gr_fade_table[((int) fabs(l)) * 256 +
      (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)]];
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    }
    } else {
    if (x >= 8) {
    if ((j = (size_t) dest & 7) != 0) {
    j = 8 - j;
   
    while (j > 0) {
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
    if (c != 255)
    *dest = gr_fade_table[((int) fabs(l)) * 256 + c];
    dest++;
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    x--;
    j--;
    }
    }
   
    j = x;
    while (j >= 8) {
    destlong = *((u_int64_t *) dest);
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~(u_int64_t)0xFF;
    destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c];
    }
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 8);
    destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 8;
    }
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 16);
    destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 16;
    }
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 24);
    destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 24;
    }
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 32);
    destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 32;
    }
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 40);
    destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 40;
    }
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 48);
    destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 48;
    }
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
    if (c != 255) {
    destlong &= ~((u_int64_t)0xFF << 56);
    destlong |= (u_int64_t) gr_fade_table[((int) fabs(l)) * 256 + c] << 56;
    }
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
   
    *((u_int64_t *) dest) = destlong;
    dest += 8;
    x -= 8;
    j -= 8;
    }
    }
    while (x-- > 0) {
    c = (uint) pixptr[(((int) (v * rec_z)) & (64 * 63)) + (((int) (u * rec_z)) & 63)];
    if (c != 255)
    *dest = gr_fade_table[((int) fabs(l)) * 256 + c];
    dest++;
    l += dldx;
    u += dudx;
    v += dvdx;
    z += dzdx;
    rec_z = 1.0 / z;
    }
    }
   }
   
   #elif 1
   // note the unrolling loop is broken. It is never called, and uses big endian. -- FH
 void c_tmap_scanline_per()  void c_tmap_scanline_per()
 {  {
  ubyte *dest;   ubyte *dest;

Legend:
line(s) removed in v.1.3 
line(s) changed
 line(s) added in v.1.4