home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mesa5.zip / mesa5src.zip / texformat_tmp.h < prev    next >
Text File  |  2002-10-29  |  17KB  |  462 lines

  1. /* $Id: texformat_tmp.h,v 1.10 2002/10/29 20:28:50 brianp Exp $ */
  2.  
  3. /*
  4.  * Mesa 3-D graphics library
  5.  * Version:  4.1
  6.  *
  7.  * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
  8.  *
  9.  * Permission is hereby granted, free of charge, to any person obtaining a
  10.  * copy of this software and associated documentation files (the "Software"),
  11.  * to deal in the Software without restriction, including without limitation
  12.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  13.  * and/or sell copies of the Software, and to permit persons to whom the
  14.  * Software is furnished to do so, subject to the following conditions:
  15.  *
  16.  * The above copyright notice and this permission notice shall be included
  17.  * in all copies or substantial portions of the Software.
  18.  *
  19.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  20.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  22.  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  23.  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  24.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  *
  26.  * Authors:
  27.  *    Gareth Hughes
  28.  *    Brian Paul
  29.  */
  30.  
  31.  
  32. /*
  33.  * This template file generates texel fetch functions for 1-D, 2-D and 3-D
  34.  * texture images.
  35.  */
  36.  
  37.  
  38. #if DIM == 1
  39.  
  40. #define CHAN_SRC( t, i, j, k, sz )                    \
  41.     ((GLchan *)(t)->Data + (i) * (sz))
  42. #define UBYTE_SRC( t, i, j, k, sz )                    \
  43.     ((GLubyte *)(t)->Data + (i) * (sz))
  44. #define USHORT_SRC( t, i, j, k )                    \
  45.     ((GLushort *)(t)->Data + (i))
  46. #define FLOAT_SRC( t, i, j, k )                        \
  47.     ((GLfloat *)(t)->Data + (i))
  48.  
  49. #define FETCH(x) fetch_1d_texel_##x
  50.  
  51. #elif DIM == 2
  52.  
  53. #define CHAN_SRC( t, i, j, k, sz )                    \
  54.     ((GLchan *)(t)->Data + ((t)->RowStride * (j) + (i)) * (sz))
  55. #define UBYTE_SRC( t, i, j, k, sz )                    \
  56.     ((GLubyte *)(t)->Data + ((t)->RowStride * (j) + (i)) * (sz))
  57. #define USHORT_SRC( t, i, j, k )                    \
  58.     ((GLushort *)(t)->Data + ((t)->RowStride * (j) + (i)))
  59. #define FLOAT_SRC( t, i, j, k )                        \
  60.     ((GLfloat *)(t)->Data + ((t)->RowStride * (j) + (i)))
  61.  
  62. #define FETCH(x) fetch_2d_texel_##x
  63.  
  64. #elif DIM == 3
  65.  
  66. #define CHAN_SRC( t, i, j, k, sz )                    \
  67.     (GLchan *)(t)->Data + (((t)->Height * (k) + (j)) *        \
  68.                 (t)->RowStride + (i)) * (sz)
  69. #define UBYTE_SRC( t, i, j, k, sz )                    \
  70.     ((GLubyte *)(t)->Data + (((t)->Height * (k) + (j)) *        \
  71.                  (t)->RowStride + (i)) * (sz))
  72. #define USHORT_SRC( t, i, j, k )                    \
  73.     ((GLushort *)(t)->Data + (((t)->Height * (k) + (j)) *        \
  74.                   (t)->RowStride + (i)))
  75. #define FLOAT_SRC( t, i, j, k )                        \
  76.     ((GLfloat *)(t)->Data + (((t)->Height * (k) + (j)) *        \
  77.                   (t)->RowStride + (i)))
  78.  
  79. #define FETCH(x) fetch_3d_texel_##x
  80.  
  81. #else
  82. #error    illegal number of texture dimensions
  83. #endif
  84.  
  85.  
  86. static void FETCH(rgba)( const struct gl_texture_image *texImage,
  87.              GLint i, GLint j, GLint k, GLvoid *texel )
  88. {
  89.    const GLchan *src = CHAN_SRC( texImage, i, j, k, 4 );
  90.    GLchan *rgba = (GLchan *) texel;
  91.    COPY_CHAN4( rgba, src );
  92. }
  93.  
  94. static void FETCH(rgb)( const struct gl_texture_image *texImage,
  95.             GLint i, GLint j, GLint k, GLvoid *texel )
  96. {
  97.    const GLchan *src = CHAN_SRC( texImage, i, j, k, 3 );
  98.    GLchan *rgba = (GLchan *) texel;
  99.    rgba[RCOMP] = src[0];
  100.    rgba[GCOMP] = src[1];
  101.    rgba[BCOMP] = src[2];
  102.    rgba[ACOMP] = CHAN_MAX;
  103. }
  104.  
  105. static void FETCH(alpha)( const struct gl_texture_image *texImage,
  106.               GLint i, GLint j, GLint k, GLvoid *texel )
  107. {
  108.    const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
  109.    GLchan *rgba = (GLchan *) texel;
  110.    rgba[RCOMP] = 0;
  111.    rgba[GCOMP] = 0;
  112.    rgba[BCOMP] = 0;
  113.    rgba[ACOMP] = src[0];
  114. }
  115.  
  116. static void FETCH(luminance)( const struct gl_texture_image *texImage,
  117.                   GLint i, GLint j, GLint k, GLvoid *texel )
  118. {
  119.    const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
  120.    GLchan *rgba = (GLchan *) texel;
  121.    rgba[RCOMP] = src[0];
  122.    rgba[GCOMP] = src[0];
  123.    rgba[BCOMP] = src[0];
  124.    rgba[ACOMP] = CHAN_MAX;
  125. }
  126.  
  127. static void FETCH(luminance_alpha)( const struct gl_texture_image *texImage,
  128.                     GLint i, GLint j, GLint k, GLvoid *texel )
  129. {
  130.    const GLchan *src = CHAN_SRC( texImage, i, j, k, 2 );
  131.    GLchan *rgba = (GLchan *) texel;
  132.    rgba[RCOMP] = src[0];
  133.    rgba[GCOMP] = src[0];
  134.    rgba[BCOMP] = src[0];
  135.    rgba[ACOMP] = src[1];
  136. }
  137.  
  138. static void FETCH(intensity)( const struct gl_texture_image *texImage,
  139.                   GLint i, GLint j, GLint k, GLvoid *texel )
  140. {
  141.    const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
  142.    GLchan *rgba = (GLchan *) texel;
  143.    rgba[RCOMP] = src[0];
  144.    rgba[GCOMP] = src[0];
  145.    rgba[BCOMP] = src[0];
  146.    rgba[ACOMP] = src[0];
  147. }
  148.  
  149. static void FETCH(color_index)( const struct gl_texture_image *texImage,
  150.                 GLint i, GLint j, GLint k, GLvoid *texel )
  151. {
  152.    const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
  153.    GLchan *index = (GLchan *) texel;
  154.    *index = *src;
  155. }
  156.  
  157. static void FETCH(depth_component)( const struct gl_texture_image *texImage,
  158.                     GLint i, GLint j, GLint k, GLvoid *texel )
  159. {
  160.    const GLfloat *src = FLOAT_SRC( texImage, i, j, k );
  161.    GLfloat *depth = (GLfloat *) texel;
  162.    *depth = *src;
  163. }
  164.  
  165. static void FETCH(rgba8888)( const struct gl_texture_image *texImage,
  166.                  GLint i, GLint j, GLint k, GLvoid *texel )
  167. {
  168.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
  169.    GLchan *rgba = (GLchan *) texel;
  170.    rgba[RCOMP] = UBYTE_TO_CHAN( src[3] );
  171.    rgba[GCOMP] = UBYTE_TO_CHAN( src[2] );
  172.    rgba[BCOMP] = UBYTE_TO_CHAN( src[1] );
  173.    rgba[ACOMP] = UBYTE_TO_CHAN( src[0] );
  174. }
  175.  
  176. static void FETCH(argb8888)( const struct gl_texture_image *texImage,
  177.                  GLint i, GLint j, GLint k, GLvoid *texel )
  178. {
  179.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
  180.    GLchan *rgba = (GLchan *) texel;
  181.    rgba[RCOMP] = UBYTE_TO_CHAN( src[2] );
  182.    rgba[GCOMP] = UBYTE_TO_CHAN( src[1] );
  183.    rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
  184.    rgba[ACOMP] = UBYTE_TO_CHAN( src[3] );
  185. }
  186.  
  187. static void FETCH(rgb888)( const struct gl_texture_image *texImage,
  188.                GLint i, GLint j, GLint k, GLvoid *texel )
  189. {
  190.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 3 );
  191.    GLchan *rgba = (GLchan *) texel;
  192.    rgba[RCOMP] = UBYTE_TO_CHAN( src[2] );
  193.    rgba[GCOMP] = UBYTE_TO_CHAN( src[1] );
  194.    rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
  195.    rgba[ACOMP] = CHAN_MAX;
  196. }
  197.  
  198. static void FETCH(rgb565)( const struct gl_texture_image *texImage,
  199.                GLint i, GLint j, GLint k, GLvoid *texel )
  200. {
  201.    const GLushort *src = USHORT_SRC( texImage, i, j, k );
  202.    const GLushort s = *src;
  203.    GLchan *rgba = (GLchan *) texel;
  204.    rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf8) * 255 / 0xf8 );
  205.    rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 3) & 0xfc) * 255 / 0xfc );
  206.    rgba[BCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xf8) * 255 / 0xf8 );
  207.    rgba[ACOMP] = CHAN_MAX;
  208. }
  209.  
  210. static void FETCH(argb4444)( const struct gl_texture_image *texImage,
  211.                  GLint i, GLint j, GLint k, GLvoid *texel )
  212. {
  213.    const GLushort *src = USHORT_SRC( texImage, i, j, k );
  214.    const GLushort s = *src;
  215.    GLchan *rgba = (GLchan *) texel;
  216.    rgba[RCOMP] = UBYTE_TO_CHAN( ((s >>  8) & 0xf) * 255 / 0xf );
  217.    rgba[GCOMP] = UBYTE_TO_CHAN( ((s >>  4) & 0xf) * 255 / 0xf );
  218.    rgba[BCOMP] = UBYTE_TO_CHAN( ((s      ) & 0xf) * 255 / 0xf );
  219.    rgba[ACOMP] = UBYTE_TO_CHAN( ((s >> 12) & 0xf) * 255 / 0xf );
  220. }
  221.  
  222. static void FETCH(argb1555)( const struct gl_texture_image *texImage,
  223.                  GLint i, GLint j, GLint k, GLvoid *texel )
  224. {
  225.    const GLushort *src = USHORT_SRC( texImage, i, j, k );
  226.    const GLushort s = *src;
  227.    GLchan *rgba = (GLchan *) texel;
  228.    rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 10) & 0x1f) * 255 / 0x1f );
  229.    rgba[GCOMP] = UBYTE_TO_CHAN( ((s >>  5) & 0x1f) * 255 / 0x1f );
  230.    rgba[BCOMP] = UBYTE_TO_CHAN( ((s      ) & 0x1f) * 255 / 0x1f );
  231.    rgba[ACOMP] = UBYTE_TO_CHAN( ((s >> 15) & 0x01) * 255 );
  232. }
  233.  
  234. static void FETCH(al88)( const struct gl_texture_image *texImage,
  235.              GLint i, GLint j, GLint k, GLvoid *texel )
  236. {
  237.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 2 );
  238.    GLchan *rgba = (GLchan *) texel;
  239.    rgba[RCOMP] = UBYTE_TO_CHAN( src[0] );
  240.    rgba[GCOMP] = UBYTE_TO_CHAN( src[0] );
  241.    rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
  242.    rgba[ACOMP] = UBYTE_TO_CHAN( src[1] );
  243. }
  244.  
  245. static void FETCH(rgb332)( const struct gl_texture_image *texImage,
  246.                GLint i, GLint j, GLint k, GLvoid *texel )
  247. {
  248.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
  249.    const GLubyte s = *src;
  250.    GLchan *rgba = (GLchan *) texel;
  251.    rgba[RCOMP] = UBYTE_TO_CHAN( ((s     ) & 0xe0) * 255 / 0xe0 );
  252.    rgba[GCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xe0) * 255 / 0xe0 );
  253.    rgba[BCOMP] = UBYTE_TO_CHAN( ((s << 5) & 0xc0) * 255 / 0xc0 );
  254.    rgba[ACOMP] = CHAN_MAX;
  255. }
  256.  
  257. static void FETCH(a8)( const struct gl_texture_image *texImage,
  258.                GLint i, GLint j, GLint k, GLvoid *texel )
  259. {
  260.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
  261.    GLchan *rgba = (GLchan *) texel;
  262.    rgba[RCOMP] = 0;
  263.    rgba[GCOMP] = 0;
  264.    rgba[BCOMP] = 0;
  265.    rgba[ACOMP] = UBYTE_TO_CHAN( src[0] );
  266. }
  267.  
  268. static void FETCH(l8)( const struct gl_texture_image *texImage,
  269.                GLint i, GLint j, GLint k, GLvoid *texel )
  270. {
  271.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
  272.    GLchan *rgba = (GLchan *) texel;
  273.    rgba[RCOMP] = UBYTE_TO_CHAN( src[0] );
  274.    rgba[GCOMP] = UBYTE_TO_CHAN( src[0] );
  275.    rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
  276.    rgba[ACOMP] = CHAN_MAX;
  277. }
  278.  
  279. static void FETCH(i8)( const struct gl_texture_image *texImage,
  280.                GLint i, GLint j, GLint k, GLvoid *texel )
  281. {
  282.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
  283.    GLchan *rgba = (GLchan *) texel;
  284.    rgba[RCOMP] = UBYTE_TO_CHAN( src[0] );
  285.    rgba[GCOMP] = UBYTE_TO_CHAN( src[0] );
  286.    rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
  287.    rgba[ACOMP] = UBYTE_TO_CHAN( src[0] );
  288. }
  289.  
  290. static void FETCH(ci8)( const struct gl_texture_image *texImage,
  291.             GLint i, GLint j, GLint k, GLvoid *texel )
  292. {
  293.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
  294.    GLchan *index = (GLchan *) texel;
  295.    *index = UBYTE_TO_CHAN( *src );
  296. }
  297.  
  298. /* XXX this may break if GLchan != GLubyte */
  299. static void FETCH(ycbcr)( const struct gl_texture_image *texImage,
  300.                           GLint i, GLint j, GLint k, GLvoid *texel )
  301. {
  302.    const GLushort *src0 = USHORT_SRC( texImage, (i & ~1), j, k ); /* even */
  303.    const GLushort *src1 = src0 + 1;                               /* odd */
  304.    const GLubyte y0 = (*src0 >> 8) & 0xff;  /* luminance */
  305.    const GLubyte cb = *src0 & 0xff;         /* chroma U */
  306.    const GLubyte y1 = (*src1 >> 8) & 0xff;  /* luminance */
  307.    const GLubyte cr = *src1 & 0xff;         /* chroma V */
  308.    GLchan *rgba = (GLchan *) texel;
  309.    GLint r, g, b;
  310.    if (i & 1) {
  311.       /* odd pixel: use y1,cr,cb */
  312.       r = (GLint) (1.164 * (y1-16) + 1.596 * (cr-128));
  313.       g = (GLint) (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
  314.       b = (GLint) (1.164 * (y1-16) + 2.018 * (cb-128));
  315.    }
  316.    else {
  317.       /* even pixel: use y0,cr,cb */
  318.       r = (GLint) (1.164 * (y0-16) + 1.596 * (cr-128));
  319.       g = (GLint) (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
  320.       b = (GLint) (1.164 * (y0-16) + 2.018 * (cb-128));
  321.    }
  322.    rgba[RCOMP] = CLAMP(r, 0, CHAN_MAX);
  323.    rgba[GCOMP] = CLAMP(g, 0, CHAN_MAX);
  324.    rgba[BCOMP] = CLAMP(b, 0, CHAN_MAX);
  325.    rgba[ACOMP] = CHAN_MAX;
  326. }
  327.  
  328. /* XXX this may break if GLchan != GLubyte */
  329. static void FETCH(ycbcr_rev)( const struct gl_texture_image *texImage,
  330.                               GLint i, GLint j, GLint k, GLvoid *texel )
  331. {
  332.    const GLushort *src0 = USHORT_SRC( texImage, (i & ~1), j, k ); /* even */
  333.    const GLushort *src1 = src0 + 1;                               /* odd */
  334.    const GLubyte y0 = *src0 & 0xff;         /* luminance */
  335.    const GLubyte cr = (*src0 >> 8) & 0xff;  /* chroma U */
  336.    const GLubyte y1 = *src1 & 0xff;         /* luminance */
  337.    const GLubyte cb = (*src1 >> 8) & 0xff;  /* chroma V */
  338.    GLchan *rgba = (GLchan *) texel;
  339.    GLint r, g, b;
  340.    if (i & 1) {
  341.       /* odd pixel: use y1,cr,cb */
  342.       r = (GLint) (1.164 * (y1-16) + 1.596 * (cr-128));
  343.       g = (GLint) (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
  344.       b = (GLint) (1.164 * (y1-16) + 2.018 * (cb-128));
  345.    }
  346.    else {
  347.       /* even pixel: use y0,cr,cb */
  348.       r = (GLint) (1.164 * (y0-16) + 1.596 * (cr-128));
  349.       g = (GLint) (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
  350.       b = (GLint) (1.164 * (y0-16) + 2.018 * (cb-128));
  351.    }
  352.    rgba[RCOMP] = CLAMP(r, 0, CHAN_MAX);
  353.    rgba[GCOMP] = CLAMP(g, 0, CHAN_MAX);
  354.    rgba[BCOMP] = CLAMP(b, 0, CHAN_MAX);
  355.    rgba[ACOMP] = CHAN_MAX;
  356. }
  357.  
  358.  
  359. /* big-endian */
  360.  
  361. #if 0
  362. static void FETCH(abgr8888)( const struct gl_texture_image *texImage,
  363.                  GLint i, GLint j, GLint k, GLvoid *texel )
  364. {
  365.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
  366.    GLchan *rgba = (GLchan *) texel;
  367.    rgba[RCOMP] = UBYTE_TO_CHAN( src[3] );
  368.    rgba[GCOMP] = UBYTE_TO_CHAN( src[2] );
  369.    rgba[BCOMP] = UBYTE_TO_CHAN( src[1] );
  370.    rgba[ACOMP] = UBYTE_TO_CHAN( src[0] );
  371. }
  372.  
  373. static void FETCH(bgra8888)( const struct gl_texture_image *texImage,
  374.                  GLint i, GLint j, GLint k, GLvoid *texel )
  375. {
  376.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
  377.    GLchan *rgba = (GLchan *) texel;
  378.    rgba[RCOMP] = UBYTE_TO_CHAN( src[2] );
  379.    rgba[GCOMP] = UBYTE_TO_CHAN( src[1] );
  380.    rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
  381.    rgba[ACOMP] = UBYTE_TO_CHAN( src[3] );
  382. }
  383.  
  384. static void FETCH(bgr888)( const struct gl_texture_image *texImage,
  385.                GLint i, GLint j, GLint k, GLvoid *texel )
  386. {
  387.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 3 );
  388.    GLchan *rgba = (GLchan *) texel;
  389.    rgba[RCOMP] = UBYTE_TO_CHAN( src[2] );
  390.    rgba[GCOMP] = UBYTE_TO_CHAN( src[1] );
  391.    rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
  392.    rgba[ACOMP] = CHAN_MAX;
  393. }
  394.  
  395. static void FETCH(bgr565)( const struct gl_texture_image *texImage,
  396.                GLint i, GLint j, GLint k, GLvoid *texel )
  397. {
  398.    const GLushort *src = USHORT_SRC( texImage, i, j, k );
  399.    const GLushort s = *src;
  400.    GLchan *rgba = (GLchan *) texel;
  401.    rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf8) * 255 / 0xf8 );
  402.    rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 3) & 0xfc) * 255 / 0xfc );
  403.    rgba[BCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xf8) * 255 / 0xf8 );
  404.    rgba[ACOMP] = CHAN_MAX;
  405. }
  406.  
  407. static void FETCH(bgra4444)( const struct gl_texture_image *texImage,
  408.                  GLint i, GLint j, GLint k, GLvoid *texel )
  409. {
  410.    const GLushort *src = USHORT_SRC( texImage, i, j, k );
  411.    const GLushort s = *src;
  412.    GLchan *rgba = (GLchan *) texel;
  413.    rgba[RCOMP] = UBYTE_TO_CHAN( ((s >>  8) & 0xf) * 255 / 0xf );
  414.    rgba[GCOMP] = UBYTE_TO_CHAN( ((s >>  4) & 0xf) * 255 / 0xf );
  415.    rgba[BCOMP] = UBYTE_TO_CHAN( ((s      ) & 0xf) * 255 / 0xf );
  416.    rgba[ACOMP] = UBYTE_TO_CHAN( ((s >> 12) & 0xf) * 255 / 0xf );
  417. }
  418.  
  419. static void FETCH(bgra5551)( const struct gl_texture_image *texImage,
  420.                  GLint i, GLint j, GLint k, GLvoid *texel )
  421. {
  422.    const GLushort *src = USHORT_SRC( texImage, i, j, k );
  423.    const GLushort s = *src;
  424.    GLchan *rgba = (GLchan *) texel;
  425.    rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 10) & 0x1f) * 255 / 0x1f );
  426.    rgba[GCOMP] = UBYTE_TO_CHAN( ((s >>  5) & 0x1f) * 255 / 0x1f );
  427.    rgba[BCOMP] = UBYTE_TO_CHAN( ((s      ) & 0x1f) * 255 / 0x1f );
  428.    rgba[ACOMP] = UBYTE_TO_CHAN( ((s >> 15) & 0x01) * 255 );
  429. }
  430.  
  431. static void FETCH(la88)( const struct gl_texture_image *texImage,
  432.              GLint i, GLint j, GLint k, GLvoid *texel )
  433. {
  434.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 2 );
  435.    GLchan *rgba = (GLchan *) texel;
  436.    rgba[RCOMP] = UBYTE_TO_CHAN( src[0] );
  437.    rgba[GCOMP] = UBYTE_TO_CHAN( src[0] );
  438.    rgba[BCOMP] = UBYTE_TO_CHAN( src[0] );
  439.    rgba[ACOMP] = UBYTE_TO_CHAN( src[1] );
  440. }
  441.  
  442. static void FETCH(bgr233)( const struct gl_texture_image *texImage,
  443.                GLint i, GLint j, GLint k, GLvoid *texel )
  444. {
  445.    const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
  446.    const GLubyte s = *src;
  447.    GLchan *rgba = (GLchan *) texel;
  448.    rgba[RCOMP] = UBYTE_TO_CHAN( ((s     ) & 0xe0) * 255 / 0xe0 );
  449.    rgba[GCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xe0) * 255 / 0xe0 );
  450.    rgba[BCOMP] = UBYTE_TO_CHAN( ((s << 5) & 0xc0) * 255 / 0xc0 );
  451.    rgba[ACOMP] = CHAN_MAX;
  452. }
  453. #endif
  454.  
  455.  
  456. #undef CHAN_SRC
  457. #undef UBYTE_SRC
  458. #undef USHORT_SRC
  459. #undef FLOAT_SRC
  460. #undef FETCH
  461. #undef DIM
  462.