/**
* Convert the span's color arrays to the given type.
+ * XXX this could be put into image.c and reused in several places.
*/
static void
convert_color_type(GLcontext *ctx, SWspan *span, GLenum newType)
{
const GLubyte *mask = span->array->mask;
+ /* XXX NOTE: These all point to the same memory!
+ * We need to use temporaray storage when converting, below.
+ */
GLubyte (*rgba1)[4] = span->array->color.sz1.rgba;
GLushort (*rgba2)[4] = span->array->color.sz2.rgba;
GLfloat (*rgba4)[4] = span->array->color.sz4.rgba;
switch (span->array->ChanType) {
case GL_UNSIGNED_BYTE:
if (newType == GL_UNSIGNED_SHORT) {
+ GLushort newVals[MAX_WIDTH][4];
GLuint i;
for (i = 0; i < span->end; i++) {
if (mask[i]) {
- rgba2[i][RCOMP] = UBYTE_TO_USHORT(rgba1[i][RCOMP]);
- rgba2[i][GCOMP] = UBYTE_TO_USHORT(rgba1[i][GCOMP]);
- rgba2[i][BCOMP] = UBYTE_TO_USHORT(rgba1[i][BCOMP]);
- rgba2[i][ACOMP] = UBYTE_TO_USHORT(rgba1[i][ACOMP]);
+ newVals[i][RCOMP] = UBYTE_TO_USHORT(rgba1[i][RCOMP]);
+ newVals[i][GCOMP] = UBYTE_TO_USHORT(rgba1[i][GCOMP]);
+ newVals[i][BCOMP] = UBYTE_TO_USHORT(rgba1[i][BCOMP]);
+ newVals[i][ACOMP] = UBYTE_TO_USHORT(rgba1[i][ACOMP]);
}
}
+ _mesa_memcpy(rgba2, newVals, span->end * 4 * sizeof(GLushort));
}
else {
+ GLfloat newVals[MAX_WIDTH][4];
GLuint i;
ASSERT(newType == GL_FLOAT);
for (i = 0; i < span->end; i++) {
if (mask[i]) {
- rgba4[i][RCOMP] = UBYTE_TO_FLOAT(rgba1[i][RCOMP]);
- rgba4[i][GCOMP] = UBYTE_TO_FLOAT(rgba1[i][GCOMP]);
- rgba4[i][BCOMP] = UBYTE_TO_FLOAT(rgba1[i][BCOMP]);
- rgba4[i][ACOMP] = UBYTE_TO_FLOAT(rgba1[i][ACOMP]);
+ newVals[i][RCOMP] = UBYTE_TO_FLOAT(rgba1[i][RCOMP]);
+ newVals[i][GCOMP] = UBYTE_TO_FLOAT(rgba1[i][GCOMP]);
+ newVals[i][BCOMP] = UBYTE_TO_FLOAT(rgba1[i][BCOMP]);
+ newVals[i][ACOMP] = UBYTE_TO_FLOAT(rgba1[i][ACOMP]);
}
}
+ _mesa_memcpy(rgba4, newVals, span->end * 4 * sizeof(GLfloat));
}
break;
case GL_UNSIGNED_SHORT:
if (newType == GL_UNSIGNED_BYTE) {
+ GLubyte newVals[MAX_WIDTH][4];
GLuint i;
for (i = 0; i < span->end; i++) {
if (mask[i]) {
- rgba1[i][RCOMP] = USHORT_TO_UBYTE(rgba2[i][RCOMP]);
- rgba1[i][GCOMP] = USHORT_TO_UBYTE(rgba2[i][GCOMP]);
- rgba1[i][BCOMP] = USHORT_TO_UBYTE(rgba2[i][BCOMP]);
- rgba1[i][ACOMP] = USHORT_TO_UBYTE(rgba2[i][ACOMP]);
+ newVals[i][RCOMP] = USHORT_TO_UBYTE(rgba2[i][RCOMP]);
+ newVals[i][GCOMP] = USHORT_TO_UBYTE(rgba2[i][GCOMP]);
+ newVals[i][BCOMP] = USHORT_TO_UBYTE(rgba2[i][BCOMP]);
+ newVals[i][ACOMP] = USHORT_TO_UBYTE(rgba2[i][ACOMP]);
}
}
+ _mesa_memcpy(rgba1, newVals, span->end * 4 * sizeof(GLubyte));
}
else {
+ GLfloat newVals[MAX_WIDTH][4];
GLuint i;
ASSERT(newType == GL_FLOAT);
for (i = 0; i < span->end; i++) {
if (mask[i]) {
- rgba4[i][RCOMP] = USHORT_TO_FLOAT(rgba2[i][RCOMP]);
- rgba4[i][GCOMP] = USHORT_TO_FLOAT(rgba2[i][GCOMP]);
- rgba4[i][BCOMP] = USHORT_TO_FLOAT(rgba2[i][BCOMP]);
- rgba4[i][ACOMP] = USHORT_TO_FLOAT(rgba2[i][ACOMP]);
+ newVals[i][RCOMP] = USHORT_TO_FLOAT(rgba2[i][RCOMP]);
+ newVals[i][GCOMP] = USHORT_TO_FLOAT(rgba2[i][GCOMP]);
+ newVals[i][BCOMP] = USHORT_TO_FLOAT(rgba2[i][BCOMP]);
+ newVals[i][ACOMP] = USHORT_TO_FLOAT(rgba2[i][ACOMP]);
}
}
+ _mesa_memcpy(rgba4, newVals, span->end * 4 * sizeof(GLfloat));
}
break;
case GL_FLOAT:
if (newType == GL_UNSIGNED_BYTE) {
+ GLubyte newVals[MAX_WIDTH][4];
GLuint i;
for (i = 0; i < span->end; i++) {
if (mask[i]) {
- UNCLAMPED_FLOAT_TO_UBYTE(rgba1[i][RCOMP], rgba4[i][RCOMP]);
- UNCLAMPED_FLOAT_TO_UBYTE(rgba1[i][GCOMP], rgba4[i][GCOMP]);
- UNCLAMPED_FLOAT_TO_UBYTE(rgba1[i][BCOMP], rgba4[i][BCOMP]);
- UNCLAMPED_FLOAT_TO_UBYTE(rgba1[i][ACOMP], rgba4[i][ACOMP]);
+ UNCLAMPED_FLOAT_TO_UBYTE(newVals[i][RCOMP], rgba4[i][RCOMP]);
+ UNCLAMPED_FLOAT_TO_UBYTE(newVals[i][GCOMP], rgba4[i][GCOMP]);
+ UNCLAMPED_FLOAT_TO_UBYTE(newVals[i][BCOMP], rgba4[i][BCOMP]);
+ UNCLAMPED_FLOAT_TO_UBYTE(newVals[i][ACOMP], rgba4[i][ACOMP]);
}
}
+ _mesa_memcpy(rgba1, newVals, span->end * 4 * sizeof(GLubyte));
}
else {
+ GLushort newVals[MAX_WIDTH][4];
GLuint i;
ASSERT(newType == GL_UNSIGNED_SHORT);
for (i = 0; i < span->end; i++) {
if (mask[i]) {
- UNCLAMPED_FLOAT_TO_USHORT(rgba2[i][RCOMP], rgba4[i][RCOMP]);
- UNCLAMPED_FLOAT_TO_USHORT(rgba2[i][GCOMP], rgba4[i][GCOMP]);
- UNCLAMPED_FLOAT_TO_USHORT(rgba2[i][BCOMP], rgba4[i][BCOMP]);
- UNCLAMPED_FLOAT_TO_USHORT(rgba2[i][ACOMP], rgba4[i][ACOMP]);
+ UNCLAMPED_FLOAT_TO_USHORT(newVals[i][RCOMP], rgba4[i][RCOMP]);
+ UNCLAMPED_FLOAT_TO_USHORT(newVals[i][GCOMP], rgba4[i][GCOMP]);
+ UNCLAMPED_FLOAT_TO_USHORT(newVals[i][BCOMP], rgba4[i][BCOMP]);
+ UNCLAMPED_FLOAT_TO_USHORT(newVals[i][ACOMP], rgba4[i][ACOMP]);
}
}
+ _mesa_memcpy(rgba2, newVals, span->end * 4 * sizeof(GLushort));
}
break;
default: