1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009-2010  VMware, Inc.  All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file pixeltransfer.c
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pixel transfer operations (scale, bias, table lookups, etc)
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "colormac.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pixeltransfer.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Apply scale and bias factors to an array of RGBA pixels.
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_scale_and_bias_rgba(GLuint n, GLfloat rgba[][4],
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLfloat rScale, GLfloat gScale,
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLfloat bScale, GLfloat aScale,
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLfloat rBias, GLfloat gBias,
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLfloat bBias, GLfloat aBias)
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rScale != 1.0 || rBias != 0.0) {
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < n; i++) {
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rgba[i][RCOMP] = rgba[i][RCOMP] * rScale + rBias;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (gScale != 1.0 || gBias != 0.0) {
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < n; i++) {
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rgba[i][GCOMP] = rgba[i][GCOMP] * gScale + gBias;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (bScale != 1.0 || bBias != 0.0) {
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < n; i++) {
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rgba[i][BCOMP] = rgba[i][BCOMP] * bScale + bBias;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (aScale != 1.0 || aBias != 0.0) {
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < n; i++) {
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rgba[i][ACOMP] = rgba[i][ACOMP] * aScale + aBias;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Apply pixel mapping to an array of floating point RGBA pixels.
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_map_rgba( const struct gl_context *ctx, GLuint n, GLfloat rgba[][4] )
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat rscale = (GLfloat) (ctx->PixelMaps.RtoR.Size - 1);
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat gscale = (GLfloat) (ctx->PixelMaps.GtoG.Size - 1);
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat bscale = (GLfloat) (ctx->PixelMaps.BtoB.Size - 1);
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat ascale = (GLfloat) (ctx->PixelMaps.AtoA.Size - 1);
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *rMap = ctx->PixelMaps.RtoR.Map;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *gMap = ctx->PixelMaps.GtoG.Map;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *bMap = ctx->PixelMaps.BtoB.Map;
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *aMap = ctx->PixelMaps.AtoA.Map;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i=0;i<n;i++) {
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat r = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat g = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat b = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat a = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rgba[i][RCOMP] = rMap[F_TO_I(r * rscale)];
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rgba[i][GCOMP] = gMap[F_TO_I(g * gscale)];
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rgba[i][BCOMP] = bMap[F_TO_I(b * bscale)];
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rgba[i][ACOMP] = aMap[F_TO_I(a * ascale)];
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Map color indexes to float rgba values.
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_map_ci_to_rgba( const struct gl_context *ctx, GLuint n,
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const GLuint index[], GLfloat rgba[][4] )
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint rmask = ctx->PixelMaps.ItoR.Size - 1;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint gmask = ctx->PixelMaps.ItoG.Size - 1;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint bmask = ctx->PixelMaps.ItoB.Size - 1;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint amask = ctx->PixelMaps.ItoA.Size - 1;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *rMap = ctx->PixelMaps.ItoR.Map;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *gMap = ctx->PixelMaps.ItoG.Map;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *bMap = ctx->PixelMaps.ItoB.Map;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *aMap = ctx->PixelMaps.ItoA.Map;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i=0;i<n;i++) {
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rgba[i][RCOMP] = rMap[index[i] & rmask];
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rgba[i][GCOMP] = gMap[index[i] & gmask];
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rgba[i][BCOMP] = bMap[index[i] & bmask];
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rgba[i][ACOMP] = aMap[index[i] & amask];
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_scale_and_bias_depth(const struct gl_context *ctx, GLuint n,
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           GLfloat depthValues[])
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat scale = ctx->Pixel.DepthScale;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat bias = ctx->Pixel.DepthBias;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < n; i++) {
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat d = depthValues[i] * scale + bias;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      depthValues[i] = CLAMP(d, 0.0F, 1.0F);
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_scale_and_bias_depth_uint(const struct gl_context *ctx, GLuint n,
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                GLuint depthValues[])
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLdouble max = (double) 0xffffffff;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLdouble scale = ctx->Pixel.DepthScale;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLdouble bias = ctx->Pixel.DepthBias * max;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < n; i++) {
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLdouble d = (GLdouble) depthValues[i] * scale + bias;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      d = CLAMP(d, 0.0, max);
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      depthValues[i] = (GLuint) d;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Apply various pixel transfer operations to an array of RGBA pixels
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * as indicated by the transferOps bitmask
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_apply_rgba_transfer_ops(struct gl_context *ctx, GLbitfield transferOps,
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLuint n, GLfloat rgba[][4])
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* scale & bias */
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (transferOps & IMAGE_SCALE_BIAS_BIT) {
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_scale_and_bias_rgba(n, rgba,
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* color map lookup */
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (transferOps & IMAGE_MAP_COLOR_BIT) {
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_map_rgba( ctx, n, rgba );
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* clamping to [0,1] */
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (transferOps & IMAGE_CLAMP_BIT) {
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < n; i++) {
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Apply color index shift and offset to an array of pixels.
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_shift_and_offset_ci(const struct gl_context *ctx,
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLuint n, GLuint indexes[])
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint shift = ctx->Pixel.IndexShift;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint offset = ctx->Pixel.IndexOffset;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (shift > 0) {
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i=0;i<n;i++) {
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         indexes[i] = (indexes[i] << shift) + offset;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (shift < 0) {
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      shift = -shift;
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i=0;i<n;i++) {
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         indexes[i] = (indexes[i] >> shift) + offset;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i=0;i<n;i++) {
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         indexes[i] = indexes[i] + offset;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Apply color index shift, offset and table lookup to an array
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of color indexes;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_apply_ci_transfer_ops(const struct gl_context *ctx,
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLbitfield transferOps,
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLuint n, GLuint indexes[])
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_shift_and_offset_ci(ctx, n, indexes);
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (transferOps & IMAGE_MAP_COLOR_BIT) {
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint mask = ctx->PixelMaps.ItoI.Size - 1;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < n; i++) {
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const GLuint j = indexes[i] & mask;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         indexes[i] = F_TO_I(ctx->PixelMaps.ItoI.Map[j]);
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Apply stencil index shift, offset and table lookup to an array
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of stencil values.
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_apply_stencil_transfer_ops(const struct gl_context *ctx, GLuint n,
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 GLubyte stencil[])
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Pixel.IndexShift != 0 || ctx->Pixel.IndexOffset != 0) {
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLint offset = ctx->Pixel.IndexOffset;
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint shift = ctx->Pixel.IndexShift;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (shift > 0) {
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < n; i++) {
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            stencil[i] = (stencil[i] << shift) + offset;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (shift < 0) {
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         shift = -shift;
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < n; i++) {
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            stencil[i] = (stencil[i] >> shift) + offset;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < n; i++) {
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            stencil[i] = stencil[i] + offset;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Pixel.MapStencilFlag) {
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint mask = ctx->PixelMaps.StoS.Size - 1;
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < n; i++) {
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         stencil[i] = (GLubyte) ctx->PixelMaps.StoS.Map[ stencil[i] & mask ];
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
281