2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 * Pixel transfer functions (glPixelZoom, glPixelMap, glPixelTransfer)
32 #include "bufferobj.h"
38 #include "glapi/dispatch.h"
41 #if FEATURE_pixel_transfer
44 /**********************************************************************/
45 /***** glPixelZoom *****/
46 /**********************************************************************/
48 static void GLAPIENTRY
49 _mesa_PixelZoom( GLfloat xfactor
, GLfloat yfactor
)
51 GET_CURRENT_CONTEXT(ctx
);
53 if (ctx
->Pixel
.ZoomX
== xfactor
&&
54 ctx
->Pixel
.ZoomY
== yfactor
)
57 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
58 ctx
->Pixel
.ZoomX
= xfactor
;
59 ctx
->Pixel
.ZoomY
= yfactor
;
64 /**********************************************************************/
65 /***** glPixelMap *****/
66 /**********************************************************************/
69 * Return pointer to a pixelmap by name.
71 static struct gl_pixelmap
*
72 get_pixelmap(GLcontext
*ctx
, GLenum map
)
75 case GL_PIXEL_MAP_I_TO_I
:
76 return &ctx
->PixelMaps
.ItoI
;
77 case GL_PIXEL_MAP_S_TO_S
:
78 return &ctx
->PixelMaps
.StoS
;
79 case GL_PIXEL_MAP_I_TO_R
:
80 return &ctx
->PixelMaps
.ItoR
;
81 case GL_PIXEL_MAP_I_TO_G
:
82 return &ctx
->PixelMaps
.ItoG
;
83 case GL_PIXEL_MAP_I_TO_B
:
84 return &ctx
->PixelMaps
.ItoB
;
85 case GL_PIXEL_MAP_I_TO_A
:
86 return &ctx
->PixelMaps
.ItoA
;
87 case GL_PIXEL_MAP_R_TO_R
:
88 return &ctx
->PixelMaps
.RtoR
;
89 case GL_PIXEL_MAP_G_TO_G
:
90 return &ctx
->PixelMaps
.GtoG
;
91 case GL_PIXEL_MAP_B_TO_B
:
92 return &ctx
->PixelMaps
.BtoB
;
93 case GL_PIXEL_MAP_A_TO_A
:
94 return &ctx
->PixelMaps
.AtoA
;
102 * Helper routine used by the other _mesa_PixelMap() functions.
105 store_pixelmap(GLcontext
*ctx
, GLenum map
, GLsizei mapsize
,
106 const GLfloat
*values
)
109 struct gl_pixelmap
*pm
= get_pixelmap(ctx
, map
);
111 _mesa_error(ctx
, GL_INVALID_ENUM
, "glPixelMap(map)");
116 case GL_PIXEL_MAP_S_TO_S
:
118 ctx
->PixelMaps
.StoS
.Size
= mapsize
;
119 for (i
= 0; i
< mapsize
; i
++) {
120 ctx
->PixelMaps
.StoS
.Map
[i
] = (GLfloat
)IROUND(values
[i
]);
123 case GL_PIXEL_MAP_I_TO_I
:
125 ctx
->PixelMaps
.ItoI
.Size
= mapsize
;
126 for (i
= 0; i
< mapsize
; i
++) {
127 ctx
->PixelMaps
.ItoI
.Map
[i
] = values
[i
];
133 for (i
= 0; i
< mapsize
; i
++) {
134 GLfloat val
= CLAMP(values
[i
], 0.0F
, 1.0F
);
136 pm
->Map8
[i
] = (GLint
) (val
* 255.0F
);
143 * Convenience wrapper for _mesa_validate_pbo_access() for gl[Get]PixelMap().
146 validate_pbo_access(GLcontext
*ctx
, struct gl_pixelstore_attrib
*pack
,
147 GLsizei mapsize
, GLenum format
, GLenum type
,
152 /* Note, need to use DefaultPacking and Unpack's buffer object */
153 ctx
->DefaultPacking
.BufferObj
= pack
->BufferObj
;
155 ok
= _mesa_validate_pbo_access(1, &ctx
->DefaultPacking
, mapsize
, 1, 1,
159 ctx
->DefaultPacking
.BufferObj
= ctx
->Shared
->NullBufferObj
;
162 _mesa_error(ctx
, GL_INVALID_OPERATION
,
163 "glPixelMap(invalid PBO access)");
169 static void GLAPIENTRY
170 _mesa_PixelMapfv( GLenum map
, GLsizei mapsize
, const GLfloat
*values
)
172 GET_CURRENT_CONTEXT(ctx
);
173 ASSERT_OUTSIDE_BEGIN_END(ctx
);
175 /* XXX someday, test against ctx->Const.MaxPixelMapTableSize */
176 if (mapsize
< 1 || mapsize
> MAX_PIXEL_MAP_TABLE
) {
177 _mesa_error( ctx
, GL_INVALID_VALUE
, "glPixelMapfv(mapsize)" );
181 if (map
>= GL_PIXEL_MAP_S_TO_S
&& map
<= GL_PIXEL_MAP_I_TO_A
) {
182 /* test that mapsize is a power of two */
183 if (!_mesa_is_pow_two(mapsize
)) {
184 _mesa_error( ctx
, GL_INVALID_VALUE
, "glPixelMapfv(mapsize)" );
189 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
191 if (!validate_pbo_access(ctx
, &ctx
->Unpack
, mapsize
,
192 GL_INTENSITY
, GL_FLOAT
, values
)) {
196 values
= (const GLfloat
*) _mesa_map_pbo_source(ctx
, &ctx
->Unpack
, values
);
198 if (_mesa_is_bufferobj(ctx
->Unpack
.BufferObj
)) {
199 _mesa_error(ctx
, GL_INVALID_OPERATION
,
200 "glPixelMapfv(PBO is mapped)");
205 store_pixelmap(ctx
, map
, mapsize
, values
);
207 _mesa_unmap_pbo_source(ctx
, &ctx
->Unpack
);
211 static void GLAPIENTRY
212 _mesa_PixelMapuiv(GLenum map
, GLsizei mapsize
, const GLuint
*values
)
214 GLfloat fvalues
[MAX_PIXEL_MAP_TABLE
];
215 GET_CURRENT_CONTEXT(ctx
);
216 ASSERT_OUTSIDE_BEGIN_END(ctx
);
218 if (mapsize
< 1 || mapsize
> MAX_PIXEL_MAP_TABLE
) {
219 _mesa_error( ctx
, GL_INVALID_VALUE
, "glPixelMapuiv(mapsize)" );
223 if (map
>= GL_PIXEL_MAP_S_TO_S
&& map
<= GL_PIXEL_MAP_I_TO_A
) {
224 /* test that mapsize is a power of two */
225 if (!_mesa_is_pow_two(mapsize
)) {
226 _mesa_error( ctx
, GL_INVALID_VALUE
, "glPixelMapuiv(mapsize)" );
231 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
233 if (!validate_pbo_access(ctx
, &ctx
->Unpack
, mapsize
,
234 GL_INTENSITY
, GL_UNSIGNED_INT
, values
)) {
238 values
= (const GLuint
*) _mesa_map_pbo_source(ctx
, &ctx
->Unpack
, values
);
240 if (_mesa_is_bufferobj(ctx
->Unpack
.BufferObj
)) {
241 _mesa_error(ctx
, GL_INVALID_OPERATION
,
242 "glPixelMapuiv(PBO is mapped)");
247 /* convert to floats */
248 if (map
== GL_PIXEL_MAP_I_TO_I
|| map
== GL_PIXEL_MAP_S_TO_S
) {
250 for (i
= 0; i
< mapsize
; i
++) {
251 fvalues
[i
] = (GLfloat
) values
[i
];
256 for (i
= 0; i
< mapsize
; i
++) {
257 fvalues
[i
] = UINT_TO_FLOAT( values
[i
] );
261 _mesa_unmap_pbo_source(ctx
, &ctx
->Unpack
);
263 store_pixelmap(ctx
, map
, mapsize
, fvalues
);
267 static void GLAPIENTRY
268 _mesa_PixelMapusv(GLenum map
, GLsizei mapsize
, const GLushort
*values
)
270 GLfloat fvalues
[MAX_PIXEL_MAP_TABLE
];
271 GET_CURRENT_CONTEXT(ctx
);
272 ASSERT_OUTSIDE_BEGIN_END(ctx
);
274 if (mapsize
< 1 || mapsize
> MAX_PIXEL_MAP_TABLE
) {
275 _mesa_error( ctx
, GL_INVALID_VALUE
, "glPixelMapusv(mapsize)" );
279 if (map
>= GL_PIXEL_MAP_S_TO_S
&& map
<= GL_PIXEL_MAP_I_TO_A
) {
280 /* test that mapsize is a power of two */
281 if (!_mesa_is_pow_two(mapsize
)) {
282 _mesa_error( ctx
, GL_INVALID_VALUE
, "glPixelMapuiv(mapsize)" );
287 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
289 if (!validate_pbo_access(ctx
, &ctx
->Unpack
, mapsize
,
290 GL_INTENSITY
, GL_UNSIGNED_SHORT
, values
)) {
294 values
= (const GLushort
*) _mesa_map_pbo_source(ctx
, &ctx
->Unpack
, values
);
296 if (_mesa_is_bufferobj(ctx
->Unpack
.BufferObj
)) {
297 _mesa_error(ctx
, GL_INVALID_OPERATION
,
298 "glPixelMapusv(PBO is mapped)");
303 /* convert to floats */
304 if (map
== GL_PIXEL_MAP_I_TO_I
|| map
== GL_PIXEL_MAP_S_TO_S
) {
306 for (i
= 0; i
< mapsize
; i
++) {
307 fvalues
[i
] = (GLfloat
) values
[i
];
312 for (i
= 0; i
< mapsize
; i
++) {
313 fvalues
[i
] = USHORT_TO_FLOAT( values
[i
] );
317 _mesa_unmap_pbo_source(ctx
, &ctx
->Unpack
);
319 store_pixelmap(ctx
, map
, mapsize
, fvalues
);
323 static void GLAPIENTRY
324 _mesa_GetPixelMapfv( GLenum map
, GLfloat
*values
)
326 GET_CURRENT_CONTEXT(ctx
);
328 const struct gl_pixelmap
*pm
;
330 ASSERT_OUTSIDE_BEGIN_END(ctx
);
332 pm
= get_pixelmap(ctx
, map
);
334 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetPixelMapfv(map)");
340 if (!validate_pbo_access(ctx
, &ctx
->Pack
, mapsize
,
341 GL_INTENSITY
, GL_FLOAT
, values
)) {
345 values
= (GLfloat
*) _mesa_map_pbo_dest(ctx
, &ctx
->Pack
, values
);
347 if (_mesa_is_bufferobj(ctx
->Pack
.BufferObj
)) {
348 _mesa_error(ctx
, GL_INVALID_OPERATION
,
349 "glGetPixelMapfv(PBO is mapped)");
354 if (map
== GL_PIXEL_MAP_S_TO_S
) {
356 for (i
= 0; i
< mapsize
; i
++) {
357 values
[i
] = (GLfloat
) ctx
->PixelMaps
.StoS
.Map
[i
];
361 MEMCPY(values
, pm
->Map
, mapsize
* sizeof(GLfloat
));
364 _mesa_unmap_pbo_dest(ctx
, &ctx
->Pack
);
368 static void GLAPIENTRY
369 _mesa_GetPixelMapuiv( GLenum map
, GLuint
*values
)
371 GET_CURRENT_CONTEXT(ctx
);
373 const struct gl_pixelmap
*pm
;
375 ASSERT_OUTSIDE_BEGIN_END(ctx
);
377 pm
= get_pixelmap(ctx
, map
);
379 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetPixelMapuiv(map)");
384 if (!validate_pbo_access(ctx
, &ctx
->Pack
, mapsize
,
385 GL_INTENSITY
, GL_UNSIGNED_INT
, values
)) {
389 values
= (GLuint
*) _mesa_map_pbo_dest(ctx
, &ctx
->Pack
, values
);
391 if (_mesa_is_bufferobj(ctx
->Pack
.BufferObj
)) {
392 _mesa_error(ctx
, GL_INVALID_OPERATION
,
393 "glGetPixelMapuiv(PBO is mapped)");
398 if (map
== GL_PIXEL_MAP_S_TO_S
) {
400 MEMCPY(values
, ctx
->PixelMaps
.StoS
.Map
, mapsize
* sizeof(GLint
));
403 for (i
= 0; i
< mapsize
; i
++) {
404 values
[i
] = FLOAT_TO_UINT( pm
->Map
[i
] );
408 _mesa_unmap_pbo_dest(ctx
, &ctx
->Pack
);
412 static void GLAPIENTRY
413 _mesa_GetPixelMapusv( GLenum map
, GLushort
*values
)
415 GET_CURRENT_CONTEXT(ctx
);
417 const struct gl_pixelmap
*pm
;
419 ASSERT_OUTSIDE_BEGIN_END(ctx
);
421 pm
= get_pixelmap(ctx
, map
);
423 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetPixelMapusv(map)");
426 mapsize
= pm
? pm
->Size
: 0;
428 if (!validate_pbo_access(ctx
, &ctx
->Pack
, mapsize
,
429 GL_INTENSITY
, GL_UNSIGNED_SHORT
, values
)) {
433 values
= (GLushort
*) _mesa_map_pbo_dest(ctx
, &ctx
->Pack
, values
);
435 if (_mesa_is_bufferobj(ctx
->Pack
.BufferObj
)) {
436 _mesa_error(ctx
, GL_INVALID_OPERATION
,
437 "glGetPixelMapusv(PBO is mapped)");
444 case GL_PIXEL_MAP_I_TO_I
:
445 for (i
= 0; i
< mapsize
; i
++) {
446 values
[i
] = (GLushort
) CLAMP(ctx
->PixelMaps
.ItoI
.Map
[i
], 0.0, 65535.);
449 case GL_PIXEL_MAP_S_TO_S
:
450 for (i
= 0; i
< mapsize
; i
++) {
451 values
[i
] = (GLushort
) CLAMP(ctx
->PixelMaps
.StoS
.Map
[i
], 0.0, 65535.);
455 for (i
= 0; i
< mapsize
; i
++) {
456 CLAMPED_FLOAT_TO_USHORT(values
[i
], pm
->Map
[i
] );
460 _mesa_unmap_pbo_dest(ctx
, &ctx
->Pack
);
465 /**********************************************************************/
466 /***** glPixelTransfer *****/
467 /**********************************************************************/
471 * Implements glPixelTransfer[fi] whether called immediately or from a
474 static void GLAPIENTRY
475 _mesa_PixelTransferf( GLenum pname
, GLfloat param
)
477 GET_CURRENT_CONTEXT(ctx
);
478 ASSERT_OUTSIDE_BEGIN_END(ctx
);
482 if (ctx
->Pixel
.MapColorFlag
== (param
? GL_TRUE
: GL_FALSE
))
484 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
485 ctx
->Pixel
.MapColorFlag
= param
? GL_TRUE
: GL_FALSE
;
488 if (ctx
->Pixel
.MapStencilFlag
== (param
? GL_TRUE
: GL_FALSE
))
490 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
491 ctx
->Pixel
.MapStencilFlag
= param
? GL_TRUE
: GL_FALSE
;
494 if (ctx
->Pixel
.IndexShift
== (GLint
) param
)
496 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
497 ctx
->Pixel
.IndexShift
= (GLint
) param
;
499 case GL_INDEX_OFFSET
:
500 if (ctx
->Pixel
.IndexOffset
== (GLint
) param
)
502 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
503 ctx
->Pixel
.IndexOffset
= (GLint
) param
;
506 if (ctx
->Pixel
.RedScale
== param
)
508 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
509 ctx
->Pixel
.RedScale
= param
;
512 if (ctx
->Pixel
.RedBias
== param
)
514 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
515 ctx
->Pixel
.RedBias
= param
;
518 if (ctx
->Pixel
.GreenScale
== param
)
520 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
521 ctx
->Pixel
.GreenScale
= param
;
524 if (ctx
->Pixel
.GreenBias
== param
)
526 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
527 ctx
->Pixel
.GreenBias
= param
;
530 if (ctx
->Pixel
.BlueScale
== param
)
532 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
533 ctx
->Pixel
.BlueScale
= param
;
536 if (ctx
->Pixel
.BlueBias
== param
)
538 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
539 ctx
->Pixel
.BlueBias
= param
;
542 if (ctx
->Pixel
.AlphaScale
== param
)
544 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
545 ctx
->Pixel
.AlphaScale
= param
;
548 if (ctx
->Pixel
.AlphaBias
== param
)
550 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
551 ctx
->Pixel
.AlphaBias
= param
;
554 if (ctx
->Pixel
.DepthScale
== param
)
556 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
557 ctx
->Pixel
.DepthScale
= param
;
560 if (ctx
->Pixel
.DepthBias
== param
)
562 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
563 ctx
->Pixel
.DepthBias
= param
;
565 case GL_POST_COLOR_MATRIX_RED_SCALE
:
566 if (ctx
->Pixel
.PostColorMatrixScale
[0] == param
)
568 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
569 ctx
->Pixel
.PostColorMatrixScale
[0] = param
;
571 case GL_POST_COLOR_MATRIX_RED_BIAS
:
572 if (ctx
->Pixel
.PostColorMatrixBias
[0] == param
)
574 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
575 ctx
->Pixel
.PostColorMatrixBias
[0] = param
;
577 case GL_POST_COLOR_MATRIX_GREEN_SCALE
:
578 if (ctx
->Pixel
.PostColorMatrixScale
[1] == param
)
580 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
581 ctx
->Pixel
.PostColorMatrixScale
[1] = param
;
583 case GL_POST_COLOR_MATRIX_GREEN_BIAS
:
584 if (ctx
->Pixel
.PostColorMatrixBias
[1] == param
)
586 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
587 ctx
->Pixel
.PostColorMatrixBias
[1] = param
;
589 case GL_POST_COLOR_MATRIX_BLUE_SCALE
:
590 if (ctx
->Pixel
.PostColorMatrixScale
[2] == param
)
592 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
593 ctx
->Pixel
.PostColorMatrixScale
[2] = param
;
595 case GL_POST_COLOR_MATRIX_BLUE_BIAS
:
596 if (ctx
->Pixel
.PostColorMatrixBias
[2] == param
)
598 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
599 ctx
->Pixel
.PostColorMatrixBias
[2] = param
;
601 case GL_POST_COLOR_MATRIX_ALPHA_SCALE
:
602 if (ctx
->Pixel
.PostColorMatrixScale
[3] == param
)
604 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
605 ctx
->Pixel
.PostColorMatrixScale
[3] = param
;
607 case GL_POST_COLOR_MATRIX_ALPHA_BIAS
:
608 if (ctx
->Pixel
.PostColorMatrixBias
[3] == param
)
610 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
611 ctx
->Pixel
.PostColorMatrixBias
[3] = param
;
613 case GL_POST_CONVOLUTION_RED_SCALE
:
614 if (ctx
->Pixel
.PostConvolutionScale
[0] == param
)
616 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
617 ctx
->Pixel
.PostConvolutionScale
[0] = param
;
619 case GL_POST_CONVOLUTION_RED_BIAS
:
620 if (ctx
->Pixel
.PostConvolutionBias
[0] == param
)
622 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
623 ctx
->Pixel
.PostConvolutionBias
[0] = param
;
625 case GL_POST_CONVOLUTION_GREEN_SCALE
:
626 if (ctx
->Pixel
.PostConvolutionScale
[1] == param
)
628 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
629 ctx
->Pixel
.PostConvolutionScale
[1] = param
;
631 case GL_POST_CONVOLUTION_GREEN_BIAS
:
632 if (ctx
->Pixel
.PostConvolutionBias
[1] == param
)
634 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
635 ctx
->Pixel
.PostConvolutionBias
[1] = param
;
637 case GL_POST_CONVOLUTION_BLUE_SCALE
:
638 if (ctx
->Pixel
.PostConvolutionScale
[2] == param
)
640 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
641 ctx
->Pixel
.PostConvolutionScale
[2] = param
;
643 case GL_POST_CONVOLUTION_BLUE_BIAS
:
644 if (ctx
->Pixel
.PostConvolutionBias
[2] == param
)
646 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
647 ctx
->Pixel
.PostConvolutionBias
[2] = param
;
649 case GL_POST_CONVOLUTION_ALPHA_SCALE
:
650 if (ctx
->Pixel
.PostConvolutionScale
[3] == param
)
652 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
653 ctx
->Pixel
.PostConvolutionScale
[3] = param
;
655 case GL_POST_CONVOLUTION_ALPHA_BIAS
:
656 if (ctx
->Pixel
.PostConvolutionBias
[3] == param
)
658 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
659 ctx
->Pixel
.PostConvolutionBias
[3] = param
;
662 _mesa_error( ctx
, GL_INVALID_ENUM
, "glPixelTransfer(pname)" );
668 static void GLAPIENTRY
669 _mesa_PixelTransferi( GLenum pname
, GLint param
)
671 _mesa_PixelTransferf( pname
, (GLfloat
) param
);
676 /**********************************************************************/
677 /***** State Management *****/
678 /**********************************************************************/
681 * Return a bitmask of IMAGE_*_BIT flags which to indicate which
682 * pixel transfer operations are enabled.
685 update_image_transfer_state(GLcontext
*ctx
)
689 if (ctx
->Pixel
.RedScale
!= 1.0F
|| ctx
->Pixel
.RedBias
!= 0.0F
||
690 ctx
->Pixel
.GreenScale
!= 1.0F
|| ctx
->Pixel
.GreenBias
!= 0.0F
||
691 ctx
->Pixel
.BlueScale
!= 1.0F
|| ctx
->Pixel
.BlueBias
!= 0.0F
||
692 ctx
->Pixel
.AlphaScale
!= 1.0F
|| ctx
->Pixel
.AlphaBias
!= 0.0F
)
693 mask
|= IMAGE_SCALE_BIAS_BIT
;
695 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
)
696 mask
|= IMAGE_SHIFT_OFFSET_BIT
;
698 if (ctx
->Pixel
.MapColorFlag
)
699 mask
|= IMAGE_MAP_COLOR_BIT
;
701 if (ctx
->Pixel
.ColorTableEnabled
[COLORTABLE_PRECONVOLUTION
])
702 mask
|= IMAGE_COLOR_TABLE_BIT
;
704 if (ctx
->Pixel
.Convolution1DEnabled
||
705 ctx
->Pixel
.Convolution2DEnabled
||
706 ctx
->Pixel
.Separable2DEnabled
) {
707 mask
|= IMAGE_CONVOLUTION_BIT
;
708 if (ctx
->Pixel
.PostConvolutionScale
[0] != 1.0F
||
709 ctx
->Pixel
.PostConvolutionScale
[1] != 1.0F
||
710 ctx
->Pixel
.PostConvolutionScale
[2] != 1.0F
||
711 ctx
->Pixel
.PostConvolutionScale
[3] != 1.0F
||
712 ctx
->Pixel
.PostConvolutionBias
[0] != 0.0F
||
713 ctx
->Pixel
.PostConvolutionBias
[1] != 0.0F
||
714 ctx
->Pixel
.PostConvolutionBias
[2] != 0.0F
||
715 ctx
->Pixel
.PostConvolutionBias
[3] != 0.0F
) {
716 mask
|= IMAGE_POST_CONVOLUTION_SCALE_BIAS
;
720 if (ctx
->Pixel
.ColorTableEnabled
[COLORTABLE_POSTCONVOLUTION
])
721 mask
|= IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT
;
723 if (ctx
->ColorMatrixStack
.Top
->type
!= MATRIX_IDENTITY
||
724 ctx
->Pixel
.PostColorMatrixScale
[0] != 1.0F
||
725 ctx
->Pixel
.PostColorMatrixBias
[0] != 0.0F
||
726 ctx
->Pixel
.PostColorMatrixScale
[1] != 1.0F
||
727 ctx
->Pixel
.PostColorMatrixBias
[1] != 0.0F
||
728 ctx
->Pixel
.PostColorMatrixScale
[2] != 1.0F
||
729 ctx
->Pixel
.PostColorMatrixBias
[2] != 0.0F
||
730 ctx
->Pixel
.PostColorMatrixScale
[3] != 1.0F
||
731 ctx
->Pixel
.PostColorMatrixBias
[3] != 0.0F
)
732 mask
|= IMAGE_COLOR_MATRIX_BIT
;
734 if (ctx
->Pixel
.ColorTableEnabled
[COLORTABLE_POSTCOLORMATRIX
])
735 mask
|= IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT
;
737 if (ctx
->Pixel
.HistogramEnabled
)
738 mask
|= IMAGE_HISTOGRAM_BIT
;
740 if (ctx
->Pixel
.MinMaxEnabled
)
741 mask
|= IMAGE_MIN_MAX_BIT
;
743 ctx
->_ImageTransferState
= mask
;
748 * Update mesa pixel transfer derived state.
750 void _mesa_update_pixel( GLcontext
*ctx
, GLuint new_state
)
752 if (new_state
& _NEW_COLOR_MATRIX
)
753 _math_matrix_analyse( ctx
->ColorMatrixStack
.Top
);
755 /* References ColorMatrix.type (derived above).
757 if (new_state
& _MESA_NEW_TRANSFER_STATE
)
758 update_image_transfer_state(ctx
);
763 _mesa_init_pixel_dispatch(struct _glapi_table
*disp
)
765 SET_GetPixelMapfv(disp
, _mesa_GetPixelMapfv
);
766 SET_GetPixelMapuiv(disp
, _mesa_GetPixelMapuiv
);
767 SET_GetPixelMapusv(disp
, _mesa_GetPixelMapusv
);
768 SET_PixelMapfv(disp
, _mesa_PixelMapfv
);
769 SET_PixelMapuiv(disp
, _mesa_PixelMapuiv
);
770 SET_PixelMapusv(disp
, _mesa_PixelMapusv
);
771 SET_PixelTransferf(disp
, _mesa_PixelTransferf
);
772 SET_PixelTransferi(disp
, _mesa_PixelTransferi
);
773 SET_PixelZoom(disp
, _mesa_PixelZoom
);
777 #endif /* FEATURE_pixel_transfer */
780 /**********************************************************************/
781 /***** Initialization *****/
782 /**********************************************************************/
785 init_pixelmap(struct gl_pixelmap
*map
)
794 * Initialize the context's PIXEL attribute group.
797 _mesa_init_pixel( GLcontext
*ctx
)
802 ctx
->Pixel
.RedBias
= 0.0;
803 ctx
->Pixel
.RedScale
= 1.0;
804 ctx
->Pixel
.GreenBias
= 0.0;
805 ctx
->Pixel
.GreenScale
= 1.0;
806 ctx
->Pixel
.BlueBias
= 0.0;
807 ctx
->Pixel
.BlueScale
= 1.0;
808 ctx
->Pixel
.AlphaBias
= 0.0;
809 ctx
->Pixel
.AlphaScale
= 1.0;
810 ctx
->Pixel
.DepthBias
= 0.0;
811 ctx
->Pixel
.DepthScale
= 1.0;
812 ctx
->Pixel
.IndexOffset
= 0;
813 ctx
->Pixel
.IndexShift
= 0;
814 ctx
->Pixel
.ZoomX
= 1.0;
815 ctx
->Pixel
.ZoomY
= 1.0;
816 ctx
->Pixel
.MapColorFlag
= GL_FALSE
;
817 ctx
->Pixel
.MapStencilFlag
= GL_FALSE
;
818 init_pixelmap(&ctx
->PixelMaps
.StoS
);
819 init_pixelmap(&ctx
->PixelMaps
.ItoI
);
820 init_pixelmap(&ctx
->PixelMaps
.ItoR
);
821 init_pixelmap(&ctx
->PixelMaps
.ItoG
);
822 init_pixelmap(&ctx
->PixelMaps
.ItoB
);
823 init_pixelmap(&ctx
->PixelMaps
.ItoA
);
824 init_pixelmap(&ctx
->PixelMaps
.RtoR
);
825 init_pixelmap(&ctx
->PixelMaps
.GtoG
);
826 init_pixelmap(&ctx
->PixelMaps
.BtoB
);
827 init_pixelmap(&ctx
->PixelMaps
.AtoA
);
828 ctx
->Pixel
.HistogramEnabled
= GL_FALSE
;
829 ctx
->Pixel
.MinMaxEnabled
= GL_FALSE
;
830 ASSIGN_4V(ctx
->Pixel
.PostColorMatrixScale
, 1.0, 1.0, 1.0, 1.0);
831 ASSIGN_4V(ctx
->Pixel
.PostColorMatrixBias
, 0.0, 0.0, 0.0, 0.0);
832 for (i
= 0; i
< COLORTABLE_MAX
; i
++) {
833 ASSIGN_4V(ctx
->Pixel
.ColorTableScale
[i
], 1.0, 1.0, 1.0, 1.0);
834 ASSIGN_4V(ctx
->Pixel
.ColorTableBias
[i
], 0.0, 0.0, 0.0, 0.0);
835 ctx
->Pixel
.ColorTableEnabled
[i
] = GL_FALSE
;
837 ctx
->Pixel
.Convolution1DEnabled
= GL_FALSE
;
838 ctx
->Pixel
.Convolution2DEnabled
= GL_FALSE
;
839 ctx
->Pixel
.Separable2DEnabled
= GL_FALSE
;
840 for (i
= 0; i
< 3; i
++) {
841 ASSIGN_4V(ctx
->Pixel
.ConvolutionBorderColor
[i
], 0.0, 0.0, 0.0, 0.0);
842 ctx
->Pixel
.ConvolutionBorderMode
[i
] = GL_REDUCE
;
843 ASSIGN_4V(ctx
->Pixel
.ConvolutionFilterScale
[i
], 1.0, 1.0, 1.0, 1.0);
844 ASSIGN_4V(ctx
->Pixel
.ConvolutionFilterBias
[i
], 0.0, 0.0, 0.0, 0.0);
846 for (i
= 0; i
< MAX_CONVOLUTION_WIDTH
* MAX_CONVOLUTION_WIDTH
* 4; i
++) {
847 ctx
->Convolution1D
.Filter
[i
] = 0.0;
848 ctx
->Convolution2D
.Filter
[i
] = 0.0;
849 ctx
->Separable2D
.Filter
[i
] = 0.0;
851 ASSIGN_4V(ctx
->Pixel
.PostConvolutionScale
, 1.0, 1.0, 1.0, 1.0);
852 ASSIGN_4V(ctx
->Pixel
.PostConvolutionBias
, 0.0, 0.0, 0.0, 0.0);
853 /* GL_SGI_texture_color_table */
854 ASSIGN_4V(ctx
->Pixel
.TextureColorTableScale
, 1.0, 1.0, 1.0, 1.0);
855 ASSIGN_4V(ctx
->Pixel
.TextureColorTableBias
, 0.0, 0.0, 0.0, 0.0);
857 if (ctx
->Visual
.doubleBufferMode
) {
858 ctx
->Pixel
.ReadBuffer
= GL_BACK
;
861 ctx
->Pixel
.ReadBuffer
= GL_FRONT
;
865 ctx
->_ImageTransferState
= 0;