Files
third_party_mesa3d/src/mesa/main/texutil.c

1039 lines
27 KiB
C
Raw Normal View History

/* $Id: texutil.c,v 1.31 2002/09/21 16:51:25 brianp Exp $ */
2000-03-24 20:54:21 +00:00
/*
* Mesa 3-D graphics library
2002-06-05 16:48:54 +00:00
* Version: 4.0.3
Committing in . Modified Files: Mesa/macos/gli_api/gliapi1.h Mesa/macos/gli_api/gliapi2.h Mesa/macos/gli_api/gliapiext.h Mesa/macos/src-gli/fxgli.c Mesa/macos/src-gli/fxgli.h Mesa/macos/src-gli/fxgli2.c Mesa/macos/src-gli/fxgli_tridebug.c Mesa/src/accum.c Mesa/src/accum.h Mesa/src/all.h Mesa/src/alpha.c Mesa/src/alpha.h Mesa/src/attrib.c Mesa/src/attrib.h Mesa/src/bitmap.c Mesa/src/bitmap.h Mesa/src/blend.c Mesa/src/blend.h Mesa/src/buffers.c Mesa/src/buffers.h Mesa/src/clip.c Mesa/src/clip.h Mesa/src/colortab.h Mesa/src/config.c Mesa/src/context.c Mesa/src/context.h Mesa/src/convolve.c Mesa/src/convolve.h Mesa/src/copypix.c Mesa/src/copypix.h Mesa/src/debug.c Mesa/src/depth.c Mesa/src/depth.h Mesa/src/dlist.c Mesa/src/dlist.h Mesa/src/drawpix.c Mesa/src/drawpix.h Mesa/src/enable.c Mesa/src/enable.h Mesa/src/eval.c Mesa/src/eval.h Mesa/src/extensions.c Mesa/src/extensions.h Mesa/src/feedback.c Mesa/src/feedback.h Mesa/src/fog.c Mesa/src/fog.h Mesa/src/get.c Mesa/src/get.h Mesa/src/glapi.c Mesa/src/glthread.h Mesa/src/highpc.c Mesa/src/hint.h Mesa/src/histogram.h Mesa/src/image.c Mesa/src/image.h Mesa/src/imports.c Mesa/src/light.c Mesa/src/light.h Mesa/src/lines.c Mesa/src/lines.h Mesa/src/logic.c Mesa/src/logic.h Mesa/src/masking.c Mesa/src/masking.h Mesa/src/matrix.c Mesa/src/matrix.h Mesa/src/pixel.c Mesa/src/pixel.h Mesa/src/points.c Mesa/src/points.h Mesa/src/polygon.c Mesa/src/polygon.h Mesa/src/rastpos.c Mesa/src/readpix.c Mesa/src/scissor.c Mesa/src/scissor.h Mesa/src/state.c Mesa/src/state.h Mesa/src/stencil.c Mesa/src/stencil.h Mesa/src/teximage.c Mesa/src/teximage.h Mesa/src/texobj.c Mesa/src/texobj.h Mesa/src/texstate.c Mesa/src/texstate.h Mesa/src/texture.c Mesa/src/texture.h Mesa/src/texutil.c Mesa/src/texutil.h Mesa/src/varray.c Mesa/src/varray.h Mesa/src/X/fakeglx.c Mesa/src/X/xm_api.c Mesa/src/X/xm_dd.c Mesa/src/X/xm_line.c Mesa/src/X/xm_span.c Mesa/src/X/xm_tri.c Mesa/src/swrast/s_aaline.c Mesa/src/swrast/s_aaline.h Mesa/src/swrast/s_aatriangle.h Mesa/src/swrast/s_accum.h Mesa/src/swrast/s_alpha.h Mesa/src/swrast/s_alphabuf.h Mesa/src/swrast/s_blend.h Mesa/src/swrast/s_context.c Mesa/src/swrast/s_context.h Mesa/src/swrast/s_depth.h Mesa/src/swrast/s_drawpix.h Mesa/src/swrast/s_feedback.h Mesa/src/swrast/s_fog.h Mesa/src/swrast/s_histogram.h Mesa/src/swrast/s_lines.h Mesa/src/swrast/s_logic.h Mesa/src/swrast/s_masking.h Mesa/src/swrast/s_pb.h Mesa/src/swrast/s_pixeltex.h Mesa/src/swrast/s_points.h Mesa/src/swrast/s_quads.c Mesa/src/swrast/s_quads.h Mesa/src/swrast/s_scissor.h Mesa/src/swrast/s_span.h Mesa/src/swrast/s_stencil.h Mesa/src/swrast/s_texture.h Mesa/src/swrast/s_triangle.h Mesa/src/swrast/s_zoom.h Mesa/src/swrast/swrast.h Mesa/src/swrast_setup/ss_context.h Mesa/src/swrast_setup/ss_triangle.c Mesa/src/swrast_setup/ss_triangle.h Mesa/src/swrast_setup/ss_vb.h Mesa/src/tnl/t_clip.c Mesa/src/tnl/t_clip.h Mesa/src/tnl/t_context.c Mesa/src/tnl/t_context.h Mesa/src/tnl/t_cva.c Mesa/src/tnl/t_cva.h Mesa/src/tnl/t_debug.c Mesa/src/tnl/t_debug.h Mesa/src/tnl/t_dlist.h Mesa/src/tnl/t_eval.c Mesa/src/tnl/t_eval.h Mesa/src/tnl/t_fog.c Mesa/src/tnl/t_fog.h Mesa/src/tnl/t_light.c Mesa/src/tnl/t_light.h Mesa/src/tnl/t_pipeline.c Mesa/src/tnl/t_pipeline.h Mesa/src/tnl/t_shade.c Mesa/src/tnl/t_shade.h Mesa/src/tnl/t_stages.c Mesa/src/tnl/t_stages.h Mesa/src/tnl/t_texture.c Mesa/src/tnl/t_texture.h Mesa/src/tnl/t_trans_elt.c Mesa/src/tnl/t_trans_elt.h Mesa/src/tnl/t_varray.c Mesa/src/tnl/t_varray.h Mesa/src/tnl/t_vb.c Mesa/src/tnl/t_vb.h Mesa/src/tnl/t_vbcull.c Mesa/src/tnl/t_vbcull.h Mesa/src/tnl/t_vbfill.c Mesa/src/tnl/t_vbfill.h Mesa/src/tnl/t_vbindirect.c Mesa/src/tnl/t_vbindirect.h Mesa/src/tnl/t_vbrender.c Mesa/src/tnl/t_vbrender.h Mesa/src/tnl/t_vbxform.c Mesa/src/tnl/t_vbxform.h Mesa/src/tnl/tnl.h Added Files: Mesa/src/mtypes.h Removed Files: Mesa/src/types.h Changed Mesa/src/types to Mesa/src/mtypes.h to avoid conflicts while compiling on a VMS system. ----------------------------------------------------------------------
2000-11-22 07:32:16 +00:00
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
Committing in . Modified Files: Mesa/macos/gli_api/gliapi1.h Mesa/macos/gli_api/gliapi2.h Mesa/macos/gli_api/gliapiext.h Mesa/macos/src-gli/fxgli.c Mesa/macos/src-gli/fxgli.h Mesa/macos/src-gli/fxgli2.c Mesa/macos/src-gli/fxgli_tridebug.c Mesa/src/accum.c Mesa/src/accum.h Mesa/src/all.h Mesa/src/alpha.c Mesa/src/alpha.h Mesa/src/attrib.c Mesa/src/attrib.h Mesa/src/bitmap.c Mesa/src/bitmap.h Mesa/src/blend.c Mesa/src/blend.h Mesa/src/buffers.c Mesa/src/buffers.h Mesa/src/clip.c Mesa/src/clip.h Mesa/src/colortab.h Mesa/src/config.c Mesa/src/context.c Mesa/src/context.h Mesa/src/convolve.c Mesa/src/convolve.h Mesa/src/copypix.c Mesa/src/copypix.h Mesa/src/debug.c Mesa/src/depth.c Mesa/src/depth.h Mesa/src/dlist.c Mesa/src/dlist.h Mesa/src/drawpix.c Mesa/src/drawpix.h Mesa/src/enable.c Mesa/src/enable.h Mesa/src/eval.c Mesa/src/eval.h Mesa/src/extensions.c Mesa/src/extensions.h Mesa/src/feedback.c Mesa/src/feedback.h Mesa/src/fog.c Mesa/src/fog.h Mesa/src/get.c Mesa/src/get.h Mesa/src/glapi.c Mesa/src/glthread.h Mesa/src/highpc.c Mesa/src/hint.h Mesa/src/histogram.h Mesa/src/image.c Mesa/src/image.h Mesa/src/imports.c Mesa/src/light.c Mesa/src/light.h Mesa/src/lines.c Mesa/src/lines.h Mesa/src/logic.c Mesa/src/logic.h Mesa/src/masking.c Mesa/src/masking.h Mesa/src/matrix.c Mesa/src/matrix.h Mesa/src/pixel.c Mesa/src/pixel.h Mesa/src/points.c Mesa/src/points.h Mesa/src/polygon.c Mesa/src/polygon.h Mesa/src/rastpos.c Mesa/src/readpix.c Mesa/src/scissor.c Mesa/src/scissor.h Mesa/src/state.c Mesa/src/state.h Mesa/src/stencil.c Mesa/src/stencil.h Mesa/src/teximage.c Mesa/src/teximage.h Mesa/src/texobj.c Mesa/src/texobj.h Mesa/src/texstate.c Mesa/src/texstate.h Mesa/src/texture.c Mesa/src/texture.h Mesa/src/texutil.c Mesa/src/texutil.h Mesa/src/varray.c Mesa/src/varray.h Mesa/src/X/fakeglx.c Mesa/src/X/xm_api.c Mesa/src/X/xm_dd.c Mesa/src/X/xm_line.c Mesa/src/X/xm_span.c Mesa/src/X/xm_tri.c Mesa/src/swrast/s_aaline.c Mesa/src/swrast/s_aaline.h Mesa/src/swrast/s_aatriangle.h Mesa/src/swrast/s_accum.h Mesa/src/swrast/s_alpha.h Mesa/src/swrast/s_alphabuf.h Mesa/src/swrast/s_blend.h Mesa/src/swrast/s_context.c Mesa/src/swrast/s_context.h Mesa/src/swrast/s_depth.h Mesa/src/swrast/s_drawpix.h Mesa/src/swrast/s_feedback.h Mesa/src/swrast/s_fog.h Mesa/src/swrast/s_histogram.h Mesa/src/swrast/s_lines.h Mesa/src/swrast/s_logic.h Mesa/src/swrast/s_masking.h Mesa/src/swrast/s_pb.h Mesa/src/swrast/s_pixeltex.h Mesa/src/swrast/s_points.h Mesa/src/swrast/s_quads.c Mesa/src/swrast/s_quads.h Mesa/src/swrast/s_scissor.h Mesa/src/swrast/s_span.h Mesa/src/swrast/s_stencil.h Mesa/src/swrast/s_texture.h Mesa/src/swrast/s_triangle.h Mesa/src/swrast/s_zoom.h Mesa/src/swrast/swrast.h Mesa/src/swrast_setup/ss_context.h Mesa/src/swrast_setup/ss_triangle.c Mesa/src/swrast_setup/ss_triangle.h Mesa/src/swrast_setup/ss_vb.h Mesa/src/tnl/t_clip.c Mesa/src/tnl/t_clip.h Mesa/src/tnl/t_context.c Mesa/src/tnl/t_context.h Mesa/src/tnl/t_cva.c Mesa/src/tnl/t_cva.h Mesa/src/tnl/t_debug.c Mesa/src/tnl/t_debug.h Mesa/src/tnl/t_dlist.h Mesa/src/tnl/t_eval.c Mesa/src/tnl/t_eval.h Mesa/src/tnl/t_fog.c Mesa/src/tnl/t_fog.h Mesa/src/tnl/t_light.c Mesa/src/tnl/t_light.h Mesa/src/tnl/t_pipeline.c Mesa/src/tnl/t_pipeline.h Mesa/src/tnl/t_shade.c Mesa/src/tnl/t_shade.h Mesa/src/tnl/t_stages.c Mesa/src/tnl/t_stages.h Mesa/src/tnl/t_texture.c Mesa/src/tnl/t_texture.h Mesa/src/tnl/t_trans_elt.c Mesa/src/tnl/t_trans_elt.h Mesa/src/tnl/t_varray.c Mesa/src/tnl/t_varray.h Mesa/src/tnl/t_vb.c Mesa/src/tnl/t_vb.h Mesa/src/tnl/t_vbcull.c Mesa/src/tnl/t_vbcull.h Mesa/src/tnl/t_vbfill.c Mesa/src/tnl/t_vbfill.h Mesa/src/tnl/t_vbindirect.c Mesa/src/tnl/t_vbindirect.h Mesa/src/tnl/t_vbrender.c Mesa/src/tnl/t_vbrender.h Mesa/src/tnl/t_vbxform.c Mesa/src/tnl/t_vbxform.h Mesa/src/tnl/tnl.h Added Files: Mesa/src/mtypes.h Removed Files: Mesa/src/types.h Changed Mesa/src/types to Mesa/src/mtypes.h to avoid conflicts while compiling on a VMS system. ----------------------------------------------------------------------
2000-11-22 07:32:16 +00:00
*
2000-03-24 20:54:21 +00:00
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
Committing in . Modified Files: Mesa/macos/gli_api/gliapi1.h Mesa/macos/gli_api/gliapi2.h Mesa/macos/gli_api/gliapiext.h Mesa/macos/src-gli/fxgli.c Mesa/macos/src-gli/fxgli.h Mesa/macos/src-gli/fxgli2.c Mesa/macos/src-gli/fxgli_tridebug.c Mesa/src/accum.c Mesa/src/accum.h Mesa/src/all.h Mesa/src/alpha.c Mesa/src/alpha.h Mesa/src/attrib.c Mesa/src/attrib.h Mesa/src/bitmap.c Mesa/src/bitmap.h Mesa/src/blend.c Mesa/src/blend.h Mesa/src/buffers.c Mesa/src/buffers.h Mesa/src/clip.c Mesa/src/clip.h Mesa/src/colortab.h Mesa/src/config.c Mesa/src/context.c Mesa/src/context.h Mesa/src/convolve.c Mesa/src/convolve.h Mesa/src/copypix.c Mesa/src/copypix.h Mesa/src/debug.c Mesa/src/depth.c Mesa/src/depth.h Mesa/src/dlist.c Mesa/src/dlist.h Mesa/src/drawpix.c Mesa/src/drawpix.h Mesa/src/enable.c Mesa/src/enable.h Mesa/src/eval.c Mesa/src/eval.h Mesa/src/extensions.c Mesa/src/extensions.h Mesa/src/feedback.c Mesa/src/feedback.h Mesa/src/fog.c Mesa/src/fog.h Mesa/src/get.c Mesa/src/get.h Mesa/src/glapi.c Mesa/src/glthread.h Mesa/src/highpc.c Mesa/src/hint.h Mesa/src/histogram.h Mesa/src/image.c Mesa/src/image.h Mesa/src/imports.c Mesa/src/light.c Mesa/src/light.h Mesa/src/lines.c Mesa/src/lines.h Mesa/src/logic.c Mesa/src/logic.h Mesa/src/masking.c Mesa/src/masking.h Mesa/src/matrix.c Mesa/src/matrix.h Mesa/src/pixel.c Mesa/src/pixel.h Mesa/src/points.c Mesa/src/points.h Mesa/src/polygon.c Mesa/src/polygon.h Mesa/src/rastpos.c Mesa/src/readpix.c Mesa/src/scissor.c Mesa/src/scissor.h Mesa/src/state.c Mesa/src/state.h Mesa/src/stencil.c Mesa/src/stencil.h Mesa/src/teximage.c Mesa/src/teximage.h Mesa/src/texobj.c Mesa/src/texobj.h Mesa/src/texstate.c Mesa/src/texstate.h Mesa/src/texture.c Mesa/src/texture.h Mesa/src/texutil.c Mesa/src/texutil.h Mesa/src/varray.c Mesa/src/varray.h Mesa/src/X/fakeglx.c Mesa/src/X/xm_api.c Mesa/src/X/xm_dd.c Mesa/src/X/xm_line.c Mesa/src/X/xm_span.c Mesa/src/X/xm_tri.c Mesa/src/swrast/s_aaline.c Mesa/src/swrast/s_aaline.h Mesa/src/swrast/s_aatriangle.h Mesa/src/swrast/s_accum.h Mesa/src/swrast/s_alpha.h Mesa/src/swrast/s_alphabuf.h Mesa/src/swrast/s_blend.h Mesa/src/swrast/s_context.c Mesa/src/swrast/s_context.h Mesa/src/swrast/s_depth.h Mesa/src/swrast/s_drawpix.h Mesa/src/swrast/s_feedback.h Mesa/src/swrast/s_fog.h Mesa/src/swrast/s_histogram.h Mesa/src/swrast/s_lines.h Mesa/src/swrast/s_logic.h Mesa/src/swrast/s_masking.h Mesa/src/swrast/s_pb.h Mesa/src/swrast/s_pixeltex.h Mesa/src/swrast/s_points.h Mesa/src/swrast/s_quads.c Mesa/src/swrast/s_quads.h Mesa/src/swrast/s_scissor.h Mesa/src/swrast/s_span.h Mesa/src/swrast/s_stencil.h Mesa/src/swrast/s_texture.h Mesa/src/swrast/s_triangle.h Mesa/src/swrast/s_zoom.h Mesa/src/swrast/swrast.h Mesa/src/swrast_setup/ss_context.h Mesa/src/swrast_setup/ss_triangle.c Mesa/src/swrast_setup/ss_triangle.h Mesa/src/swrast_setup/ss_vb.h Mesa/src/tnl/t_clip.c Mesa/src/tnl/t_clip.h Mesa/src/tnl/t_context.c Mesa/src/tnl/t_context.h Mesa/src/tnl/t_cva.c Mesa/src/tnl/t_cva.h Mesa/src/tnl/t_debug.c Mesa/src/tnl/t_debug.h Mesa/src/tnl/t_dlist.h Mesa/src/tnl/t_eval.c Mesa/src/tnl/t_eval.h Mesa/src/tnl/t_fog.c Mesa/src/tnl/t_fog.h Mesa/src/tnl/t_light.c Mesa/src/tnl/t_light.h Mesa/src/tnl/t_pipeline.c Mesa/src/tnl/t_pipeline.h Mesa/src/tnl/t_shade.c Mesa/src/tnl/t_shade.h Mesa/src/tnl/t_stages.c Mesa/src/tnl/t_stages.h Mesa/src/tnl/t_texture.c Mesa/src/tnl/t_texture.h Mesa/src/tnl/t_trans_elt.c Mesa/src/tnl/t_trans_elt.h Mesa/src/tnl/t_varray.c Mesa/src/tnl/t_varray.h Mesa/src/tnl/t_vb.c Mesa/src/tnl/t_vb.h Mesa/src/tnl/t_vbcull.c Mesa/src/tnl/t_vbcull.h Mesa/src/tnl/t_vbfill.c Mesa/src/tnl/t_vbfill.h Mesa/src/tnl/t_vbindirect.c Mesa/src/tnl/t_vbindirect.h Mesa/src/tnl/t_vbrender.c Mesa/src/tnl/t_vbrender.h Mesa/src/tnl/t_vbxform.c Mesa/src/tnl/t_vbxform.h Mesa/src/tnl/tnl.h Added Files: Mesa/src/mtypes.h Removed Files: Mesa/src/types.h Changed Mesa/src/types to Mesa/src/mtypes.h to avoid conflicts while compiling on a VMS system. ----------------------------------------------------------------------
2000-11-22 07:32:16 +00:00
*
2000-03-24 20:54:21 +00:00
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
Committing in . Modified Files: Mesa/macos/gli_api/gliapi1.h Mesa/macos/gli_api/gliapi2.h Mesa/macos/gli_api/gliapiext.h Mesa/macos/src-gli/fxgli.c Mesa/macos/src-gli/fxgli.h Mesa/macos/src-gli/fxgli2.c Mesa/macos/src-gli/fxgli_tridebug.c Mesa/src/accum.c Mesa/src/accum.h Mesa/src/all.h Mesa/src/alpha.c Mesa/src/alpha.h Mesa/src/attrib.c Mesa/src/attrib.h Mesa/src/bitmap.c Mesa/src/bitmap.h Mesa/src/blend.c Mesa/src/blend.h Mesa/src/buffers.c Mesa/src/buffers.h Mesa/src/clip.c Mesa/src/clip.h Mesa/src/colortab.h Mesa/src/config.c Mesa/src/context.c Mesa/src/context.h Mesa/src/convolve.c Mesa/src/convolve.h Mesa/src/copypix.c Mesa/src/copypix.h Mesa/src/debug.c Mesa/src/depth.c Mesa/src/depth.h Mesa/src/dlist.c Mesa/src/dlist.h Mesa/src/drawpix.c Mesa/src/drawpix.h Mesa/src/enable.c Mesa/src/enable.h Mesa/src/eval.c Mesa/src/eval.h Mesa/src/extensions.c Mesa/src/extensions.h Mesa/src/feedback.c Mesa/src/feedback.h Mesa/src/fog.c Mesa/src/fog.h Mesa/src/get.c Mesa/src/get.h Mesa/src/glapi.c Mesa/src/glthread.h Mesa/src/highpc.c Mesa/src/hint.h Mesa/src/histogram.h Mesa/src/image.c Mesa/src/image.h Mesa/src/imports.c Mesa/src/light.c Mesa/src/light.h Mesa/src/lines.c Mesa/src/lines.h Mesa/src/logic.c Mesa/src/logic.h Mesa/src/masking.c Mesa/src/masking.h Mesa/src/matrix.c Mesa/src/matrix.h Mesa/src/pixel.c Mesa/src/pixel.h Mesa/src/points.c Mesa/src/points.h Mesa/src/polygon.c Mesa/src/polygon.h Mesa/src/rastpos.c Mesa/src/readpix.c Mesa/src/scissor.c Mesa/src/scissor.h Mesa/src/state.c Mesa/src/state.h Mesa/src/stencil.c Mesa/src/stencil.h Mesa/src/teximage.c Mesa/src/teximage.h Mesa/src/texobj.c Mesa/src/texobj.h Mesa/src/texstate.c Mesa/src/texstate.h Mesa/src/texture.c Mesa/src/texture.h Mesa/src/texutil.c Mesa/src/texutil.h Mesa/src/varray.c Mesa/src/varray.h Mesa/src/X/fakeglx.c Mesa/src/X/xm_api.c Mesa/src/X/xm_dd.c Mesa/src/X/xm_line.c Mesa/src/X/xm_span.c Mesa/src/X/xm_tri.c Mesa/src/swrast/s_aaline.c Mesa/src/swrast/s_aaline.h Mesa/src/swrast/s_aatriangle.h Mesa/src/swrast/s_accum.h Mesa/src/swrast/s_alpha.h Mesa/src/swrast/s_alphabuf.h Mesa/src/swrast/s_blend.h Mesa/src/swrast/s_context.c Mesa/src/swrast/s_context.h Mesa/src/swrast/s_depth.h Mesa/src/swrast/s_drawpix.h Mesa/src/swrast/s_feedback.h Mesa/src/swrast/s_fog.h Mesa/src/swrast/s_histogram.h Mesa/src/swrast/s_lines.h Mesa/src/swrast/s_logic.h Mesa/src/swrast/s_masking.h Mesa/src/swrast/s_pb.h Mesa/src/swrast/s_pixeltex.h Mesa/src/swrast/s_points.h Mesa/src/swrast/s_quads.c Mesa/src/swrast/s_quads.h Mesa/src/swrast/s_scissor.h Mesa/src/swrast/s_span.h Mesa/src/swrast/s_stencil.h Mesa/src/swrast/s_texture.h Mesa/src/swrast/s_triangle.h Mesa/src/swrast/s_zoom.h Mesa/src/swrast/swrast.h Mesa/src/swrast_setup/ss_context.h Mesa/src/swrast_setup/ss_triangle.c Mesa/src/swrast_setup/ss_triangle.h Mesa/src/swrast_setup/ss_vb.h Mesa/src/tnl/t_clip.c Mesa/src/tnl/t_clip.h Mesa/src/tnl/t_context.c Mesa/src/tnl/t_context.h Mesa/src/tnl/t_cva.c Mesa/src/tnl/t_cva.h Mesa/src/tnl/t_debug.c Mesa/src/tnl/t_debug.h Mesa/src/tnl/t_dlist.h Mesa/src/tnl/t_eval.c Mesa/src/tnl/t_eval.h Mesa/src/tnl/t_fog.c Mesa/src/tnl/t_fog.h Mesa/src/tnl/t_light.c Mesa/src/tnl/t_light.h Mesa/src/tnl/t_pipeline.c Mesa/src/tnl/t_pipeline.h Mesa/src/tnl/t_shade.c Mesa/src/tnl/t_shade.h Mesa/src/tnl/t_stages.c Mesa/src/tnl/t_stages.h Mesa/src/tnl/t_texture.c Mesa/src/tnl/t_texture.h Mesa/src/tnl/t_trans_elt.c Mesa/src/tnl/t_trans_elt.h Mesa/src/tnl/t_varray.c Mesa/src/tnl/t_varray.h Mesa/src/tnl/t_vb.c Mesa/src/tnl/t_vb.h Mesa/src/tnl/t_vbcull.c Mesa/src/tnl/t_vbcull.h Mesa/src/tnl/t_vbfill.c Mesa/src/tnl/t_vbfill.h Mesa/src/tnl/t_vbindirect.c Mesa/src/tnl/t_vbindirect.h Mesa/src/tnl/t_vbrender.c Mesa/src/tnl/t_vbrender.h Mesa/src/tnl/t_vbxform.c Mesa/src/tnl/t_vbxform.h Mesa/src/tnl/tnl.h Added Files: Mesa/src/mtypes.h Removed Files: Mesa/src/types.h Changed Mesa/src/types to Mesa/src/mtypes.h to avoid conflicts while compiling on a VMS system. ----------------------------------------------------------------------
2000-11-22 07:32:16 +00:00
*
2000-03-24 20:54:21 +00:00
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Authors:
* Gareth Hughes <gareth@valinux.com>
2000-03-24 20:54:21 +00:00
*/
/*
* Description:
* Functions for texture image conversion. This takes care of converting
* typical GL_RGBA/GLubyte textures into hardware-specific formats.
* We can handle non-standard row strides and pixel unpacking parameters.
*/
2000-03-24 20:54:21 +00:00
#ifdef PC_HEADER
#include "all.h"
#else
#include "glheader.h"
2000-03-27 18:56:26 +00:00
#include "context.h"
#include "enums.h"
2000-03-24 20:54:21 +00:00
#include "image.h"
#include "macros.h"
2000-03-24 20:54:21 +00:00
#include "mem.h"
Committing in . Modified Files: Mesa/macos/gli_api/gliapi1.h Mesa/macos/gli_api/gliapi2.h Mesa/macos/gli_api/gliapiext.h Mesa/macos/src-gli/fxgli.c Mesa/macos/src-gli/fxgli.h Mesa/macos/src-gli/fxgli2.c Mesa/macos/src-gli/fxgli_tridebug.c Mesa/src/accum.c Mesa/src/accum.h Mesa/src/all.h Mesa/src/alpha.c Mesa/src/alpha.h Mesa/src/attrib.c Mesa/src/attrib.h Mesa/src/bitmap.c Mesa/src/bitmap.h Mesa/src/blend.c Mesa/src/blend.h Mesa/src/buffers.c Mesa/src/buffers.h Mesa/src/clip.c Mesa/src/clip.h Mesa/src/colortab.h Mesa/src/config.c Mesa/src/context.c Mesa/src/context.h Mesa/src/convolve.c Mesa/src/convolve.h Mesa/src/copypix.c Mesa/src/copypix.h Mesa/src/debug.c Mesa/src/depth.c Mesa/src/depth.h Mesa/src/dlist.c Mesa/src/dlist.h Mesa/src/drawpix.c Mesa/src/drawpix.h Mesa/src/enable.c Mesa/src/enable.h Mesa/src/eval.c Mesa/src/eval.h Mesa/src/extensions.c Mesa/src/extensions.h Mesa/src/feedback.c Mesa/src/feedback.h Mesa/src/fog.c Mesa/src/fog.h Mesa/src/get.c Mesa/src/get.h Mesa/src/glapi.c Mesa/src/glthread.h Mesa/src/highpc.c Mesa/src/hint.h Mesa/src/histogram.h Mesa/src/image.c Mesa/src/image.h Mesa/src/imports.c Mesa/src/light.c Mesa/src/light.h Mesa/src/lines.c Mesa/src/lines.h Mesa/src/logic.c Mesa/src/logic.h Mesa/src/masking.c Mesa/src/masking.h Mesa/src/matrix.c Mesa/src/matrix.h Mesa/src/pixel.c Mesa/src/pixel.h Mesa/src/points.c Mesa/src/points.h Mesa/src/polygon.c Mesa/src/polygon.h Mesa/src/rastpos.c Mesa/src/readpix.c Mesa/src/scissor.c Mesa/src/scissor.h Mesa/src/state.c Mesa/src/state.h Mesa/src/stencil.c Mesa/src/stencil.h Mesa/src/teximage.c Mesa/src/teximage.h Mesa/src/texobj.c Mesa/src/texobj.h Mesa/src/texstate.c Mesa/src/texstate.h Mesa/src/texture.c Mesa/src/texture.h Mesa/src/texutil.c Mesa/src/texutil.h Mesa/src/varray.c Mesa/src/varray.h Mesa/src/X/fakeglx.c Mesa/src/X/xm_api.c Mesa/src/X/xm_dd.c Mesa/src/X/xm_line.c Mesa/src/X/xm_span.c Mesa/src/X/xm_tri.c Mesa/src/swrast/s_aaline.c Mesa/src/swrast/s_aaline.h Mesa/src/swrast/s_aatriangle.h Mesa/src/swrast/s_accum.h Mesa/src/swrast/s_alpha.h Mesa/src/swrast/s_alphabuf.h Mesa/src/swrast/s_blend.h Mesa/src/swrast/s_context.c Mesa/src/swrast/s_context.h Mesa/src/swrast/s_depth.h Mesa/src/swrast/s_drawpix.h Mesa/src/swrast/s_feedback.h Mesa/src/swrast/s_fog.h Mesa/src/swrast/s_histogram.h Mesa/src/swrast/s_lines.h Mesa/src/swrast/s_logic.h Mesa/src/swrast/s_masking.h Mesa/src/swrast/s_pb.h Mesa/src/swrast/s_pixeltex.h Mesa/src/swrast/s_points.h Mesa/src/swrast/s_quads.c Mesa/src/swrast/s_quads.h Mesa/src/swrast/s_scissor.h Mesa/src/swrast/s_span.h Mesa/src/swrast/s_stencil.h Mesa/src/swrast/s_texture.h Mesa/src/swrast/s_triangle.h Mesa/src/swrast/s_zoom.h Mesa/src/swrast/swrast.h Mesa/src/swrast_setup/ss_context.h Mesa/src/swrast_setup/ss_triangle.c Mesa/src/swrast_setup/ss_triangle.h Mesa/src/swrast_setup/ss_vb.h Mesa/src/tnl/t_clip.c Mesa/src/tnl/t_clip.h Mesa/src/tnl/t_context.c Mesa/src/tnl/t_context.h Mesa/src/tnl/t_cva.c Mesa/src/tnl/t_cva.h Mesa/src/tnl/t_debug.c Mesa/src/tnl/t_debug.h Mesa/src/tnl/t_dlist.h Mesa/src/tnl/t_eval.c Mesa/src/tnl/t_eval.h Mesa/src/tnl/t_fog.c Mesa/src/tnl/t_fog.h Mesa/src/tnl/t_light.c Mesa/src/tnl/t_light.h Mesa/src/tnl/t_pipeline.c Mesa/src/tnl/t_pipeline.h Mesa/src/tnl/t_shade.c Mesa/src/tnl/t_shade.h Mesa/src/tnl/t_stages.c Mesa/src/tnl/t_stages.h Mesa/src/tnl/t_texture.c Mesa/src/tnl/t_texture.h Mesa/src/tnl/t_trans_elt.c Mesa/src/tnl/t_trans_elt.h Mesa/src/tnl/t_varray.c Mesa/src/tnl/t_varray.h Mesa/src/tnl/t_vb.c Mesa/src/tnl/t_vb.h Mesa/src/tnl/t_vbcull.c Mesa/src/tnl/t_vbcull.h Mesa/src/tnl/t_vbfill.c Mesa/src/tnl/t_vbfill.h Mesa/src/tnl/t_vbindirect.c Mesa/src/tnl/t_vbindirect.h Mesa/src/tnl/t_vbrender.c Mesa/src/tnl/t_vbrender.h Mesa/src/tnl/t_vbxform.c Mesa/src/tnl/t_vbxform.h Mesa/src/tnl/tnl.h Added Files: Mesa/src/mtypes.h Removed Files: Mesa/src/types.h Changed Mesa/src/types to Mesa/src/mtypes.h to avoid conflicts while compiling on a VMS system. ----------------------------------------------------------------------
2000-11-22 07:32:16 +00:00
#include "mtypes.h"
#include "texformat.h"
#include "texutil.h"
2000-03-24 20:54:21 +00:00
#endif
2001-04-20 19:21:41 +00:00
#define DEBUG_TEXUTIL 0
2000-03-24 20:54:21 +00:00
#ifdef MESA_BIG_ENDIAN
#define APPEND16( a, b ) ( (a) << 16 | (b) )
#else
#define APPEND16( a, b ) ( (a) | (b) << 16 )
#endif
struct convert_info {
GLint xoffset, yoffset, zoffset; /* Subimage offset */
GLint width, height, depth; /* Subimage region */
GLint dstImageWidth, dstImageHeight; /* Dest image size */
/* Needed for subimage replacement */
GLenum format, type; /* Source (user) format and type */
const struct gl_pixelstore_attrib *unpacking;
const GLvoid *srcImage;
GLvoid *dstImage;
GLint index;
};
typedef GLboolean (*convert_func)( const struct convert_info *convert );
/* bitvalues for convert->index */
#define CONVERT_STRIDE_BIT 0x1
#define CONVERT_UNPACKING_BIT 0x2
2001-03-30 14:44:43 +00:00
/* =============================================================
* Convert to RGBA8888 textures:
2000-03-24 20:54:21 +00:00
*/
#define DST_TYPE GLuint
#define DST_TEXELS_PER_DWORD 1
2000-03-24 20:54:21 +00:00
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_8888_LE( src[3], src[2], src[1], src[0] )
#define CONVERT_DIRECT
#define SRC_TEXEL_BYTES 4
#define TAG(x) x##_rgba8888_direct
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_8888_LE( src[0], src[1], src[2], src[3] )
#define CONVERT_TEXEL_DWORD( dst, src ) CONVERT_TEXEL( dst, src )
#define SRC_TEXEL_BYTES 4
#define TAG(x) x##_abgr8888_to_rgba8888
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_8888_LE( src[0], src[1], src[2], 0xff )
#define CONVERT_TEXEL_DWORD( dst, src ) CONVERT_TEXEL( dst, src )
#define SRC_TEXEL_BYTES 3
#define TAG(x) x##_bgr888_to_rgba8888
#include "texutil_tmp.h"
#define CONVERT_RGBA8888( name ) \
static GLboolean \
convert_##name##_rgba8888( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( convert->format == GL_ABGR_EXT && \
convert->type == GL_UNSIGNED_INT_8_8_8_8_REV ) \
{ \
tab = name##_tab_rgba8888_direct; \
} \
else if ( convert->format == GL_RGBA && \
( convert->type == GL_UNSIGNED_BYTE || \
convert->type == GL_UNSIGNED_INT_8_8_8_8 ) ) \
{ \
tab = name##_tab_abgr8888_to_rgba8888; \
} \
else if ( convert->format == GL_RGB && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_bgr888_to_rgba8888; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
}
CONVERT_RGBA8888( texsubimage2d )
CONVERT_RGBA8888( texsubimage3d )
2001-03-30 14:44:43 +00:00
/* =============================================================
* Convert to ARGB8888 textures:
2000-03-29 18:14:08 +00:00
*/
#define DST_TYPE GLuint
#define DST_TEXELS_PER_DWORD 1
2000-03-24 20:54:21 +00:00
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_8888_LE( src[3], src[2], src[1], src[0] )
2000-03-24 20:54:21 +00:00
#define CONVERT_DIRECT
#define SRC_TEXEL_BYTES 4
#define TAG(x) x##_argb8888_direct
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_8888_LE( src[3], src[0], src[1], src[2] )
#define CONVERT_TEXEL_DWORD( dst, src ) CONVERT_TEXEL( dst, src )
#define SRC_TEXEL_BYTES 4
#define TAG(x) x##_abgr8888_to_argb8888
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_8888_LE( 0xff, src[0], src[1], src[2] )
#define CONVERT_TEXEL_DWORD( dst, src ) CONVERT_TEXEL( dst, src )
#define SRC_TEXEL_BYTES 3
#define TAG(x) x##_bgr888_to_argb8888
#include "texutil_tmp.h"
#define CONVERT_ARGB8888( name ) \
static GLboolean \
convert_##name##_argb8888( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( convert->format == GL_BGRA && \
convert->type == GL_UNSIGNED_INT_8_8_8_8_REV ) \
{ \
tab = name##_tab_argb8888_direct; \
} \
else if ( convert->format == GL_RGBA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_abgr8888_to_argb8888; \
} \
else if ( convert->format == GL_RGB && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_bgr888_to_argb8888; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
}
CONVERT_ARGB8888( texsubimage2d )
CONVERT_ARGB8888( texsubimage3d )
2001-03-30 14:44:43 +00:00
/* =============================================================
* Convert to RGB888 textures:
2000-03-24 20:54:21 +00:00
*/
static GLboolean
convert_texsubimage2d_rgb888( const struct convert_info *convert )
2000-03-24 20:54:21 +00:00
{
/* This is a placeholder for now...
*/
return GL_FALSE;
2000-03-29 18:14:08 +00:00
}
static GLboolean
convert_texsubimage3d_rgb888( const struct convert_info *convert )
{
/* This is a placeholder for now...
*/
return GL_FALSE;
}
2000-03-29 18:14:08 +00:00
2001-03-30 14:44:43 +00:00
/* =============================================================
* Convert to RGB565 textures:
2000-03-29 18:14:08 +00:00
*/
#define DST_TYPE GLushort
#define DST_TEXELS_PER_DWORD 2
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_565_LE( src[0], src[1], src[2] )
#define CONVERT_DIRECT
#define SRC_TEXEL_BYTES 2
#define TAG(x) x##_rgb565_direct
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_565_LE( src[0], src[1], src[2] )
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_565_LE( src[0], src[1], src[2] ), \
PACK_COLOR_565_LE( src[3], src[4], src[5] ) )
#define SRC_TEXEL_BYTES 3
#define TAG(x) x##_bgr888_to_rgb565
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_565_LE( src[0], src[1], src[2] )
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_565_LE( src[0], src[1], src[2] ), \
PACK_COLOR_565_LE( src[4], src[5], src[6] ) )
#define SRC_TEXEL_BYTES 4
#define TAG(x) x##_abgr8888_to_rgb565
#include "texutil_tmp.h"
#define CONVERT_RGB565( name ) \
static GLboolean \
convert_##name##_rgb565( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( convert->format == GL_RGB && \
convert->type == GL_UNSIGNED_SHORT_5_6_5 ) \
{ \
tab = name##_tab_rgb565_direct; \
} \
else if ( convert->format == GL_RGB && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_bgr888_to_rgb565; \
} \
else if ( convert->format == GL_RGBA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_abgr8888_to_rgb565; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
2000-03-24 20:54:21 +00:00
}
2000-03-27 18:56:26 +00:00
CONVERT_RGB565( texsubimage2d )
CONVERT_RGB565( texsubimage3d )
2000-03-27 18:56:26 +00:00
2000-03-29 18:14:08 +00:00
2001-03-30 14:44:43 +00:00
/* =============================================================
* Convert to ARGB4444 textures:
*/
#define DST_TYPE GLushort
#define DST_TEXELS_PER_DWORD 2
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_4444_LE( src[3], src[0], src[1], src[2] )
#define CONVERT_DIRECT
#define SRC_TEXEL_BYTES 2
#define TAG(x) x##_argb4444_direct
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_4444_LE( src[3], src[0], src[1], src[2] )
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_4444_LE( src[3], src[0], src[1], src[2] ), \
PACK_COLOR_4444_LE( src[7], src[4], src[5], src[6] ) )
#define SRC_TEXEL_BYTES 4
#define TAG(x) x##_abgr8888_to_argb4444
#include "texutil_tmp.h"
#define CONVERT_ARGB4444( name ) \
static GLboolean \
convert_##name##_argb4444( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( convert->format == GL_BGRA && \
convert->type == GL_UNSIGNED_SHORT_4_4_4_4_REV ) \
{ \
tab = name##_tab_argb4444_direct; \
} \
else if ( convert->format == GL_RGBA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_abgr8888_to_argb4444; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
}
CONVERT_ARGB4444( texsubimage2d )
CONVERT_ARGB4444( texsubimage3d )
2001-03-30 14:44:43 +00:00
/* =============================================================
* Convert to ARGB1555 textures:
*/
#define DST_TYPE GLushort
#define DST_TEXELS_PER_DWORD 2
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_1555_LE( src[3], src[0], src[1], src[2] )
#define CONVERT_DIRECT
#define SRC_TEXEL_BYTES 2
#define TAG(x) x##_argb1555_direct
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
#ifdef MESA_BIG_ENDIAN
#define CONVERT_TEXEL( dst, src ) \
{ const GLushort s = *(GLushort *)src; \
dst = (s >> 9) | ((s & 0x1ff) << 7); }
#define CONVERT_TEXEL_DWORD( dst, src ) \
{ const GLuint s = ((fi_type *)src)->i; \
dst = (((s & 0xfe00fe00) >> 9) | \
((s & 0x01ff01ff) << 7)); }
#else
#define CONVERT_TEXEL( dst, src ) \
{ const GLushort s = *(GLushort *)src; \
dst = (s >> 1) | ((s & 1) << 15); }
#define CONVERT_TEXEL_DWORD( dst, src ) \
{ const GLuint s = ((fi_type *)src)->i; \
dst = (((s & 0xfffefffe) >> 1) | \
((s & 0x00010001) << 15)); }
#endif
#define SRC_TEXEL_BYTES 2
#define TAG(x) x##_rgba5551_to_argb1555
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_1555_LE( src[3], src[0], src[1], src[2] )
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_1555_LE( src[3], src[0], src[1], src[2] ), \
PACK_COLOR_1555_LE( src[7], src[4], src[5], src[6] ) )
#define SRC_TEXEL_BYTES 4
#define TAG(x) x##_abgr8888_to_argb1555
#include "texutil_tmp.h"
#define CONVERT_ARGB1555( name ) \
static GLboolean \
convert_##name##_argb1555( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( convert->format == GL_BGRA && \
convert->type == GL_UNSIGNED_SHORT_1_5_5_5_REV ) \
{ \
tab = name##_tab_argb1555_direct; \
} \
else if ( convert->format == GL_RGBA && \
convert->type == GL_UNSIGNED_SHORT_5_5_5_1 ) \
{ \
tab = name##_tab_rgba5551_to_argb1555; \
} \
else if ( convert->format == GL_RGBA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_abgr8888_to_argb1555; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
}
CONVERT_ARGB1555( texsubimage2d )
CONVERT_ARGB1555( texsubimage3d )
2001-03-30 14:44:43 +00:00
/* =============================================================
* AL88 textures:
*/
#define DST_TYPE GLushort
#define DST_TEXELS_PER_DWORD 2
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_88_LE( src[0], src[1] )
#define CONVERT_DIRECT
#define SRC_TEXEL_BYTES 2
#define TAG(x) x##_al88_direct
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_88_LE( src[0], 0x00 )
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_88_LE( src[0], 0x00 ), \
PACK_COLOR_88_LE( src[1], 0x00 ) )
#define SRC_TEXEL_BYTES 1
#define TAG(x) x##_a8_to_al88
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_88_LE( 0xff, src[0] )
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_88_LE( 0xff, src[0] ), \
PACK_COLOR_88_LE( 0xff, src[1] ) )
#define SRC_TEXEL_BYTES 1
#define TAG(x) x##_l8_to_al88
#define PRESERVE_DST_TYPE
#include "texutil_tmp.h"
#define CONVERT_TEXEL( dst, src ) \
dst = PACK_COLOR_88_LE( src[3], src[0] )
#define CONVERT_TEXEL_DWORD( dst, src ) \
dst = APPEND16( PACK_COLOR_88_LE( src[3], src[0] ), \
PACK_COLOR_88_LE( src[7], src[4] ) )
#define SRC_TEXEL_BYTES 4
#define TAG(x) x##_abgr8888_to_al88
#include "texutil_tmp.h"
#define CONVERT_AL88( name ) \
static GLboolean \
convert_##name##_al88( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( convert->format == GL_LUMINANCE_ALPHA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_al88_direct; \
} \
else if ( convert->format == GL_ALPHA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_a8_to_al88; \
} \
else if ( convert->format == GL_LUMINANCE && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_l8_to_al88; \
} \
else if ( convert->format == GL_RGBA && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_abgr8888_to_al88; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
}
CONVERT_AL88( texsubimage2d )
CONVERT_AL88( texsubimage3d )
2001-03-30 14:44:43 +00:00
/* =============================================================
* Convert to RGB332 textures:
2000-03-27 18:56:26 +00:00
*/
static GLboolean
convert_texsubimage2d_rgb332( const struct convert_info *convert )
2000-03-27 18:56:26 +00:00
{
/* This is a placeholder for now...
*/
return GL_FALSE;
}
2000-03-27 18:56:26 +00:00
static GLboolean
convert_texsubimage3d_rgb332( const struct convert_info *convert )
{
/* This is a placeholder for now...
*/
return GL_FALSE;
}
2000-03-27 18:56:26 +00:00
2001-03-30 14:44:43 +00:00
/* =============================================================
* CI8 (and all other single-byte texel) textures:
*/
#define DST_TYPE GLubyte
#define DST_TEXELS_PER_DWORD 4
#define CONVERT_TEXEL( dst, src ) dst = src[0]
#define CONVERT_DIRECT
#define SRC_TEXEL_BYTES 1
#define TAG(x) x##_ci8_direct
#include "texutil_tmp.h"
#define CONVERT_CI8( name ) \
static GLboolean \
convert_##name##_ci8( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if ( ( convert->format == GL_ALPHA || \
convert->format == GL_LUMINANCE || \
convert->format == GL_INTENSITY || \
convert->format == GL_COLOR_INDEX ) && \
convert->type == GL_UNSIGNED_BYTE ) \
{ \
tab = name##_tab_ci8_direct; \
} \
else \
{ \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
\
return tab[index]( convert ); \
2000-03-27 18:56:26 +00:00
}
CONVERT_CI8( texsubimage2d )
CONVERT_CI8( texsubimage3d )
2000-03-27 18:56:26 +00:00
/* =============================================================
* convert to YCBCR textures:
*/
#define DST_TYPE GLushort
#define DST_TEXELS_PER_DWORD 2
#define CONVERT_TEXEL( dst, src ) \
dst = (src[0] << 8) | src[1];
#define CONVERT_DIRECT
#define SRC_TEXEL_BYTES 2
#define TAG(x) x##_ycbcr_direct
#include "texutil_tmp.h"
#define CONVERT_YCBCR( name ) \
static GLboolean \
convert_##name##_ycbcr( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if (convert->format != GL_YCBCR_MESA) { \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
tab = name##_tab_ycbcr_direct; \
\
return tab[index]( convert ); \
}
CONVERT_YCBCR( texsubimage2d )
CONVERT_YCBCR( texsubimage3d )
/* =============================================================
* convert to YCBCR_REV textures:
*/
#define DST_TYPE GLushort
#define DST_TEXELS_PER_DWORD 2
#define CONVERT_TEXEL( dst, src ) \
dst = (src[1] << 8) | src[0];
#define CONVERT_DIRECT
#define SRC_TEXEL_BYTES 2
#define TAG(x) x##_ycbcr_rev_direct
#include "texutil_tmp.h"
#define CONVERT_YCBCR_REV( name ) \
static GLboolean \
convert_##name##_ycbcr_rev( const struct convert_info *convert ) \
{ \
convert_func *tab; \
GLint index = convert->index; \
\
if (convert->format != GL_YCBCR_MESA) { \
/* Can't handle this source format/type combination */ \
return GL_FALSE; \
} \
tab = name##_tab_ycbcr_rev_direct; \
\
return tab[index]( convert ); \
}
CONVERT_YCBCR_REV( texsubimage2d )
CONVERT_YCBCR_REV( texsubimage3d )
2001-03-30 14:44:43 +00:00
/* =============================================================
* Global entry points
2000-03-27 18:56:26 +00:00
*/
static convert_func convert_texsubimage2d_tab[] = {
convert_texsubimage2d_rgba8888,
convert_texsubimage2d_argb8888,
convert_texsubimage2d_rgb888,
convert_texsubimage2d_rgb565,
convert_texsubimage2d_argb4444,
convert_texsubimage2d_argb1555,
convert_texsubimage2d_al88,
convert_texsubimage2d_rgb332,
convert_texsubimage2d_ci8, /* These are all the same... */
convert_texsubimage2d_ci8,
convert_texsubimage2d_ci8,
convert_texsubimage2d_ci8,
convert_texsubimage2d_ycbcr,
convert_texsubimage2d_ycbcr_rev,
};
static convert_func convert_texsubimage3d_tab[] = {
convert_texsubimage3d_rgba8888,
convert_texsubimage3d_argb8888,
convert_texsubimage3d_rgb888,
convert_texsubimage3d_rgb565,
convert_texsubimage3d_argb4444,
convert_texsubimage3d_argb1555,
convert_texsubimage3d_al88,
convert_texsubimage3d_rgb332,
convert_texsubimage3d_ci8, /* These are all the same... */
convert_texsubimage3d_ci8,
convert_texsubimage3d_ci8,
convert_texsubimage3d_ci8,
convert_texsubimage3d_ycbcr,
convert_texsubimage3d_ycbcr_rev,
};
/* See if we need to care about the pixel store attributes when we're
* converting the texture image. This should be stored as
* unpacking->_SomeBoolean and updated when the values change, to avoid
* testing every time...
*/
static INLINE GLboolean
convert_needs_unpacking( const struct gl_pixelstore_attrib *unpacking,
GLenum format, GLenum type )
2000-03-27 18:56:26 +00:00
{
if ( ( unpacking->Alignment == 1 ||
( unpacking->Alignment == 4 && /* Pick up the common Q3A case... */
format == GL_RGBA && type == GL_UNSIGNED_BYTE ) ) &&
unpacking->RowLength == 0 &&
unpacking->SkipPixels == 0 &&
unpacking->SkipRows == 0 &&
unpacking->ImageHeight == 0 &&
unpacking->SkipImages == 0 &&
unpacking->SwapBytes == GL_FALSE &&
unpacking->LsbFirst == GL_FALSE ) {
return GL_FALSE;
} else {
return GL_TRUE;
2000-03-27 18:56:26 +00:00
}
}
2000-03-27 18:56:26 +00:00
GLboolean
_mesa_convert_texsubimage1d( GLint mesaFormat,
GLint xoffset,
GLint width,
GLenum format, GLenum type,
const struct gl_pixelstore_attrib *unpacking,
const GLvoid *srcImage, GLvoid *dstImage )
{
struct convert_info convert;
ASSERT( unpacking );
ASSERT( srcImage );
ASSERT( dstImage );
ASSERT( mesaFormat >= MESA_FORMAT_RGBA8888 );
ASSERT( mesaFormat <= MESA_FORMAT_YCBCR_REV );
/* Make it easier to pass all the parameters around.
*/
convert.xoffset = xoffset;
convert.yoffset = 0;
convert.width = width;
convert.height = 1;
convert.format = format;
convert.type = type;
convert.unpacking = unpacking;
convert.srcImage = srcImage;
convert.dstImage = dstImage;
convert.index = 0;
if ( convert_needs_unpacking( unpacking, format, type ) )
convert.index |= CONVERT_UNPACKING_BIT;
ASSERT(convert.index < 4);
return convert_texsubimage2d_tab[mesaFormat]( &convert );
2000-03-27 18:56:26 +00:00
}
2000-03-29 18:14:08 +00:00
/* Convert a user's 2D image into a texture image. This basically
* repacks pixel data into the special texture formats used by core Mesa
* and the DRI drivers. This function can do full images or subimages.
*
* We return a boolean because this function may not accept some kinds
* of source image formats and/or types. For example, if the incoming
* format/type = GL_BGR, GL_UNSIGNED_INT this function probably won't
* be able to do the conversion.
*
* In that case, the incoming image should first be simplified to one of
* the "canonical" formats (GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA,
* GL_INTENSITY, GL_RGB, GL_RGBA) and types (GL_CHAN). We can do that
* with the _mesa_transfer_teximage() function. That function will also
* do image transfer operations such as scale/bias and convolution.
*
* Input:
* mesaFormat - one of the MESA_FORMAT_* values from texformat.h
* xoffset, yoffset - position in dest image to put data
* width, height - incoming image size, also size of dest region.
* dstImageWidth - width (row stride) of dest image in pixels
* format, type - incoming image format and type
* unpacking - describes incoming image unpacking
* srcImage - pointer to source image
* destImage - pointer to dest image
*/
GLboolean
_mesa_convert_texsubimage2d( GLint mesaFormat, /* dest */
GLint xoffset, GLint yoffset,
GLint width, GLint height,
GLint destImageWidth,
GLenum format, GLenum type, /* source */
const struct gl_pixelstore_attrib *unpacking,
const GLvoid *srcImage, GLvoid *dstImage )
{
struct convert_info convert;
2000-03-29 18:14:08 +00:00
ASSERT( unpacking );
ASSERT( srcImage );
ASSERT( dstImage );
2000-03-29 18:14:08 +00:00
ASSERT( mesaFormat >= MESA_FORMAT_RGBA8888 );
ASSERT( mesaFormat <= MESA_FORMAT_YCBCR_REV );
/* Make it easier to pass all the parameters around.
*/
convert.xoffset = xoffset;
convert.yoffset = yoffset;
convert.width = width;
convert.height = height;
convert.dstImageWidth = destImageWidth;
convert.format = format;
convert.type = type;
convert.unpacking = unpacking;
convert.srcImage = srcImage;
convert.dstImage = dstImage;
convert.index = 0;
if ( convert_needs_unpacking( unpacking, format, type ) )
convert.index |= CONVERT_UNPACKING_BIT;
if ( width != destImageWidth )
convert.index |= CONVERT_STRIDE_BIT;
return convert_texsubimage2d_tab[mesaFormat]( &convert );
}
GLboolean
_mesa_convert_texsubimage3d( GLint mesaFormat, /* dest */
GLint xoffset, GLint yoffset, GLint zoffset,
GLint width, GLint height, GLint depth,
GLint dstImageWidth, GLint dstImageHeight,
GLenum format, GLenum type, /* source */
const struct gl_pixelstore_attrib *unpacking,
const GLvoid *srcImage, GLvoid *dstImage )
{
struct convert_info convert;
ASSERT( unpacking );
ASSERT( srcImage );
ASSERT( dstImage );
ASSERT( mesaFormat >= MESA_FORMAT_RGBA8888 );
ASSERT( mesaFormat <= MESA_FORMAT_YCBCR_REV );
/* Make it easier to pass all the parameters around.
*/
convert.xoffset = xoffset;
convert.yoffset = yoffset;
convert.zoffset = zoffset;
convert.width = width;
convert.height = height;
convert.depth = depth;
convert.dstImageWidth = dstImageWidth;
convert.dstImageHeight = dstImageHeight;
convert.format = format;
convert.type = type;
convert.unpacking = unpacking;
convert.srcImage = srcImage;
convert.dstImage = dstImage;
convert.index = 0;
if ( convert_needs_unpacking( unpacking, format, type ) )
convert.index |= CONVERT_UNPACKING_BIT;
if ( width != dstImageWidth || height != dstImageHeight )
convert.index |= CONVERT_STRIDE_BIT;
return convert_texsubimage3d_tab[mesaFormat]( &convert );
}
/* Nearest filtering only (for broken hardware that can't support
* all aspect ratios). This can be made a lot faster, but I don't
* really care enough...
2000-03-29 18:14:08 +00:00
*/
void _mesa_rescale_teximage2d( GLuint bytesPerPixel, GLuint dstRowStride,
GLint srcWidth, GLint srcHeight,
GLint dstWidth, GLint dstHeight,
const GLvoid *srcImage, GLvoid *dstImage )
2000-03-29 18:14:08 +00:00
{
GLint row, col;
#define INNER_LOOP( TYPE, HOP, WOP ) \
for ( row = 0 ; row < dstHeight ; row++ ) { \
GLint srcRow = row HOP hScale; \
for ( col = 0 ; col < dstWidth ; col++ ) { \
GLint srcCol = col WOP wScale; \
dst[col] = src[srcRow * srcWidth + srcCol]; \
} \
dst = (TYPE *) ((GLubyte *) dst + dstRowStride); \
} \
#define RESCALE_IMAGE( TYPE ) \
do { \
const TYPE *src = (const TYPE *)srcImage; \
TYPE *dst = (TYPE *)dstImage; \
\
if ( srcHeight <= dstHeight ) { \
const GLint hScale = dstHeight / srcHeight; \
if ( srcWidth <= dstWidth ) { \
const GLint wScale = dstWidth / srcWidth; \
INNER_LOOP( TYPE, /, / ); \
} \
else { \
const GLint wScale = srcWidth / dstWidth; \
INNER_LOOP( TYPE, /, * ); \
} \
} \
else { \
const GLint hScale = srcHeight / dstHeight; \
if ( srcWidth <= dstWidth ) { \
const GLint wScale = dstWidth / srcWidth; \
INNER_LOOP( TYPE, *, / ); \
} \
else { \
const GLint wScale = srcWidth / dstWidth; \
INNER_LOOP( TYPE, *, * ); \
} \
} \
} while (0)
switch ( bytesPerPixel ) {
case 4:
RESCALE_IMAGE( GLuint );
break;
case 2:
RESCALE_IMAGE( GLushort );
break;
case 1:
RESCALE_IMAGE( GLubyte );
break;
default:
_mesa_problem(NULL,"unexpected bytes/pixel in _mesa_rescale_teximage2d");
2000-03-29 18:14:08 +00:00
}
}