mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 13:58:04 +02:00
support for runtime renderbuffer depths
This commit is contained in:
parent
9440868270
commit
86f0e0b9cc
1 changed files with 81 additions and 24 deletions
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Version: 6.5.2
|
||||
*
|
||||
* Copyright (C) 1999-2005 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2006 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"),
|
||||
|
|
@ -144,7 +144,8 @@ zoom_span( GLcontext *ctx, GLint imgX, GLint imgY, const SWspan *span,
|
|||
zoomed.x = x0;
|
||||
zoomed.end = zoomedWidth;
|
||||
zoomed.array = &zoomed_arrays;
|
||||
zoomed_arrays.ChanType = CHAN_TYPE;
|
||||
zoomed_arrays.ChanType = span->array->ChanType;
|
||||
/* XXX temporary */
|
||||
#if CHAN_TYPE == GL_UNSIGNED_BYTE
|
||||
zoomed_arrays.rgba = zoomed_arrays.color.sz1.rgba;
|
||||
zoomed_arrays.spec = zoomed_arrays.color.sz1.spec;
|
||||
|
|
@ -202,26 +203,76 @@ zoom_span( GLcontext *ctx, GLint imgX, GLint imgY, const SWspan *span,
|
|||
|
||||
/* zoom the span horizontally */
|
||||
if (format == GL_RGBA) {
|
||||
const GLchan (*rgba)[4] = (const GLchan (*)[4]) src;
|
||||
GLint i;
|
||||
for (i = 0; i < zoomedWidth; i++) {
|
||||
GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
|
||||
ASSERT(j >= 0);
|
||||
ASSERT(j < span->end);
|
||||
COPY_CHAN4(zoomed.array->rgba[i], rgba[j]);
|
||||
if (zoomed.array->ChanType == GL_UNSIGNED_BYTE) {
|
||||
const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) src;
|
||||
GLint i;
|
||||
for (i = 0; i < zoomedWidth; i++) {
|
||||
GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
|
||||
ASSERT(j >= 0);
|
||||
ASSERT(j < span->end);
|
||||
COPY_4UBV(zoomed.array->color.sz1.rgba[i], rgba[j]);
|
||||
}
|
||||
}
|
||||
else if (zoomed.array->ChanType == GL_UNSIGNED_SHORT) {
|
||||
const GLushort (*rgba)[4] = (const GLushort (*)[4]) src;
|
||||
GLint i;
|
||||
for (i = 0; i < zoomedWidth; i++) {
|
||||
GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
|
||||
ASSERT(j >= 0);
|
||||
ASSERT(j < span->end);
|
||||
COPY_4V(zoomed.array->color.sz2.rgba[i], rgba[j]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
const GLfloat (*rgba)[4] = (const GLfloat (*)[4]) src;
|
||||
GLint i;
|
||||
for (i = 0; i < zoomedWidth; i++) {
|
||||
GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
|
||||
ASSERT(j >= 0);
|
||||
ASSERT(j < span->end);
|
||||
COPY_4V(zoomed.array->color.sz4.rgba[i], rgba[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (format == GL_RGB) {
|
||||
const GLchan (*rgb)[3] = (const GLchan (*)[3]) src;
|
||||
GLint i;
|
||||
for (i = 0; i < zoomedWidth; i++) {
|
||||
GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
|
||||
ASSERT(j >= 0);
|
||||
ASSERT(j < span->end);
|
||||
zoomed.array->rgba[i][0] = rgb[j][0];
|
||||
zoomed.array->rgba[i][1] = rgb[j][1];
|
||||
zoomed.array->rgba[i][2] = rgb[j][2];
|
||||
zoomed.array->rgba[i][3] = CHAN_MAX;
|
||||
if (zoomed.array->ChanType == GL_UNSIGNED_BYTE) {
|
||||
const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) src;
|
||||
GLint i;
|
||||
for (i = 0; i < zoomedWidth; i++) {
|
||||
GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
|
||||
ASSERT(j >= 0);
|
||||
ASSERT(j < span->end);
|
||||
zoomed.array->color.sz1.rgba[i][0] = rgb[j][0];
|
||||
zoomed.array->color.sz1.rgba[i][1] = rgb[j][1];
|
||||
zoomed.array->color.sz1.rgba[i][2] = rgb[j][2];
|
||||
zoomed.array->color.sz1.rgba[i][3] = 0xff;
|
||||
}
|
||||
}
|
||||
else if (zoomed.array->ChanType == GL_UNSIGNED_SHORT) {
|
||||
const GLushort (*rgb)[3] = (const GLushort (*)[3]) src;
|
||||
GLint i;
|
||||
for (i = 0; i < zoomedWidth; i++) {
|
||||
GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
|
||||
ASSERT(j >= 0);
|
||||
ASSERT(j < span->end);
|
||||
zoomed.array->color.sz2.rgba[i][0] = rgb[j][0];
|
||||
zoomed.array->color.sz2.rgba[i][1] = rgb[j][1];
|
||||
zoomed.array->color.sz2.rgba[i][2] = rgb[j][2];
|
||||
zoomed.array->color.sz2.rgba[i][3] = 0xffff;
|
||||
}
|
||||
}
|
||||
else {
|
||||
const GLfloat (*rgb)[3] = (const GLfloat (*)[3]) src;
|
||||
GLint i;
|
||||
for (i = 0; i < zoomedWidth; i++) {
|
||||
GLint j = unzoom_x(ctx->Pixel.ZoomX, imgX, x0 + i) - span->x;
|
||||
ASSERT(j >= 0);
|
||||
ASSERT(j < span->end);
|
||||
zoomed.array->color.sz4.rgba[i][0] = rgb[j][0];
|
||||
zoomed.array->color.sz4.rgba[i][1] = rgb[j][1];
|
||||
zoomed.array->color.sz4.rgba[i][2] = rgb[j][2];
|
||||
zoomed.array->color.sz4.rgba[i][3] = 1.0F;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (format == GL_COLOR_INDEX) {
|
||||
|
|
@ -253,22 +304,28 @@ zoom_span( GLcontext *ctx, GLint imgX, GLint imgY, const SWspan *span,
|
|||
* going to call _swrast_write_zoomed_span() more than once.
|
||||
* Also, clipping may change the span end value, so store it as well.
|
||||
*/
|
||||
GLchan rgbaSave[MAX_WIDTH][4];
|
||||
const GLint end = zoomed.end; /* save */
|
||||
/* use specular color array for temp storage */
|
||||
void *rgbaSave = zoomed.array->spec;
|
||||
const GLint pixelSize =
|
||||
(zoomed.array->ChanType == GL_UNSIGNED_BYTE) ? 4 * sizeof(GLubyte) :
|
||||
((zoomed.array->ChanType == GL_UNSIGNED_SHORT) ? 4 * sizeof(GLushort)
|
||||
: 4 * sizeof(GLfloat));
|
||||
if (y1 - y0 > 1) {
|
||||
MEMCPY(rgbaSave, zoomed.array->rgba, zoomed.end * 4 * sizeof(GLchan));
|
||||
MEMCPY(rgbaSave, zoomed.array->rgba, zoomed.end * pixelSize);
|
||||
}
|
||||
for (zoomed.y = y0; zoomed.y < y1; zoomed.y++) {
|
||||
_swrast_write_rgba_span(ctx, &zoomed);
|
||||
zoomed.end = end; /* restore */
|
||||
if (y1 - y0 > 1) {
|
||||
/* restore the colors */
|
||||
MEMCPY(zoomed.array->rgba, rgbaSave, zoomed.end*4 * sizeof(GLchan));
|
||||
MEMCPY(zoomed.array->rgba, rgbaSave, zoomed.end * pixelSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (format == GL_COLOR_INDEX) {
|
||||
GLuint indexSave[MAX_WIDTH];
|
||||
/* use specular color array for temp storage */
|
||||
GLuint *indexSave = (GLuint *) zoomed.array->spec;
|
||||
const GLint end = zoomed.end; /* save */
|
||||
if (y1 - y0 > 1) {
|
||||
MEMCPY(indexSave, zoomed.array->index, zoomed.end * sizeof(GLuint));
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue