mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 11:00:11 +01:00
glDrawPixels(GL_DEPTH_COMPONENT) with glPixelZoom didn't work
This commit is contained in:
parent
a3a10e6dfc
commit
4be6c0f04b
3 changed files with 92 additions and 36 deletions
|
|
@ -627,7 +627,7 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,
|
|||
GLenum type, const GLvoid *pixels )
|
||||
{
|
||||
const GLboolean bias_or_scale = ctx->Pixel.DepthBias!=0.0 || ctx->Pixel.DepthScale!=1.0;
|
||||
const GLboolean zoom = ctx->Pixel.ZoomX!=1.0 || ctx->Pixel.ZoomY!=1.0;
|
||||
const GLboolean zoom = ctx->Pixel.ZoomX != 1.0 || ctx->Pixel.ZoomY != 1.0;
|
||||
const GLint desty = y;
|
||||
struct sw_span span;
|
||||
|
||||
|
|
@ -720,19 +720,13 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,
|
|||
span.array->z[i] = (GLdepth) (floatSpan[i] * zs + 0.5F);
|
||||
}
|
||||
}
|
||||
if (ctx->Visual.rgbMode) {
|
||||
if (zoom) {
|
||||
_swrast_write_zoomed_rgba_span(ctx, &span,
|
||||
(const GLchan (*)[4]) span.array->rgba,
|
||||
desty, skipPixels);
|
||||
}
|
||||
else
|
||||
_swrast_write_rgba_span(ctx, &span);
|
||||
if (zoom) {
|
||||
_swrast_write_zoomed_depth_span(ctx, &span, desty, skipPixels);
|
||||
}
|
||||
else if (ctx->Visual.rgbMode) {
|
||||
_swrast_write_rgba_span(ctx, &span);
|
||||
}
|
||||
else {
|
||||
if (zoom)
|
||||
_swrast_write_zoomed_index_span(ctx, &span, desty, 0);
|
||||
else
|
||||
_swrast_write_index_span(ctx, &span);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,44 +45,58 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
|
|||
GLint c0, c1, skipCol;
|
||||
GLint i, j;
|
||||
const GLuint maxWidth = MIN2( ctx->DrawBuffer->Width, MAX_WIDTH );
|
||||
GLchan rgbaSave[MAX_WIDTH][4];
|
||||
GLuint indexSave[MAX_WIDTH];
|
||||
const GLchan (*rgba)[4] = (const GLchan (*)[4]) src;
|
||||
const GLchan (*rgb)[3] = (const GLchan (*)[3]) src;
|
||||
const GLuint *indexes = (const GLuint *) src;
|
||||
struct sw_span zoomed;
|
||||
struct span_arrays zoomed_arrays; /* this is big! */
|
||||
|
||||
/* no pixel arrays! */
|
||||
/* no pixel arrays! must be horizontal spans. */
|
||||
ASSERT((span->arrayMask & SPAN_XY) == 0);
|
||||
ASSERT(span->primitive == GL_BITMAP);
|
||||
|
||||
INIT_SPAN(zoomed, GL_BITMAP, 0, 0, 0);
|
||||
zoomed.array = &zoomed_arrays;
|
||||
|
||||
zoomed.z = span->z;
|
||||
zoomed.zStep = span->zStep; /* span->zStep == 0 */
|
||||
/* copy fog interp info */
|
||||
zoomed.fog = span->fog;
|
||||
zoomed.fogStep = span->fogStep;
|
||||
/* XXX copy texcoord info? */
|
||||
|
||||
if (format == GL_RGBA || format == GL_RGB) {
|
||||
/* copy Z info */
|
||||
zoomed.z = span->z;
|
||||
zoomed.zStep = span->zStep;
|
||||
/* we'll generate an array of colorss */
|
||||
zoomed.interpMask = span->interpMask & ~SPAN_RGBA;
|
||||
zoomed.arrayMask |= SPAN_RGBA;
|
||||
}
|
||||
else if (format == GL_COLOR_INDEX) {
|
||||
/* copy Z info */
|
||||
zoomed.z = span->z;
|
||||
zoomed.zStep = span->zStep;
|
||||
/* we'll generate an array of color indexes */
|
||||
zoomed.interpMask = span->interpMask & ~SPAN_INDEX;
|
||||
zoomed.arrayMask |= SPAN_INDEX;
|
||||
}
|
||||
else {
|
||||
assert(format == GL_DEPTH_COMPONENT);
|
||||
/* Copy color info */
|
||||
zoomed.red = span->red;
|
||||
zoomed.green = span->green;
|
||||
zoomed.blue = span->blue;
|
||||
zoomed.alpha = span->alpha;
|
||||
zoomed.redStep = span->redStep;
|
||||
zoomed.greenStep = span->greenStep;
|
||||
zoomed.blueStep = span->blueStep;
|
||||
zoomed.alphaStep = span->alphaStep;
|
||||
/* we'll generate an array of depth values */
|
||||
zoomed.interpMask = span->interpMask & ~SPAN_Z;
|
||||
zoomed.arrayMask |= SPAN_Z;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute which columns to draw: [c0, c1)
|
||||
*/
|
||||
#if 0
|
||||
c0 = (GLint) span->x;
|
||||
c1 = (GLint) (span->x + span->end * ctx->Pixel.ZoomX);
|
||||
#else
|
||||
c0 = (GLint) (span->x + skipPixels * ctx->Pixel.ZoomX);
|
||||
c1 = (GLint) (span->x + (skipPixels + span->end) * ctx->Pixel.ZoomX);
|
||||
#endif
|
||||
if (c0 == c1) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -140,6 +154,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
|
|||
|
||||
/* zoom the span horizontally */
|
||||
if (format == GL_RGBA) {
|
||||
const GLchan (*rgba)[4] = (const GLchan (*)[4]) src;
|
||||
if (ctx->Pixel.ZoomX == -1.0F) {
|
||||
/* common case */
|
||||
for (j = (GLint) zoomed.start; j < (GLint) zoomed.end; j++) {
|
||||
|
|
@ -163,6 +178,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
|
|||
}
|
||||
}
|
||||
else if (format == GL_RGB) {
|
||||
const GLchan (*rgb)[3] = (const GLchan (*)[3]) src;
|
||||
if (ctx->Pixel.ZoomX == -1.0F) {
|
||||
/* common case */
|
||||
for (j = (GLint) zoomed.start; j < (GLint) zoomed.end; j++) {
|
||||
|
|
@ -192,6 +208,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
|
|||
}
|
||||
}
|
||||
else if (format == GL_COLOR_INDEX) {
|
||||
const GLuint *indexes = (const GLuint *) src;
|
||||
if (ctx->Pixel.ZoomX == -1.0F) {
|
||||
/* common case */
|
||||
for (j = (GLint) zoomed.start; j < (GLint) zoomed.end; j++) {
|
||||
|
|
@ -214,6 +231,37 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
|
|||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
const GLdepth *zValues = (const GLuint *) src;
|
||||
assert(format == GL_DEPTH_COMPONENT);
|
||||
if (ctx->Pixel.ZoomX == -1.0F) {
|
||||
/* common case */
|
||||
for (j = (GLint) zoomed.start; j < (GLint) zoomed.end; j++) {
|
||||
i = span->end - (j + skipCol) - 1;
|
||||
zoomed.array->z[j] = zValues[i];
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* general solution */
|
||||
const GLfloat xscale = 1.0F / ctx->Pixel.ZoomX;
|
||||
for (j = (GLint) zoomed.start; j < (GLint) zoomed.end; j++) {
|
||||
i = (GLint) ((j + skipCol) * xscale);
|
||||
if (ctx->Pixel.ZoomX < 0.0) {
|
||||
ASSERT(i <= 0);
|
||||
i = span->end + i - 1;
|
||||
}
|
||||
ASSERT(i >= 0);
|
||||
ASSERT(i < (GLint) span->end);
|
||||
zoomed.array->z[j] = zValues[i];
|
||||
}
|
||||
}
|
||||
/* Now, fall into either the RGB or COLOR_INDEX path below */
|
||||
if (ctx->Visual.rgbMode)
|
||||
format = GL_RGBA;
|
||||
else
|
||||
format = GL_COLOR_INDEX;
|
||||
}
|
||||
|
||||
|
||||
/* write the span in rows [r0, r1) */
|
||||
if (format == GL_RGBA || format == GL_RGB) {
|
||||
|
|
@ -221,6 +269,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *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 */
|
||||
if (r1 - r0 > 1) {
|
||||
MEMCPY(rgbaSave, zoomed.array->rgba, zoomed.end * 4 * sizeof(GLchan));
|
||||
|
|
@ -235,6 +284,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *span,
|
|||
}
|
||||
}
|
||||
else if (format == GL_COLOR_INDEX) {
|
||||
GLuint indexSave[MAX_WIDTH];
|
||||
const GLint end = zoomed.end; /* save */
|
||||
if (r1 - r0 > 1) {
|
||||
MEMCPY(indexSave, zoomed.array->index, zoomed.end * sizeof(GLuint));
|
||||
|
|
@ -273,8 +323,17 @@ void
|
|||
_swrast_write_zoomed_index_span( GLcontext *ctx, const struct sw_span *span,
|
||||
GLint y0, GLint skipPixels )
|
||||
{
|
||||
zoom_span(ctx, span, (const GLvoid *) span->array->index, y0,
|
||||
GL_COLOR_INDEX, skipPixels);
|
||||
zoom_span(ctx, span, (const GLvoid *) span->array->index, y0,
|
||||
GL_COLOR_INDEX, skipPixels);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_swrast_write_zoomed_depth_span( GLcontext *ctx, const struct sw_span *span,
|
||||
GLint y0, GLint skipPixels )
|
||||
{
|
||||
zoom_span(ctx, span, (const GLvoid *) span->array->z, y0,
|
||||
GL_DEPTH_COMPONENT, skipPixels);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,8 @@
|
|||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 5.1
|
||||
*
|
||||
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2003 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"),
|
||||
|
|
@ -31,21 +30,25 @@
|
|||
|
||||
extern void
|
||||
_swrast_write_zoomed_rgba_span( GLcontext *ctx, const struct sw_span *span,
|
||||
CONST GLchan rgb[][4], GLint y0,
|
||||
GLint skipPixels );
|
||||
CONST GLchan rgb[][4], GLint y0,
|
||||
GLint skipPixels );
|
||||
|
||||
extern void
|
||||
_swrast_write_zoomed_rgb_span( GLcontext *ctx, const struct sw_span *span,
|
||||
CONST GLchan rgb[][3], GLint y0,
|
||||
GLint skipPixels );
|
||||
CONST GLchan rgb[][3], GLint y0,
|
||||
GLint skipPixels );
|
||||
|
||||
extern void
|
||||
_swrast_write_zoomed_index_span( GLcontext *ctx, const struct sw_span *span,
|
||||
GLint y0, GLint skipPixels );
|
||||
GLint y0, GLint skipPixels );
|
||||
|
||||
extern void
|
||||
_swrast_write_zoomed_depth_span( GLcontext *ctx, const struct sw_span *span,
|
||||
GLint y0, GLint skipPixels );
|
||||
|
||||
extern void
|
||||
_swrast_write_zoomed_stencil_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
|
||||
const GLstencil stencil[], GLint y0,
|
||||
GLint skipPixels );
|
||||
const GLstencil stencil[], GLint y0,
|
||||
GLint skipPixels );
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue