-static void
-dist_atten_antialiased_rgba_point( GLcontext *ctx, const SWvertex *vert )
-{
- SWcontext *swrast = SWRAST_CONTEXT(ctx);
- struct pixel_buffer *PB = swrast->PB;
-
- if (ctx->Texture._ReallyEnabled) {
- GLfloat radius, rmin, rmax, rmin2, rmax2, cscale, alphaAtten;
- GLint xmin, ymin, xmax, ymax;
- GLint x, y, z;
- GLint red, green, blue, alpha;
- GLfloat texcoord[MAX_TEXTURE_UNITS][4];
- GLint u;
-
- GLfixed fog = FloatToFixed( vert->fog );
-
- if (vert->pointSize >= ctx->Point.Threshold) {
- radius = MIN2(vert->pointSize, ctx->Point.MaxSize) * 0.5F;
- alphaAtten = 1.0F;
- }
- else {
- GLfloat dsize = vert->pointSize / ctx->Point.Threshold;
- radius = (MAX2(ctx->Point.Threshold, ctx->Point.MinSize) * 0.5F);
- alphaAtten = dsize * dsize;
- }
- rmin = radius - 0.7071F; /* 0.7071 = sqrt(2)/2 */
- rmax = radius + 0.7071F;
- rmin2 = MAX2(0.0, rmin * rmin);
- rmax2 = rmax * rmax;
- cscale = 256.0F / (rmax2 - rmin2);
-
- xmin = (GLint) (vert->win[0] - radius);
- xmax = (GLint) (vert->win[0] + radius);
- ymin = (GLint) (vert->win[1] - radius);
- ymax = (GLint) (vert->win[1] + radius);
- z = (GLint) (vert->win[2]);
-
- red = vert->color[0];
- green = vert->color[1];
- blue = vert->color[2];
-
- /* get texture coordinates */
- for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
- if (ctx->Texture.Unit[u]._ReallyEnabled) {
- if (vert->texcoord[u][3] != 1.0 && vert->texcoord[u][3] != 0.0) {
- texcoord[u][0] = vert->texcoord[u][0] / vert->texcoord[u][3];
- texcoord[u][1] = vert->texcoord[u][1] / vert->texcoord[u][3];
- texcoord[u][2] = vert->texcoord[u][2] / vert->texcoord[u][3];
- }
- else {
- texcoord[u][0] = vert->texcoord[u][0];
- texcoord[u][1] = vert->texcoord[u][1];
- texcoord[u][2] = vert->texcoord[u][2];
- }
- }
- }
-
- for (y = ymin; y <= ymax; y++) {
- for (x = xmin; x <= xmax; x++) {
- const GLfloat dx = x + 0.5F - vert->win[0];
- const GLfloat dy = y + 0.5F - vert->win[1];
- const GLfloat dist2 = dx*dx + dy*dy;
- if (dist2 < rmax2) {
- alpha = vert->color[3];
- if (dist2 >= rmin2) {
- GLint coverage = (GLint) (256.0F - (dist2 - rmin2) * cscale);
- /* coverage is in [0,256] */
- alpha = (alpha * coverage) >> 8;
- }
- alpha = (GLint) (alpha * alphaAtten);
- if (swrast->_MultiTextureEnabled) {
- PB_WRITE_MULTITEX_PIXEL( PB, x, y, z, fog,
- red, green, blue, alpha,
- texcoord );
- }
- else {
- PB_WRITE_TEX_PIXEL( PB, x,y,z, fog,
- red, green, blue, alpha,
- texcoord[0][0],
- texcoord[0][1],
- texcoord[0][2] );
- }
- }
- }
- }
- PB_CHECK_FLUSH(ctx,PB);
- }
- else {
- /* Not texture mapped */
- GLfloat radius, rmin, rmax, rmin2, rmax2, cscale, alphaAtten;
- GLint xmin, ymin, xmax, ymax;
- GLint x, y, z;
- GLfixed fog;
- GLint red, green, blue, alpha;
-
- if (vert->pointSize >= ctx->Point.Threshold) {
- radius = MIN2(vert->pointSize, ctx->Point.MaxSize) * 0.5F;
- alphaAtten = 1.0F;
- }
- else {
- GLfloat dsize = vert->pointSize / ctx->Point.Threshold;
- radius = (MAX2(ctx->Point.Threshold, ctx->Point.MinSize) * 0.5F);
- alphaAtten = dsize * dsize;
- }
- rmin = radius - 0.7071F; /* 0.7071 = sqrt(2)/2 */
- rmax = radius + 0.7071F;
- rmin2 = MAX2(0.0, rmin * rmin);
- rmax2 = rmax * rmax;
- cscale = 256.0F / (rmax2 - rmin2);
-
- xmin = (GLint) (vert->win[0] - radius);
- xmax = (GLint) (vert->win[0] + radius);
- ymin = (GLint) (vert->win[1] - radius);
- ymax = (GLint) (vert->win[1] + radius);
- z = (GLint) (vert->win[2]);
-
- fog = FloatToFixed( vert->fog );
-
- red = vert->color[0];
- green = vert->color[1];
- blue = vert->color[2];
-
- for (y = ymin; y <= ymax; y++) {
- for (x = xmin; x <= xmax; x++) {
- const GLfloat dx = x + 0.5F - vert->win[0];
- const GLfloat dy = y + 0.5F - vert->win[1];
- const GLfloat dist2 = dx * dx + dy * dy;
- if (dist2 < rmax2) {
- alpha = vert->color[3];
- if (dist2 >= rmin2) {
- GLint coverage = (GLint) (256.0F - (dist2 - rmin2) * cscale);
- /* coverage is in [0,256] */
- alpha = (alpha * coverage) >> 8;
- }
- alpha = (GLint) (alpha * alphaAtten);
- PB_WRITE_RGBA_PIXEL(PB, x, y, z, fog,
- red, green, blue, alpha);
- }
- }
- }
- PB_CHECK_FLUSH(ctx,PB);
- }
-}