3
* Mesa 3-D graphics library
6
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
8
* Permission is hereby granted, free of charge, to any person obtaining a
9
* copy of this software and associated documentation files (the "Software"),
10
* to deal in the Software without restriction, including without limitation
11
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
12
* and/or sell copies of the Software, and to permit persons to whom the
13
* Software is furnished to do so, subject to the following conditions:
15
* The above copyright notice and this permission notice shall be included
16
* in all copies or substantial portions of the Software.
18
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26
/* KW: Moved these here to remove knowledge of swrast from core mesa.
27
* Should probably pull the entire software implementation of these
28
* extensions into either swrast or a sister module.
31
#include "s_context.h"
35
_swrast_CopyColorTable( GLcontext *ctx,
36
GLenum target, GLenum internalformat,
37
GLint x, GLint y, GLsizei width)
39
SWcontext *swrast = SWRAST_CONTEXT(ctx);
40
GLchan data[MAX_WIDTH][4];
42
/* Select buffer to read from */
43
(*swrast->Driver.SetReadBuffer)( ctx, ctx->ReadBuffer,
44
ctx->Pixel.DriverReadBuffer );
46
if (width > MAX_WIDTH)
49
/* read the data from framebuffer */
50
_mesa_read_rgba_span( ctx, ctx->ReadBuffer, width, x, y, data );
52
/* Restore reading from draw buffer (the default) */
53
(*swrast->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer,
54
ctx->Color.DriverDrawBuffer );
56
glColorTable(target, internalformat, width, GL_RGBA, CHAN_TYPE, data);
60
_swrast_CopyColorSubTable( GLcontext *ctx,GLenum target, GLsizei start,
61
GLint x, GLint y, GLsizei width)
63
SWcontext *swrast = SWRAST_CONTEXT(ctx);
64
GLchan data[MAX_WIDTH][4];
66
/* Select buffer to read from */
67
(*swrast->Driver.SetReadBuffer)( ctx, ctx->ReadBuffer,
68
ctx->Pixel.DriverReadBuffer );
70
if (width > MAX_WIDTH)
73
/* read the data from framebuffer */
74
_mesa_read_rgba_span( ctx, ctx->ReadBuffer, width, x, y, data );
76
/* Restore reading from draw buffer (the default) */
77
(*swrast->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer,
78
ctx->Color.DriverDrawBuffer );
80
glColorSubTable(target, start, width, GL_RGBA, CHAN_TYPE, data);
85
_swrast_CopyConvolutionFilter1D(GLcontext *ctx, GLenum target,
86
GLenum internalFormat,
87
GLint x, GLint y, GLsizei width)
89
SWcontext *swrast = SWRAST_CONTEXT(ctx);
90
GLchan rgba[MAX_CONVOLUTION_WIDTH][4];
92
RENDER_START( swrast, ctx );
94
/* read the data from framebuffer */
95
_mesa_read_rgba_span( ctx, ctx->ReadBuffer, width, x, y,
96
(GLchan (*)[4]) rgba );
98
RENDER_FINISH( swrast, ctx );
100
/* store as convolution filter */
101
glConvolutionFilter1D(target, internalFormat, width,
102
GL_RGBA, CHAN_TYPE, rgba);
107
_swrast_CopyConvolutionFilter2D(GLcontext *ctx, GLenum target,
108
GLenum internalFormat,
109
GLint x, GLint y, GLsizei width, GLsizei height)
111
SWcontext *swrast = SWRAST_CONTEXT(ctx);
112
struct gl_pixelstore_attrib packSave;
113
GLchan rgba[MAX_CONVOLUTION_HEIGHT][MAX_CONVOLUTION_WIDTH][4];
116
RENDER_START(swrast,ctx);
118
/* read pixels from framebuffer */
119
for (i = 0; i < height; i++) {
120
_mesa_read_rgba_span( ctx, ctx->ReadBuffer, width, x, y + i,
121
(GLchan (*)[4]) rgba[i] );
124
RENDER_FINISH(swrast,ctx);
127
* HACK: save & restore context state so we can store this as a
128
* convolution filter via the GL api. Doesn't call any callbacks
129
* hanging off ctx->Unpack statechanges.
132
packSave = ctx->Unpack; /* save pixel packing params */
134
ctx->Unpack.Alignment = 1;
135
ctx->Unpack.RowLength = MAX_CONVOLUTION_WIDTH;
136
ctx->Unpack.SkipPixels = 0;
137
ctx->Unpack.SkipRows = 0;
138
ctx->Unpack.ImageHeight = 0;
139
ctx->Unpack.SkipImages = 0;
140
ctx->Unpack.SwapBytes = GL_FALSE;
141
ctx->Unpack.LsbFirst = GL_FALSE;
142
ctx->NewState |= _NEW_PACKUNPACK;
144
glConvolutionFilter2D(target, internalFormat, width, height,
145
GL_RGBA, CHAN_TYPE, rgba);
147
ctx->Unpack = packSave; /* restore pixel packing params */
148
ctx->NewState |= _NEW_PACKUNPACK;