Header file clean-up:
[mesa.git] / src / mesa / swrast / s_pixeltex.c
index 854482a25161a9618aa15352488d3c79f54c7059..1ddfae14b77274bdd4de45617b853686d3eb8416 100644 (file)
@@ -1,21 +1,21 @@
-/* $Id: s_pixeltex.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_pixeltex.c,v 1.11 2002/10/24 23:57:24 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
- * 
- * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
- * 
+ * Version:  4.1
+ *
+ * Copyright (C) 1999-2002  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"),
  * to deal in the Software without restriction, including without limitation
  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  * and/or sell copies of the Software, and to permit persons to whom the
  * Software is furnished to do so, subject to the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice shall be included
  * in all copies or substantial portions of the Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 
 #include "glheader.h"
 #include "colormac.h"
+#include "imports.h"
 
+#include "s_context.h"
 #include "s_pixeltex.h"
+#include "s_texture.h"
 
 
 /*
  * Convert RGBA values into strq texture coordinates.
  */
-void
-_mesa_pixeltexgen(GLcontext *ctx, GLuint n, const GLchan rgba[][4],
-                  GLfloat s[], GLfloat t[], GLfloat r[], GLfloat q[])
+static void
+pixeltexgen(GLcontext *ctx, GLuint n, const GLchan rgba[][4],
+            GLfloat texcoord[][4])
 {
    if (ctx->Pixel.FragmentRgbSource == GL_CURRENT_RASTER_COLOR) {
       GLuint i;
       for (i = 0; i < n; i++) {
-         s[i] = ctx->Current.RasterColor[RCOMP];
-         t[i] = ctx->Current.RasterColor[GCOMP];
-         r[i] = ctx->Current.RasterColor[BCOMP];
+         texcoord[i][0] = ctx->Current.RasterColor[RCOMP];
+         texcoord[i][1] = ctx->Current.RasterColor[GCOMP];
+         texcoord[i][2] = ctx->Current.RasterColor[BCOMP];
       }
    }
    else {
       GLuint i;
       ASSERT(ctx->Pixel.FragmentRgbSource == GL_PIXEL_GROUP_COLOR_SGIS);
       for (i = 0; i < n; i++) {
-         s[i] = CHAN_TO_FLOAT(rgba[i][RCOMP]);
-         t[i] = CHAN_TO_FLOAT(rgba[i][GCOMP]);
-         r[i] = CHAN_TO_FLOAT(rgba[i][BCOMP]);
+         texcoord[i][0] = CHAN_TO_FLOAT(rgba[i][RCOMP]);
+         texcoord[i][1] = CHAN_TO_FLOAT(rgba[i][GCOMP]);
+         texcoord[i][2] = CHAN_TO_FLOAT(rgba[i][BCOMP]);
       }
    }
 
    if (ctx->Pixel.FragmentAlphaSource == GL_CURRENT_RASTER_COLOR) {
       GLuint i;
       for (i = 0; i < n; i++) {
-         q[i] = ctx->Current.RasterColor[ACOMP];
+         texcoord[i][3] = ctx->Current.RasterColor[ACOMP];
       }
    }
    else {
       GLuint i;
       ASSERT(ctx->Pixel.FragmentAlphaSource == GL_PIXEL_GROUP_COLOR_SGIS);
       for (i = 0; i < n; i++) {
-         q[i] = CHAN_TO_FLOAT(rgba[i][ACOMP]);
+         texcoord[i][3] = CHAN_TO_FLOAT(rgba[i][ACOMP]);
+      }
+   }
+}
+
+
+
+/*
+ * Used by glDraw/CopyPixels: the incoming image colors are treated
+ * as texture coordinates.  Use those coords to texture the image.
+ * This is for GL_SGIS_pixel_texture / GL_SGIX_pixel_texture.
+ */
+void
+_swrast_pixel_texture(GLcontext *ctx, struct sw_span *span)
+{
+   GLuint unit;
+
+   ASSERT(!(span->arrayMask & SPAN_TEXTURE));
+   span->arrayMask |= SPAN_TEXTURE;
+
+   /* convert colors into texture coordinates */
+   pixeltexgen( ctx, span->end,
+                (const GLchan (*)[4]) span->array->rgba,
+                span->array->texcoords[0] );
+
+   /* copy the new texture units for all enabled units */
+   for (unit = 1; unit < ctx->Const.MaxTextureUnits; unit++) {
+      if (ctx->Texture.Unit[unit]._ReallyEnabled) {
+         MEMCPY( span->array->texcoords[unit], span->array->texcoords[0],
+                 span->end * 4 * sizeof(GLfloat) );
       }
    }
+
+   /* apply texture mapping */
+   _swrast_texture_span( ctx, span );
+
+   /* this is a work-around to be fixed by initializing again span */
+   span->arrayMask &= ~SPAN_TEXTURE;
 }