r300: Further reduced the radeon_span.c diff.
[mesa.git] / src / mesa / swrast / s_aatriangle.c
index d3d44d4e54a2cef72f008d60deb4240a2b1050cc..0d95f06a9de8609b755e55e429ddcc4ee1d06e1a 100644 (file)
@@ -1,10 +1,8 @@
-/* $Id: s_aatriangle.c,v 1.28 2003/01/22 15:03:09 brianp Exp $ */
-
 /*
  * Mesa 3-D graphics library
- * Version:  5.1
+ * Version:  6.5.3
  *
- * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
 
 
 #include "glheader.h"
+#include "context.h"
 #include "colormac.h"
+#include "context.h"
 #include "macros.h"
 #include "imports.h"
-#include "mmath.h"
 #include "s_aatriangle.h"
 #include "s_context.h"
 #include "s_span.h"
@@ -213,30 +212,40 @@ compute_coveragef(const GLfloat v0[3], const GLfloat v1[3],
    for (i = 0; i < stop; i++) {
       const GLfloat sx = x + samples[i][0];
       const GLfloat sy = y + samples[i][1];
-      const GLfloat fx0 = sx - v0[0];
-      const GLfloat fy0 = sy - v0[1];
-      const GLfloat fx1 = sx - v1[0];
-      const GLfloat fy1 = sy - v1[1];
-      const GLfloat fx2 = sx - v2[0];
-      const GLfloat fy2 = sy - v2[1];
       /* cross product determines if sample is inside or outside each edge */
-      GLfloat cross0 = (dx0 * fy0 - dy0 * fx0);
-      GLfloat cross1 = (dx1 * fy1 - dy1 * fx1);
-      GLfloat cross2 = (dx2 * fy2 - dy2 * fx2);
+      GLfloat cross = (dx0 * (sy - v0[1]) - dy0 * (sx - v0[0]));
       /* Check if the sample is exactly on an edge.  If so, let cross be a
        * positive or negative value depending on the direction of the edge.
        */
-      if (cross0 == 0.0F)
-         cross0 = dx0 + dy0;
-      if (cross1 == 0.0F)
-         cross1 = dx1 + dy1;
-      if (cross2 == 0.0F)
-         cross2 = dx2 + dy2;
-      if (cross0 < 0.0F || cross1 < 0.0F || cross2 < 0.0F) {
-         /* point is outside triangle */
+      if (cross == 0.0F)
+         cross = dx0 + dy0;
+      if (cross < 0.0F) {
+         /* sample point is outside first edge */
          insideCount -= 1.0F;
          stop = 16;
       }
+      else {
+         /* sample point is inside first edge */
+         cross = (dx1 * (sy - v1[1]) - dy1 * (sx - v1[0]));
+         if (cross == 0.0F)
+            cross = dx1 + dy1;
+         if (cross < 0.0F) {
+            /* sample point is outside second edge */
+            insideCount -= 1.0F;
+            stop = 16;
+         }
+         else {
+            /* sample point is inside first and second edges */
+            cross = (dx2 * (sy - v2[1]) -  dy2 * (sx - v2[0]));
+            if (cross == 0.0F)
+               cross = dx2 + dy2;
+            if (cross < 0.0F) {
+               /* sample point is outside third edge */
+               insideCount -= 1.0F;
+               stop = 16;
+            }
+         }
+      }
    }
    if (stop == 4)
       return 1.0F;
@@ -399,7 +408,7 @@ tex_aa_tri(GLcontext *ctx,
 #define DO_Z
 #define DO_FOG
 #define DO_RGBA
-#define DO_TEX
+#define DO_ATTRIBS
 #include "s_aatritemp.h"
 }
 
@@ -413,65 +422,29 @@ spec_tex_aa_tri(GLcontext *ctx,
 #define DO_Z
 #define DO_FOG
 #define DO_RGBA
-#define DO_TEX
+#define DO_ATTRIBS
 #define DO_SPEC
 #include "s_aatritemp.h"
 }
 
 
-static void
-multitex_aa_tri(GLcontext *ctx,
-               const SWvertex *v0,
-               const SWvertex *v1,
-               const SWvertex *v2)
-{
-#define DO_Z
-#define DO_FOG
-#define DO_RGBA
-#define DO_MULTITEX
-#include "s_aatritemp.h"
-}
-
-static void
-spec_multitex_aa_tri(GLcontext *ctx,
-                    const SWvertex *v0,
-                    const SWvertex *v1,
-                    const SWvertex *v2)
-{
-#define DO_Z
-#define DO_FOG
-#define DO_RGBA
-#define DO_MULTITEX
-#define DO_SPEC
-#include "s_aatritemp.h"
-}
-
 
 /*
  * Examine GL state and set swrast->Triangle to an
  * appropriate antialiased triangle rasterizer function.
  */
 void
-_mesa_set_aa_triangle_function(GLcontext *ctx)
+_swrast_set_aa_triangle_function(GLcontext *ctx)
 {
    ASSERT(ctx->Polygon.SmoothFlag);
 
-   if (ctx->Texture._EnabledUnits != 0) {
-      if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) {
-         if (ctx->Texture._EnabledUnits > 1) {
-            SWRAST_CONTEXT(ctx)->Triangle = spec_multitex_aa_tri;
-         }
-         else {
-            SWRAST_CONTEXT(ctx)->Triangle = spec_tex_aa_tri;
-         }
+   if (ctx->Texture._EnabledCoordUnits != 0
+       || ctx->FragmentProgram._Current) {
+      if (NEED_SECONDARY_COLOR(ctx)) {
+         SWRAST_CONTEXT(ctx)->Triangle = spec_tex_aa_tri;
       }
       else {
-         if (ctx->Texture._EnabledUnits > 1) {
-            SWRAST_CONTEXT(ctx)->Triangle = multitex_aa_tri;
-         }
-         else {
-            SWRAST_CONTEXT(ctx)->Triangle = tex_aa_tri;
-         }
+         SWRAST_CONTEXT(ctx)->Triangle = tex_aa_tri;
       }
    }
    else if (ctx->Visual.rgbMode) {