diff options
Diffstat (limited to 'src/mesa/main/image.c')
| -rw-r--r-- | src/mesa/main/image.c | 155 |
1 files changed, 127 insertions, 28 deletions
diff --git a/src/mesa/main/image.c b/src/mesa/main/image.c index 029d2fef8a..2c3af332c0 100644 --- a/src/mesa/main/image.c +++ b/src/mesa/main/image.c @@ -286,6 +286,7 @@ _mesa_components_in_format( GLenum format ) return 1; case GL_LUMINANCE_ALPHA: case GL_LUMINANCE_ALPHA_INTEGER_EXT: + case GL_RG: return 2; case GL_RGB: case GL_RGB_INTEGER_EXT: @@ -398,7 +399,7 @@ _mesa_bytes_per_pixel( GLenum format, GLenum type ) * otherwise. */ GLboolean -_mesa_is_legal_format_and_type( GLcontext *ctx, GLenum format, GLenum type ) +_mesa_is_legal_format_and_type( struct gl_context *ctx, GLenum format, GLenum type ) { switch (format) { case GL_COLOR_INDEX: @@ -442,6 +443,24 @@ _mesa_is_legal_format_and_type( GLcontext *ctx, GLenum format, GLenum type ) default: return GL_FALSE; } + case GL_RG: + if (!ctx->Extensions.ARB_texture_rg) + return GL_FALSE; + + switch (type) { + case GL_BYTE: + case GL_UNSIGNED_BYTE: + case GL_SHORT: + case GL_UNSIGNED_SHORT: + case GL_INT: + case GL_UNSIGNED_INT: + case GL_FLOAT: + return GL_TRUE; + case GL_HALF_FLOAT_ARB: + return ctx->Extensions.ARB_half_float_pixel; + default: + return GL_FALSE; + } case GL_RGB: switch (type) { case GL_BYTE: @@ -596,6 +615,11 @@ _mesa_is_color_format(GLenum format) case GL_INTENSITY8: case GL_INTENSITY12: case GL_INTENSITY16: + case GL_R8: + case GL_R16: + case GL_RG: + case GL_RG8: + case GL_RG16: case 3: case GL_RGB: case GL_BGR: @@ -626,6 +650,10 @@ _mesa_is_color_format(GLenum format) case GL_LUMINANCE_ALPHA32F_ARB: case GL_INTENSITY16F_ARB: case GL_INTENSITY32F_ARB: + case GL_R16F: + case GL_R32F: + case GL_RG16F: + case GL_RG32F: case GL_RGB16F_ARB: case GL_RGB32F_ARB: case GL_RGBA16F_ARB: @@ -635,6 +663,8 @@ _mesa_is_color_format(GLenum format) case GL_COMPRESSED_LUMINANCE: case GL_COMPRESSED_LUMINANCE_ALPHA: case GL_COMPRESSED_INTENSITY: + case GL_COMPRESSED_RED: + case GL_COMPRESSED_RG: case GL_COMPRESSED_RGB: case GL_COMPRESSED_RGBA: case GL_RGB_S3TC: @@ -665,6 +695,10 @@ _mesa_is_color_format(GLenum format) case GL_COMPRESSED_SLUMINANCE_EXT: case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: #endif /* FEATURE_EXT_texture_sRGB */ + case GL_COMPRESSED_RED_RGTC1: + case GL_COMPRESSED_SIGNED_RED_RGTC1: + case GL_COMPRESSED_RG_RGTC2: + case GL_COMPRESSED_SIGNED_RG_RGTC2: return GL_TRUE; /* signed texture formats */ case GL_RGBA_SNORM: @@ -835,7 +869,7 @@ _mesa_is_integer_format(GLenum format) * \return GL_TRUE if compressed, GL_FALSE if uncompressed */ GLboolean -_mesa_is_compressed_format(GLcontext *ctx, GLenum format) +_mesa_is_compressed_format(struct gl_context *ctx, GLenum format) { switch (format) { case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: @@ -857,6 +891,11 @@ _mesa_is_compressed_format(GLcontext *ctx, GLenum format) case GL_COMPRESSED_RGB_FXT1_3DFX: case GL_COMPRESSED_RGBA_FXT1_3DFX: return ctx->Extensions.TDFX_texture_compression_FXT1; + case GL_COMPRESSED_RED_RGTC1: + case GL_COMPRESSED_SIGNED_RED_RGTC1: + case GL_COMPRESSED_RG_RGTC2: + case GL_COMPRESSED_SIGNED_RG_RGTC2: + return ctx->Extensions.ARB_texture_compression_rgtc; default: return GL_FALSE; } @@ -1502,7 +1541,7 @@ _mesa_scale_and_bias_rgba(GLuint n, GLfloat rgba[][4], * Apply pixel mapping to an array of floating point RGBA pixels. */ void -_mesa_map_rgba( const GLcontext *ctx, GLuint n, GLfloat rgba[][4] ) +_mesa_map_rgba( const struct gl_context *ctx, GLuint n, GLfloat rgba[][4] ) { const GLfloat rscale = (GLfloat) (ctx->PixelMaps.RtoR.Size - 1); const GLfloat gscale = (GLfloat) (ctx->PixelMaps.GtoG.Size - 1); @@ -1585,6 +1624,25 @@ _mesa_lookup_rgba_float(const struct gl_color_table *table, rgba[i][ACOMP] = alpha;; } break; + case GL_RED: + /* replace RGB with RGB */ + for (i = 0; i < n; i++) { + GLint jR = IROUND(rgba[i][RCOMP] * scale); + jR = CLAMP(jR, 0, max); + rgba[i][RCOMP] = lut[jR * 3 + 0]; + } + break; + case GL_RG: + /* replace RG with RG */ + for (i = 0; i < n; i++) { + GLint jR = IROUND(rgba[i][RCOMP] * scale); + GLint jG = IROUND(rgba[i][GCOMP] * scale); + jR = CLAMP(jR, 0, max); + jG = CLAMP(jG, 0, max); + rgba[i][RCOMP] = lut[jR * 3 + 0]; + rgba[i][GCOMP] = lut[jG * 3 + 1]; + } + break; case GL_RGB: /* replace RGB with RGB */ for (i = 0; i < n; i++) { @@ -1771,7 +1829,7 @@ _mesa_lookup_rgba_ubyte(const struct gl_color_table *table, * Map color indexes to float rgba values. */ void -_mesa_map_ci_to_rgba( const GLcontext *ctx, GLuint n, +_mesa_map_ci_to_rgba( const struct gl_context *ctx, GLuint n, const GLuint index[], GLfloat rgba[][4] ) { GLuint rmask = ctx->PixelMaps.ItoR.Size - 1; @@ -1796,7 +1854,7 @@ _mesa_map_ci_to_rgba( const GLcontext *ctx, GLuint n, * Map ubyte color indexes to ubyte/RGBA values. */ void -_mesa_map_ci8_to_rgba8(const GLcontext *ctx, GLuint n, const GLubyte index[], +_mesa_map_ci8_to_rgba8(const struct gl_context *ctx, GLuint n, const GLubyte index[], GLubyte rgba[][4]) { GLuint rmask = ctx->PixelMaps.ItoR.Size - 1; @@ -1818,7 +1876,7 @@ _mesa_map_ci8_to_rgba8(const GLcontext *ctx, GLuint n, const GLubyte index[], void -_mesa_scale_and_bias_depth(const GLcontext *ctx, GLuint n, +_mesa_scale_and_bias_depth(const struct gl_context *ctx, GLuint n, GLfloat depthValues[]) { const GLfloat scale = ctx->Pixel.DepthScale; @@ -1832,7 +1890,7 @@ _mesa_scale_and_bias_depth(const GLcontext *ctx, GLuint n, void -_mesa_scale_and_bias_depth_uint(const GLcontext *ctx, GLuint n, +_mesa_scale_and_bias_depth_uint(const struct gl_context *ctx, GLuint n, GLuint depthValues[]) { const GLdouble max = (double) 0xffffffff; @@ -1851,7 +1909,7 @@ _mesa_scale_and_bias_depth_uint(const GLcontext *ctx, GLuint n, * as indicated by the transferOps bitmask */ void -_mesa_apply_rgba_transfer_ops(GLcontext *ctx, GLbitfield transferOps, +_mesa_apply_rgba_transfer_ops(struct gl_context *ctx, GLbitfield transferOps, GLuint n, GLfloat rgba[][4]) { /* scale & bias */ @@ -1884,7 +1942,7 @@ _mesa_apply_rgba_transfer_ops(GLcontext *ctx, GLbitfield transferOps, * Apply color index shift and offset to an array of pixels. */ static void -shift_and_offset_ci( const GLcontext *ctx, GLuint n, GLuint indexes[] ) +shift_and_offset_ci( const struct gl_context *ctx, GLuint n, GLuint indexes[] ) { GLint shift = ctx->Pixel.IndexShift; GLint offset = ctx->Pixel.IndexOffset; @@ -1914,7 +1972,7 @@ shift_and_offset_ci( const GLcontext *ctx, GLuint n, GLuint indexes[] ) * of color indexes; */ void -_mesa_apply_ci_transfer_ops(const GLcontext *ctx, GLbitfield transferOps, +_mesa_apply_ci_transfer_ops(const struct gl_context *ctx, GLbitfield transferOps, GLuint n, GLuint indexes[]) { if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { @@ -1936,7 +1994,7 @@ _mesa_apply_ci_transfer_ops(const GLcontext *ctx, GLbitfield transferOps, * of stencil values. */ void -_mesa_apply_stencil_transfer_ops(const GLcontext *ctx, GLuint n, +_mesa_apply_stencil_transfer_ops(const struct gl_context *ctx, GLuint n, GLstencil stencil[]) { if (ctx->Pixel.IndexShift != 0 || ctx->Pixel.IndexOffset != 0) { @@ -1977,7 +2035,7 @@ _mesa_apply_stencil_transfer_ops(const GLcontext *ctx, GLuint n, * transfer ops are enabled. */ void -_mesa_pack_rgba_span_float(GLcontext *ctx, GLuint n, GLfloat rgba[][4], +_mesa_pack_rgba_span_float(struct gl_context *ctx, GLuint n, GLfloat rgba[][4], GLenum dstFormat, GLenum dstType, GLvoid *dstAddr, const struct gl_pixelstore_attrib *dstPacking, @@ -3201,6 +3259,7 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4], srcFormat == GL_LUMINANCE || srcFormat == GL_LUMINANCE_ALPHA || srcFormat == GL_INTENSITY || + srcFormat == GL_RG || srcFormat == GL_RGB || srcFormat == GL_BGR || srcFormat == GL_RGBA || @@ -3283,6 +3342,18 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4], redIndex = greenIndex = blueIndex = alphaIndex = 0; stride = 1; break; + case GL_RG: + case GL_RG_INTEGER: + redIndex = 0; + greenIndex = 1; + blueIndex = -1; + alphaIndex = -1; + rComp = 0; + gComp = 1; + bComp = 2; + aComp = 3; + stride = 2; + break; case GL_RGB: case GL_RGB_INTEGER: redIndex = 0; @@ -3841,7 +3912,7 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4], * XXX perhaps expand this to process whole images someday. */ void -_mesa_unpack_color_span_chan( GLcontext *ctx, +_mesa_unpack_color_span_chan( struct gl_context *ctx, GLuint n, GLenum dstFormat, GLchan dest[], GLenum srcFormat, GLenum srcType, const GLvoid *source, @@ -3852,6 +3923,8 @@ _mesa_unpack_color_span_chan( GLcontext *ctx, dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA || dstFormat == GL_INTENSITY || + dstFormat == GL_RED || + dstFormat == GL_RG || dstFormat == GL_RGB || dstFormat == GL_RGBA || dstFormat == GL_COLOR_INDEX); @@ -3863,6 +3936,7 @@ _mesa_unpack_color_span_chan( GLcontext *ctx, srcFormat == GL_LUMINANCE || srcFormat == GL_LUMINANCE_ALPHA || srcFormat == GL_INTENSITY || + srcFormat == GL_RG || srcFormat == GL_RGB || srcFormat == GL_BGR || srcFormat == GL_RGBA || @@ -4090,6 +4164,17 @@ _mesa_unpack_color_span_chan( GLcontext *ctx, dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; dstLuminanceIndex = -1; break; + case GL_RED: + dstRedIndex = 0; + dstGreenIndex = dstBlueIndex = -1; + dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; + break; + case GL_RG: + dstRedIndex = 0; + dstGreenIndex = 1; + dstBlueIndex = -1; + dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; + break; case GL_RGB: dstRedIndex = 0; dstGreenIndex = 1; @@ -4177,7 +4262,7 @@ _mesa_unpack_color_span_chan( GLcontext *ctx, * instead of GLchan. */ void -_mesa_unpack_color_span_float( GLcontext *ctx, +_mesa_unpack_color_span_float( struct gl_context *ctx, GLuint n, GLenum dstFormat, GLfloat dest[], GLenum srcFormat, GLenum srcType, const GLvoid *source, @@ -4188,6 +4273,8 @@ _mesa_unpack_color_span_float( GLcontext *ctx, dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA || dstFormat == GL_INTENSITY || + dstFormat == GL_RED || + dstFormat == GL_RG || dstFormat == GL_RGB || dstFormat == GL_RGBA || dstFormat == GL_COLOR_INDEX); @@ -4199,6 +4286,7 @@ _mesa_unpack_color_span_float( GLcontext *ctx, srcFormat == GL_LUMINANCE || srcFormat == GL_LUMINANCE_ALPHA || srcFormat == GL_INTENSITY || + srcFormat == GL_RG || srcFormat == GL_RGB || srcFormat == GL_BGR || srcFormat == GL_RGBA || @@ -4315,6 +4403,17 @@ _mesa_unpack_color_span_float( GLcontext *ctx, dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; dstLuminanceIndex = -1; break; + case GL_RED: + dstRedIndex = 0; + dstGreenIndex = dstBlueIndex = -1; + dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; + break; + case GL_RG: + dstRedIndex = 0; + dstGreenIndex = 1; + dstBlueIndex = -1; + dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; + break; case GL_RGB: dstRedIndex = 0; dstGreenIndex = 1; @@ -4399,7 +4498,7 @@ _mesa_unpack_color_span_float( GLcontext *ctx, * directly return GLbyte data, no transfer ops apply. */ void -_mesa_unpack_dudv_span_byte( GLcontext *ctx, +_mesa_unpack_dudv_span_byte( struct gl_context *ctx, GLuint n, GLenum dstFormat, GLbyte dest[], GLenum srcFormat, GLenum srcType, const GLvoid *source, @@ -4466,7 +4565,7 @@ _mesa_unpack_dudv_span_byte( GLcontext *ctx, * transferOps - the pixel transfer operations to apply */ void -_mesa_unpack_index_span( const GLcontext *ctx, GLuint n, +_mesa_unpack_index_span( const struct gl_context *ctx, GLuint n, GLenum dstType, GLvoid *dest, GLenum srcType, const GLvoid *source, const struct gl_pixelstore_attrib *srcPacking, @@ -4544,7 +4643,7 @@ _mesa_unpack_index_span( const GLcontext *ctx, GLuint n, void -_mesa_pack_index_span( const GLcontext *ctx, GLuint n, +_mesa_pack_index_span( const struct gl_context *ctx, GLuint n, GLenum dstType, GLvoid *dest, const GLuint *source, const struct gl_pixelstore_attrib *dstPacking, GLbitfield transferOps ) @@ -4674,7 +4773,7 @@ _mesa_pack_index_span( const GLcontext *ctx, GLuint n, * transferOps - apply offset/bias/lookup ops? */ void -_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n, +_mesa_unpack_stencil_span( const struct gl_context *ctx, GLuint n, GLenum dstType, GLvoid *dest, GLenum srcType, const GLvoid *source, const struct gl_pixelstore_attrib *srcPacking, @@ -4769,7 +4868,7 @@ _mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n, void -_mesa_pack_stencil_span( const GLcontext *ctx, GLuint n, +_mesa_pack_stencil_span( const struct gl_context *ctx, GLuint n, GLenum dstType, GLvoid *dest, const GLstencil *source, const struct gl_pixelstore_attrib *dstPacking ) { @@ -4944,7 +5043,7 @@ _mesa_pack_stencil_span( const GLcontext *ctx, GLuint n, * (ignored for GLfloat). */ void -_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, +_mesa_unpack_depth_span( const struct gl_context *ctx, GLuint n, GLenum dstType, GLvoid *dest, GLuint depthMax, GLenum srcType, const GLvoid *source, const struct gl_pixelstore_attrib *srcPacking ) @@ -5143,7 +5242,7 @@ _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, * Pack an array of depth values. The values are floats in [0,1]. */ void -_mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest, +_mesa_pack_depth_span( const struct gl_context *ctx, GLuint n, GLvoid *dest, GLenum dstType, const GLfloat *depthSpan, const struct gl_pixelstore_attrib *dstPacking ) { @@ -5259,7 +5358,7 @@ _mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest, * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8. */ void -_mesa_pack_depth_stencil_span(const GLcontext *ctx, GLuint n, GLuint *dest, +_mesa_pack_depth_stencil_span(const struct gl_context *ctx, GLuint n, GLuint *dest, const GLfloat *depthVals, const GLstencil *stencilVals, const struct gl_pixelstore_attrib *dstPacking) @@ -5574,12 +5673,12 @@ _mesa_convert_colors(GLenum srcType, const GLvoid *src, * GL_FALSE if image was completely clipped away (draw nothing) */ GLboolean -_mesa_clip_drawpixels(const GLcontext *ctx, +_mesa_clip_drawpixels(const struct gl_context *ctx, GLint *destX, GLint *destY, GLsizei *width, GLsizei *height, struct gl_pixelstore_attrib *unpack) { - const GLframebuffer *buffer = ctx->DrawBuffer; + const struct gl_framebuffer *buffer = ctx->DrawBuffer; if (unpack->RowLength == 0) { unpack->RowLength = *width; @@ -5645,12 +5744,12 @@ _mesa_clip_drawpixels(const GLcontext *ctx, * GL_FALSE if image was completely clipped away (draw nothing) */ GLboolean -_mesa_clip_readpixels(const GLcontext *ctx, +_mesa_clip_readpixels(const struct gl_context *ctx, GLint *srcX, GLint *srcY, GLsizei *width, GLsizei *height, struct gl_pixelstore_attrib *pack) { - const GLframebuffer *buffer = ctx->ReadBuffer; + const struct gl_framebuffer *buffer = ctx->ReadBuffer; if (pack->RowLength == 0) { pack->RowLength = *width; @@ -5695,7 +5794,7 @@ _mesa_clip_readpixels(const GLcontext *ctx, * \return GL_FALSE if region is totally clipped, GL_TRUE otherwise. */ GLboolean -_mesa_clip_copytexsubimage(const GLcontext *ctx, +_mesa_clip_copytexsubimage(const struct gl_context *ctx, GLint *destX, GLint *destY, GLint *srcX, GLint *srcY, GLsizei *width, GLsizei *height) @@ -5838,7 +5937,7 @@ clip_left_or_bottom(GLint *srcX0, GLint *srcX1, * \return GL_TRUE if anything is left to draw, GL_FALSE if totally clipped */ GLboolean -_mesa_clip_blit(GLcontext *ctx, +_mesa_clip_blit(struct gl_context *ctx, GLint *srcX0, GLint *srcY0, GLint *srcX1, GLint *srcY1, GLint *dstX0, GLint *dstY0, GLint *dstX1, GLint *dstY1) { |
