ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

image.c
Go to the documentation of this file.
00001 /*
00002  * Mesa 3-D graphics library
00003  * Version:  7.1
00004  *
00005  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
00006  *
00007  * Permission is hereby granted, free of charge, to any person obtaining a
00008  * copy of this software and associated documentation files (the "Software"),
00009  * to deal in the Software without restriction, including without limitation
00010  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
00011  * and/or sell copies of the Software, and to permit persons to whom the
00012  * Software is furnished to do so, subject to the following conditions:
00013  *
00014  * The above copyright notice and this permission notice shall be included
00015  * in all copies or substantial portions of the Software.
00016  *
00017  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
00018  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00019  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
00020  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
00021  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
00022  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00023  */
00024 
00025 
00032 #include "glheader.h"
00033 #include "colormac.h"
00034 #include "context.h"
00035 #include "image.h"
00036 #include "imports.h"
00037 #include "macros.h"
00038 #include "pixel.h"
00039 
00040 
00049 #undef BYTE_TO_FLOAT
00050 #define BYTE_TO_FLOAT(B)    ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
00051 
00052 #undef SHORT_TO_FLOAT
00053 #define SHORT_TO_FLOAT(S)   ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
00054 
00055 
00056 
00058 #define CEILING( A, B )  ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
00059 
00060 
00064 GLboolean
00065 _mesa_type_is_packed(GLenum type)
00066 {
00067    switch (type) {
00068    case GL_UNSIGNED_BYTE_3_3_2:
00069    case GL_UNSIGNED_BYTE_2_3_3_REV:
00070    case GL_UNSIGNED_SHORT_5_6_5:
00071    case GL_UNSIGNED_SHORT_5_6_5_REV:
00072    case GL_UNSIGNED_SHORT_4_4_4_4:
00073    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
00074    case GL_UNSIGNED_SHORT_5_5_5_1:
00075    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
00076    case GL_UNSIGNED_INT_8_8_8_8:
00077    case GL_UNSIGNED_INT_8_8_8_8_REV:
00078    case GL_UNSIGNED_INT_10_10_10_2:
00079    case GL_UNSIGNED_INT_2_10_10_10_REV:
00080    case GL_UNSIGNED_SHORT_8_8_MESA:
00081    case GL_UNSIGNED_SHORT_8_8_REV_MESA:
00082    case GL_UNSIGNED_INT_24_8_EXT:
00083       return GL_TRUE;
00084    }
00085 
00086    return GL_FALSE;
00087 }
00088 
00102 static void
00103 flip_bytes( GLubyte *p, GLuint n )
00104 {
00105    GLuint i, a, b;
00106    for (i = 0; i < n; i++) {
00107       b = (GLuint) p[i];        /* words are often faster than bytes */
00108       a = ((b & 0x01) << 7) |
00109       ((b & 0x02) << 5) |
00110       ((b & 0x04) << 3) |
00111       ((b & 0x08) << 1) |
00112       ((b & 0x10) >> 1) |
00113       ((b & 0x20) >> 3) |
00114       ((b & 0x40) >> 5) |
00115       ((b & 0x80) >> 7);
00116       p[i] = (GLubyte) a;
00117    }
00118 }
00119 
00120 
00127 void
00128 _mesa_swap2( GLushort *p, GLuint n )
00129 {
00130    GLuint i;
00131    for (i = 0; i < n; i++) {
00132       p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00);
00133    }
00134 }
00135 
00136 
00137 
00138 /*
00139  * Flip the order of the 4 bytes in each word in the given array.
00140  */
00141 void
00142 _mesa_swap4( GLuint *p, GLuint n )
00143 {
00144    GLuint i, a, b;
00145    for (i = 0; i < n; i++) {
00146       b = p[i];
00147       a =  (b >> 24)
00148     | ((b >> 8) & 0xff00)
00149     | ((b << 8) & 0xff0000)
00150     | ((b << 24) & 0xff000000);
00151       p[i] = a;
00152    }
00153 }
00154 
00155 
00164 GLint
00165 _mesa_sizeof_type( GLenum type )
00166 {
00167    switch (type) {
00168       case GL_BITMAP:
00169      return 0;
00170       case GL_UNSIGNED_BYTE:
00171          return sizeof(GLubyte);
00172       case GL_BYTE:
00173      return sizeof(GLbyte);
00174       case GL_UNSIGNED_SHORT:
00175      return sizeof(GLushort);
00176       case GL_SHORT:
00177      return sizeof(GLshort);
00178       case GL_UNSIGNED_INT:
00179      return sizeof(GLuint);
00180       case GL_INT:
00181      return sizeof(GLint);
00182       case GL_FLOAT:
00183      return sizeof(GLfloat);
00184       case GL_HALF_FLOAT_ARB:
00185      return sizeof(GLhalfARB);
00186       default:
00187          return -1;
00188    }
00189 }
00190 
00191 
00196 GLint
00197 _mesa_sizeof_packed_type( GLenum type )
00198 {
00199    switch (type) {
00200       case GL_BITMAP:
00201      return 0;
00202       case GL_UNSIGNED_BYTE:
00203          return sizeof(GLubyte);
00204       case GL_BYTE:
00205      return sizeof(GLbyte);
00206       case GL_UNSIGNED_SHORT:
00207      return sizeof(GLushort);
00208       case GL_SHORT:
00209      return sizeof(GLshort);
00210       case GL_UNSIGNED_INT:
00211      return sizeof(GLuint);
00212       case GL_INT:
00213      return sizeof(GLint);
00214       case GL_HALF_FLOAT_ARB:
00215      return sizeof(GLhalfARB);
00216       case GL_FLOAT:
00217      return sizeof(GLfloat);
00218       case GL_UNSIGNED_BYTE_3_3_2:
00219          return sizeof(GLubyte);
00220       case GL_UNSIGNED_BYTE_2_3_3_REV:
00221          return sizeof(GLubyte);
00222       case GL_UNSIGNED_SHORT_5_6_5:
00223          return sizeof(GLushort);
00224       case GL_UNSIGNED_SHORT_5_6_5_REV:
00225          return sizeof(GLushort);
00226       case GL_UNSIGNED_SHORT_4_4_4_4:
00227          return sizeof(GLushort);
00228       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
00229          return sizeof(GLushort);
00230       case GL_UNSIGNED_SHORT_5_5_5_1:
00231          return sizeof(GLushort);
00232       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
00233          return sizeof(GLushort);
00234       case GL_UNSIGNED_INT_8_8_8_8:
00235          return sizeof(GLuint);
00236       case GL_UNSIGNED_INT_8_8_8_8_REV:
00237          return sizeof(GLuint);
00238       case GL_UNSIGNED_INT_10_10_10_2:
00239          return sizeof(GLuint);
00240       case GL_UNSIGNED_INT_2_10_10_10_REV:
00241          return sizeof(GLuint);
00242       case GL_UNSIGNED_SHORT_8_8_MESA:
00243       case GL_UNSIGNED_SHORT_8_8_REV_MESA:
00244          return sizeof(GLushort);      
00245       case GL_UNSIGNED_INT_24_8_EXT:
00246          return sizeof(GLuint);
00247       default:
00248          return -1;
00249    }
00250 }
00251 
00252 
00260 GLint
00261 _mesa_components_in_format( GLenum format )
00262 {
00263    switch (format) {
00264       case GL_COLOR_INDEX:
00265       case GL_COLOR_INDEX1_EXT:
00266       case GL_COLOR_INDEX2_EXT:
00267       case GL_COLOR_INDEX4_EXT:
00268       case GL_COLOR_INDEX8_EXT:
00269       case GL_COLOR_INDEX12_EXT:
00270       case GL_COLOR_INDEX16_EXT:
00271       case GL_STENCIL_INDEX:
00272       case GL_DEPTH_COMPONENT:
00273       case GL_RED:
00274       case GL_GREEN:
00275       case GL_BLUE:
00276       case GL_ALPHA:
00277       case GL_LUMINANCE:
00278       case GL_INTENSITY:
00279          return 1;
00280       case GL_LUMINANCE_ALPHA:
00281      return 2;
00282       case GL_RGB:
00283      return 3;
00284       case GL_RGBA:
00285      return 4;
00286       case GL_BGR:
00287      return 3;
00288       case GL_BGRA:
00289      return 4;
00290       case GL_ABGR_EXT:
00291          return 4;
00292       case GL_YCBCR_MESA:
00293          return 2;
00294       case GL_DEPTH_STENCIL_EXT:
00295          return 2;
00296       default:
00297          return -1;
00298    }
00299 }
00300 
00301 
00310 GLint
00311 _mesa_bytes_per_pixel( GLenum format, GLenum type )
00312 {
00313    GLint comps = _mesa_components_in_format( format );
00314    if (comps < 0)
00315       return -1;
00316 
00317    switch (type) {
00318       case GL_BITMAP:
00319          return 0;  /* special case */
00320       case GL_BYTE:
00321       case GL_UNSIGNED_BYTE:
00322          return comps * sizeof(GLubyte);
00323       case GL_SHORT:
00324       case GL_UNSIGNED_SHORT:
00325          return comps * sizeof(GLshort);
00326       case GL_INT:
00327       case GL_UNSIGNED_INT:
00328          return comps * sizeof(GLint);
00329       case GL_FLOAT:
00330          return comps * sizeof(GLfloat);
00331       case GL_HALF_FLOAT_ARB:
00332          return comps * sizeof(GLhalfARB);
00333       case GL_UNSIGNED_BYTE_3_3_2:
00334       case GL_UNSIGNED_BYTE_2_3_3_REV:
00335          if (format == GL_RGB || format == GL_BGR)
00336             return sizeof(GLubyte);
00337          else
00338             return -1;  /* error */
00339       case GL_UNSIGNED_SHORT_5_6_5:
00340       case GL_UNSIGNED_SHORT_5_6_5_REV:
00341          if (format == GL_RGB || format == GL_BGR)
00342             return sizeof(GLushort);
00343          else
00344             return -1;  /* error */
00345       case GL_UNSIGNED_SHORT_4_4_4_4:
00346       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
00347       case GL_UNSIGNED_SHORT_5_5_5_1:
00348       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
00349          if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
00350             return sizeof(GLushort);
00351          else
00352             return -1;
00353       case GL_UNSIGNED_INT_8_8_8_8:
00354       case GL_UNSIGNED_INT_8_8_8_8_REV:
00355       case GL_UNSIGNED_INT_10_10_10_2:
00356       case GL_UNSIGNED_INT_2_10_10_10_REV:
00357          if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
00358             return sizeof(GLuint);
00359          else
00360             return -1;
00361       case GL_UNSIGNED_SHORT_8_8_MESA:
00362       case GL_UNSIGNED_SHORT_8_8_REV_MESA:
00363          if (format == GL_YCBCR_MESA)
00364             return sizeof(GLushort);
00365          else
00366             return -1;
00367       case GL_UNSIGNED_INT_24_8_EXT:
00368          if (format == GL_DEPTH_STENCIL_EXT)
00369             return sizeof(GLuint);
00370          else
00371             return -1;
00372       default:
00373          return -1;
00374    }
00375 }
00376 
00377 
00387 GLboolean
00388 _mesa_is_legal_format_and_type( GLcontext *ctx, GLenum format, GLenum type )
00389 {
00390    switch (format) {
00391       case GL_COLOR_INDEX:
00392       case GL_STENCIL_INDEX:
00393          switch (type) {
00394             case GL_BITMAP:
00395             case GL_BYTE:
00396             case GL_UNSIGNED_BYTE:
00397             case GL_SHORT:
00398             case GL_UNSIGNED_SHORT:
00399             case GL_INT:
00400             case GL_UNSIGNED_INT:
00401             case GL_FLOAT:
00402                return GL_TRUE;
00403             case GL_HALF_FLOAT_ARB:
00404                return ctx->Extensions.ARB_half_float_pixel;
00405             default:
00406                return GL_FALSE;
00407          }
00408       case GL_RED:
00409       case GL_GREEN:
00410       case GL_BLUE:
00411       case GL_ALPHA:
00412 #if 0 /* not legal!  see table 3.6 of the 1.5 spec */
00413       case GL_INTENSITY:
00414 #endif
00415       case GL_LUMINANCE:
00416       case GL_LUMINANCE_ALPHA:
00417       case GL_DEPTH_COMPONENT:
00418          switch (type) {
00419             case GL_BYTE:
00420             case GL_UNSIGNED_BYTE:
00421             case GL_SHORT:
00422             case GL_UNSIGNED_SHORT:
00423             case GL_INT:
00424             case GL_UNSIGNED_INT:
00425             case GL_FLOAT:
00426                return GL_TRUE;
00427             case GL_HALF_FLOAT_ARB:
00428                return ctx->Extensions.ARB_half_float_pixel;
00429             default:
00430                return GL_FALSE;
00431          }
00432       case GL_RGB:
00433          switch (type) {
00434             case GL_BYTE:
00435             case GL_UNSIGNED_BYTE:
00436             case GL_SHORT:
00437             case GL_UNSIGNED_SHORT:
00438             case GL_INT:
00439             case GL_UNSIGNED_INT:
00440             case GL_FLOAT:
00441             case GL_UNSIGNED_BYTE_3_3_2:
00442             case GL_UNSIGNED_BYTE_2_3_3_REV:
00443             case GL_UNSIGNED_SHORT_5_6_5:
00444             case GL_UNSIGNED_SHORT_5_6_5_REV:
00445                return GL_TRUE;
00446             case GL_HALF_FLOAT_ARB:
00447                return ctx->Extensions.ARB_half_float_pixel;
00448             default:
00449                return GL_FALSE;
00450          }
00451       case GL_BGR:
00452          switch (type) {
00453             /* NOTE: no packed types are supported with BGR.  That's
00454              * intentional, according to the GL spec.
00455              */
00456             case GL_BYTE:
00457             case GL_UNSIGNED_BYTE:
00458             case GL_SHORT:
00459             case GL_UNSIGNED_SHORT:
00460             case GL_INT:
00461             case GL_UNSIGNED_INT:
00462             case GL_FLOAT:
00463                return GL_TRUE;
00464             case GL_HALF_FLOAT_ARB:
00465                return ctx->Extensions.ARB_half_float_pixel;
00466             default:
00467                return GL_FALSE;
00468          }
00469       case GL_RGBA:
00470       case GL_BGRA:
00471       case GL_ABGR_EXT:
00472          switch (type) {
00473             case GL_BYTE:
00474             case GL_UNSIGNED_BYTE:
00475             case GL_SHORT:
00476             case GL_UNSIGNED_SHORT:
00477             case GL_INT:
00478             case GL_UNSIGNED_INT:
00479             case GL_FLOAT:
00480             case GL_UNSIGNED_SHORT_4_4_4_4:
00481             case GL_UNSIGNED_SHORT_4_4_4_4_REV:
00482             case GL_UNSIGNED_SHORT_5_5_5_1:
00483             case GL_UNSIGNED_SHORT_1_5_5_5_REV:
00484             case GL_UNSIGNED_INT_8_8_8_8:
00485             case GL_UNSIGNED_INT_8_8_8_8_REV:
00486             case GL_UNSIGNED_INT_10_10_10_2:
00487             case GL_UNSIGNED_INT_2_10_10_10_REV:
00488                return GL_TRUE;
00489             case GL_HALF_FLOAT_ARB:
00490                return ctx->Extensions.ARB_half_float_pixel;
00491             default:
00492                return GL_FALSE;
00493          }
00494       case GL_YCBCR_MESA:
00495          if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
00496              type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
00497             return GL_TRUE;
00498          else
00499             return GL_FALSE;
00500       case GL_DEPTH_STENCIL_EXT:
00501          if (ctx->Extensions.EXT_packed_depth_stencil
00502              && type == GL_UNSIGNED_INT_24_8_EXT)
00503             return GL_TRUE;
00504          else
00505             return GL_FALSE;
00506       default:
00507          ; /* fall-through */
00508    }
00509    return GL_FALSE;
00510 }
00511 
00512 
00533 GLvoid *
00534 _mesa_image_address( GLuint dimensions,
00535                      const struct gl_pixelstore_attrib *packing,
00536                      const GLvoid *image,
00537                      GLsizei width, GLsizei height,
00538                      GLenum format, GLenum type,
00539                      GLint img, GLint row, GLint column )
00540 {
00541    GLint alignment;        /* 1, 2 or 4 */
00542    GLint pixels_per_row;
00543    GLint rows_per_image;
00544    GLint skiprows;
00545    GLint skippixels;
00546    GLint skipimages;       /* for 3-D volume images */
00547    GLubyte *pixel_addr;
00548 
00549    ASSERT(dimensions >= 1 && dimensions <= 3);
00550 
00551    alignment = packing->Alignment;
00552    if (packing->RowLength > 0) {
00553       pixels_per_row = packing->RowLength;
00554    }
00555    else {
00556       pixels_per_row = width;
00557    }
00558    if (packing->ImageHeight > 0) {
00559       rows_per_image = packing->ImageHeight;
00560    }
00561    else {
00562       rows_per_image = height;
00563    }
00564 
00565    skippixels = packing->SkipPixels;
00566    /* Note: SKIP_ROWS _is_ used for 1D images */
00567    skiprows = packing->SkipRows;
00568    /* Note: SKIP_IMAGES is only used for 3D images */
00569    skipimages = (dimensions == 3) ? packing->SkipImages : 0;
00570 
00571    if (type == GL_BITMAP) {
00572       /* BITMAP data */
00573       GLint comp_per_pixel;   /* components per pixel */
00574       GLint bytes_per_comp;   /* bytes per component */
00575       GLint bytes_per_row;
00576       GLint bytes_per_image;
00577 
00578       /* Compute bytes per component */
00579       bytes_per_comp = _mesa_sizeof_packed_type( type );
00580       if (bytes_per_comp < 0) {
00581          return NULL;
00582       }
00583 
00584       /* Compute number of components per pixel */
00585       comp_per_pixel = _mesa_components_in_format( format );
00586       if (comp_per_pixel < 0) {
00587          return NULL;
00588       }
00589 
00590       bytes_per_row = alignment
00591                     * CEILING( comp_per_pixel*pixels_per_row, 8*alignment );
00592 
00593       bytes_per_image = bytes_per_row * rows_per_image;
00594 
00595       pixel_addr = (GLubyte *) image
00596                  + (skipimages + img) * bytes_per_image
00597                  + (skiprows + row) * bytes_per_row
00598                  + (skippixels + column) / 8;
00599    }
00600    else {
00601       /* Non-BITMAP data */
00602       GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image;
00603       GLint topOfImage;
00604 
00605       bytes_per_pixel = _mesa_bytes_per_pixel( format, type );
00606 
00607       /* The pixel type and format should have been error checked earlier */
00608       assert(bytes_per_pixel > 0);
00609 
00610       bytes_per_row = pixels_per_row * bytes_per_pixel;
00611       remainder = bytes_per_row % alignment;
00612       if (remainder > 0)
00613          bytes_per_row += (alignment - remainder);
00614 
00615       ASSERT(bytes_per_row % alignment == 0);
00616 
00617       bytes_per_image = bytes_per_row * rows_per_image;
00618 
00619       if (packing->Invert) {
00620          /* set pixel_addr to the last row */
00621          topOfImage = bytes_per_row * (height - 1);
00622          bytes_per_row = -bytes_per_row;
00623       }
00624       else {
00625          topOfImage = 0;
00626       }
00627 
00628       /* compute final pixel address */
00629       pixel_addr = (GLubyte *) image
00630                  + (skipimages + img) * bytes_per_image
00631                  + topOfImage
00632                  + (skiprows + row) * bytes_per_row
00633                  + (skippixels + column) * bytes_per_pixel;
00634    }
00635 
00636    return (GLvoid *) pixel_addr;
00637 }
00638 
00639 
00640 GLvoid *
00641 _mesa_image_address1d( const struct gl_pixelstore_attrib *packing,
00642                        const GLvoid *image,
00643                        GLsizei width,
00644                        GLenum format, GLenum type,
00645                        GLint column )
00646 {
00647    return _mesa_image_address(1, packing, image, width, 1,
00648                               format, type, 0, 0, column);
00649 }
00650 
00651 
00652 GLvoid *
00653 _mesa_image_address2d( const struct gl_pixelstore_attrib *packing,
00654                        const GLvoid *image,
00655                        GLsizei width, GLsizei height,
00656                        GLenum format, GLenum type,
00657                        GLint row, GLint column )
00658 {
00659    return _mesa_image_address(2, packing, image, width, height,
00660                               format, type, 0, row, column);
00661 }
00662 
00663 
00664 GLvoid *
00665 _mesa_image_address3d( const struct gl_pixelstore_attrib *packing,
00666                        const GLvoid *image,
00667                        GLsizei width, GLsizei height,
00668                        GLenum format, GLenum type,
00669                        GLint img, GLint row, GLint column )
00670 {
00671    return _mesa_image_address(3, packing, image, width, height,
00672                               format, type, img, row, column);
00673 }
00674 
00675 
00676 
00687 GLint
00688 _mesa_image_row_stride( const struct gl_pixelstore_attrib *packing,
00689                         GLint width, GLenum format, GLenum type )
00690 {
00691    GLint bytesPerRow, remainder;
00692 
00693    ASSERT(packing);
00694 
00695    if (type == GL_BITMAP) {
00696       if (packing->RowLength == 0) {
00697          bytesPerRow = (width + 7) / 8;
00698       }
00699       else {
00700          bytesPerRow = (packing->RowLength + 7) / 8;
00701       }
00702    }
00703    else {
00704       /* Non-BITMAP data */
00705       const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
00706       if (bytesPerPixel <= 0)
00707          return -1;  /* error */
00708       if (packing->RowLength == 0) {
00709          bytesPerRow = bytesPerPixel * width;
00710       }
00711       else {
00712          bytesPerRow = bytesPerPixel * packing->RowLength;
00713       }
00714    }
00715 
00716    remainder = bytesPerRow % packing->Alignment;
00717    if (remainder > 0) {
00718       bytesPerRow += (packing->Alignment - remainder);
00719    }
00720 
00721    if (packing->Invert) {
00722       /* negate the bytes per row (negative row stride) */
00723       bytesPerRow = -bytesPerRow;
00724    }
00725 
00726    return bytesPerRow;
00727 }
00728 
00729 
00730 #if _HAVE_FULL_GL
00731 
00732 /*
00733  * Compute the stride between images in a 3D texture (in bytes) for the given
00734  * pixel packing parameters and image width, format and type.
00735  */
00736 GLint
00737 _mesa_image_image_stride( const struct gl_pixelstore_attrib *packing,
00738                           GLint width, GLint height,
00739                           GLenum format, GLenum type )
00740 {
00741    ASSERT(packing);
00742    ASSERT(type != GL_BITMAP);
00743 
00744    {
00745       const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
00746       GLint bytesPerRow, bytesPerImage, remainder;
00747 
00748       if (bytesPerPixel <= 0)
00749          return -1;  /* error */
00750       if (packing->RowLength == 0) {
00751          bytesPerRow = bytesPerPixel * width;
00752       }
00753       else {
00754          bytesPerRow = bytesPerPixel * packing->RowLength;
00755       }
00756       remainder = bytesPerRow % packing->Alignment;
00757       if (remainder > 0)
00758          bytesPerRow += (packing->Alignment - remainder);
00759 
00760       if (packing->ImageHeight == 0)
00761          bytesPerImage = bytesPerRow * height;
00762       else
00763          bytesPerImage = bytesPerRow * packing->ImageHeight;
00764 
00765       return bytesPerImage;
00766    }
00767 }
00768 
00769 
00770 /*
00771  * Unpack a 32x32 pixel polygon stipple from user memory using the
00772  * current pixel unpack settings.
00773  */
00774 void
00775 _mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
00776                               const struct gl_pixelstore_attrib *unpacking )
00777 {
00778    GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap(32, 32, pattern, unpacking);
00779    if (ptrn) {
00780       /* Convert pattern from GLubytes to GLuints and handle big/little
00781        * endian differences
00782        */
00783       GLubyte *p = ptrn;
00784       GLint i;
00785       for (i = 0; i < 32; i++) {
00786          dest[i] = (p[0] << 24)
00787                  | (p[1] << 16)
00788                  | (p[2] <<  8)
00789                  | (p[3]      );
00790          p += 4;
00791       }
00792       _mesa_free(ptrn);
00793    }
00794 }
00795 
00796 
00797 /*
00798  * Pack polygon stipple into user memory given current pixel packing
00799  * settings.
00800  */
00801 void
00802 _mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
00803                             const struct gl_pixelstore_attrib *packing )
00804 {
00805    /* Convert pattern from GLuints to GLubytes to handle big/little
00806     * endian differences.
00807     */
00808    GLubyte ptrn[32*4];
00809    GLint i;
00810    for (i = 0; i < 32; i++) {
00811       ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
00812       ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
00813       ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
00814       ptrn[i * 4 + 3] = (GLubyte) ((pattern[i]      ) & 0xff);
00815    }
00816 
00817    _mesa_pack_bitmap(32, 32, ptrn, dest, packing);
00818 }
00819 
00820 
00821 /*
00822  * Unpack bitmap data.  Resulting data will be in most-significant-bit-first
00823  * order with row alignment = 1 byte.
00824  */
00825 GLvoid *
00826 _mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
00827                      const struct gl_pixelstore_attrib *packing )
00828 {
00829    GLint bytes, row, width_in_bytes;
00830    GLubyte *buffer, *dst;
00831 
00832    if (!pixels)
00833       return NULL;
00834 
00835    /* Alloc dest storage */
00836    bytes = ((width + 7) / 8 * height);
00837    buffer = (GLubyte *) _mesa_malloc( bytes );
00838    if (!buffer)
00839       return NULL;
00840 
00841    width_in_bytes = CEILING( width, 8 );
00842    dst = buffer;
00843    for (row = 0; row < height; row++) {
00844       const GLubyte *src = (const GLubyte *)
00845          _mesa_image_address2d(packing, pixels, width, height,
00846                                GL_COLOR_INDEX, GL_BITMAP, row, 0);
00847       if (!src) {
00848          _mesa_free(buffer);
00849          return NULL;
00850       }
00851 
00852       if ((packing->SkipPixels & 7) == 0) {
00853          _mesa_memcpy( dst, src, width_in_bytes );
00854          if (packing->LsbFirst) {
00855             flip_bytes( dst, width_in_bytes );
00856          }
00857       }
00858       else {
00859          /* handling SkipPixels is a bit tricky (no pun intended!) */
00860          GLint i;
00861          if (packing->LsbFirst) {
00862             GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
00863             GLubyte dstMask = 128;
00864             const GLubyte *s = src;
00865             GLubyte *d = dst;
00866             *d = 0;
00867             for (i = 0; i < width; i++) {
00868                if (*s & srcMask) {
00869                   *d |= dstMask;
00870                }
00871                if (srcMask == 128) {
00872                   srcMask = 1;
00873                   s++;
00874                }
00875                else {
00876                   srcMask = srcMask << 1;
00877                }
00878                if (dstMask == 1) {
00879                   dstMask = 128;
00880                   d++;
00881                   *d = 0;
00882                }
00883                else {
00884                   dstMask = dstMask >> 1;
00885                }
00886             }
00887          }
00888          else {
00889             GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
00890             GLubyte dstMask = 128;
00891             const GLubyte *s = src;
00892             GLubyte *d = dst;
00893             *d = 0;
00894             for (i = 0; i < width; i++) {
00895                if (*s & srcMask) {
00896                   *d |= dstMask;
00897                }
00898                if (srcMask == 1) {
00899                   srcMask = 128;
00900                   s++;
00901                }
00902                else {
00903                   srcMask = srcMask >> 1;
00904                }
00905                if (dstMask == 1) {
00906                   dstMask = 128;
00907                   d++;
00908                   *d = 0;
00909                }
00910                else {
00911                   dstMask = dstMask >> 1;
00912                }
00913             }
00914          }
00915       }
00916       dst += width_in_bytes;
00917    }
00918 
00919    return buffer;
00920 }
00921 
00922 
00923 /*
00924  * Pack bitmap data.
00925  */
00926 void
00927 _mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
00928                    GLubyte *dest, const struct gl_pixelstore_attrib *packing )
00929 {
00930    GLint row, width_in_bytes;
00931    const GLubyte *src;
00932 
00933    if (!source)
00934       return;
00935 
00936    width_in_bytes = CEILING( width, 8 );
00937    src = source;
00938    for (row = 0; row < height; row++) {
00939       GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dest,
00940                        width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0);
00941       if (!dst)
00942          return;
00943 
00944       if ((packing->SkipPixels & 7) == 0) {
00945          _mesa_memcpy( dst, src, width_in_bytes );
00946          if (packing->LsbFirst) {
00947             flip_bytes( dst, width_in_bytes );
00948          }
00949       }
00950       else {
00951          /* handling SkipPixels is a bit tricky (no pun intended!) */
00952          GLint i;
00953          if (packing->LsbFirst) {
00954             GLubyte srcMask = 128;
00955             GLubyte dstMask = 1 << (packing->SkipPixels & 0x7);
00956             const GLubyte *s = src;
00957             GLubyte *d = dst;
00958             *d = 0;
00959             for (i = 0; i < width; i++) {
00960                if (*s & srcMask) {
00961                   *d |= dstMask;
00962                }
00963                if (srcMask == 1) {
00964                   srcMask = 128;
00965                   s++;
00966                }
00967                else {
00968                   srcMask = srcMask >> 1;
00969                }
00970                if (dstMask == 128) {
00971                   dstMask = 1;
00972                   d++;
00973                   *d = 0;
00974                }
00975                else {
00976                   dstMask = dstMask << 1;
00977                }
00978             }
00979          }
00980          else {
00981             GLubyte srcMask = 128;
00982             GLubyte dstMask = 128 >> (packing->SkipPixels & 0x7);
00983             const GLubyte *s = src;
00984             GLubyte *d = dst;
00985             *d = 0;
00986             for (i = 0; i < width; i++) {
00987                if (*s & srcMask) {
00988                   *d |= dstMask;
00989                }
00990                if (srcMask == 1) {
00991                   srcMask = 128;
00992                   s++;
00993                }
00994                else {
00995                   srcMask = srcMask >> 1;
00996                }
00997                if (dstMask == 1) {
00998                   dstMask = 128;
00999                   d++;
01000                   *d = 0;
01001                }
01002                else {
01003                   dstMask = dstMask >> 1;
01004                }
01005             }
01006          }
01007       }
01008       src += width_in_bytes;
01009    }
01010 }
01011 
01012 
01013 /**********************************************************************/
01014 /*****                  Pixel processing functions               ******/
01015 /**********************************************************************/
01016 
01017 /*
01018  * Apply scale and bias factors to an array of RGBA pixels.
01019  */
01020 void
01021 _mesa_scale_and_bias_rgba(GLuint n, GLfloat rgba[][4],
01022                           GLfloat rScale, GLfloat gScale,
01023                           GLfloat bScale, GLfloat aScale,
01024                           GLfloat rBias, GLfloat gBias,
01025                           GLfloat bBias, GLfloat aBias)
01026 {
01027    if (rScale != 1.0 || rBias != 0.0) {
01028       GLuint i;
01029       for (i = 0; i < n; i++) {
01030          rgba[i][RCOMP] = rgba[i][RCOMP] * rScale + rBias;
01031       }
01032    }
01033    if (gScale != 1.0 || gBias != 0.0) {
01034       GLuint i;
01035       for (i = 0; i < n; i++) {
01036          rgba[i][GCOMP] = rgba[i][GCOMP] * gScale + gBias;
01037       }
01038    }
01039    if (bScale != 1.0 || bBias != 0.0) {
01040       GLuint i;
01041       for (i = 0; i < n; i++) {
01042          rgba[i][BCOMP] = rgba[i][BCOMP] * bScale + bBias;
01043       }
01044    }
01045    if (aScale != 1.0 || aBias != 0.0) {
01046       GLuint i;
01047       for (i = 0; i < n; i++) {
01048          rgba[i][ACOMP] = rgba[i][ACOMP] * aScale + aBias;
01049       }
01050    }
01051 }
01052 
01053 
01054 /*
01055  * Apply pixel mapping to an array of floating point RGBA pixels.
01056  */
01057 void
01058 _mesa_map_rgba( const GLcontext *ctx, GLuint n, GLfloat rgba[][4] )
01059 {
01060    const GLfloat rscale = (GLfloat) (ctx->PixelMaps.RtoR.Size - 1);
01061    const GLfloat gscale = (GLfloat) (ctx->PixelMaps.GtoG.Size - 1);
01062    const GLfloat bscale = (GLfloat) (ctx->PixelMaps.BtoB.Size - 1);
01063    const GLfloat ascale = (GLfloat) (ctx->PixelMaps.AtoA.Size - 1);
01064    const GLfloat *rMap = ctx->PixelMaps.RtoR.Map;
01065    const GLfloat *gMap = ctx->PixelMaps.GtoG.Map;
01066    const GLfloat *bMap = ctx->PixelMaps.BtoB.Map;
01067    const GLfloat *aMap = ctx->PixelMaps.AtoA.Map;
01068    GLuint i;
01069    for (i=0;i<n;i++) {
01070       GLfloat r = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
01071       GLfloat g = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
01072       GLfloat b = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
01073       GLfloat a = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
01074       rgba[i][RCOMP] = rMap[IROUND(r * rscale)];
01075       rgba[i][GCOMP] = gMap[IROUND(g * gscale)];
01076       rgba[i][BCOMP] = bMap[IROUND(b * bscale)];
01077       rgba[i][ACOMP] = aMap[IROUND(a * ascale)];
01078    }
01079 }
01080 
01081 
01082 /*
01083  * Apply the color matrix and post color matrix scaling and biasing.
01084  */
01085 void
01086 _mesa_transform_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4])
01087 {
01088    const GLfloat rs = ctx->Pixel.PostColorMatrixScale[0];
01089    const GLfloat rb = ctx->Pixel.PostColorMatrixBias[0];
01090    const GLfloat gs = ctx->Pixel.PostColorMatrixScale[1];
01091    const GLfloat gb = ctx->Pixel.PostColorMatrixBias[1];
01092    const GLfloat bs = ctx->Pixel.PostColorMatrixScale[2];
01093    const GLfloat bb = ctx->Pixel.PostColorMatrixBias[2];
01094    const GLfloat as = ctx->Pixel.PostColorMatrixScale[3];
01095    const GLfloat ab = ctx->Pixel.PostColorMatrixBias[3];
01096    const GLfloat *m = ctx->ColorMatrixStack.Top->m;
01097    GLuint i;
01098    for (i = 0; i < n; i++) {
01099       const GLfloat r = rgba[i][RCOMP];
01100       const GLfloat g = rgba[i][GCOMP];
01101       const GLfloat b = rgba[i][BCOMP];
01102       const GLfloat a = rgba[i][ACOMP];
01103       rgba[i][RCOMP] = (m[0] * r + m[4] * g + m[ 8] * b + m[12] * a) * rs + rb;
01104       rgba[i][GCOMP] = (m[1] * r + m[5] * g + m[ 9] * b + m[13] * a) * gs + gb;
01105       rgba[i][BCOMP] = (m[2] * r + m[6] * g + m[10] * b + m[14] * a) * bs + bb;
01106       rgba[i][ACOMP] = (m[3] * r + m[7] * g + m[11] * b + m[15] * a) * as + ab;
01107    }
01108 }
01109 
01110 
01114 void
01115 _mesa_lookup_rgba_float(const struct gl_color_table *table,
01116                         GLuint n, GLfloat rgba[][4])
01117 {
01118    const GLint max = table->Size - 1;
01119    const GLfloat scale = (GLfloat) max;
01120    const GLfloat *lut = table->TableF;
01121    GLuint i;
01122 
01123    if (!table->TableF || table->Size == 0)
01124       return;
01125 
01126    switch (table->_BaseFormat) {
01127       case GL_INTENSITY:
01128          /* replace RGBA with I */
01129          for (i = 0; i < n; i++) {
01130             GLint j = IROUND(rgba[i][RCOMP] * scale);
01131             GLfloat c = lut[CLAMP(j, 0, max)];
01132             rgba[i][RCOMP] =
01133             rgba[i][GCOMP] =
01134             rgba[i][BCOMP] =
01135             rgba[i][ACOMP] = c;
01136          }
01137          break;
01138       case GL_LUMINANCE:
01139          /* replace RGB with L */
01140          for (i = 0; i < n; i++) {
01141             GLint j = IROUND(rgba[i][RCOMP] * scale);
01142             GLfloat c = lut[CLAMP(j, 0, max)];
01143             rgba[i][RCOMP] =
01144             rgba[i][GCOMP] =
01145             rgba[i][BCOMP] = c;
01146          }
01147          break;
01148       case GL_ALPHA:
01149          /* replace A with A */
01150          for (i = 0; i < n; i++) {
01151             GLint j = IROUND(rgba[i][ACOMP] * scale);
01152             rgba[i][ACOMP] = lut[CLAMP(j, 0, max)];
01153          }
01154          break;
01155       case GL_LUMINANCE_ALPHA:
01156          /* replace RGBA with LLLA */
01157          for (i = 0; i < n; i++) {
01158             GLint jL = IROUND(rgba[i][RCOMP] * scale);
01159             GLint jA = IROUND(rgba[i][ACOMP] * scale);
01160             GLfloat luminance, alpha;
01161             jL = CLAMP(jL, 0, max);
01162             jA = CLAMP(jA, 0, max);
01163             luminance = lut[jL * 2 + 0];
01164             alpha     = lut[jA * 2 + 1];
01165             rgba[i][RCOMP] =
01166             rgba[i][GCOMP] =
01167             rgba[i][BCOMP] = luminance;
01168             rgba[i][ACOMP] = alpha;;
01169          }
01170          break;
01171       case GL_RGB:
01172          /* replace RGB with RGB */
01173          for (i = 0; i < n; i++) {
01174             GLint jR = IROUND(rgba[i][RCOMP] * scale);
01175             GLint jG = IROUND(rgba[i][GCOMP] * scale);
01176             GLint jB = IROUND(rgba[i][BCOMP] * scale);
01177             jR = CLAMP(jR, 0, max);
01178             jG = CLAMP(jG, 0, max);
01179             jB = CLAMP(jB, 0, max);
01180             rgba[i][RCOMP] = lut[jR * 3 + 0];
01181             rgba[i][GCOMP] = lut[jG * 3 + 1];
01182             rgba[i][BCOMP] = lut[jB * 3 + 2];
01183          }
01184          break;
01185       case GL_RGBA:
01186          /* replace RGBA with RGBA */
01187          for (i = 0; i < n; i++) {
01188             GLint jR = IROUND(rgba[i][RCOMP] * scale);
01189             GLint jG = IROUND(rgba[i][GCOMP] * scale);
01190             GLint jB = IROUND(rgba[i][BCOMP] * scale);
01191             GLint jA = IROUND(rgba[i][ACOMP] * scale);
01192             jR = CLAMP(jR, 0, max);
01193             jG = CLAMP(jG, 0, max);
01194             jB = CLAMP(jB, 0, max);
01195             jA = CLAMP(jA, 0, max);
01196             rgba[i][RCOMP] = lut[jR * 4 + 0];
01197             rgba[i][GCOMP] = lut[jG * 4 + 1];
01198             rgba[i][BCOMP] = lut[jB * 4 + 2];
01199             rgba[i][ACOMP] = lut[jA * 4 + 3];
01200          }
01201          break;
01202       default:
01203          _mesa_problem(NULL, "Bad format in _mesa_lookup_rgba_float");
01204          return;
01205    }
01206 }
01207 
01208 
01209 
01213 void
01214 _mesa_lookup_rgba_ubyte(const struct gl_color_table *table,
01215                         GLuint n, GLubyte rgba[][4])
01216 {
01217    const GLubyte *lut = table->TableUB;
01218    const GLfloat scale = (GLfloat) (table->Size - 1) / (GLfloat)255.0;
01219    GLuint i;
01220 
01221    if (!table->TableUB || table->Size == 0)
01222       return;
01223 
01224    switch (table->_BaseFormat) {
01225    case GL_INTENSITY:
01226       /* replace RGBA with I */
01227       if (table->Size == 256) {
01228          for (i = 0; i < n; i++) {
01229             const GLubyte c = lut[rgba[i][RCOMP]];
01230             rgba[i][RCOMP] =
01231             rgba[i][GCOMP] =
01232             rgba[i][BCOMP] =
01233             rgba[i][ACOMP] = c;
01234          }
01235       }
01236       else {
01237          for (i = 0; i < n; i++) {
01238             GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
01239             rgba[i][RCOMP] =
01240             rgba[i][GCOMP] =
01241             rgba[i][BCOMP] =
01242             rgba[i][ACOMP] = lut[j];
01243          }
01244       }
01245       break;
01246    case GL_LUMINANCE:
01247       /* replace RGB with L */
01248       if (table->Size == 256) {
01249          for (i = 0; i < n; i++) {
01250             const GLubyte c = lut[rgba[i][RCOMP]];
01251             rgba[i][RCOMP] =
01252             rgba[i][GCOMP] =
01253             rgba[i][BCOMP] = c;
01254          }
01255       }
01256       else {
01257          for (i = 0; i < n; i++) {
01258             GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
01259             rgba[i][RCOMP] =
01260             rgba[i][GCOMP] =
01261             rgba[i][BCOMP] = lut[j];
01262          }
01263       }
01264       break;
01265    case GL_ALPHA:
01266       /* replace A with A */
01267       if (table->Size == 256) {
01268          for (i = 0; i < n; i++) {
01269             rgba[i][ACOMP] = lut[rgba[i][ACOMP]];
01270          }
01271       }
01272       else {
01273          for (i = 0; i < n; i++) {
01274             GLint j = IROUND((GLfloat) rgba[i][ACOMP] * scale);
01275             rgba[i][ACOMP] = lut[j];
01276          }
01277       }
01278       break;
01279    case GL_LUMINANCE_ALPHA:
01280       /* replace RGBA with LLLA */
01281       if (table->Size == 256) {
01282          for (i = 0; i < n; i++) {
01283             GLubyte l = lut[rgba[i][RCOMP] * 2 + 0];
01284             GLubyte a = lut[rgba[i][ACOMP] * 2 + 1];;
01285             rgba[i][RCOMP] =
01286             rgba[i][GCOMP] =
01287             rgba[i][BCOMP] = l;
01288             rgba[i][ACOMP] = a;
01289          }
01290       }
01291       else {
01292          for (i = 0; i < n; i++) {
01293             GLint jL = IROUND((GLfloat) rgba[i][RCOMP] * scale);
01294             GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
01295             GLubyte luminance = lut[jL * 2 + 0];
01296             GLubyte alpha     = lut[jA * 2 + 1];
01297             rgba[i][RCOMP] =
01298             rgba[i][GCOMP] =
01299             rgba[i][BCOMP] = luminance;
01300             rgba[i][ACOMP] = alpha;
01301          }
01302       }
01303       break;
01304    case GL_RGB:
01305       if (table->Size == 256) {
01306          for (i = 0; i < n; i++) {
01307             rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 3 + 0];
01308             rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 3 + 1];
01309             rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 3 + 2];
01310          }
01311       }
01312       else {
01313          for (i = 0; i < n; i++) {
01314             GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
01315             GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
01316             GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
01317             rgba[i][RCOMP] = lut[jR * 3 + 0];
01318             rgba[i][GCOMP] = lut[jG * 3 + 1];
01319             rgba[i][BCOMP] = lut[jB * 3 + 2];
01320          }
01321       }
01322       break;
01323    case GL_RGBA:
01324       if (table->Size == 256) {
01325          for (i = 0; i < n; i++) {
01326             rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 4 + 0];
01327             rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 4 + 1];
01328             rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 4 + 2];
01329             rgba[i][ACOMP] = lut[rgba[i][ACOMP] * 4 + 3];
01330          }
01331       }
01332       else {
01333          for (i = 0; i < n; i++) {
01334             GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
01335             GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
01336             GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
01337             GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
01338             CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], lut[jR * 4 + 0]);
01339             CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], lut[jG * 4 + 1]);
01340             CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], lut[jB * 4 + 2]);
01341             CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], lut[jA * 4 + 3]);
01342          }
01343       }
01344       break;
01345    default:
01346       _mesa_problem(NULL, "Bad format in _mesa_lookup_rgba_chan");
01347       return;
01348    }
01349 }
01350 
01351 
01352 
01353 /*
01354  * Map color indexes to float rgba values.
01355  */
01356 void
01357 _mesa_map_ci_to_rgba( const GLcontext *ctx, GLuint n,
01358                       const GLuint index[], GLfloat rgba[][4] )
01359 {
01360    GLuint rmask = ctx->PixelMaps.ItoR.Size - 1;
01361    GLuint gmask = ctx->PixelMaps.ItoG.Size - 1;
01362    GLuint bmask = ctx->PixelMaps.ItoB.Size - 1;
01363    GLuint amask = ctx->PixelMaps.ItoA.Size - 1;
01364    const GLfloat *rMap = ctx->PixelMaps.ItoR.Map;
01365    const GLfloat *gMap = ctx->PixelMaps.ItoG.Map;
01366    const GLfloat *bMap = ctx->PixelMaps.ItoB.Map;
01367    const GLfloat *aMap = ctx->PixelMaps.ItoA.Map;
01368    GLuint i;
01369    for (i=0;i<n;i++) {
01370       rgba[i][RCOMP] = rMap[index[i] & rmask];
01371       rgba[i][GCOMP] = gMap[index[i] & gmask];
01372       rgba[i][BCOMP] = bMap[index[i] & bmask];
01373       rgba[i][ACOMP] = aMap[index[i] & amask];
01374    }
01375 }
01376 
01377 
01381 void
01382 _mesa_map_ci8_to_rgba8(const GLcontext *ctx, GLuint n, const GLubyte index[],
01383                        GLubyte rgba[][4])
01384 {
01385    GLuint rmask = ctx->PixelMaps.ItoR.Size - 1;
01386    GLuint gmask = ctx->PixelMaps.ItoG.Size - 1;
01387    GLuint bmask = ctx->PixelMaps.ItoB.Size - 1;
01388    GLuint amask = ctx->PixelMaps.ItoA.Size - 1;
01389    const GLubyte *rMap = ctx->PixelMaps.ItoR.Map8;
01390    const GLubyte *gMap = ctx->PixelMaps.ItoG.Map8;
01391    const GLubyte *bMap = ctx->PixelMaps.ItoB.Map8;
01392    const GLubyte *aMap = ctx->PixelMaps.ItoA.Map8;
01393    GLuint i;
01394    for (i=0;i<n;i++) {
01395       rgba[i][RCOMP] = rMap[index[i] & rmask];
01396       rgba[i][GCOMP] = gMap[index[i] & gmask];
01397       rgba[i][BCOMP] = bMap[index[i] & bmask];
01398       rgba[i][ACOMP] = aMap[index[i] & amask];
01399    }
01400 }
01401 
01402 
01403 void
01404 _mesa_scale_and_bias_depth(const GLcontext *ctx, GLuint n,
01405                            GLfloat depthValues[])
01406 {
01407    const GLfloat scale = ctx->Pixel.DepthScale;
01408    const GLfloat bias = ctx->Pixel.DepthBias;
01409    GLuint i;
01410    for (i = 0; i < n; i++) {
01411       GLfloat d = depthValues[i] * scale + bias;
01412       depthValues[i] = CLAMP(d, 0.0F, 1.0F);
01413    }
01414 }
01415 
01416 
01417 void
01418 _mesa_scale_and_bias_depth_uint(const GLcontext *ctx, GLuint n,
01419                                 GLuint depthValues[])
01420 {
01421    const GLdouble max = (double) 0xffffffff;
01422    const GLdouble scale = ctx->Pixel.DepthScale;
01423    const GLdouble bias = ctx->Pixel.DepthBias * max;
01424    GLuint i;
01425    for (i = 0; i < n; i++) {
01426       GLdouble d = (GLdouble) depthValues[i] * scale + bias;
01427       d = CLAMP(d, 0.0, max);
01428       depthValues[i] = (GLuint) d;
01429    }
01430 }
01431 
01432 
01433 
01434 /*
01435  * Update the min/max values from an array of fragment colors.
01436  */
01437 static void
01438 update_minmax(GLcontext *ctx, GLuint n, const GLfloat rgba[][4])
01439 {
01440    GLuint i;
01441    for (i = 0; i < n; i++) {
01442       /* update mins */
01443       if (rgba[i][RCOMP] < ctx->MinMax.Min[RCOMP])
01444          ctx->MinMax.Min[RCOMP] = rgba[i][RCOMP];
01445       if (rgba[i][GCOMP] < ctx->MinMax.Min[GCOMP])
01446          ctx->MinMax.Min[GCOMP] = rgba[i][GCOMP];
01447       if (rgba[i][BCOMP] < ctx->MinMax.Min[BCOMP])
01448          ctx->MinMax.Min[BCOMP] = rgba[i][BCOMP];
01449       if (rgba[i][ACOMP] < ctx->MinMax.Min[ACOMP])
01450          ctx->MinMax.Min[ACOMP] = rgba[i][ACOMP];
01451 
01452       /* update maxs */
01453       if (rgba[i][RCOMP] > ctx->MinMax.Max[RCOMP])
01454          ctx->MinMax.Max[RCOMP] = rgba[i][RCOMP];
01455       if (rgba[i][GCOMP] > ctx->MinMax.Max[GCOMP])
01456          ctx->MinMax.Max[GCOMP] = rgba[i][GCOMP];
01457       if (rgba[i][BCOMP] > ctx->MinMax.Max[BCOMP])
01458          ctx->MinMax.Max[BCOMP] = rgba[i][BCOMP];
01459       if (rgba[i][ACOMP] > ctx->MinMax.Max[ACOMP])
01460          ctx->MinMax.Max[ACOMP] = rgba[i][ACOMP];
01461    }
01462 }
01463 
01464 
01465 /*
01466  * Update the histogram values from an array of fragment colors.
01467  */
01468 static void
01469 update_histogram(GLcontext *ctx, GLuint n, const GLfloat rgba[][4])
01470 {
01471    const GLint max = ctx->Histogram.Width - 1;
01472    GLfloat w = (GLfloat) max;
01473    GLuint i;
01474 
01475    if (ctx->Histogram.Width == 0)
01476       return;
01477 
01478    for (i = 0; i < n; i++) {
01479       GLint ri = IROUND(rgba[i][RCOMP] * w);
01480       GLint gi = IROUND(rgba[i][GCOMP] * w);
01481       GLint bi = IROUND(rgba[i][BCOMP] * w);
01482       GLint ai = IROUND(rgba[i][ACOMP] * w);
01483       ri = CLAMP(ri, 0, max);
01484       gi = CLAMP(gi, 0, max);
01485       bi = CLAMP(bi, 0, max);
01486       ai = CLAMP(ai, 0, max);
01487       ctx->Histogram.Count[ri][RCOMP]++;
01488       ctx->Histogram.Count[gi][GCOMP]++;
01489       ctx->Histogram.Count[bi][BCOMP]++;
01490       ctx->Histogram.Count[ai][ACOMP]++;
01491    }
01492 }
01493 
01494 
01499 void
01500 _mesa_apply_rgba_transfer_ops(GLcontext *ctx, GLbitfield transferOps,
01501                               GLuint n, GLfloat rgba[][4])
01502 {
01503    /* scale & bias */
01504    if (transferOps & IMAGE_SCALE_BIAS_BIT) {
01505       _mesa_scale_and_bias_rgba(n, rgba,
01506                                 ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
01507                                 ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
01508                                 ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
01509                                 ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
01510    }
01511    /* color map lookup */
01512    if (transferOps & IMAGE_MAP_COLOR_BIT) {
01513       _mesa_map_rgba( ctx, n, rgba );
01514    }
01515    /* GL_COLOR_TABLE lookup */
01516    if (transferOps & IMAGE_COLOR_TABLE_BIT) {
01517       _mesa_lookup_rgba_float(&ctx->ColorTable[COLORTABLE_PRECONVOLUTION], n, rgba);
01518    }
01519    /* convolution */
01520    if (transferOps & IMAGE_CONVOLUTION_BIT) {
01521       /* this has to be done in the calling code */
01522       _mesa_problem(ctx, "IMAGE_CONVOLUTION_BIT set in _mesa_apply_transfer_ops");
01523    }
01524    /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
01525    if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
01526       _mesa_scale_and_bias_rgba(n, rgba,
01527                                 ctx->Pixel.PostConvolutionScale[RCOMP],
01528                                 ctx->Pixel.PostConvolutionScale[GCOMP],
01529                                 ctx->Pixel.PostConvolutionScale[BCOMP],
01530                                 ctx->Pixel.PostConvolutionScale[ACOMP],
01531                                 ctx->Pixel.PostConvolutionBias[RCOMP],
01532                                 ctx->Pixel.PostConvolutionBias[GCOMP],
01533                                 ctx->Pixel.PostConvolutionBias[BCOMP],
01534                                 ctx->Pixel.PostConvolutionBias[ACOMP]);
01535    }
01536    /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
01537    if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
01538       _mesa_lookup_rgba_float(&ctx->ColorTable[COLORTABLE_POSTCONVOLUTION], n, rgba);
01539    }
01540    /* color matrix transform */
01541    if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
01542       _mesa_transform_rgba(ctx, n, rgba);
01543    }
01544    /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
01545    if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
01546       _mesa_lookup_rgba_float(&ctx->ColorTable[COLORTABLE_POSTCOLORMATRIX], n, rgba);
01547    }
01548    /* update histogram count */
01549    if (transferOps & IMAGE_HISTOGRAM_BIT) {
01550       update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
01551    }
01552    /* update min/max values */
01553    if (transferOps & IMAGE_MIN_MAX_BIT) {
01554       update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
01555    }
01556    /* clamping to [0,1] */
01557    if (transferOps & IMAGE_CLAMP_BIT) {
01558       GLuint i;
01559       for (i = 0; i < n; i++) {
01560          rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
01561          rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
01562          rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
01563          rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
01564       }
01565    }
01566 }
01567 
01568 
01569 /*
01570  * Apply color index shift and offset to an array of pixels.
01571  */
01572 static void
01573 shift_and_offset_ci( const GLcontext *ctx, GLuint n, GLuint indexes[] )
01574 {
01575    GLint shift = ctx->Pixel.IndexShift;
01576    GLint offset = ctx->Pixel.IndexOffset;
01577    GLuint i;
01578    if (shift > 0) {
01579       for (i=0;i<n;i++) {
01580          indexes[i] = (indexes[i] << shift) + offset;
01581       }
01582    }
01583    else if (shift < 0) {
01584       shift = -shift;
01585       for (i=0;i<n;i++) {
01586          indexes[i] = (indexes[i] >> shift) + offset;
01587       }
01588    }
01589    else {
01590       for (i=0;i<n;i++) {
01591          indexes[i] = indexes[i] + offset;
01592       }
01593    }
01594 }
01595 
01596 
01597 
01602 void
01603 _mesa_apply_ci_transfer_ops(const GLcontext *ctx, GLbitfield transferOps,
01604                             GLuint n, GLuint indexes[])
01605 {
01606    if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
01607       shift_and_offset_ci(ctx, n, indexes);
01608    }
01609    if (transferOps & IMAGE_MAP_COLOR_BIT) {
01610       const GLuint mask = ctx->PixelMaps.ItoI.Size - 1;
01611       GLuint i;
01612       for (i = 0; i < n; i++) {
01613          const GLuint j = indexes[i] & mask;
01614          indexes[i] = IROUND(ctx->PixelMaps.ItoI.Map[j]);
01615       }
01616    }
01617 }
01618 
01619 
01624 void
01625 _mesa_apply_stencil_transfer_ops(const GLcontext *ctx, GLuint n,
01626                                  GLstencil stencil[])
01627 {
01628    if (ctx->Pixel.IndexShift != 0 || ctx->Pixel.IndexOffset != 0) {
01629       const GLint offset = ctx->Pixel.IndexOffset;
01630       GLint shift = ctx->Pixel.IndexShift;
01631       GLuint i;
01632       if (shift > 0) {
01633          for (i = 0; i < n; i++) {
01634             stencil[i] = (stencil[i] << shift) + offset;
01635          }
01636       }
01637       else if (shift < 0) {
01638          shift = -shift;
01639          for (i = 0; i < n; i++) {
01640             stencil[i] = (stencil[i] >> shift) + offset;
01641          }
01642       }
01643       else {
01644          for (i = 0; i < n; i++) {
01645             stencil[i] = stencil[i] + offset;
01646          }
01647       }
01648    }
01649    if (ctx->Pixel.MapStencilFlag) {
01650       GLuint mask = ctx->PixelMaps.StoS.Size - 1;
01651       GLuint i;
01652       for (i = 0; i < n; i++) {
01653          stencil[i] = (GLstencil)ctx->PixelMaps.StoS.Map[ stencil[i] & mask ];
01654       }
01655    }
01656 }
01657 
01658 
01667 void
01668 _mesa_pack_rgba_span_float(GLcontext *ctx, GLuint n, GLfloat rgba[][4],
01669                            GLenum dstFormat, GLenum dstType,
01670                            GLvoid *dstAddr,
01671                            const struct gl_pixelstore_attrib *dstPacking,
01672                            GLbitfield transferOps)
01673 {
01674    GLfloat luminance[MAX_WIDTH];
01675    const GLint comps = _mesa_components_in_format(dstFormat);
01676    GLuint i;
01677 
01678    if (dstType != GL_FLOAT || ctx->Color.ClampReadColor == GL_TRUE) {
01679       /* need to clamp to [0, 1] */
01680       transferOps |= IMAGE_CLAMP_BIT;
01681    }
01682 
01683    if (transferOps) {
01684       _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
01685       if ((transferOps & IMAGE_MIN_MAX_BIT) && ctx->MinMax.Sink) {
01686          return;
01687       }
01688    }
01689 
01690    if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
01691       /* compute luminance values */
01692       if (transferOps & IMAGE_CLAMP_BIT) {
01693          for (i = 0; i < n; i++) {
01694             GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
01695             luminance[i] = CLAMP(sum, 0.0F, 1.0F);
01696          }
01697       }
01698       else {
01699          for (i = 0; i < n; i++) {
01700             luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
01701          }
01702       }
01703    }
01704 
01705    /*
01706     * Pack/store the pixels.  Ugh!  Lots of cases!!!
01707     */
01708    switch (dstType) {
01709       case GL_UNSIGNED_BYTE:
01710          {
01711             GLubyte *dst = (GLubyte *) dstAddr;
01712             switch (dstFormat) {
01713                case GL_RED:
01714                   for (i=0;i<n;i++)
01715                      dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
01716                   break;
01717                case GL_GREEN:
01718                   for (i=0;i<n;i++)
01719                      dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
01720                   break;
01721                case GL_BLUE:
01722                   for (i=0;i<n;i++)
01723                      dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
01724                   break;
01725                case GL_ALPHA:
01726                   for (i=0;i<n;i++)
01727                      dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
01728                   break;
01729                case GL_LUMINANCE:
01730                   for (i=0;i<n;i++)
01731                      dst[i] = FLOAT_TO_UBYTE(luminance[i]);
01732                   break;
01733                case GL_LUMINANCE_ALPHA:
01734                   for (i=0;i<n;i++) {
01735                      dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
01736                      dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
01737                   }
01738                   break;
01739                case GL_RGB:
01740                   for (i=0;i<n;i++) {
01741                      dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
01742                      dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
01743                      dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
01744                   }
01745                   break;
01746                case GL_RGBA:
01747                   for (i=0;i<n;i++) {
01748                      dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
01749                      dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
01750                      dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
01751                      dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
01752                   }
01753                   break;
01754                case GL_BGR:
01755                   for (i=0;i<n;i++) {
01756                      dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
01757                      dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
01758                      dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
01759                   }
01760                   break;
01761                case GL_BGRA:
01762                   for (i=0;i<n;i++) {
01763                      dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
01764                      dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
01765                      dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
01766                      dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
01767                   }
01768                   break;
01769                case GL_ABGR_EXT:
01770                   for (i=0;i<n;i++) {
01771                      dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
01772                      dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
01773                      dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
01774                      dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
01775                   }
01776                   break;
01777                default:
01778                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
01779             }
01780          }
01781          break;
01782       case GL_BYTE:
01783          {
01784             GLbyte *dst = (GLbyte *) dstAddr;
01785             switch (dstFormat) {
01786                case GL_RED:
01787                   for (i=0;i<n;i++)
01788                      dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
01789                   break;
01790                case GL_GREEN:
01791                   for (i=0;i<n;i++)
01792                      dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
01793                   break;
01794                case GL_BLUE:
01795                   for (i=0;i<n;i++)
01796                      dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
01797                   break;
01798                case GL_ALPHA:
01799                   for (i=0;i<n;i++)
01800                      dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
01801                   break;
01802                case GL_LUMINANCE:
01803                   for (i=0;i<n;i++)
01804                      dst[i] = FLOAT_TO_BYTE(luminance[i]);
01805                   break;
01806                case GL_LUMINANCE_ALPHA:
01807                   for (i=0;i<n;i++) {
01808                      dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
01809                      dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
01810                   }
01811                   break;
01812                case GL_RGB:
01813                   for (i=0;i<n;i++) {
01814                      dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
01815                      dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
01816                      dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
01817                   }
01818                   break;
01819                case GL_RGBA:
01820                   for (i=0;i<n;i++) {
01821                      dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
01822                      dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
01823                      dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
01824                      dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
01825                   }
01826                   break;
01827                case GL_BGR:
01828                   for (i=0;i<n;i++) {
01829                      dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
01830                      dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
01831                      dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
01832                   }
01833                   break;
01834                case GL_BGRA:
01835                   for (i=0;i<n;i++) {
01836                      dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
01837                      dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
01838                      dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
01839                      dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
01840                   }
01841           break;
01842                case GL_ABGR_EXT:
01843                   for (i=0;i<n;i++) {
01844                      dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
01845                      dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
01846                      dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
01847                      dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
01848                   }
01849                   break;
01850                default:
01851                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
01852             }
01853          }
01854          break;
01855       case GL_UNSIGNED_SHORT:
01856          {
01857             GLushort *dst = (GLushort *) dstAddr;
01858             switch (dstFormat) {
01859                case GL_RED:
01860                   for (i=0;i<n;i++)
01861                      CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]);
01862                   break;
01863                case GL_GREEN:
01864                   for (i=0;i<n;i++)
01865                      CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]);
01866                   break;
01867                case GL_BLUE:
01868                   for (i=0;i<n;i++)
01869                      CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]);
01870                   break;
01871                case GL_ALPHA:
01872                   for (i=0;i<n;i++)
01873                      CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]);
01874                   break;
01875                case GL_LUMINANCE:
01876                   for (i=0;i<n;i++)
01877                      UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]);
01878                   break;
01879                case GL_LUMINANCE_ALPHA:
01880                   for (i=0;i<n;i++) {
01881                      UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]);
01882                      CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]);
01883                   }
01884                   break;
01885                case GL_RGB:
01886                   for (i=0;i<n;i++) {
01887                      CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]);
01888                      CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
01889                      CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]);
01890                   }
01891                   break;
01892                case GL_RGBA:
01893                   for (i=0;i<n;i++) {
01894                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]);
01895                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
01896                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]);
01897                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
01898                   }
01899                   break;
01900                case GL_BGR:
01901                   for (i=0;i<n;i++) {
01902                      CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]);
01903                      CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
01904                      CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]);
01905                   }
01906                   break;
01907                case GL_BGRA:
01908                   for (i=0;i<n;i++) {
01909                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]);
01910                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
01911                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]);
01912                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
01913                   }
01914                   break;
01915                case GL_ABGR_EXT:
01916                   for (i=0;i<n;i++) {
01917                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]);
01918                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]);
01919                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]);
01920                      CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]);
01921                   }
01922                   break;
01923                default:
01924                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
01925             }
01926          }
01927          break;
01928       case GL_SHORT:
01929          {
01930             GLshort *dst = (GLshort *) dstAddr;
01931             switch (dstFormat) {
01932                case GL_RED:
01933                   for (i=0;i<n;i++)
01934                      dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
01935                   break;
01936                case GL_GREEN:
01937                   for (i=0;i<n;i++)
01938                      dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
01939                   break;
01940                case GL_BLUE:
01941                   for (i=0;i<n;i++)
01942                      dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
01943                   break;
01944                case GL_ALPHA:
01945                   for (i=0;i<n;i++)
01946                      dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
01947                   break;
01948                case GL_LUMINANCE:
01949                   for (i=0;i<n;i++)
01950                      dst[i] = FLOAT_TO_SHORT(luminance[i]);
01951                   break;
01952                case GL_LUMINANCE_ALPHA:
01953                   for (i=0;i<n;i++) {
01954                      dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
01955                      dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
01956                   }
01957                   break;
01958                case GL_RGB:
01959                   for (i=0;i<n;i++) {
01960                      dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
01961                      dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
01962                      dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
01963                   }
01964                   break;
01965                case GL_RGBA:
01966                   for (i=0;i<n;i++) {
01967                      dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
01968                      dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
01969                      dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
01970                      dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
01971                   }
01972                   break;
01973                case GL_BGR:
01974                   for (i=0;i<n;i++) {
01975                      dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
01976                      dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
01977                      dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
01978                   }
01979                   break;
01980                case GL_BGRA:
01981                   for (i=0;i<n;i++) {
01982                      dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
01983                      dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
01984                      dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
01985                      dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
01986                   }
01987           break;
01988                case GL_ABGR_EXT:
01989                   for (i=0;i<n;i++) {
01990                      dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
01991                      dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
01992                      dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
01993                      dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
01994                   }
01995                   break;
01996                default:
01997                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
01998             }
01999          }
02000          break;
02001       case GL_UNSIGNED_INT:
02002          {
02003             GLuint *dst = (GLuint *) dstAddr;
02004             switch (dstFormat) {
02005                case GL_RED:
02006                   for (i=0;i<n;i++)
02007                      dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
02008                   break;
02009                case GL_GREEN:
02010                   for (i=0;i<n;i++)
02011                      dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
02012                   break;
02013                case GL_BLUE:
02014                   for (i=0;i<n;i++)
02015                      dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
02016                   break;
02017                case GL_ALPHA:
02018                   for (i=0;i<n;i++)
02019                      dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
02020                   break;
02021                case GL_LUMINANCE:
02022                   for (i=0;i<n;i++)
02023                      dst[i] = FLOAT_TO_UINT(luminance[i]);
02024                   break;
02025                case GL_LUMINANCE_ALPHA:
02026                   for (i=0;i<n;i++) {
02027                      dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
02028                      dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
02029                   }
02030                   break;
02031                case GL_RGB:
02032                   for (i=0;i<n;i++) {
02033                      dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
02034                      dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
02035                      dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
02036                   }
02037                   break;
02038                case GL_RGBA:
02039                   for (i=0;i<n;i++) {
02040                      dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
02041                      dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
02042                      dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
02043                      dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
02044                   }
02045                   break;
02046                case GL_BGR:
02047                   for (i=0;i<n;i++) {
02048                      dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
02049                      dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
02050                      dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
02051                   }
02052                   break;
02053                case GL_BGRA:
02054                   for (i=0;i<n;i++) {
02055                      dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
02056                      dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
02057                      dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
02058                      dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
02059                   }
02060                   break;
02061                case GL_ABGR_EXT:
02062                   for (i=0;i<n;i++) {
02063                      dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
02064                      dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
02065                      dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
02066                      dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
02067                   }
02068                   break;
02069                default:
02070                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
02071             }
02072          }
02073          break;
02074       case GL_INT:
02075          {
02076             GLint *dst = (GLint *) dstAddr;
02077             switch (dstFormat) {
02078                case GL_RED:
02079                   for (i=0;i<n;i++)
02080                      dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
02081                   break;
02082                case GL_GREEN:
02083                   for (i=0;i<n;i++)
02084                      dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
02085                   break;
02086                case GL_BLUE:
02087                   for (i=0;i<n;i++)
02088                      dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
02089                   break;
02090                case GL_ALPHA:
02091                   for (i=0;i<n;i++)
02092                      dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
02093                   break;
02094                case GL_LUMINANCE:
02095                   for (i=0;i<n;i++)
02096                      dst[i] = FLOAT_TO_INT(luminance[i]);
02097                   break;
02098                case GL_LUMINANCE_ALPHA:
02099                   for (i=0;i<n;i++) {
02100                      dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
02101                      dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
02102                   }
02103                   break;
02104                case GL_RGB:
02105                   for (i=0;i<n;i++) {
02106                      dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
02107                      dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
02108                      dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
02109                   }
02110                   break;
02111                case GL_RGBA:
02112                   for (i=0;i<n;i++) {
02113                      dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
02114                      dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
02115                      dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
02116                      dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
02117                   }
02118                   break;
02119                case GL_BGR:
02120                   for (i=0;i<n;i++) {
02121                      dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
02122                      dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
02123                      dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
02124                   }
02125                   break;
02126                case GL_BGRA:
02127                   for (i=0;i<n;i++) {
02128                      dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
02129                      dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
02130                      dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
02131                      dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
02132                   }
02133                   break;
02134                case GL_ABGR_EXT:
02135                   for (i=0;i<n;i++) {
02136                      dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
02137                      dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
02138                      dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
02139                      dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
02140                   }
02141                   break;
02142                default:
02143                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
02144             }
02145          }
02146          break;
02147       case GL_FLOAT:
02148          {
02149             GLfloat *dst = (GLfloat *) dstAddr;
02150             switch (dstFormat) {
02151                case GL_RED:
02152                   for (i=0;i<n;i++)
02153                      dst[i] = rgba[i][RCOMP];
02154                   break;
02155                case GL_GREEN:
02156                   for (i=0;i<n;i++)
02157                      dst[i] = rgba[i][GCOMP];
02158                   break;
02159                case GL_BLUE:
02160                   for (i=0;i<n;i++)
02161                      dst[i] = rgba[i][BCOMP];
02162                   break;
02163                case GL_ALPHA:
02164                   for (i=0;i<n;i++)
02165                      dst[i] = rgba[i][ACOMP];
02166                   break;
02167                case GL_LUMINANCE:
02168                   for (i=0;i<n;i++)
02169                      dst[i] = luminance[i];
02170                   break;
02171                case GL_LUMINANCE_ALPHA:
02172                   for (i=0;i<n;i++) {
02173                      dst[i*2+0] = luminance[i];
02174                      dst[i*2+1] = rgba[i][ACOMP];
02175                   }
02176                   break;
02177                case GL_RGB:
02178                   for (i=0;i<n;i++) {
02179                      dst[i*3+0] = rgba[i][RCOMP];
02180                      dst[i*3+1] = rgba[i][GCOMP];
02181                      dst[i*3+2] = rgba[i][BCOMP];
02182                   }
02183                   break;
02184                case GL_RGBA:
02185                   for (i=0;i<n;i++) {
02186                      dst[i*4+0] = rgba[i][RCOMP];
02187                      dst[i*4+1] = rgba[i][GCOMP];
02188                      dst[i*4+2] = rgba[i][BCOMP];
02189                      dst[i*4+3] = rgba[i][ACOMP];
02190                   }
02191                   break;
02192                case GL_BGR:
02193                   for (i=0;i<n;i++) {
02194                      dst[i*3+0] = rgba[i][BCOMP];
02195                      dst[i*3+1] = rgba[i][GCOMP];
02196                      dst[i*3+2] = rgba[i][RCOMP];
02197                   }
02198                   break;
02199                case GL_BGRA:
02200                   for (i=0;i<n;i++) {
02201                      dst[i*4+0] = rgba[i][BCOMP];
02202                      dst[i*4+1] = rgba[i][GCOMP];
02203                      dst[i*4+2] = rgba[i][RCOMP];
02204                      dst[i*4+3] = rgba[i][ACOMP];
02205                   }
02206                   break;
02207                case GL_ABGR_EXT:
02208                   for (i=0;i<n;i++) {
02209                      dst[i*4+0] = rgba[i][ACOMP];
02210                      dst[i*4+1] = rgba[i][BCOMP];
02211                      dst[i*4+2] = rgba[i][GCOMP];
02212                      dst[i*4+3] = rgba[i][RCOMP];
02213                   }
02214                   break;
02215                default:
02216                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
02217             }
02218          }
02219          break;
02220       case GL_HALF_FLOAT_ARB:
02221          {
02222             GLhalfARB *dst = (GLhalfARB *) dstAddr;
02223             switch (dstFormat) {
02224                case GL_RED:
02225                   for (i=0;i<n;i++)
02226                      dst[i] = _mesa_float_to_half(rgba[i][RCOMP]);
02227                   break;
02228                case GL_GREEN:
02229                   for (i=0;i<n;i++)
02230                      dst[i] = _mesa_float_to_half(rgba[i][GCOMP]);
02231                   break;
02232                case GL_BLUE:
02233                   for (i=0;i<n;i++)
02234                      dst[i] = _mesa_float_to_half(rgba[i][BCOMP]);
02235                   break;
02236                case GL_ALPHA:
02237                   for (i=0;i<n;i++)
02238                      dst[i] = _mesa_float_to_half(rgba[i][ACOMP]);
02239                   break;
02240                case GL_LUMINANCE:
02241                   for (i=0;i<n;i++)
02242                      dst[i] = _mesa_float_to_half(luminance[i]);
02243                   break;
02244                case GL_LUMINANCE_ALPHA:
02245                   for (i=0;i<n;i++) {
02246                      dst[i*2+0] = _mesa_float_to_half(luminance[i]);
02247                      dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]);
02248                   }
02249                   break;
02250                case GL_RGB:
02251                   for (i=0;i<n;i++) {
02252                      dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]);
02253                      dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
02254                      dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]);
02255                   }
02256                   break;
02257                case GL_RGBA:
02258                   for (i=0;i<n;i++) {
02259                      dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]);
02260                      dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
02261                      dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]);
02262                      dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
02263                   }
02264                   break;
02265                case GL_BGR:
02266                   for (i=0;i<n;i++) {
02267                      dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]);
02268                      dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
02269                      dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]);
02270                   }
02271                   break;
02272                case GL_BGRA:
02273                   for (i=0;i<n;i++) {
02274                      dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]);
02275                      dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
02276                      dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]);
02277                      dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
02278                   }
02279                   break;
02280                case GL_ABGR_EXT:
02281                   for (i=0;i<n;i++) {
02282                      dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]);
02283                      dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]);
02284                      dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]);
02285                      dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]);
02286                   }
02287                   break;
02288                default:
02289                   _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
02290             }
02291          }
02292          break;
02293       case GL_UNSIGNED_BYTE_3_3_2:
02294          if (dstFormat == GL_RGB) {
02295             GLubyte *dst = (GLubyte *) dstAddr;
02296             for (i=0;i<n;i++) {
02297                dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5)
02298                       | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2)
02299                       | (((GLint) (rgba[i][BCOMP] * 3.0F))     );
02300             }
02301          }
02302          break;
02303       case GL_UNSIGNED_BYTE_2_3_3_REV:
02304          if (dstFormat == GL_RGB) {
02305             GLubyte *dst = (GLubyte *) dstAddr;
02306             for (i=0;i<n;i++) {
02307                dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F))     )
02308                       | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3)
02309                       | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 6);
02310             }
02311          }
02312          break;
02313       case GL_UNSIGNED_SHORT_5_6_5:
02314          if (dstFormat == GL_RGB) {
02315             GLushort *dst = (GLushort *) dstAddr;
02316             for (i=0;i<n;i++) {
02317                dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
02318                       | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
02319                       | (((GLint) (rgba[i][BCOMP] * 31.0F))      );
02320             }
02321          }
02322          break;
02323       case GL_UNSIGNED_SHORT_5_6_5_REV:
02324          if (dstFormat == GL_RGB) {
02325             GLushort *dst = (GLushort *) dstAddr;
02326             for (i=0;i<n;i++) {
02327                dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
02328                       | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
02329                       | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11);
02330             }
02331          }
02332          break;
02333       case GL_UNSIGNED_SHORT_4_4_4_4:
02334          if (dstFormat == GL_RGBA) {
02335             GLushort *dst = (GLushort *) dstAddr;
02336             for (i=0;i<n;i++) {
02337                dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12)
02338                       | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
02339                       | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  4)
02340                       | (((GLint) (rgba[i][ACOMP] * 15.0F))      );
02341             }
02342          }
02343          else if (dstFormat == GL_BGRA) {
02344             GLushort *dst = (GLushort *) dstAddr;
02345             for (i=0;i<n;i++) {
02346                dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) << 12)
02347                       | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
02348                       | (((GLint) (rgba[i][RCOMP] * 15.0F)) <<  4)
02349                       | (((GLint) (rgba[i][ACOMP] * 15.0F))      );
02350             }
02351          }
02352          else if (dstFormat == GL_ABGR_EXT) {
02353             GLushort *dst = (GLushort *) dstAddr;
02354             for (i=0;i<n;i++) {
02355                dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12)
02356                       | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  8)
02357                       | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
02358                       | (((GLint) (rgba[i][RCOMP] * 15.0F))      );
02359             }
02360          }
02361          break;
02362       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
02363          if (dstFormat == GL_RGBA) {
02364             GLushort *dst = (GLushort *) dstAddr;
02365             for (i=0;i<n;i++) {
02366                dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F))      )
02367                       | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
02368                       | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  8)
02369                       | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
02370             }
02371          }
02372          else if (dstFormat == GL_BGRA) {
02373             GLushort *dst = (GLushort *) dstAddr;
02374             for (i=0;i<n;i++) {
02375                dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F))      )
02376                       | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
02377                       | (((GLint) (rgba[i][RCOMP] * 15.0F)) <<  8)
02378                       | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
02379             }
02380          }
02381          else if (dstFormat == GL_ABGR_EXT) {
02382             GLushort *dst = (GLushort *) dstAddr;
02383             for (i=0;i<n;i++) {
02384                dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F))      )
02385                       | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  4)
02386                       | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
02387                       | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12);
02388             }
02389          }
02390          break;
02391       case GL_UNSIGNED_SHORT_5_5_5_1:
02392          if (dstFormat == GL_RGBA) {
02393             GLushort *dst = (GLushort *) dstAddr;
02394             for (i=0;i<n;i++) {
02395                dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
02396                       | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  6)
02397                       | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  1)
02398                       | (((GLint) (rgba[i][ACOMP] *  1.0F))      );
02399             }
02400          }
02401          else if (dstFormat == GL_BGRA) {
02402             GLushort *dst = (GLushort *) dstAddr;
02403             for (i=0;i<n;i++) {
02404                dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11)
02405                       | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  6)
02406                       | (((GLint) (rgba[i][RCOMP] * 31.0F)) <<  1)
02407                       | (((GLint) (rgba[i][ACOMP] *  1.0F))      );
02408             }
02409          }
02410          else if (dstFormat == GL_ABGR_EXT) {
02411             GLushort *dst = (GLushort *) dstAddr;
02412             for (i=0;i<n;i++) {
02413                dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) << 11)
02414                       | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  6)
02415                       | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  1)
02416                       | (((GLint) (rgba[i][RCOMP] *  1.0F))      );
02417             }
02418          }
02419          break;
02420       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
02421          if (dstFormat == GL_RGBA) {
02422             GLushort *dst = (GLushort *) dstAddr;
02423             for (i=0;i<n;i++) {
02424                dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
02425                       | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  5)
02426                       | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10)
02427                       | (((GLint) (rgba[i][ACOMP] *  1.0F)) << 15);
02428             }
02429          }
02430          else if (dstFormat == GL_BGRA) {
02431             GLushort *dst = (GLushort *) dstAddr;
02432             for (i=0;i<n;i++) {
02433                dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F))      )
02434                       | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  5)
02435                       | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 10)
02436                       | (((GLint) (rgba[i][ACOMP] *  1.0F)) << 15);
02437             }
02438          }
02439          else if (dstFormat == GL_ABGR_EXT) {
02440             GLushort *dst = (GLushort *) dstAddr;
02441             for (i=0;i<n;i++) {
02442                dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F))      )
02443                       | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  5)
02444                       | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 10)
02445                       | (((GLint) (rgba[i][RCOMP] *  1.0F)) << 15);
02446             }
02447          }
02448          break;
02449       case GL_UNSIGNED_INT_8_8_8_8:
02450          if (dstFormat == GL_RGBA) {
02451             GLuint *dst = (GLuint *) dstAddr;
02452             for (i=0;i<n;i++) {
02453                dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24)
02454                       | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
02455                       | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
02456                       | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
02457             }
02458          }
02459          else if (dstFormat == GL_BGRA) {
02460             GLuint *dst = (GLuint *) dstAddr;
02461             for (i=0;i<n;i++) {
02462                dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24)
02463                       | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
02464                       | (((GLuint) (rgba[i][RCOMP] * 255.0F)) <<  8)
02465                       | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
02466             }
02467          }
02468          else if (dstFormat == GL_ABGR_EXT) {
02469             GLuint *dst = (GLuint *) dstAddr;
02470             for (i=0;i<n;i++) {
02471                dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24)
02472                       | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
02473                       | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
02474                       | (((GLuint) (rgba[i][RCOMP] * 255.0F))      );
02475             }
02476          }
02477          break;
02478       case GL_UNSIGNED_INT_8_8_8_8_REV:
02479          if (dstFormat == GL_RGBA) {
02480             GLuint *dst = (GLuint *) dstAddr;
02481             for (i=0;i<n;i++) {
02482                dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F))      )
02483                       | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
02484                       | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
02485                       | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
02486             }
02487          }
02488          else if (dstFormat == GL_BGRA) {
02489             GLuint *dst = (GLuint *) dstAddr;
02490             for (i=0;i<n;i++) {
02491                dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F))      )
02492                       | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
02493                       | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16)
02494                       | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
02495             }
02496          }
02497          else if (dstFormat == GL_ABGR_EXT) {
02498             GLuint *dst = (GLuint *) dstAddr;
02499             for (i=0;i<n;i++) {
02500                dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F))      )
02501                       | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
02502                       | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
02503                       | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24);
02504             }
02505          }
02506          break;
02507       case GL_UNSIGNED_INT_10_10_10_2:
02508          if (dstFormat == GL_RGBA) {
02509             GLuint *dst = (GLuint *) dstAddr;
02510             for (i=0;i<n;i++) {
02511                dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22)
02512                       | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
02513                       | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) <<  2)
02514                       | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
02515             }
02516          }
02517          else if (dstFormat == GL_BGRA) {
02518             GLuint *dst = (GLuint *) dstAddr;
02519             for (i=0;i<n;i++) {
02520                dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22)
02521                       | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
02522                       | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) <<  2)
02523                       | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
02524             }
02525          }
02526          else if (dstFormat == GL_ABGR_EXT) {
02527             GLuint *dst = (GLuint *) dstAddr;
02528             for (i=0;i<n;i++) {
02529                dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22)
02530                       | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12)
02531                       | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) <<  2)
02532                       | (((GLuint) (rgba[i][RCOMP] *    3.0F))      );
02533             }
02534          }
02535          break;
02536       case GL_UNSIGNED_INT_2_10_10_10_REV:
02537          if (dstFormat == GL_RGBA) {
02538             GLuint *dst = (GLuint *) dstAddr;
02539             for (i=0;i<n;i++) {
02540                dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F))      )
02541                       | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
02542                       | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20)
02543                       | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
02544             }
02545          }
02546          else if (dstFormat == GL_BGRA) {
02547             GLuint *dst = (GLuint *) dstAddr;
02548             for (i=0;i<n;i++) {
02549                dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F))      )
02550                       | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
02551                       | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20)
02552                       | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
02553             }
02554          }
02555          else if (dstFormat == GL_ABGR_EXT) {
02556             GLuint *dst = (GLuint *) dstAddr;
02557             for (i=0;i<n;i++) {
02558                dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F))      )
02559                       | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10)
02560                       | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20)
02561                       | (((GLuint) (rgba[i][RCOMP] *    3.0F)) << 30);
02562             }
02563          }
02564          break;
02565       default:
02566          _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float");
02567          return;
02568    }
02569 
02570    if (dstPacking->SwapBytes) {
02571       GLint swapSize = _mesa_sizeof_packed_type(dstType);
02572       if (swapSize == 2) {
02573          if (dstPacking->SwapBytes) {
02574             _mesa_swap2((GLushort *) dstAddr, n * comps);
02575          }
02576       }
02577       else if (swapSize == 4) {
02578          if (dstPacking->SwapBytes) {
02579             _mesa_swap4((GLuint *) dstAddr, n * comps);
02580          }
02581       }
02582    }
02583 }
02584 
02585 
02586 #define SWAP2BYTE(VALUE)            \
02587    {                        \
02588       GLubyte *bytes = (GLubyte *) &(VALUE);    \
02589       GLubyte tmp = bytes[0];           \
02590       bytes[0] = bytes[1];          \
02591       bytes[1] = tmp;               \
02592    }
02593 
02594 #define SWAP4BYTE(VALUE)            \
02595    {                        \
02596       GLubyte *bytes = (GLubyte *) &(VALUE);    \
02597       GLubyte tmp = bytes[0];           \
02598       bytes[0] = bytes[3];          \
02599       bytes[3] = tmp;               \
02600       tmp = bytes[1];               \
02601       bytes[1] = bytes[2];          \
02602       bytes[2] = tmp;               \
02603    }
02604 
02605 
02606 static void
02607 extract_uint_indexes(GLuint n, GLuint indexes[],
02608                      GLenum srcFormat, GLenum srcType, const GLvoid *src,
02609                      const struct gl_pixelstore_attrib *unpack )
02610 {
02611    ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX);
02612 
02613    ASSERT(srcType == GL_BITMAP ||
02614           srcType == GL_UNSIGNED_BYTE ||
02615           srcType == GL_BYTE ||
02616           srcType == GL_UNSIGNED_SHORT ||
02617           srcType == GL_SHORT ||
02618           srcType == GL_UNSIGNED_INT ||
02619           srcType == GL_INT ||
02620           srcType == GL_UNSIGNED_INT_24_8_EXT ||
02621           srcType == GL_HALF_FLOAT_ARB ||
02622           srcType == GL_FLOAT);
02623 
02624    switch (srcType) {
02625       case GL_BITMAP:
02626          {
02627             GLubyte *ubsrc = (GLubyte *) src;
02628             if (unpack->LsbFirst) {
02629                GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
02630                GLuint i;
02631                for (i = 0; i < n; i++) {
02632                   indexes[i] = (*ubsrc & mask) ? 1 : 0;
02633                   if (mask == 128) {
02634                      mask = 1;
02635                      ubsrc++;
02636                   }
02637                   else {
02638                      mask = mask << 1;
02639                   }
02640                }
02641             }
02642             else {
02643                GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
02644                GLuint i;
02645                for (i = 0; i < n; i++) {
02646                   indexes[i] = (*ubsrc & mask) ? 1 : 0;
02647                   if (mask == 1) {
02648                      mask = 128;
02649                      ubsrc++;
02650                   }
02651                   else {
02652                      mask = mask >> 1;
02653                   }
02654                }
02655             }
02656          }
02657          break;
02658       case GL_UNSIGNED_BYTE:
02659          {
02660             GLuint i;
02661             const GLubyte *s = (const GLubyte *) src;
02662             for (i = 0; i < n; i++)
02663                indexes[i] = s[i];
02664          }
02665          break;
02666       case GL_BYTE:
02667          {
02668             GLuint i;
02669             const GLbyte *s = (const GLbyte *) src;
02670             for (i = 0; i < n; i++)
02671                indexes[i] = s[i];
02672          }
02673          break;
02674       case GL_UNSIGNED_SHORT:
02675          {
02676             GLuint i;
02677             const GLushort *s = (const GLushort *) src;
02678             if (unpack->SwapBytes) {
02679                for (i = 0; i < n; i++) {
02680                   GLushort value = s[i];
02681                   SWAP2BYTE(value);
02682                   indexes[i] = value;
02683                }
02684             }
02685             else {
02686                for (i = 0; i < n; i++)
02687                   indexes[i] = s[i];
02688             }
02689          }
02690          break;
02691       case GL_SHORT:
02692          {
02693             GLuint i;
02694             const GLshort *s = (const GLshort *) src;
02695             if (unpack->SwapBytes) {
02696                for (i = 0; i < n; i++) {
02697                   GLshort value = s[i];
02698                   SWAP2BYTE(value);
02699                   indexes[i] = value;
02700                }
02701             }
02702             else {
02703                for (i = 0; i < n; i++)
02704                   indexes[i] = s[i];
02705             }
02706          }
02707          break;
02708       case GL_UNSIGNED_INT:
02709          {
02710             GLuint i;
02711             const GLuint *s = (const GLuint *) src;
02712             if (unpack->SwapBytes) {
02713                for (i = 0; i < n; i++) {
02714                   GLuint value = s[i];
02715                   SWAP4BYTE(value);
02716                   indexes[i] = value;
02717                }
02718             }
02719             else {
02720                for (i = 0; i < n; i++)
02721                   indexes[i] = s[i];
02722             }
02723          }
02724          break;
02725       case GL_INT:
02726          {
02727             GLuint i;
02728             const GLint *s = (const GLint *) src;
02729             if (unpack->SwapBytes) {
02730                for (i = 0; i < n; i++) {
02731                   GLint value = s[i];
02732                   SWAP4BYTE(value);
02733                   indexes[i] = value;
02734                }
02735             }
02736             else {
02737                for (i = 0; i < n; i++)
02738                   indexes[i] = s[i];
02739             }
02740          }
02741          break;
02742       case GL_FLOAT:
02743          {
02744             GLuint i;
02745             const GLfloat *s = (const GLfloat *) src;
02746             if (unpack->SwapBytes) {
02747                for (i = 0; i < n; i++) {
02748                   GLfloat value = s[i];
02749                   SWAP4BYTE(value);
02750                   indexes[i] = (GLuint) value;
02751                }
02752             }
02753             else {
02754                for (i = 0; i < n; i++)
02755                   indexes[i] = (GLuint) s[i];
02756             }
02757          }
02758          break;
02759       case GL_HALF_FLOAT_ARB:
02760          {
02761             GLuint i;
02762             const GLhalfARB *s = (const GLhalfARB *) src;
02763             if (unpack->SwapBytes) {
02764                for (i = 0; i < n; i++) {
02765                   GLhalfARB value = s[i];
02766                   SWAP2BYTE(value);
02767                   indexes[i] = (GLuint) _mesa_half_to_float(value);
02768                }
02769             }
02770             else {
02771                for (i = 0; i < n; i++)
02772                   indexes[i] = (GLuint) _mesa_half_to_float(s[i]);
02773             }
02774          }
02775          break;
02776       case GL_UNSIGNED_INT_24_8_EXT:
02777          {
02778             GLuint i;
02779             const GLuint *s = (const GLuint *) src;
02780             if (unpack->SwapBytes) {
02781                for (i = 0; i < n; i++) {
02782                   GLuint value = s[i];
02783                   SWAP4BYTE(value);
02784                   indexes[i] = value & 0xff;  /* lower 8 bits */
02785                }
02786             }
02787             else {
02788                for (i = 0; i < n; i++)
02789                   indexes[i] = s[i] & 0xfff;  /* lower 8 bits */
02790             }
02791          }
02792          break;
02793 
02794       default:
02795          _mesa_problem(NULL, "bad srcType in extract_uint_indexes");
02796          return;
02797    }
02798 }
02799 
02800 
02801 /*
02802  * This function extracts floating point RGBA values from arbitrary
02803  * image data.  srcFormat and srcType are the format and type parameters
02804  * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
02805  *
02806  * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
02807  * implements the "Conversion to floating point", "Conversion to RGB",
02808  * and "Final Expansion to RGBA" operations.
02809  *
02810  * Args:  n - number of pixels
02811  *        rgba - output colors
02812  *        srcFormat - format of incoming data
02813  *        srcType - data type of incoming data
02814  *        src - source data pointer
02815  *        swapBytes - perform byteswapping of incoming data?
02816  */
02817 static void
02818 extract_float_rgba(GLuint n, GLfloat rgba[][4],
02819                    GLenum srcFormat, GLenum srcType, const GLvoid *src,
02820                    GLboolean swapBytes)
02821 {
02822    GLint redIndex, greenIndex, blueIndex, alphaIndex;
02823    GLint stride;
02824    GLint rComp, bComp, gComp, aComp;
02825 
02826    ASSERT(srcFormat == GL_RED ||
02827           srcFormat == GL_GREEN ||
02828           srcFormat == GL_BLUE ||
02829           srcFormat == GL_ALPHA ||
02830           srcFormat == GL_LUMINANCE ||
02831           srcFormat == GL_LUMINANCE_ALPHA ||
02832           srcFormat == GL_INTENSITY ||
02833           srcFormat == GL_RGB ||
02834           srcFormat == GL_BGR ||
02835           srcFormat == GL_RGBA ||
02836           srcFormat == GL_BGRA ||
02837           srcFormat == GL_ABGR_EXT);
02838 
02839    ASSERT(srcType == GL_UNSIGNED_BYTE ||
02840           srcType == GL_BYTE ||
02841           srcType == GL_UNSIGNED_SHORT ||
02842           srcType == GL_SHORT ||
02843           srcType == GL_UNSIGNED_INT ||
02844           srcType == GL_INT ||
02845           srcType == GL_HALF_FLOAT_ARB ||
02846           srcType == GL_FLOAT ||
02847           srcType == GL_UNSIGNED_BYTE_3_3_2 ||
02848           srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
02849           srcType == GL_UNSIGNED_SHORT_5_6_5 ||
02850           srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
02851           srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
02852           srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
02853           srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
02854           srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
02855           srcType == GL_UNSIGNED_INT_8_8_8_8 ||
02856           srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
02857           srcType == GL_UNSIGNED_INT_10_10_10_2 ||
02858           srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
02859 
02860    rComp = gComp = bComp = aComp = -1;
02861 
02862    switch (srcFormat) {
02863       case GL_RED:
02864          redIndex = 0;
02865          greenIndex = blueIndex = alphaIndex = -1;
02866          stride = 1;
02867          break;
02868       case GL_GREEN:
02869          greenIndex = 0;
02870          redIndex = blueIndex = alphaIndex = -1;
02871          stride = 1;
02872          break;
02873       case GL_BLUE:
02874          blueIndex = 0;
02875          redIndex = greenIndex = alphaIndex = -1;
02876          stride = 1;
02877          break;
02878       case GL_ALPHA:
02879          redIndex = greenIndex = blueIndex = -1;
02880          alphaIndex = 0;
02881          stride = 1;
02882          break;
02883       case GL_LUMINANCE:
02884          redIndex = greenIndex = blueIndex = 0;
02885          alphaIndex = -1;
02886          stride = 1;
02887          break;
02888       case GL_LUMINANCE_ALPHA:
02889          redIndex = greenIndex = blueIndex = 0;
02890          alphaIndex = 1;
02891          stride = 2;
02892          break;
02893       case GL_INTENSITY:
02894          redIndex = greenIndex = blueIndex = alphaIndex = 0;
02895          stride = 1;
02896          break;
02897       case GL_RGB:
02898          redIndex = 0;
02899          greenIndex = 1;
02900          blueIndex = 2;
02901          alphaIndex = -1;
02902          rComp = 0;
02903          gComp = 1;
02904          bComp = 2;
02905          aComp = 3;
02906          stride = 3;
02907          break;
02908       case GL_BGR:
02909          redIndex = 2;
02910          greenIndex = 1;
02911          blueIndex = 0;
02912          alphaIndex = -1;
02913          rComp = 2;
02914          gComp = 1;
02915          bComp = 0;
02916          aComp = 3;
02917          stride = 3;
02918          break;
02919       case GL_RGBA:
02920          redIndex = 0;
02921          greenIndex = 1;
02922          blueIndex = 2;
02923          alphaIndex = 3;
02924          rComp = 0;
02925          gComp = 1;
02926          bComp = 2;
02927          aComp = 3;
02928          stride = 4;
02929          break;
02930       case GL_BGRA:
02931          redIndex = 2;
02932          greenIndex = 1;
02933          blueIndex = 0;
02934          alphaIndex = 3;
02935          rComp = 2;
02936          gComp = 1;
02937          bComp = 0;
02938          aComp = 3;
02939          stride = 4;
02940          break;
02941       case GL_ABGR_EXT:
02942          redIndex = 3;
02943          greenIndex = 2;
02944          blueIndex = 1;
02945          alphaIndex = 0;
02946          rComp = 3;
02947          gComp = 2;
02948          bComp = 1;
02949          aComp = 0;
02950          stride = 4;
02951          break;
02952       default:
02953          _mesa_problem(NULL, "bad srcFormat in extract float data");
02954          return;
02955    }
02956 
02957 
02958 #define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION)      \
02959    if ((INDEX) < 0) {                           \
02960       GLuint i;                             \
02961       for (i = 0; i < n; i++) {                     \
02962          rgba[i][CHANNEL] = DEFAULT;                    \
02963       }                                 \
02964    }                                    \
02965    else if (swapBytes) {                        \
02966       const TYPE *s = (const TYPE *) src;               \
02967       GLuint i;                             \
02968       for (i = 0; i < n; i++) {                     \
02969          TYPE value = s[INDEX];                     \
02970          if (sizeof(TYPE) == 2) {                   \
02971             SWAP2BYTE(value);                       \
02972          }                              \
02973          else if (sizeof(TYPE) == 4) {                  \
02974             SWAP4BYTE(value);                       \
02975          }                              \
02976          rgba[i][CHANNEL] = (GLfloat) CONVERSION(value);        \
02977          s += stride;                           \
02978       }                                 \
02979    }                                    \
02980    else {                               \
02981       const TYPE *s = (const TYPE *) src;               \
02982       GLuint i;                             \
02983       for (i = 0; i < n; i++) {                     \
02984          rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]);     \
02985          s += stride;                           \
02986       }                                 \
02987    }
02988 
02989    switch (srcType) {
02990       case GL_UNSIGNED_BYTE:
02991          PROCESS(redIndex,   RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
02992          PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
02993          PROCESS(blueIndex,  BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
02994          PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT);
02995          break;
02996       case GL_BYTE:
02997          PROCESS(redIndex,   RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
02998          PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
02999          PROCESS(blueIndex,  BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
03000          PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT);
03001          break;
03002       case GL_UNSIGNED_SHORT:
03003          PROCESS(redIndex,   RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
03004          PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
03005          PROCESS(blueIndex,  BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
03006          PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT);
03007          break;
03008       case GL_SHORT:
03009          PROCESS(redIndex,   RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
03010          PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
03011          PROCESS(blueIndex,  BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
03012          PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT);
03013          break;
03014       case GL_UNSIGNED_INT:
03015          PROCESS(redIndex,   RCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
03016          PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
03017          PROCESS(blueIndex,  BCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
03018          PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT);
03019          break;
03020       case GL_INT:
03021          PROCESS(redIndex,   RCOMP, 0.0F, GLint, INT_TO_FLOAT);
03022          PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT);
03023          PROCESS(blueIndex,  BCOMP, 0.0F, GLint, INT_TO_FLOAT);
03024          PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT);
03025          break;
03026       case GL_FLOAT:
03027          PROCESS(redIndex,   RCOMP, 0.0F, GLfloat, (GLfloat));
03028          PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat));
03029          PROCESS(blueIndex,  BCOMP, 0.0F, GLfloat, (GLfloat));
03030          PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat));
03031          break;
03032       case GL_HALF_FLOAT_ARB:
03033          PROCESS(redIndex,   RCOMP, 0.0F, GLhalfARB, _mesa_half_to_float);
03034          PROCESS(greenIndex, GCOMP, 0.0F, GLhalfARB, _mesa_half_to_float);
03035          PROCESS(blueIndex,  BCOMP, 0.0F, GLhalfARB, _mesa_half_to_float);
03036          PROCESS(alphaIndex, ACOMP, 1.0F, GLhalfARB, _mesa_half_to_float);
03037          break;
03038       case GL_UNSIGNED_BYTE_3_3_2:
03039          {
03040             const GLubyte *ubsrc = (const GLubyte *) src;
03041             GLuint i;
03042             for (i = 0; i < n; i ++) {
03043                GLubyte p = ubsrc[i];
03044                rgba[i][rComp] = ((p >> 5)      ) * (1.0F / 7.0F);
03045                rgba[i][gComp] = ((p >> 2) & 0x7) * (1.0F / 7.0F);
03046                rgba[i][bComp] = ((p     ) & 0x3) * (1.0F / 3.0F);
03047                rgba[i][aComp] = 1.0F;
03048             }
03049          }
03050          break;
03051       case GL_UNSIGNED_BYTE_2_3_3_REV:
03052          {
03053             const GLubyte *ubsrc = (const GLubyte *) src;
03054             GLuint i;
03055             for (i = 0; i < n; i ++) {
03056                GLubyte p = ubsrc[i];
03057                rgba[i][rComp] = ((p     ) & 0x7) * (1.0F / 7.0F);
03058                rgba[i][gComp] = ((p >> 3) & 0x7) * (1.0F / 7.0F);
03059                rgba[i][bComp] = ((p >> 6)      ) * (1.0F / 3.0F);
03060                rgba[i][aComp] = 1.0F;
03061             }
03062          }
03063          break;
03064       case GL_UNSIGNED_SHORT_5_6_5:
03065          if (swapBytes) {
03066             const GLushort *ussrc = (const GLushort *) src;
03067             GLuint i;
03068             for (i = 0; i < n; i ++) {
03069                GLushort p = ussrc[i];
03070                SWAP2BYTE(p);
03071                rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
03072                rgba[i][gComp] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
03073                rgba[i][bComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
03074                rgba[i][aComp] = 1.0F;
03075             }
03076          }
03077          else {
03078             const GLushort *ussrc = (const GLushort *) src;
03079             GLuint i;
03080             for (i = 0; i < n; i ++) {
03081                GLushort p = ussrc[i];
03082                rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
03083                rgba[i][gComp] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
03084                rgba[i][bComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
03085                rgba[i][aComp] = 1.0F;
03086             }
03087          }
03088          break;
03089       case GL_UNSIGNED_SHORT_5_6_5_REV:
03090          if (swapBytes) {
03091             const GLushort *ussrc = (const GLushort *) src;
03092             GLuint i;
03093             for (i = 0; i < n; i ++) {
03094                GLushort p = ussrc[i];
03095                SWAP2BYTE(p);
03096                rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
03097                rgba[i][gComp] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
03098                rgba[i][bComp] = ((p >> 11)       ) * (1.0F / 31.0F);
03099                rgba[i][aComp] = 1.0F;
03100             }
03101          }
03102          else {
03103             const GLushort *ussrc = (const GLushort *) src;
03104             GLuint i;
03105             for (i = 0; i < n; i ++) {
03106                GLushort p = ussrc[i];
03107                rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
03108                rgba[i][gComp] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
03109                rgba[i][bComp] = ((p >> 11)       ) * (1.0F / 31.0F);
03110                rgba[i][aComp] = 1.0F;
03111             }
03112          }
03113          break;
03114       case GL_UNSIGNED_SHORT_4_4_4_4:
03115          if (swapBytes) {
03116             const GLushort *ussrc = (const GLushort *) src;
03117             GLuint i;
03118             for (i = 0; i < n; i ++) {
03119                GLushort p = ussrc[i];
03120                SWAP2BYTE(p);
03121                rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
03122                rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
03123                rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
03124                rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
03125             }
03126          }
03127          else {
03128             const GLushort *ussrc = (const GLushort *) src;
03129             GLuint i;
03130             for (i = 0; i < n; i ++) {
03131                GLushort p = ussrc[i];
03132                rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
03133                rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
03134                rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
03135                rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
03136             }
03137          }
03138          break;
03139       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
03140          if (swapBytes) {
03141             const GLushort *ussrc = (const GLushort *) src;
03142             GLuint i;
03143             for (i = 0; i < n; i ++) {
03144                GLushort p = ussrc[i];
03145                SWAP2BYTE(p);
03146                rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
03147                rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
03148                rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
03149                rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
03150             }
03151          }
03152          else {
03153             const GLushort *ussrc = (const GLushort *) src;
03154             GLuint i;
03155             for (i = 0; i < n; i ++) {
03156                GLushort p = ussrc[i];
03157                rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
03158                rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
03159                rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
03160                rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
03161             }
03162          }
03163          break;
03164       case GL_UNSIGNED_SHORT_5_5_5_1:
03165          if (swapBytes) {
03166             const GLushort *ussrc = (const GLushort *) src;
03167             GLuint i;
03168             for (i = 0; i < n; i ++) {
03169                GLushort p = ussrc[i];
03170                SWAP2BYTE(p);
03171                rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
03172                rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
03173                rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
03174                rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
03175             }
03176          }
03177          else {
03178             const GLushort *ussrc = (const GLushort *) src;
03179             GLuint i;
03180             for (i = 0; i < n; i ++) {
03181                GLushort p = ussrc[i];
03182                rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
03183                rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
03184                rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
03185                rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
03186             }
03187          }
03188          break;
03189       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
03190          if (swapBytes) {
03191             const GLushort *ussrc = (const GLushort *) src;
03192             GLuint i;
03193             for (i = 0; i < n; i ++) {
03194                GLushort p = ussrc[i];
03195                SWAP2BYTE(p);
03196                rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
03197                rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
03198                rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
03199                rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
03200             }
03201          }
03202          else {
03203             const GLushort *ussrc = (const GLushort *) src;
03204             GLuint i;
03205             for (i = 0; i < n; i ++) {
03206                GLushort p = ussrc[i];
03207                rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
03208                rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
03209                rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
03210                rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
03211             }
03212          }
03213          break;
03214       case GL_UNSIGNED_INT_8_8_8_8:
03215          if (swapBytes) {
03216             const GLuint *uisrc = (const GLuint *) src;
03217             GLuint i;
03218             for (i = 0; i < n; i ++) {
03219                GLuint p = uisrc[i];
03220                rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
03221                rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
03222                rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
03223                rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
03224             }
03225          }
03226          else {
03227             const GLuint *uisrc = (const GLuint *) src;
03228             GLuint i;
03229             for (i = 0; i < n; i ++) {
03230                GLuint p = uisrc[i];
03231                rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
03232                rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
03233                rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
03234                rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
03235             }
03236          }
03237          break;
03238       case GL_UNSIGNED_INT_8_8_8_8_REV:
03239          if (swapBytes) {
03240             const GLuint *uisrc = (const GLuint *) src;
03241             GLuint i;
03242             for (i = 0; i < n; i ++) {
03243                GLuint p = uisrc[i];
03244                rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
03245                rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
03246                rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
03247                rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
03248             }
03249          }
03250          else {
03251             const GLuint *uisrc = (const GLuint *) src;
03252             GLuint i;
03253             for (i = 0; i < n; i ++) {
03254                GLuint p = uisrc[i];
03255                rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
03256                rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
03257                rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
03258                rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
03259             }
03260          }
03261          break;
03262       case GL_UNSIGNED_INT_10_10_10_2:
03263          if (swapBytes) {
03264             const GLuint *uisrc = (const GLuint *) src;
03265             GLuint i;
03266             for (i = 0; i < n; i ++) {
03267                GLuint p = uisrc[i];
03268                SWAP4BYTE(p);
03269                rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
03270                rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
03271                rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
03272                rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
03273             }
03274          }
03275          else {
03276             const GLuint *uisrc = (const GLuint *) src;
03277             GLuint i;
03278             for (i = 0; i < n; i ++) {
03279                GLuint p = uisrc[i];
03280                rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
03281                rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
03282                rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
03283                rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
03284             }
03285          }
03286          break;
03287       case GL_UNSIGNED_INT_2_10_10_10_REV:
03288          if (swapBytes) {
03289             const GLuint *uisrc = (const GLuint *) src;
03290             GLuint i;
03291             for (i = 0; i < n; i ++) {
03292                GLuint p = uisrc[i];
03293                SWAP4BYTE(p);
03294                rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
03295                rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
03296                rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
03297                rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
03298             }
03299          }
03300          else {
03301             const GLuint *uisrc = (const GLuint *) src;
03302             GLuint i;
03303             for (i = 0; i < n; i ++) {
03304                GLuint p = uisrc[i];
03305                rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
03306                rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
03307                rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
03308                rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
03309             }
03310          }
03311          break;
03312       default:
03313          _mesa_problem(NULL, "bad srcType in extract float data");
03314          break;
03315    }
03316 }
03317 
03318 
03319 /*
03320  * Unpack a row of color image data from a client buffer according to
03321  * the pixel unpacking parameters.
03322  * Return GLchan values in the specified dest image format.
03323  * This is used by glDrawPixels and glTexImage?D().
03324  * \param ctx - the context
03325  *         n - number of pixels in the span
03326  *         dstFormat - format of destination color array
03327  *         dest - the destination color array
03328  *         srcFormat - source image format
03329  *         srcType - source image  data type
03330  *         source - source image pointer
03331  *         srcPacking - pixel unpacking parameters
03332  *         transferOps - bitmask of IMAGE_*_BIT values of operations to apply
03333  *
03334  * XXX perhaps expand this to process whole images someday.
03335  */
03336 void
03337 _mesa_unpack_color_span_chan( GLcontext *ctx,
03338                               GLuint n, GLenum dstFormat, GLchan dest[],
03339                               GLenum srcFormat, GLenum srcType,
03340                               const GLvoid *source,
03341                               const struct gl_pixelstore_attrib *srcPacking,
03342                               GLbitfield transferOps )
03343 {
03344    ASSERT(dstFormat == GL_ALPHA ||
03345           dstFormat == GL_LUMINANCE ||
03346           dstFormat == GL_LUMINANCE_ALPHA ||
03347           dstFormat == GL_INTENSITY ||
03348           dstFormat == GL_RGB ||
03349           dstFormat == GL_RGBA ||
03350           dstFormat == GL_COLOR_INDEX);
03351 
03352    ASSERT(srcFormat == GL_RED ||
03353           srcFormat == GL_GREEN ||
03354           srcFormat == GL_BLUE ||
03355           srcFormat == GL_ALPHA ||
03356           srcFormat == GL_LUMINANCE ||
03357           srcFormat == GL_LUMINANCE_ALPHA ||
03358           srcFormat == GL_INTENSITY ||
03359           srcFormat == GL_RGB ||
03360           srcFormat == GL_BGR ||
03361           srcFormat == GL_RGBA ||
03362           srcFormat == GL_BGRA ||
03363           srcFormat == GL_ABGR_EXT ||
03364           srcFormat == GL_COLOR_INDEX);
03365 
03366    ASSERT(srcType == GL_BITMAP ||
03367           srcType == GL_UNSIGNED_BYTE ||
03368           srcType == GL_BYTE ||
03369           srcType == GL_UNSIGNED_SHORT ||
03370           srcType == GL_SHORT ||
03371           srcType == GL_UNSIGNED_INT ||
03372           srcType == GL_INT ||
03373           srcType == GL_HALF_FLOAT_ARB ||
03374           srcType == GL_FLOAT ||
03375           srcType == GL_UNSIGNED_BYTE_3_3_2 ||
03376           srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
03377           srcType == GL_UNSIGNED_SHORT_5_6_5 ||
03378           srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
03379           srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
03380           srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
03381           srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
03382           srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
03383           srcType == GL_UNSIGNED_INT_8_8_8_8 ||
03384           srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
03385           srcType == GL_UNSIGNED_INT_10_10_10_2 ||
03386           srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
03387 
03388    /* Try simple cases first */
03389    if (transferOps == 0) {
03390       if (srcType == CHAN_TYPE) {
03391          if (dstFormat == GL_RGBA) {
03392             if (srcFormat == GL_RGBA) {
03393                _mesa_memcpy( dest, source, n * 4 * sizeof(GLchan) );
03394                return;
03395             }
03396             else if (srcFormat == GL_RGB) {
03397                GLuint i;
03398                const GLchan *src = (const GLchan *) source;
03399                GLchan *dst = dest;
03400                for (i = 0; i < n; i++) {
03401                   dst[0] = src[0];
03402                   dst[1] = src[1];
03403                   dst[2] = src[2];
03404                   dst[3] = CHAN_MAX;
03405                   src += 3;
03406                   dst += 4;
03407                }
03408                return;
03409             }
03410          }
03411          else if (dstFormat == GL_RGB) {
03412             if (srcFormat == GL_RGB) {
03413                _mesa_memcpy( dest, source, n * 3 * sizeof(GLchan) );
03414                return;
03415             }
03416             else if (srcFormat == GL_RGBA) {
03417                GLuint i;
03418                const GLchan *src = (const GLchan *) source;
03419                GLchan *dst = dest;
03420                for (i = 0; i < n; i++) {
03421                   dst[0] = src[0];
03422                   dst[1] = src[1];
03423                   dst[2] = src[2];
03424                   src += 4;
03425                   dst += 3;
03426                }
03427                return;
03428             }
03429          }
03430          else if (dstFormat == srcFormat) {
03431             GLint comps = _mesa_components_in_format(srcFormat);
03432             assert(comps > 0);
03433             _mesa_memcpy( dest, source, n * comps * sizeof(GLchan) );
03434             return;
03435          }
03436       }
03437       /*
03438        * Common situation, loading 8bit RGBA/RGB source images
03439        * into 16/32 bit destination. (OSMesa16/32)
03440        */
03441       else if (srcType == GL_UNSIGNED_BYTE) {
03442          if (dstFormat == GL_RGBA) {
03443             if (srcFormat == GL_RGB) {
03444                GLuint i;
03445                const GLubyte *src = (const GLubyte *) source;
03446                GLchan *dst = dest;
03447                for (i = 0; i < n; i++) {
03448                   dst[0] = UBYTE_TO_CHAN(src[0]);
03449                   dst[1] = UBYTE_TO_CHAN(src[1]);
03450                   dst[2] = UBYTE_TO_CHAN(src[2]);
03451                   dst[3] = CHAN_MAX;
03452                   src += 3;
03453                   dst += 4;
03454                }
03455                return;
03456             }
03457             else if (srcFormat == GL_RGBA) {
03458                GLuint i;
03459                const GLubyte *src = (const GLubyte *) source;
03460                GLchan *dst = dest;
03461                for (i = 0; i < n; i++) {
03462                   dst[0] = UBYTE_TO_CHAN(src[0]);
03463                   dst[1] = UBYTE_TO_CHAN(src[1]);
03464                   dst[2] = UBYTE_TO_CHAN(src[2]);
03465                   dst[3] = UBYTE_TO_CHAN(src[3]);
03466                   src += 4;
03467                   dst += 4;
03468                }
03469                return;
03470              }
03471          }
03472          else if (dstFormat == GL_RGB) {
03473             if (srcFormat == GL_RGB) {
03474                GLuint i;
03475                const GLubyte *src = (const GLubyte *) source;
03476                GLchan *dst = dest;
03477                for (i = 0; i < n; i++) {
03478                   dst[0] = UBYTE_TO_CHAN(src[0]);
03479                   dst[1] = UBYTE_TO_CHAN(src[1]);
03480                   dst[2] = UBYTE_TO_CHAN(src[2]);
03481                   src += 3;
03482                   dst += 3;
03483                }
03484                return;
03485             }
03486             else if (srcFormat == GL_RGBA) {
03487                GLuint i;
03488                const GLubyte *src = (const GLubyte *) source;
03489                GLchan *dst = dest;
03490                for (i = 0; i < n; i++) {
03491                   dst[0] = UBYTE_TO_CHAN(src[0]);
03492                   dst[1] = UBYTE_TO_CHAN(src[1]);
03493                   dst[2] = UBYTE_TO_CHAN(src[2]);
03494                   src += 4;
03495                   dst += 3;
03496                }
03497                return;
03498             }
03499          }
03500       }
03501    }
03502 
03503 
03504    /* general solution begins here */
03505    {
03506       GLint dstComponents;
03507       GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
03508       GLint dstLuminanceIndex, dstIntensityIndex;
03509       GLfloat rgba[MAX_WIDTH][4];
03510 
03511       dstComponents = _mesa_components_in_format( dstFormat );
03512       /* source & dest image formats should have been error checked by now */
03513       assert(dstComponents > 0);
03514 
03515       /*
03516        * Extract image data and convert to RGBA floats
03517        */
03518       assert(n <= MAX_WIDTH);
03519       if (srcFormat == GL_COLOR_INDEX) {
03520          GLuint indexes[MAX_WIDTH];
03521          extract_uint_indexes(n, indexes, srcFormat, srcType, source,
03522                               srcPacking);
03523 
03524          if (dstFormat == GL_COLOR_INDEX) {
03525             GLuint i;
03526             _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
03527             /* convert to GLchan and return */
03528             for (i = 0; i < n; i++) {
03529                dest[i] = (GLchan) (indexes[i] & 0xff);
03530             }
03531             return;
03532          }
03533          else {
03534             /* Convert indexes to RGBA */
03535             if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
03536                shift_and_offset_ci(ctx, n, indexes);
03537             }
03538             _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
03539          }
03540 
03541          /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
03542           * with color indexes.
03543           */
03544          transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
03545       }
03546       else {
03547          /* non-color index data */
03548          extract_float_rgba(n, rgba, srcFormat, srcType, source,
03549                             srcPacking->SwapBytes);
03550       }
03551 
03552       /* Need to clamp if returning GLubytes or GLushorts */
03553 #if CHAN_TYPE != GL_FLOAT
03554       transferOps |= IMAGE_CLAMP_BIT;
03555 #endif
03556 
03557       if (transferOps) {
03558          _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
03559       }
03560 
03561       /* Now determine which color channels we need to produce.
03562        * And determine the dest index (offset) within each color tuple.
03563        */
03564       switch (dstFormat) {
03565          case GL_ALPHA:
03566             dstAlphaIndex = 0;
03567             dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
03568             dstLuminanceIndex = dstIntensityIndex = -1;
03569             break;
03570          case GL_LUMINANCE:
03571             dstLuminanceIndex = 0;
03572             dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
03573             dstIntensityIndex = -1;
03574             break;
03575          case GL_LUMINANCE_ALPHA:
03576             dstLuminanceIndex = 0;
03577             dstAlphaIndex = 1;
03578             dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
03579             dstIntensityIndex = -1;
03580             break;
03581          case GL_INTENSITY:
03582             dstIntensityIndex = 0;
03583             dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
03584             dstLuminanceIndex = -1;
03585             break;
03586          case GL_RGB:
03587             dstRedIndex = 0;
03588             dstGreenIndex = 1;
03589             dstBlueIndex = 2;
03590             dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
03591             break;
03592          case GL_RGBA:
03593             dstRedIndex = 0;
03594             dstGreenIndex = 1;
03595             dstBlueIndex = 2;
03596             dstAlphaIndex = 3;
03597             dstLuminanceIndex = dstIntensityIndex = -1;
03598             break;
03599          default:
03600             _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()");
03601             return;
03602       }
03603 
03604 
03605       /* Now return the GLchan data in the requested dstFormat */
03606 
03607       if (dstRedIndex >= 0) {
03608          GLchan *dst = dest;
03609          GLuint i;
03610          for (i = 0; i < n; i++) {
03611             CLAMPED_FLOAT_TO_CHAN(dst[dstRedIndex], rgba[i][RCOMP]);
03612             dst += dstComponents;
03613          }
03614       }
03615 
03616       if (dstGreenIndex >= 0) {
03617          GLchan *dst = dest;
03618          GLuint i;
03619          for (i = 0; i < n; i++) {
03620             CLAMPED_FLOAT_TO_CHAN(dst[dstGreenIndex], rgba[i][GCOMP]);
03621             dst += dstComponents;
03622          }
03623       }
03624 
03625       if (dstBlueIndex >= 0) {
03626          GLchan *dst = dest;
03627          GLuint i;
03628          for (i = 0; i < n; i++) {
03629             CLAMPED_FLOAT_TO_CHAN(dst[dstBlueIndex], rgba[i][BCOMP]);
03630             dst += dstComponents;
03631          }
03632       }
03633 
03634       if (dstAlphaIndex >= 0) {
03635          GLchan *dst = dest;
03636          GLuint i;
03637          for (i = 0; i < n; i++) {
03638             CLAMPED_FLOAT_TO_CHAN(dst[dstAlphaIndex], rgba[i][ACOMP]);
03639             dst += dstComponents;
03640          }
03641       }
03642 
03643       if (dstIntensityIndex >= 0) {
03644          GLchan *dst = dest;
03645          GLuint i;
03646          assert(dstIntensityIndex == 0);
03647          assert(dstComponents == 1);
03648          for (i = 0; i < n; i++) {
03649             /* Intensity comes from red channel */
03650             CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]);
03651          }
03652       }
03653 
03654       if (dstLuminanceIndex >= 0) {
03655          GLchan *dst = dest;
03656          GLuint i;
03657          assert(dstLuminanceIndex == 0);
03658          for (i = 0; i < n; i++) {
03659             /* Luminance comes from red channel */
03660             CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]);
03661             dst += dstComponents;
03662          }
03663       }
03664    }
03665 }
03666 
03667 
03672 void
03673 _mesa_unpack_color_span_float( GLcontext *ctx,
03674                                GLuint n, GLenum dstFormat, GLfloat dest[],
03675                                GLenum srcFormat, GLenum srcType,
03676                                const GLvoid *source,
03677                                const struct gl_pixelstore_attrib *srcPacking,
03678                                GLbitfield transferOps )
03679 {
03680    ASSERT(dstFormat == GL_ALPHA ||
03681           dstFormat == GL_LUMINANCE ||
03682           dstFormat == GL_LUMINANCE_ALPHA ||
03683           dstFormat == GL_INTENSITY ||
03684           dstFormat == GL_RGB ||
03685           dstFormat == GL_RGBA ||
03686           dstFormat == GL_COLOR_INDEX);
03687 
03688    ASSERT(srcFormat == GL_RED ||
03689           srcFormat == GL_GREEN ||
03690           srcFormat == GL_BLUE ||
03691           srcFormat == GL_ALPHA ||
03692           srcFormat == GL_LUMINANCE ||
03693           srcFormat == GL_LUMINANCE_ALPHA ||
03694           srcFormat == GL_INTENSITY ||
03695           srcFormat == GL_RGB ||
03696           srcFormat == GL_BGR ||
03697           srcFormat == GL_RGBA ||
03698           srcFormat == GL_BGRA ||
03699           srcFormat == GL_ABGR_EXT ||
03700           srcFormat == GL_COLOR_INDEX);
03701 
03702    ASSERT(srcType == GL_BITMAP ||
03703           srcType == GL_UNSIGNED_BYTE ||
03704           srcType == GL_BYTE ||
03705           srcType == GL_UNSIGNED_SHORT ||
03706           srcType == GL_SHORT ||
03707           srcType == GL_UNSIGNED_INT ||
03708           srcType == GL_INT ||
03709           srcType == GL_HALF_FLOAT_ARB ||
03710           srcType == GL_FLOAT ||
03711           srcType == GL_UNSIGNED_BYTE_3_3_2 ||
03712           srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
03713           srcType == GL_UNSIGNED_SHORT_5_6_5 ||
03714           srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
03715           srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
03716           srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
03717           srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
03718           srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
03719           srcType == GL_UNSIGNED_INT_8_8_8_8 ||
03720           srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
03721           srcType == GL_UNSIGNED_INT_10_10_10_2 ||
03722           srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
03723 
03724    /* general solution, no special cases, yet */
03725    {
03726       GLint dstComponents;
03727       GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
03728       GLint dstLuminanceIndex, dstIntensityIndex;
03729       GLfloat rgba[MAX_WIDTH][4];
03730 
03731       dstComponents = _mesa_components_in_format( dstFormat );
03732       /* source & dest image formats should have been error checked by now */
03733       assert(dstComponents > 0);
03734 
03735       /*
03736        * Extract image data and convert to RGBA floats
03737        */
03738       assert(n <= MAX_WIDTH);
03739       if (srcFormat == GL_COLOR_INDEX) {
03740          GLuint indexes[MAX_WIDTH];
03741          extract_uint_indexes(n, indexes, srcFormat, srcType, source,
03742                               srcPacking);
03743 
03744          if (dstFormat == GL_COLOR_INDEX) {
03745             GLuint i;
03746             _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
03747             /* convert to GLchan and return */
03748             for (i = 0; i < n; i++) {
03749                dest[i] = (GLchan) (indexes[i] & 0xff);
03750             }
03751             return;
03752          }
03753          else {
03754             /* Convert indexes to RGBA */
03755             if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
03756                shift_and_offset_ci(ctx, n, indexes);
03757             }
03758             _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
03759          }
03760 
03761          /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
03762           * with color indexes.
03763           */
03764          transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
03765       }
03766       else {
03767          /* non-color index data */
03768          extract_float_rgba(n, rgba, srcFormat, srcType, source,
03769                             srcPacking->SwapBytes);
03770       }
03771 
03772       if (transferOps) {
03773          _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
03774       }
03775 
03776       /* Now determine which color channels we need to produce.
03777        * And determine the dest index (offset) within each color tuple.
03778        */
03779       switch (dstFormat) {
03780          case GL_ALPHA:
03781             dstAlphaIndex = 0;
03782             dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
03783             dstLuminanceIndex = dstIntensityIndex = -1;
03784             break;
03785          case GL_LUMINANCE:
03786             dstLuminanceIndex = 0;
03787             dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
03788             dstIntensityIndex = -1;
03789             break;
03790          case GL_LUMINANCE_ALPHA:
03791             dstLuminanceIndex = 0;
03792             dstAlphaIndex = 1;
03793             dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
03794             dstIntensityIndex = -1;
03795             break;
03796          case GL_INTENSITY:
03797             dstIntensityIndex = 0;
03798             dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
03799             dstLuminanceIndex = -1;
03800             break;
03801          case GL_RGB:
03802             dstRedIndex = 0;
03803             dstGreenIndex = 1;
03804             dstBlueIndex = 2;
03805             dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
03806             break;
03807          case GL_RGBA:
03808             dstRedIndex = 0;
03809             dstGreenIndex = 1;
03810             dstBlueIndex = 2;
03811             dstAlphaIndex = 3;
03812             dstLuminanceIndex = dstIntensityIndex = -1;
03813             break;
03814          default:
03815             _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_color_span_float()");
03816             return;
03817       }
03818 
03819       /* Now pack results in the requested dstFormat */
03820       if (dstRedIndex >= 0) {
03821          GLfloat *dst = dest;
03822          GLuint i;
03823          for (i = 0; i < n; i++) {
03824             dst[dstRedIndex] = rgba[i][RCOMP];
03825             dst += dstComponents;
03826          }
03827       }
03828 
03829       if (dstGreenIndex >= 0) {
03830          GLfloat *dst = dest;
03831          GLuint i;
03832          for (i = 0; i < n; i++) {
03833             dst[dstGreenIndex] = rgba[i][GCOMP];
03834             dst += dstComponents;
03835          }
03836       }
03837 
03838       if (dstBlueIndex >= 0) {
03839          GLfloat *dst = dest;
03840          GLuint i;
03841          for (i = 0; i < n; i++) {
03842             dst[dstBlueIndex] = rgba[i][BCOMP];
03843             dst += dstComponents;
03844          }
03845       }
03846 
03847       if (dstAlphaIndex >= 0) {
03848          GLfloat *dst = dest;
03849          GLuint i;
03850          for (i = 0; i < n; i++) {
03851             dst[dstAlphaIndex] = rgba[i][ACOMP];
03852             dst += dstComponents;
03853          }
03854       }
03855 
03856       if (dstIntensityIndex >= 0) {
03857          GLfloat *dst = dest;
03858          GLuint i;
03859          assert(dstIntensityIndex == 0);
03860          assert(dstComponents == 1);
03861          for (i = 0; i < n; i++) {
03862             /* Intensity comes from red channel */
03863             dst[i] = rgba[i][RCOMP];
03864          }
03865       }
03866 
03867       if (dstLuminanceIndex >= 0) {
03868          GLfloat *dst = dest;
03869          GLuint i;
03870          assert(dstLuminanceIndex == 0);
03871          for (i = 0; i < n; i++) {
03872             /* Luminance comes from red channel */
03873             dst[0] = rgba[i][RCOMP];
03874             dst += dstComponents;
03875          }
03876       }
03877    }
03878 }
03879 
03880 
03881 /*
03882  * Unpack a row of color index data from a client buffer according to
03883  * the pixel unpacking parameters.
03884  * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
03885  *
03886  * Args:  ctx - the context
03887  *        n - number of pixels
03888  *        dstType - destination data type
03889  *        dest - destination array
03890  *        srcType - source pixel type
03891  *        source - source data pointer
03892  *        srcPacking - pixel unpacking parameters
03893  *        transferOps - the pixel transfer operations to apply
03894  */
03895 void
03896 _mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
03897                          GLenum dstType, GLvoid *dest,
03898                          GLenum srcType, const GLvoid *source,
03899                          const struct gl_pixelstore_attrib *srcPacking,
03900                          GLbitfield transferOps )
03901 {
03902    ASSERT(srcType == GL_BITMAP ||
03903           srcType == GL_UNSIGNED_BYTE ||
03904           srcType == GL_BYTE ||
03905           srcType == GL_UNSIGNED_SHORT ||
03906           srcType == GL_SHORT ||
03907           srcType == GL_UNSIGNED_INT ||
03908           srcType == GL_INT ||
03909           srcType == GL_HALF_FLOAT_ARB ||
03910           srcType == GL_FLOAT);
03911 
03912    ASSERT(dstType == GL_UNSIGNED_BYTE ||
03913           dstType == GL_UNSIGNED_SHORT ||
03914           dstType == GL_UNSIGNED_INT);
03915 
03916 
03917    transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
03918 
03919    /*
03920     * Try simple cases first
03921     */
03922    if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
03923        && dstType == GL_UNSIGNED_BYTE) {
03924       _mesa_memcpy(dest, source, n * sizeof(GLubyte));
03925    }
03926    else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
03927             && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
03928       _mesa_memcpy(dest, source, n * sizeof(GLuint));
03929    }
03930    else {
03931       /*
03932        * general solution
03933        */
03934       GLuint indexes[MAX_WIDTH];
03935       assert(n <= MAX_WIDTH);
03936 
03937       extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
03938                            srcPacking);
03939 
03940       if (transferOps)
03941          _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
03942 
03943       /* convert to dest type */
03944       switch (dstType) {
03945          case GL_UNSIGNED_BYTE:
03946             {
03947                GLubyte *dst = (GLubyte *) dest;
03948                GLuint i;
03949                for (i = 0; i < n; i++) {
03950                   dst[i] = (GLubyte) (indexes[i] & 0xff);
03951                }
03952             }
03953             break;
03954          case GL_UNSIGNED_SHORT:
03955             {
03956                GLuint *dst = (GLuint *) dest;
03957                GLuint i;
03958                for (i = 0; i < n; i++) {
03959                   dst[i] = (GLushort) (indexes[i] & 0xffff);
03960                }
03961             }
03962             break;
03963          case GL_UNSIGNED_INT:
03964             _mesa_memcpy(dest, indexes, n * sizeof(GLuint));
03965             break;
03966          default:
03967             _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
03968       }
03969    }
03970 }
03971 
03972 
03973 void
03974 _mesa_pack_index_span( const GLcontext *ctx, GLuint n,
03975                        GLenum dstType, GLvoid *dest, const GLuint *source,
03976                        const struct gl_pixelstore_attrib *dstPacking,
03977                        GLbitfield transferOps )
03978 {
03979    GLuint indexes[MAX_WIDTH];
03980 
03981    ASSERT(n <= MAX_WIDTH);
03982 
03983    transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
03984 
03985    if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
03986       /* make a copy of input */
03987       _mesa_memcpy(indexes, source, n * sizeof(GLuint));
03988       _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
03989       source = indexes;
03990    }
03991 
03992    switch (dstType) {
03993    case GL_UNSIGNED_BYTE:
03994       {
03995          GLubyte *dst = (GLubyte *) dest;
03996          GLuint i;
03997          for (i = 0; i < n; i++) {
03998             *dst++ = (GLubyte) source[i];
03999          }
04000       }
04001       break;
04002    case GL_BYTE:
04003       {
04004          GLbyte *dst = (GLbyte *) dest;
04005          GLuint i;
04006          for (i = 0; i < n; i++) {
04007             dst[i] = (GLbyte) source[i];
04008          }
04009       }
04010       break;
04011    case GL_UNSIGNED_SHORT:
04012       {
04013          GLushort *dst = (GLushort *) dest;
04014          GLuint i;
04015          for (i = 0; i < n; i++) {
04016             dst[i] = (GLushort) source[i];
04017          }
04018          if (dstPacking->SwapBytes) {
04019             _mesa_swap2( (GLushort *) dst, n );
04020          }
04021       }
04022       break;
04023    case GL_SHORT:
04024       {
04025          GLshort *dst = (GLshort *) dest;
04026          GLuint i;
04027          for (i = 0; i < n; i++) {
04028             dst[i] = (GLshort) source[i];
04029          }
04030          if (dstPacking->SwapBytes) {
04031             _mesa_swap2( (GLushort *) dst, n );
04032          }
04033       }
04034       break;
04035    case GL_UNSIGNED_INT:
04036       {
04037          GLuint *dst = (GLuint *) dest;
04038          GLuint i;
04039          for (i = 0; i < n; i++) {
04040             dst[i] = (GLuint) source[i];
04041          }
04042          if (dstPacking->SwapBytes) {
04043             _mesa_swap4( (GLuint *) dst, n );
04044          }
04045       }
04046       break;
04047    case GL_INT:
04048       {
04049          GLint *dst = (GLint *) dest;
04050          GLuint i;
04051          for (i = 0; i < n; i++) {
04052             dst[i] = (GLint) source[i];
04053          }
04054          if (dstPacking->SwapBytes) {
04055             _mesa_swap4( (GLuint *) dst, n );
04056          }
04057       }
04058       break;
04059    case GL_FLOAT:
04060       {
04061          GLfloat *dst = (GLfloat *) dest;
04062          GLuint i;
04063          for (i = 0; i < n; i++) {
04064             dst[i] = (GLfloat) source[i];
04065          }
04066          if (dstPacking->SwapBytes) {
04067             _mesa_swap4( (GLuint *) dst, n );
04068          }
04069       }
04070       break;
04071    case GL_HALF_FLOAT_ARB:
04072       {
04073          GLhalfARB *dst = (GLhalfARB *) dest;
04074          GLuint i;
04075          for (i = 0; i < n; i++) {
04076             dst[i] = _mesa_float_to_half((GLfloat) source[i]);
04077          }
04078          if (dstPacking->SwapBytes) {
04079             _mesa_swap2( (GLushort *) dst, n );
04080          }
04081       }
04082       break;
04083    default:
04084       _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
04085    }
04086 }
04087 
04088 
04089 /*
04090  * Unpack a row of stencil data from a client buffer according to
04091  * the pixel unpacking parameters.
04092  * This is (or will be) used by glDrawPixels
04093  *
04094  * Args:  ctx - the context
04095  *        n - number of pixels
04096  *        dstType - destination data type
04097  *        dest - destination array
04098  *        srcType - source pixel type
04099  *        source - source data pointer
04100  *        srcPacking - pixel unpacking parameters
04101  *        transferOps - apply offset/bias/lookup ops?
04102  */
04103 void
04104 _mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
04105                            GLenum dstType, GLvoid *dest,
04106                            GLenum srcType, const GLvoid *source,
04107                            const struct gl_pixelstore_attrib *srcPacking,
04108                            GLbitfield transferOps )
04109 {
04110    ASSERT(srcType == GL_BITMAP ||
04111           srcType == GL_UNSIGNED_BYTE ||
04112           srcType == GL_BYTE ||
04113           srcType == GL_UNSIGNED_SHORT ||
04114           srcType == GL_SHORT ||
04115           srcType == GL_UNSIGNED_INT ||
04116           srcType == GL_INT ||
04117           srcType == GL_UNSIGNED_INT_24_8_EXT ||
04118           srcType == GL_HALF_FLOAT_ARB ||
04119           srcType == GL_FLOAT);
04120 
04121    ASSERT(dstType == GL_UNSIGNED_BYTE ||
04122           dstType == GL_UNSIGNED_SHORT ||
04123           dstType == GL_UNSIGNED_INT);
04124 
04125    /* only shift and offset apply to stencil */
04126    transferOps &= IMAGE_SHIFT_OFFSET_BIT;
04127 
04128    /*
04129     * Try simple cases first
04130     */
04131    if (transferOps == 0 &&
04132        !ctx->Pixel.MapStencilFlag &&
04133        srcType == GL_UNSIGNED_BYTE &&
04134        dstType == GL_UNSIGNED_BYTE) {
04135       _mesa_memcpy(dest, source, n * sizeof(GLubyte));
04136    }
04137    else if (transferOps == 0 &&
04138             !ctx->Pixel.MapStencilFlag &&
04139             srcType == GL_UNSIGNED_INT &&
04140             dstType == GL_UNSIGNED_INT &&
04141             !srcPacking->SwapBytes) {
04142       _mesa_memcpy(dest, source, n * sizeof(GLuint));
04143    }
04144    else {
04145       /*
04146        * general solution
04147        */
04148       GLuint indexes[MAX_WIDTH];
04149       assert(n <= MAX_WIDTH);
04150 
04151       extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source,
04152                            srcPacking);
04153 
04154       if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
04155          /* shift and offset indexes */
04156          shift_and_offset_ci(ctx, n, indexes);
04157       }
04158 
04159       if (ctx->Pixel.MapStencilFlag) {
04160          /* Apply stencil lookup table */
04161          const GLuint mask = ctx->PixelMaps.StoS.Size - 1;
04162          GLuint i;
04163          for (i = 0; i < n; i++) {
04164             indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ];
04165          }
04166       }
04167 
04168       /* convert to dest type */
04169       switch (dstType) {
04170          case GL_UNSIGNED_BYTE:
04171             {
04172                GLubyte *dst = (GLubyte *) dest;
04173                GLuint i;
04174                for (i = 0; i < n; i++) {
04175                   dst[i] = (GLubyte) (indexes[i] & 0xff);
04176                }
04177             }
04178             break;
04179          case GL_UNSIGNED_SHORT:
04180             {
04181                GLuint *dst = (GLuint *) dest;
04182                GLuint i;
04183                for (i = 0; i < n; i++) {
04184                   dst[i] = (GLushort) (indexes[i] & 0xffff);
04185                }
04186             }
04187             break;
04188          case GL_UNSIGNED_INT:
04189             _mesa_memcpy(dest, indexes, n * sizeof(GLuint));
04190             break;
04191          default:
04192             _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
04193       }
04194    }
04195 }
04196 
04197 
04198 void
04199 _mesa_pack_stencil_span( const GLcontext *ctx, GLuint n,
04200                          GLenum dstType, GLvoid *dest, const GLstencil *source,
04201                          const struct gl_pixelstore_attrib *dstPacking )
04202 {
04203    GLstencil stencil[MAX_WIDTH];
04204 
04205    ASSERT(n <= MAX_WIDTH);
04206 
04207    if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
04208        ctx->Pixel.MapStencilFlag) {
04209       /* make a copy of input */
04210       _mesa_memcpy(stencil, source, n * sizeof(GLstencil));
04211       _mesa_apply_stencil_transfer_ops(ctx, n, stencil);
04212       source = stencil;
04213    }
04214 
04215    switch (dstType) {
04216    case GL_UNSIGNED_BYTE:
04217       if (sizeof(GLstencil) == 1) {
04218          _mesa_memcpy( dest, source, n );
04219       }
04220       else {
04221          GLubyte *dst = (GLubyte *) dest;
04222          GLuint i;
04223          for (i=0;i<n;i++) {
04224             dst[i] = (GLubyte) source[i];
04225          }
04226       }
04227       break;
04228    case GL_BYTE:
04229       {
04230          GLbyte *dst = (GLbyte *) dest;
04231          GLuint i;
04232          for (i=0;i<n;i++) {
04233             dst[i] = (GLbyte) (source[i] & 0x7f);
04234          }
04235       }
04236       break;
04237    case GL_UNSIGNED_SHORT:
04238       {
04239          GLushort *dst = (GLushort *) dest;
04240          GLuint i;
04241          for (i=0;i<n;i++) {
04242             dst[i] = (GLushort) source[i];
04243          }
04244          if (dstPacking->SwapBytes) {
04245             _mesa_swap2( (GLushort *) dst, n );
04246          }
04247       }
04248       break;
04249    case GL_SHORT:
04250       {
04251          GLshort *dst = (GLshort *) dest;
04252          GLuint i;
04253          for (i=0;i<n;i++) {
04254             dst[i] = (GLshort) source[i];
04255          }
04256          if (dstPacking->SwapBytes) {
04257             _mesa_swap2( (GLushort *) dst, n );
04258          }
04259       }
04260       break;
04261    case GL_UNSIGNED_INT:
04262       {
04263          GLuint *dst = (GLuint *) dest;
04264          GLuint i;
04265          for (i=0;i<n;i++) {
04266             dst[i] = (GLuint) source[i];
04267          }
04268          if (dstPacking->SwapBytes) {
04269             _mesa_swap4( (GLuint *) dst, n );
04270          }
04271       }
04272       break;
04273    case GL_INT:
04274       {
04275          GLint *dst = (GLint *) dest;
04276          GLuint i;
04277          for (i=0;i<n;i++) {
04278             dst[i] = (GLint) source[i];
04279          }
04280          if (dstPacking->SwapBytes) {
04281             _mesa_swap4( (GLuint *) dst, n );
04282          }
04283       }
04284       break;
04285    case GL_FLOAT:
04286       {
04287          GLfloat *dst = (GLfloat *) dest;
04288          GLuint i;
04289          for (i=0;i<n;i++) {
04290             dst[i] = (GLfloat) source[i];
04291          }
04292          if (dstPacking->SwapBytes) {
04293             _mesa_swap4( (GLuint *) dst, n );
04294          }
04295       }
04296       break;
04297    case GL_HALF_FLOAT_ARB:
04298       {
04299          GLhalfARB *dst = (GLhalfARB *) dest;
04300          GLuint i;
04301          for (i=0;i<n;i++) {
04302             dst[i] = _mesa_float_to_half( (float) source[i] );
04303          }
04304          if (dstPacking->SwapBytes) {
04305             _mesa_swap2( (GLushort *) dst, n );
04306          }
04307       }
04308       break;
04309    case GL_BITMAP:
04310       if (dstPacking->LsbFirst) {
04311          GLubyte *dst = (GLubyte *) dest;
04312          GLint shift = 0;
04313          GLuint i;
04314          for (i = 0; i < n; i++) {
04315             if (shift == 0)
04316                *dst = 0;
04317             *dst |= ((source[i] != 0) << shift);
04318             shift++;
04319             if (shift == 8) {
04320                shift = 0;
04321                dst++;
04322             }
04323          }
04324       }
04325       else {
04326          GLubyte *dst = (GLubyte *) dest;
04327          GLint shift = 7;
04328          GLuint i;
04329          for (i = 0; i < n; i++) {
04330             if (shift == 7)
04331                *dst = 0;
04332             *dst |= ((source[i] != 0) << shift);
04333             shift--;
04334             if (shift < 0) {
04335                shift = 7;
04336                dst++;
04337             }
04338          }
04339       }
04340       break;
04341    default:
04342       _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
04343    }
04344 }
04345 
04346 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT)                              \
04347     do {                                                                \
04348         GLuint i;                                                       \
04349         const GLTYPE *src = (const GLTYPE *)source;                     \
04350         for (i = 0; i < n; i++) {                                       \
04351             GLTYPE value = src[i];                                      \
04352             if (srcPacking->SwapBytes) {                                \
04353                 if (sizeof(GLTYPE) == 2) {                              \
04354                     SWAP2BYTE(value);                                   \
04355                 } else if (sizeof(GLTYPE) == 4) {                       \
04356                     SWAP4BYTE(value);                                   \
04357                 }                                                       \
04358             }                                                           \
04359             depthValues[i] = GLTYPE2FLOAT(value);                       \
04360         }                                                               \
04361     } while (0)
04362 
04363 
04373 void
04374 _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n,
04375                          GLenum dstType, GLvoid *dest, GLuint depthMax,
04376                          GLenum srcType, const GLvoid *source,
04377                          const struct gl_pixelstore_attrib *srcPacking )
04378 {
04379    GLfloat depthTemp[MAX_WIDTH], *depthValues;
04380    GLboolean needClamp = GL_FALSE;
04381 
04382    /* Look for special cases first.
04383     * Not only are these faster, they're less prone to numeric conversion
04384     * problems.  Otherwise, converting from an int type to a float then
04385     * back to an int type can introduce errors that will show up as
04386     * artifacts in things like depth peeling which uses glCopyTexImage.
04387     */
04388    if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) {
04389       if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) {
04390          const GLuint *src = (const GLuint *) source;
04391          GLushort *dst = (GLushort *) dest;
04392          GLuint i;
04393          for (i = 0; i < n; i++) {
04394             dst[i] = src[i] >> 16;
04395          }
04396          return;
04397       }
04398       if (srcType == GL_UNSIGNED_SHORT
04399           && dstType == GL_UNSIGNED_INT
04400           && depthMax == 0xffffffff) {
04401          const GLushort *src = (const GLushort *) source;
04402          GLuint *dst = (GLuint *) dest;
04403          GLuint i;
04404          for (i = 0; i < n; i++) {
04405             dst[i] = src[i] | (src[i] << 16);
04406          }
04407          return;
04408       }
04409       /* XXX may want to add additional cases here someday */
04410    }
04411 
04412    /* general case path follows */
04413 
04414    if (dstType == GL_FLOAT) {
04415       depthValues = (GLfloat *) dest;
04416    }
04417    else {
04418       depthValues = depthTemp;
04419    }
04420 
04421    /* Convert incoming values to GLfloat.  Some conversions will require
04422     * clamping, below.
04423     */
04424    switch (srcType) {
04425       case GL_BYTE:
04426          DEPTH_VALUES(GLbyte, BYTE_TO_FLOAT);
04427          needClamp = GL_TRUE;
04428          break;
04429       case GL_UNSIGNED_BYTE:
04430          DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT);
04431          break;
04432       case GL_SHORT:
04433          DEPTH_VALUES(GLshort, SHORT_TO_FLOAT);
04434          needClamp = GL_TRUE;
04435          break;
04436       case GL_UNSIGNED_SHORT:
04437          DEPTH_VALUES(GLushort, USHORT_TO_FLOAT);
04438          break;
04439       case GL_INT:
04440          DEPTH_VALUES(GLint, INT_TO_FLOAT);
04441          needClamp = GL_TRUE;
04442          break;
04443       case GL_UNSIGNED_INT:
04444          DEPTH_VALUES(GLuint, UINT_TO_FLOAT);
04445          break;
04446       case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */
04447          if (dstType == GL_UNSIGNED_INT_24_8_EXT &&
04448              depthMax == 0xffffff &&
04449              ctx->Pixel.DepthScale == 1.0 &&
04450              ctx->Pixel.DepthBias == 0.0) {
04451             const GLuint *src = (const GLuint *) source;
04452             GLuint *zValues = (GLuint *) dest;
04453             GLuint i;
04454             for (i = 0; i < n; i++) {
04455                 GLuint value = src[i];
04456                 if (srcPacking->SwapBytes) {
04457                     SWAP4BYTE(value);
04458                 }
04459                 zValues[i] = value & 0xffffff00;
04460             }
04461             return;
04462          }
04463          else {
04464             const GLuint *src = (const GLuint *) source;
04465             const GLfloat scale = 1.0f / 0xffffff;
04466             GLuint i;
04467             for (i = 0; i < n; i++) {
04468                 GLuint value = src[i];
04469                 if (srcPacking->SwapBytes) {
04470                     SWAP4BYTE(value);
04471                 }
04472                 depthValues[i] = (value >> 8) * scale;
04473             }
04474          }
04475          break;
04476       case GL_FLOAT:
04477          DEPTH_VALUES(GLfloat, 1*);
04478          needClamp = GL_TRUE;
04479          break;
04480       case GL_HALF_FLOAT_ARB:
04481          {
04482             GLuint i;
04483             const GLhalfARB *src = (const GLhalfARB *) source;
04484             for (i = 0; i < n; i++) {
04485                GLhalfARB value = src[i];
04486                if (srcPacking->SwapBytes) {
04487                   SWAP2BYTE(value);
04488                }
04489                depthValues[i] = _mesa_half_to_float(value);
04490             }
04491             needClamp = GL_TRUE;
04492          }
04493          break;
04494       default:
04495          _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
04496          return;
04497    }
04498 
04499    /* apply depth scale and bias */
04500    {
04501       const GLfloat scale = ctx->Pixel.DepthScale;
04502       const GLfloat bias = ctx->Pixel.DepthBias;
04503       if (scale != 1.0 || bias != 0.0) {
04504          GLuint i;
04505          for (i = 0; i < n; i++) {
04506             depthValues[i] = depthValues[i] * scale + bias;
04507          }
04508          needClamp = GL_TRUE;
04509       }
04510    }
04511 
04512    /* clamp to [0, 1] */
04513    if (needClamp) {
04514       GLuint i;
04515       for (i = 0; i < n; i++) {
04516          depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0);
04517       }
04518    }
04519 
04520    /*
04521     * Convert values to dstType
04522     */
04523    if (dstType == GL_UNSIGNED_INT) {
04524       GLuint *zValues = (GLuint *) dest;
04525       GLuint i;
04526       if (depthMax <= 0xffffff) {
04527          /* no overflow worries */
04528          for (i = 0; i < n; i++) {
04529             zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax);
04530          }
04531       }
04532       else {
04533          /* need to use double precision to prevent overflow problems */
04534          for (i = 0; i < n; i++) {
04535             GLdouble z = depthValues[i] * (GLfloat) depthMax;
04536             if (z >= (GLdouble) 0xffffffff)
04537                zValues[i] = 0xffffffff;
04538             else
04539                zValues[i] = (GLuint) z;
04540          }
04541       }
04542    }
04543    else if (dstType == GL_UNSIGNED_SHORT) {
04544       GLushort *zValues = (GLushort *) dest;
04545       GLuint i;
04546       ASSERT(depthMax <= 0xffff);
04547       for (i = 0; i < n; i++) {
04548          zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax);
04549       }
04550    }
04551    else {
04552       ASSERT(dstType == GL_FLOAT);
04553       /*ASSERT(depthMax == 1.0F);*/
04554    }
04555 }
04556 
04557 
04558 /*
04559  * Pack an array of depth values.  The values are floats in [0,1].
04560  */
04561 void
04562 _mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest,
04563                        GLenum dstType, const GLfloat *depthSpan,
04564                        const struct gl_pixelstore_attrib *dstPacking )
04565 {
04566    GLfloat depthCopy[MAX_WIDTH];
04567 
04568    ASSERT(n <= MAX_WIDTH);
04569 
04570    if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
04571       _mesa_memcpy(depthCopy, depthSpan, n * sizeof(GLfloat));
04572       _mesa_scale_and_bias_depth(ctx, n, depthCopy);
04573       depthSpan = depthCopy;
04574    }
04575 
04576    switch (dstType) {
04577    case GL_UNSIGNED_BYTE:
04578       {
04579          GLubyte *dst = (GLubyte *) dest;
04580          GLuint i;
04581          for (i = 0; i < n; i++) {
04582             dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
04583          }
04584       }
04585       break;
04586    case GL_BYTE:
04587       {
04588          GLbyte *dst = (GLbyte *) dest;
04589          GLuint i;
04590          for (i = 0; i < n; i++) {
04591             dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
04592          }
04593       }
04594       break;
04595    case GL_UNSIGNED_SHORT:
04596       {
04597          GLushort *dst = (GLushort *) dest;
04598          GLuint i;
04599          for (i = 0; i < n; i++) {
04600             CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]);
04601          }
04602          if (dstPacking->SwapBytes) {
04603             _mesa_swap2( (GLushort *) dst, n );
04604          }
04605       }
04606       break;
04607    case GL_SHORT:
04608       {
04609          GLshort *dst = (GLshort *) dest;
04610          GLuint i;
04611          for (i = 0; i < n; i++) {
04612             dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
04613          }
04614          if (dstPacking->SwapBytes) {
04615             _mesa_swap2( (GLushort *) dst, n );
04616          }
04617       }
04618       break;
04619    case GL_UNSIGNED_INT:
04620       {
04621          GLuint *dst = (GLuint *) dest;
04622          GLuint i;
04623          for (i = 0; i < n; i++) {
04624             dst[i] = FLOAT_TO_UINT( depthSpan[i] );
04625          }
04626          if (dstPacking->SwapBytes) {
04627             _mesa_swap4( (GLuint *) dst, n );
04628          }
04629       }
04630       break;
04631    case GL_INT:
04632       {
04633          GLint *dst = (GLint *) dest;
04634          GLuint i;
04635          for (i = 0; i < n; i++) {
04636             dst[i] = FLOAT_TO_INT( depthSpan[i] );
04637          }
04638          if (dstPacking->SwapBytes) {
04639             _mesa_swap4( (GLuint *) dst, n );
04640          }
04641       }
04642       break;
04643    case GL_FLOAT:
04644       {
04645          GLfloat *dst = (GLfloat *) dest;
04646          GLuint i;
04647          for (i = 0; i < n; i++) {
04648             dst[i] = depthSpan[i];
04649          }
04650          if (dstPacking->SwapBytes) {
04651             _mesa_swap4( (GLuint *) dst, n );
04652          }
04653       }
04654       break;
04655    case GL_HALF_FLOAT_ARB:
04656       {
04657          GLhalfARB *dst = (GLhalfARB *) dest;
04658          GLuint i;
04659          for (i = 0; i < n; i++) {
04660             dst[i] = _mesa_float_to_half(depthSpan[i]);
04661          }
04662          if (dstPacking->SwapBytes) {
04663             _mesa_swap2( (GLushort *) dst, n );
04664          }
04665       }
04666       break;
04667    default:
04668       _mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
04669    }
04670 }
04671 
04672 
04673 
04677 void
04678 _mesa_pack_depth_stencil_span(const GLcontext *ctx, GLuint n, GLuint *dest,
04679                               const GLfloat *depthVals,
04680                               const GLstencil *stencilVals,
04681                               const struct gl_pixelstore_attrib *dstPacking)
04682 {
04683    GLfloat depthCopy[MAX_WIDTH];
04684    GLstencil stencilCopy[MAX_WIDTH];
04685    GLuint i;
04686 
04687    ASSERT(n <= MAX_WIDTH);
04688 
04689    if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
04690       _mesa_memcpy(depthCopy, depthVals, n * sizeof(GLfloat));
04691       _mesa_scale_and_bias_depth(ctx, n, depthCopy);
04692       depthVals = depthCopy;
04693    }
04694 
04695    if (ctx->Pixel.IndexShift ||
04696        ctx->Pixel.IndexOffset ||
04697        ctx->Pixel.MapStencilFlag) {
04698       _mesa_memcpy(stencilCopy, stencilVals, n * sizeof(GLstencil));
04699       _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy);
04700       stencilVals = stencilCopy;
04701    }
04702 
04703    for (i = 0; i < n; i++) {
04704       GLuint z = (GLuint) (depthVals[i] * 0xffffff);
04705       dest[i] = (z << 8) | (stencilVals[i] & 0xff);
04706    }
04707 
04708    if (dstPacking->SwapBytes) {
04709       _mesa_swap4(dest, n);
04710    }
04711 }
04712 
04713 
04714 
04715 
04722 void *
04723 _mesa_unpack_image( GLuint dimensions,
04724                     GLsizei width, GLsizei height, GLsizei depth,
04725                     GLenum format, GLenum type, const GLvoid *pixels,
04726                     const struct gl_pixelstore_attrib *unpack )
04727 {
04728    GLint bytesPerRow, compsPerRow;
04729    GLboolean flipBytes, swap2, swap4;
04730 
04731    if (!pixels)
04732       return NULL;  /* not necessarily an error */
04733 
04734    if (width <= 0 || height <= 0 || depth <= 0)
04735       return NULL;  /* generate error later */
04736 
04737    if (type == GL_BITMAP) {
04738       bytesPerRow = (width + 7) >> 3;
04739       flipBytes = unpack->LsbFirst;
04740       swap2 = swap4 = GL_FALSE;
04741       compsPerRow = 0;
04742    }
04743    else {
04744       const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
04745       GLint components = _mesa_components_in_format(format);
04746       GLint bytesPerComp;
04747 
04748       if (_mesa_type_is_packed(type))
04749           components = 1;
04750 
04751       if (bytesPerPixel <= 0 || components <= 0)
04752          return NULL;   /* bad format or type.  generate error later */
04753       bytesPerRow = bytesPerPixel * width;
04754       bytesPerComp = bytesPerPixel / components;
04755       flipBytes = GL_FALSE;
04756       swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
04757       swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
04758       compsPerRow = components * width;
04759       assert(compsPerRow >= width);
04760    }
04761 
04762    {
04763       GLubyte *destBuffer
04764          = (GLubyte *) _mesa_malloc(bytesPerRow * height * depth);
04765       GLubyte *dst;
04766       GLint img, row;
04767       if (!destBuffer)
04768          return NULL;   /* generate GL_OUT_OF_MEMORY later */
04769 
04770       dst = destBuffer;
04771       for (img = 0; img < depth; img++) {
04772          for (row = 0; row < height; row++) {
04773             const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels,
04774                                width, height, format, type, img, row, 0);
04775 
04776             if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) {
04777                GLint i;
04778                flipBytes = GL_FALSE;
04779                if (unpack->LsbFirst) {
04780                   GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7);
04781                   GLubyte dstMask = 128;
04782                   const GLubyte *s = src;
04783                   GLubyte *d = dst;
04784                   *d = 0;
04785                   for (i = 0; i < width; i++) {
04786                      if (*s & srcMask) {
04787                         *d |= dstMask;
04788                      }      
04789                      if (srcMask == 128) {
04790                         srcMask = 1;
04791                         s++;
04792                      }
04793                      else {
04794                         srcMask = srcMask << 1;
04795                      }
04796                      if (dstMask == 1) {
04797                         dstMask = 128;
04798                         d++;
04799                         *d = 0;
04800                      }
04801                      else {
04802                         dstMask = dstMask >> 1;
04803                      }
04804                   }
04805                }
04806                else {
04807                   GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7);
04808                   GLubyte dstMask = 128;
04809                   const GLubyte *s = src;
04810                   GLubyte *d = dst;
04811                   *d = 0;
04812                   for (i = 0; i < width; i++) {
04813                      if (*s & srcMask) {
04814                         *d |= dstMask;
04815                      }
04816                      if (srcMask == 1) {
04817                         srcMask = 128;
04818                         s++;
04819                      }
04820                      else {
04821                         srcMask = srcMask >> 1;
04822                      }
04823                      if (dstMask == 1) {
04824                         dstMask = 128;
04825                         d++;
04826                         *d = 0;
04827                      }
04828                      else {
04829                         dstMask = dstMask >> 1;
04830                      }      
04831                   }
04832                }
04833             }
04834             else {
04835                _mesa_memcpy(dst, src, bytesPerRow);
04836             }
04837 
04838             /* byte flipping/swapping */
04839             if (flipBytes) {
04840                flip_bytes((GLubyte *) dst, bytesPerRow);
04841             }
04842             else if (swap2) {
04843                _mesa_swap2((GLushort*) dst, compsPerRow);
04844             }
04845             else if (swap4) {
04846                _mesa_swap4((GLuint*) dst, compsPerRow);
04847             }
04848             dst += bytesPerRow;
04849          }
04850       }
04851       return destBuffer;
04852    }
04853 }
04854 
04855 #endif /* _HAVE_FULL_GL */
04856 
04857 
04858 
04863 void
04864 _mesa_convert_colors(GLenum srcType, const GLvoid *src,
04865                      GLenum dstType, GLvoid *dst,
04866                      GLuint count, const GLubyte mask[])
04867 {
04868    GLuint tempBuffer[MAX_WIDTH][4];
04869    const GLboolean useTemp = (src == dst);
04870 
04871    ASSERT(srcType != dstType);
04872 
04873    switch (srcType) {
04874    case GL_UNSIGNED_BYTE:
04875       if (dstType == GL_UNSIGNED_SHORT) {
04876          const GLubyte (*src1)[4] = (const GLubyte (*)[4]) src;
04877          GLushort (*dst2)[4] = (GLushort (*)[4]) (useTemp ? tempBuffer : dst);
04878          GLuint i;
04879          for (i = 0; i < count; i++) {
04880             if (!mask || mask[i]) {
04881                dst2[i][RCOMP] = UBYTE_TO_USHORT(src1[i][RCOMP]);
04882                dst2[i][GCOMP] = UBYTE_TO_USHORT(src1[i][GCOMP]);
04883                dst2[i][BCOMP] = UBYTE_TO_USHORT(src1[i][BCOMP]);
04884                dst2[i][ACOMP] = UBYTE_TO_USHORT(src1[i][ACOMP]);
04885             }
04886          }
04887          if (useTemp)
04888             _mesa_memcpy(dst, tempBuffer, count * 4 * sizeof(GLushort));
04889       }
04890       else {
04891          const GLubyte (*src1)[4] = (const GLubyte (*)[4]) src;
04892          GLfloat (*dst4)[4] = (GLfloat (*)[4]) (useTemp ? tempBuffer : dst);
04893          GLuint i;
04894          ASSERT(dstType == GL_FLOAT);
04895          for (i = 0; i < count; i++) {
04896             if (!mask || mask[i]) {
04897                dst4[i][RCOMP] = UBYTE_TO_FLOAT(src1[i][RCOMP]);
04898                dst4[i][GCOMP] = UBYTE_TO_FLOAT(src1[i][GCOMP]);
04899                dst4[i][BCOMP] = UBYTE_TO_FLOAT(src1[i][BCOMP]);
04900                dst4[i][ACOMP] = UBYTE_TO_FLOAT(src1[i][ACOMP]);
04901             }
04902          }
04903          if (useTemp)
04904             _mesa_memcpy(dst, tempBuffer, count * 4 * sizeof(GLfloat));
04905       }
04906       break;
04907    case GL_UNSIGNED_SHORT:
04908       if (dstType == GL_UNSIGNED_BYTE) {
04909          const GLushort (*src2)[4] = (const GLushort (*)[4]) src;
04910          GLubyte (*dst1)[4] = (GLubyte (*)[4]) (useTemp ? tempBuffer : dst);
04911          GLuint i;
04912          for (i = 0; i < count; i++) {
04913             if (!mask || mask[i]) {
04914                dst1[i][RCOMP] = USHORT_TO_UBYTE(src2[i][RCOMP]);
04915                dst1[i][GCOMP] = USHORT_TO_UBYTE(src2[i][GCOMP]);
04916                dst1[i][BCOMP] = USHORT_TO_UBYTE(src2[i][BCOMP]);
04917                dst1[i][ACOMP] = USHORT_TO_UBYTE(src2[i][ACOMP]);
04918             }
04919          }
04920          if (useTemp)
04921             _mesa_memcpy(dst, tempBuffer, count * 4 * sizeof(GLubyte));
04922       }
04923       else {
04924          const GLushort (*src2)[4] = (const GLushort (*)[4]) src;
04925          GLfloat (*dst4)[4] = (GLfloat (*)[4]) (useTemp ? tempBuffer : dst);
04926          GLuint i;
04927          ASSERT(dstType == GL_FLOAT);
04928          for (i = 0; i < count; i++) {
04929             if (!mask || mask[i]) {
04930                dst4[i][RCOMP] = USHORT_TO_FLOAT(src2[i][RCOMP]);
04931                dst4[i][GCOMP] = USHORT_TO_FLOAT(src2[i][GCOMP]);
04932                dst4[i][BCOMP] = USHORT_TO_FLOAT(src2[i][BCOMP]);
04933                dst4[i][ACOMP] = USHORT_TO_FLOAT(src2[i][ACOMP]);
04934             }
04935          }
04936          if (useTemp)
04937             _mesa_memcpy(dst, tempBuffer, count * 4 * sizeof(GLfloat));
04938       }
04939       break;
04940    case GL_FLOAT:
04941       if (dstType == GL_UNSIGNED_BYTE) {
04942          const GLfloat (*src4)[4] = (const GLfloat (*)[4]) src;
04943          GLubyte (*dst1)[4] = (GLubyte (*)[4]) (useTemp ? tempBuffer : dst);
04944          GLuint i;
04945          for (i = 0; i < count; i++) {
04946             if (!mask || mask[i]) {
04947                UNCLAMPED_FLOAT_TO_UBYTE(dst1[i][RCOMP], src4[i][RCOMP]);
04948                UNCLAMPED_FLOAT_TO_UBYTE(dst1[i][GCOMP], src4[i][GCOMP]);
04949                UNCLAMPED_FLOAT_TO_UBYTE(dst1[i][BCOMP], src4[i][BCOMP]);
04950                UNCLAMPED_FLOAT_TO_UBYTE(dst1[i][ACOMP], src4[i][ACOMP]);
04951             }
04952          }
04953          if (useTemp)
04954             _mesa_memcpy(dst, tempBuffer, count * 4 * sizeof(GLubyte));
04955       }
04956       else {
04957          const GLfloat (*src4)[4] = (const GLfloat (*)[4]) src;
04958          GLushort (*dst2)[4] = (GLushort (*)[4]) (useTemp ? tempBuffer : dst);
04959          GLuint i;
04960          ASSERT(dstType == GL_UNSIGNED_SHORT);
04961          for (i = 0; i < count; i++) {
04962             if (!mask || mask[i]) {
04963                UNCLAMPED_FLOAT_TO_USHORT(dst2[i][RCOMP], src4[i][RCOMP]);
04964                UNCLAMPED_FLOAT_TO_USHORT(dst2[i][GCOMP], src4[i][GCOMP]);
04965                UNCLAMPED_FLOAT_TO_USHORT(dst2[i][BCOMP], src4[i][BCOMP]);
04966                UNCLAMPED_FLOAT_TO_USHORT(dst2[i][ACOMP], src4[i][ACOMP]);
04967             }
04968          }
04969          if (useTemp)
04970             _mesa_memcpy(dst, tempBuffer, count * 4 * sizeof(GLushort));
04971       }
04972       break;
04973    default:
04974       _mesa_problem(NULL, "Invalid datatype in _mesa_convert_colors");
04975    }
04976 }
04977 
04978 
04979 
04980 
04992 GLboolean
04993 _mesa_clip_drawpixels(const GLcontext *ctx,
04994                       GLint *destX, GLint *destY,
04995                       GLsizei *width, GLsizei *height,
04996                       struct gl_pixelstore_attrib *unpack)
04997 {
04998    const GLframebuffer *buffer = ctx->DrawBuffer;
04999 
05000    if (unpack->RowLength == 0) {
05001       unpack->RowLength = *width;
05002    }
05003 
05004    ASSERT(ctx->Pixel.ZoomX == 1.0F);
05005    ASSERT(ctx->Pixel.ZoomY == 1.0F || ctx->Pixel.ZoomY == -1.0F);
05006 
05007    /* left clipping */
05008    if (*destX < buffer->_Xmin) {
05009       unpack->SkipPixels += (buffer->_Xmin - *destX);
05010       *width -= (buffer->_Xmin - *destX);
05011       *destX = buffer->_Xmin;
05012    }
05013    /* right clipping */
05014    if (*destX + *width > buffer->_Xmax)
05015       *width -= (*destX + *width - buffer->_Xmax);
05016 
05017    if (*width <= 0)
05018       return GL_FALSE;
05019 
05020    if (ctx->Pixel.ZoomY == 1.0F) {
05021       /* bottom clipping */
05022       if (*destY < buffer->_Ymin) {
05023          unpack->SkipRows += (buffer->_Ymin - *destY);
05024          *height -= (buffer->_Ymin - *destY);
05025          *destY = buffer->_Ymin;
05026       }
05027       /* top clipping */
05028       if (*destY + *height > buffer->_Ymax)
05029          *height -= (*destY + *height - buffer->_Ymax);
05030    }
05031    else { /* upside down */
05032       /* top clipping */
05033       if (*destY > buffer->_Ymax) {
05034          unpack->SkipRows += (*destY - buffer->_Ymax);
05035          *height -= (*destY - buffer->_Ymax);
05036          *destY = buffer->_Ymax;
05037       }
05038       /* bottom clipping */
05039       if (*destY - *height < buffer->_Ymin)
05040          *height -= (buffer->_Ymin - (*destY - *height));
05041       /* adjust destY so it's the first row to write to */
05042       (*destY)--;
05043    }
05044 
05045    if (*height <= 0)
05046       return GL_TRUE;
05047 
05048    return GL_TRUE;
05049 }
05050 
05051 
05063 GLboolean
05064 _mesa_clip_readpixels(const GLcontext *ctx,
05065                       GLint *srcX, GLint *srcY,
05066                       GLsizei *width, GLsizei *height,
05067                       struct gl_pixelstore_attrib *pack)
05068 {
05069    const GLframebuffer *buffer = ctx->ReadBuffer;
05070 
05071    if (pack->RowLength == 0) {
05072       pack->RowLength = *width;
05073    }
05074 
05075    /* left clipping */
05076    if (*srcX < 0) {
05077       pack->SkipPixels += (0 - *srcX);
05078       *width -= (0 - *srcX);
05079       *srcX = 0;
05080    }
05081    /* right clipping */
05082    if (*srcX + *width > (GLsizei) buffer->Width)
05083       *width -= (*srcX + *width - buffer->Width);
05084 
05085    if (*width <= 0)
05086       return GL_FALSE;
05087 
05088    /* bottom clipping */
05089    if (*srcY < 0) {
05090       pack->SkipRows += (0 - *srcY);
05091       *height -= (0 - *srcY);
05092       *srcY = 0;
05093    }
05094    /* top clipping */
05095    if (*srcY + *height > (GLsizei) buffer->Height)
05096       *height -= (*srcY + *height - buffer->Height);
05097 
05098    if (*height <= 0)
05099       return GL_TRUE;
05100 
05101    return GL_TRUE;
05102 }
05103 
05104 
05113 GLboolean
05114 _mesa_clip_copytexsubimage(const GLcontext *ctx,
05115                            GLint *destX, GLint *destY,
05116                            GLint *srcX, GLint *srcY,
05117                            GLsizei *width, GLsizei *height)
05118 {
05119    const struct gl_framebuffer *fb = ctx->ReadBuffer;
05120    const GLint srcX0 = *srcX, srcY0 = *srcY;
05121 
05122    if (_mesa_clip_to_region(0, 0, fb->Width, fb->Height,
05123                             srcX, srcY, width, height)) {
05124       *destX = *destX + *srcX - srcX0;
05125       *destY = *destY + *srcY - srcY0;
05126 
05127       return GL_TRUE;
05128    }
05129    else {
05130       return GL_FALSE;
05131    }
05132 }
05133 
05134 
05135 
05141 GLboolean
05142 _mesa_clip_to_region(GLint xmin, GLint ymin,
05143                      GLint xmax, GLint ymax,
05144                      GLint *x, GLint *y,
05145                      GLsizei *width, GLsizei *height )
05146 {
05147    /* left clipping */
05148    if (*x < xmin) {
05149       *width -= (xmin - *x);
05150       *x = xmin;
05151    }
05152 
05153    /* right clipping */
05154    if (*x + *width > xmax)
05155       *width -= (*x + *width - xmax);
05156 
05157    if (*width <= 0)
05158       return GL_FALSE;
05159 
05160    /* bottom (or top) clipping */
05161    if (*y < ymin) {
05162       *height -= (ymin - *y);
05163       *y = ymin;
05164    }
05165 
05166    /* top (or bottom) clipping */
05167    if (*y + *height > ymax)
05168       *height -= (*y + *height - ymax);
05169 
05170    if (*height <= 0)
05171       return GL_FALSE;
05172 
05173    return GL_TRUE;
05174 }

Generated on Sun May 27 2012 04:20:19 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.