49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync/* Cop(c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_pixeldata.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_error.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_mem.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_version.h"
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync#include <stdio.h>
2369dc897927db3f9d3c044b8f35348680d4b831vboxsync#include <math.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync#include <iprt/string.h>
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#if defined(WINDOWS)
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync# include <float.h>
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync# define isnan(x) _isnan(x)
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/**
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Maybe export this someday.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int crSizeOfType( GLenum type )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (type) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE_3_3_2:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE_2_3_3_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return 1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BITMAP:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return 0; /* special case */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_5_6_5:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_5_6_5_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_5_5_5_1:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_1_5_5_5_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_4_4_4_4:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_4_4_4_4_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return 2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_8_8_8_8:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_8_8_8_8_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_10_10_10_2:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_2_10_10_10_REV:
70f0bd50f20879a58549999c7871cf0ddefc35e0vboxsync#endif
70f0bd50f20879a58549999c7871cf0ddefc35e0vboxsync#ifdef CR_EXT_framebuffer_object
70f0bd50f20879a58549999c7871cf0ddefc35e0vboxsync case GL_UNSIGNED_INT_24_8:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return 4;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return 8;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "Unknown pixel type in crSizeOfType: 0x%x", (unsigned int) type );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/**
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Compute bytes per pixel for the given format/type combination.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * \return bytes per pixel or -1 for invalid format or type, 0 for bitmap data.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncint crPixelSize( GLenum format, GLenum type )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int bytes = 1; /* picky Windows compiler, we override later */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (type) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE_3_3_2:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE_2_3_3_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return 1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes = 1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BITMAP:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return 0; /* special case */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_5_6_5:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_5_6_5_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_5_5_5_1:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_1_5_5_5_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_4_4_4_4:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_4_4_4_4_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return 2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes = 2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_8_8_8_8:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_8_8_8_8_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_10_10_10_2:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_2_10_10_10_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return 4;
70f0bd50f20879a58549999c7871cf0ddefc35e0vboxsync#endif
70f0bd50f20879a58549999c7871cf0ddefc35e0vboxsync#ifdef CR_EXT_framebuffer_object
70f0bd50f20879a58549999c7871cf0ddefc35e0vboxsync case GL_UNSIGNED_INT_24_8:
70f0bd50f20879a58549999c7871cf0ddefc35e0vboxsync return 4;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes = 4;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
c94dfdedd3c28b8db5d23f1947e56e21bf5711c8vboxsync crWarning( "Unknown pixel type in crPixelSize: type:0x%x(fmt:0x%x)", (unsigned int) type, (unsigned int) format);
c94dfdedd3c28b8db5d23f1947e56e21bf5711c8vboxsync return 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (format) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_COLOR_INDEX:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_STENCIL_INDEX:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DEPTH_COMPONENT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_RED:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_GREEN:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BLUE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_ALPHA:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_LUMINANCE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INTENSITY:
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync case GL_SLUMINANCE_EXT:
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync case GL_SLUMINANCE8_EXT:
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_LUMINANCE_ALPHA:
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync case GL_SLUMINANCE_ALPHA_EXT:
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync case GL_SLUMINANCE8_ALPHA8_EXT:
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes *= 2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_RGB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BGR:
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync case GL_SRGB_EXT:
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync case GL_SRGB8_EXT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes *= 3;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_RGBA:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef GL_ABGR_EXT
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_ABGR_EXT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BGRA:
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync case GL_SRGB_ALPHA_EXT:
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync case GL_SRGB8_ALPHA8_EXT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes *= 4;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
c94dfdedd3c28b8db5d23f1947e56e21bf5711c8vboxsync crWarning( "Unknown pixel format in crPixelSize: type:0x%x(fmt:0x%x)", (unsigned int) type, (unsigned int) format);
c94dfdedd3c28b8db5d23f1947e56e21bf5711c8vboxsync return 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return bytes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define BYTE_TO_FLOAT(b) ((b) * (1.0/127.0))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define FLOAT_TO_BYTE(f) ((GLbyte) ((f) * 127.0))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define UBYTE_TO_FLOAT(b) ((b) * (1.0/255.0))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define FLOAT_TO_UBYTE(f) ((GLbyte) ((f) * 255.0))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define SHORT_TO_FLOAT(s) ((s) * (1.0/32768.0))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define FLOAT_TO_SHORT(f) ((GLshort) ((f) * 32768.0))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define USHORT_TO_FLOAT(s) ((s) * (1.0/65535.0))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define FLOAT_TO_USHORT(f) ((GLushort) ((f) * 65535.0))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define INT_TO_FLOAT(i) ((i) * (1.0F/2147483647.0))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define FLOAT_TO_INT(f) ((GLint) ((f) * 2147483647.0))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define UINT_TO_FLOAT(i) ((i) * (1.0F / 4294967295.0F))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define FLOAT_TO_UINT(f) ((GLuint) ((f) * 4294967295.0))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsyncstatic float SRGBF_TO_RGBF(float f)
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync{
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync if (isnan(f)) return 0.f;
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync if (f<=0.04045f)
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync {
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync return f/12.92f;
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync }
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync else
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync {
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync return pow((f+0.055f)/1.055f, 2.4f);
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync }
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync}
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsyncstatic float RGBF_TO_SRGBF(float f)
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync{
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync if (isnan(f)) return 0.f;
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync if (f>1.f) return 1.f;
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync if (f<0.f) return 0.f;
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync if (f<0.0031308f)
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync {
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync return f*12.92f;
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync }
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync else
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync {
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync return 1.055f*pow(f, 0.41666f) - 0.055f;
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync }
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync}
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef _MSC_VER
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/** @todo bird: MSC takes 5..20 mins to compile get_row and/or put_row with global
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * optimizations enabled. It varies a bit between 8.0/64 and 7.1/32 - the latter seems
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * to be fine with just disabling opts for get_row, while the former needs both to be
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * disabled to compile it a decent time. It seems this isn't important code after all,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * so we're not overly worried about the performance degration. Even so, we might want
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * to look into it before long, perhaps checking with Visual C++ 9.0 (aka 2008). */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync# pragma optimize("g", off)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Pack src pixel data into tmpRow array as either GLfloat[][1] or
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * GLfloat[][4] depending on whether the format is for colors.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncget_row(const char *src, GLenum srcFormat, GLenum srcType,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLsizei width, GLfloat *tmpRow)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLbyte *bSrc = (GLbyte *) src;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLubyte *ubSrc = (GLubyte *) src;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLshort *sSrc = (GLshort *) src;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLushort *usSrc = (GLushort *) src;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLint *iSrc = (GLint *) src;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLuint *uiSrc = (GLuint *) src;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLfloat *fSrc = (GLfloat *) src;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLdouble *dSrc = (GLdouble *) src;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (srcType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) bSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) ubSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) sSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) usSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) iSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) uiSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = fSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) dSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in get_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (srcFormat == GL_DEPTH_COMPONENT) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (srcType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) BYTE_TO_FLOAT(bSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) UBYTE_TO_FLOAT(ubSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) SHORT_TO_FLOAT(sSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) USHORT_TO_FLOAT(usSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) INT_TO_FLOAT(bSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) UINT_TO_FLOAT(bSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = fSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i] = (GLfloat) dSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in get_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (srcFormat == GL_RED || srcFormat == GL_GREEN ||
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync srcFormat == GL_BLUE || srcFormat == GL_ALPHA) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int dst;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcFormat == GL_RED)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dst = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (srcFormat == GL_GREEN)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dst = 1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (srcFormat == GL_BLUE)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dst = 2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dst = 3;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = 0.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = 0.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = 0.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (srcType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++, dst += 4)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[dst] = (GLfloat) BYTE_TO_FLOAT(bSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++, dst += 4)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[dst] = (GLfloat) UBYTE_TO_FLOAT(ubSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++, dst += 4)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[dst] = (GLfloat) SHORT_TO_FLOAT(sSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++, dst += 4)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[dst] = (GLfloat) USHORT_TO_FLOAT(usSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++, dst += 4)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[dst] = (GLfloat) INT_TO_FLOAT(iSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++, dst += 4)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[dst] = (GLfloat) UINT_TO_FLOAT(uiSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++, dst += 4)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[dst] = fSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++, dst += 4)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[dst] = (GLfloat) fSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in get_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync else if (srcFormat == GL_LUMINANCE
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SLUMINANCE_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SLUMINANCE8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (srcType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) BYTE_TO_FLOAT(bSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) UBYTE_TO_FLOAT(ubSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) SHORT_TO_FLOAT(sSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) USHORT_TO_FLOAT(usSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) INT_TO_FLOAT(iSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) UINT_TO_FLOAT(uiSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2] = fSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2] = (GLfloat) dSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in get_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (srcFormat == GL_INTENSITY) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (srcType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2] = tmpRow[i*4+3]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) BYTE_TO_FLOAT(bSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2] = tmpRow[i*4+3]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) UBYTE_TO_FLOAT(ubSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2] = tmpRow[i*4+3]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) SHORT_TO_FLOAT(sSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2] = tmpRow[i*4+3]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) USHORT_TO_FLOAT(usSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2] = tmpRow[i*4+3]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) INT_TO_FLOAT(iSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2] = tmpRow[i*4+3]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = UINT_TO_FLOAT(uiSrc[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2] = tmpRow[i*4+3]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = fSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2] = tmpRow[i*4+3]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) dSrc[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in get_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync else if (srcFormat == GL_LUMINANCE_ALPHA
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SLUMINANCE_ALPHA_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SLUMINANCE8_ALPHA8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (srcType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) BYTE_TO_FLOAT(bSrc[i*2+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) BYTE_TO_FLOAT(bSrc[i*2+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) UBYTE_TO_FLOAT(ubSrc[i*2+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) UBYTE_TO_FLOAT(ubSrc[i*2+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) SHORT_TO_FLOAT(sSrc[i*2+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) SHORT_TO_FLOAT(sSrc[i*2+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) USHORT_TO_FLOAT(usSrc[i*2+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) USHORT_TO_FLOAT(usSrc[i*2+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) INT_TO_FLOAT(iSrc[i*2+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) INT_TO_FLOAT(iSrc[i*2+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) UINT_TO_FLOAT(uiSrc[i*2+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) UINT_TO_FLOAT(uiSrc[i*2+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2] = fSrc[i*2+0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = fSrc[i*2+1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = tmpRow[i*4+1] = tmpRow[i*4+2]
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync = (GLfloat) dSrc[i*2+0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) dSrc[i*2+1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in get_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (srcFormat == GL_RGB
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_BGR
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SRGB_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SRGB8_EXT
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int r, b;
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync if (srcFormat == GL_RGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SRGB_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SRGB8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync r = 0; b = 2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync r = 2; b = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (srcType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) BYTE_TO_FLOAT(bSrc[i*3+r]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) BYTE_TO_FLOAT(bSrc[i*3+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) BYTE_TO_FLOAT(bSrc[i*3+b]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) UBYTE_TO_FLOAT(ubSrc[i*3+r]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) UBYTE_TO_FLOAT(ubSrc[i*3+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) UBYTE_TO_FLOAT(ubSrc[i*3+b]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) SHORT_TO_FLOAT(sSrc[i*3+r]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) SHORT_TO_FLOAT(sSrc[i*3+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) SHORT_TO_FLOAT(sSrc[i*3+b]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) USHORT_TO_FLOAT(usSrc[i*3+r]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) USHORT_TO_FLOAT(usSrc[i*3+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) USHORT_TO_FLOAT(usSrc[i*3+b]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) INT_TO_FLOAT(iSrc[i*3+r]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) INT_TO_FLOAT(iSrc[i*3+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) INT_TO_FLOAT(iSrc[i*3+b]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) UINT_TO_FLOAT(uiSrc[i*3+r]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) UINT_TO_FLOAT(uiSrc[i*3+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) UINT_TO_FLOAT(uiSrc[i*3+b]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = fSrc[i*3+r];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = fSrc[i*3+1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = fSrc[i*3+b];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) dSrc[i*3+r];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) dSrc[i*3+1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) dSrc[i*3+b];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE_3_3_2:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+r] = (GLfloat) ((ubSrc[i] >> 5) ) / 7.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) ((ubSrc[i] >> 2) & 0x7) / 7.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+b] = (GLfloat) ((ubSrc[i] ) & 0x3) / 3.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE_2_3_3_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+r] = (GLfloat) ((ubSrc[i] ) & 0x7) / 7.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) ((ubSrc[i] >> 3) & 0x7) / 7.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+b] = (GLfloat) ((ubSrc[i] >> 6) ) / 3.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_5_6_5:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+r] = (GLfloat) ((usSrc[i] >> 11) & 0x1f) / 31.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) ((usSrc[i] >> 5) & 0x3f) / 63.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+b] = (GLfloat) ((usSrc[i] ) & 0x1f) / 31.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_5_6_5_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+r] = (GLfloat) ((usSrc[i] ) & 0x1f) / 31.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) ((usSrc[i] >> 5) & 0x3f) / 63.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+b] = (GLfloat) ((usSrc[i] >> 11) & 0x1f) / 31.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = 1.0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in get_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (srcFormat == GL_RGBA
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_BGRA
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SRGB_ALPHA_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SRGB8_ALPHA8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int r, b;
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync if (srcFormat == GL_RGBA
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SRGB_ALPHA_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SRGB8_ALPHA8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync )
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync r = 0; b = 2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync r = 2; b = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (srcType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) BYTE_TO_FLOAT(bSrc[i*4+r]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) BYTE_TO_FLOAT(bSrc[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) BYTE_TO_FLOAT(bSrc[i*4+b]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) BYTE_TO_FLOAT(bSrc[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) UBYTE_TO_FLOAT(ubSrc[i*4+r]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) UBYTE_TO_FLOAT(ubSrc[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) UBYTE_TO_FLOAT(ubSrc[i*4+b]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) UBYTE_TO_FLOAT(ubSrc[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) SHORT_TO_FLOAT(sSrc[i*4+r]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) SHORT_TO_FLOAT(sSrc[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) SHORT_TO_FLOAT(sSrc[i*4+b]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) SHORT_TO_FLOAT(sSrc[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) USHORT_TO_FLOAT(usSrc[i*4+r]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) USHORT_TO_FLOAT(usSrc[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) USHORT_TO_FLOAT(usSrc[i*4+b]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) USHORT_TO_FLOAT(usSrc[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) INT_TO_FLOAT(iSrc[i*4+r]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) INT_TO_FLOAT(iSrc[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) INT_TO_FLOAT(iSrc[i*4+b]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) INT_TO_FLOAT(iSrc[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) UINT_TO_FLOAT(uiSrc[i*4+r]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) UINT_TO_FLOAT(uiSrc[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) UINT_TO_FLOAT(uiSrc[i*4+b]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) UINT_TO_FLOAT(uiSrc[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = fSrc[i*4+r];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = fSrc[i*4+1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = fSrc[i*4+b];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = fSrc[i*4+3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+0] = (GLfloat) dSrc[i*4+r];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) dSrc[i*4+1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+2] = (GLfloat) dSrc[i*4+b];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) dSrc[i*4+3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_5_5_5_1:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+r] = (GLfloat) ((usSrc[i] >> 11) ) / 31.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) ((usSrc[i] >> 6) & 0x1f) / 31.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+b] = (GLfloat) ((usSrc[i] >> 1) & 0x1f) / 31.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) ((usSrc[i] ) & 0x01);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_1_5_5_5_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+r] = (GLfloat) ((usSrc[i] ) & 0x1f) / 31.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) ((usSrc[i] >> 5) & 0x1f) / 31.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+b] = (GLfloat) ((usSrc[i] >> 10) & 0x1f) / 31.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) ((usSrc[i] >> 15) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_4_4_4_4:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+r] = (GLfloat) ((usSrc[i] >> 12) & 0xf) / 15.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) ((usSrc[i] >> 8) & 0xf) / 15.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+b] = (GLfloat) ((usSrc[i] >> 4) & 0xf) / 15.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) ((usSrc[i] ) & 0xf) / 15.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_4_4_4_4_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+r] = (GLfloat) ((usSrc[i] ) & 0xf) / 15.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) ((usSrc[i] >> 4) & 0xf) / 15.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+b] = (GLfloat) ((usSrc[i] >> 8) & 0xf) / 15.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) ((usSrc[i] >> 12) & 0xf) / 15.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_8_8_8_8:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+r] = (GLfloat) ((uiSrc[i] >> 24) & 0xff) / 255.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) ((uiSrc[i] >> 16) & 0xff) / 255.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+b] = (GLfloat) ((uiSrc[i] >> 8) & 0xff) / 255.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) ((uiSrc[i] ) & 0xff) / 255.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_8_8_8_8_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+r] = (GLfloat) ((uiSrc[i] ) & 0xff) / 255.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) ((uiSrc[i] >> 8) & 0xff) / 255.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+b] = (GLfloat) ((uiSrc[i] >> 16) & 0xff) / 255.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) ((uiSrc[i] >> 24) & 0xff) / 255.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_10_10_10_2:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+r] = (GLfloat) ((uiSrc[i] >> 22) & 0x3ff) / 1023.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) ((uiSrc[i] >> 12) & 0x3ff) / 1023.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+b] = (GLfloat) ((uiSrc[i] >> 2) & 0x3ff) / 1023.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) ((uiSrc[i] ) & 0x003) / 3.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_2_10_10_10_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+r] = (GLfloat) ((uiSrc[i] ) & 0x3ff) / 1023.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+1] = (GLfloat) ((uiSrc[i] >> 10) & 0x3ff) / 1023.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+b] = (GLfloat) ((uiSrc[i] >> 20) & 0x3ff) / 1023.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tmpRow[i*4+3] = (GLfloat) ((uiSrc[i] >> 30) & 0x003) / 3.0f;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in get_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected source format in get_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync if (srcFormat == GL_SRGB_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SRGB8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SRGB_ALPHA_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SRGB8_ALPHA8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SLUMINANCE_ALPHA_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SLUMINANCE8_ALPHA8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SLUMINANCE_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || srcFormat == GL_SLUMINANCE8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync )
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync {
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync for (i=0; i<width; ++i)
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync {
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync tmpRow[i*4+0] = SRGBF_TO_RGBF(tmpRow[i*4+0]);
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync tmpRow[i*4+1] = SRGBF_TO_RGBF(tmpRow[i*4+1]);
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync tmpRow[i*4+2] = SRGBF_TO_RGBF(tmpRow[i*4+2]);
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync }
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync }
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void put_row(char *dst, GLenum dstFormat, GLenum dstType,
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync GLsizei width, GLfloat *tmpRow)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLbyte *bDst = (GLbyte *) dst;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLubyte *ubDst = (GLubyte *) dst;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLshort *sDst = (GLshort *) dst;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLushort *usDst = (GLushort *) dst;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint *iDst = (GLint *) dst;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint *uiDst = (GLuint *) dst;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat *fDst = (GLfloat *) dst;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLdouble *dDst = (GLdouble *) dst;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync if (dstFormat == GL_SRGB_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SRGB8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SRGB_ALPHA_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SRGB8_ALPHA8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SLUMINANCE_ALPHA_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SLUMINANCE8_ALPHA8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SLUMINANCE_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SLUMINANCE8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync )
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync {
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync for (i=0; i<width; ++i)
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync {
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync tmpRow[i*4+0] = RGBF_TO_SRGBF(tmpRow[i*4+0]);
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync tmpRow[i*4+1] = RGBF_TO_SRGBF(tmpRow[i*4+1]);
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync tmpRow[i*4+2] = RGBF_TO_SRGBF(tmpRow[i*4+2]);
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync }
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync }
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dstFormat == GL_COLOR_INDEX || dstFormat == GL_STENCIL_INDEX) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (dstType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i] = (GLbyte) tmpRow[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i] = (GLubyte) tmpRow[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sDst[i] = (GLshort) tmpRow[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i] = (GLushort) tmpRow[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync iDst[i] = (GLint) tmpRow[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i] = (GLuint) tmpRow[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync fDst[i] = tmpRow[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dDst[i] = tmpRow[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in put_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (dstFormat == GL_DEPTH_COMPONENT) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (dstType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i] = FLOAT_TO_BYTE(tmpRow[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i] = FLOAT_TO_UBYTE(tmpRow[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sDst[i] = FLOAT_TO_SHORT(tmpRow[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sDst[i] = FLOAT_TO_SHORT(tmpRow[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i] = (GLbyte) FLOAT_TO_INT(tmpRow[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i] = (GLbyte) FLOAT_TO_UINT(tmpRow[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync fDst[i] = tmpRow[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dDst[i] = tmpRow[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in put_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (dstFormat == GL_RED || dstFormat == GL_GREEN ||
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync dstFormat == GL_BLUE || dstFormat == GL_ALPHA ||
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync dstFormat == GL_LUMINANCE || dstFormat == GL_INTENSITY
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SLUMINANCE_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SLUMINANCE8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int index;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dstFormat == GL_RED)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync index = 0;
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync else if (dstFormat == GL_LUMINANCE
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SLUMINANCE_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SLUMINANCE8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync index = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (dstFormat == GL_INTENSITY)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync index = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (dstFormat == GL_GREEN)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync index = 1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (dstFormat == GL_BLUE)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync index = 2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync index = 3;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (dstType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i] = FLOAT_TO_BYTE(tmpRow[i*4+index]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i] = FLOAT_TO_UBYTE(tmpRow[i*4+index]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sDst[i] = FLOAT_TO_SHORT(tmpRow[i*4+index]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i] = FLOAT_TO_USHORT(tmpRow[i*4+index]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync iDst[i] = FLOAT_TO_INT(tmpRow[i*4+index]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i] = FLOAT_TO_UINT(tmpRow[i*4+index]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync fDst[i] = tmpRow[i*4+index];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dDst[i] = tmpRow[i*4+index];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in put_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync else if (dstFormat == GL_LUMINANCE_ALPHA
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SLUMINANCE_ALPHA_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SLUMINANCE8_ALPHA8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (dstType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i*2+0] = FLOAT_TO_BYTE(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i*2+1] = FLOAT_TO_BYTE(tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i*2+0] = FLOAT_TO_UBYTE(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i*2+1] = FLOAT_TO_UBYTE(tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sDst[i*2+0] = FLOAT_TO_SHORT(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sDst[i*2+1] = FLOAT_TO_SHORT(tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i*2+0] = FLOAT_TO_USHORT(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i*2+1] = FLOAT_TO_USHORT(tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync iDst[i*2+0] = FLOAT_TO_INT(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync iDst[i*2+1] = FLOAT_TO_INT(tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i*2+0] = FLOAT_TO_UINT(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i*2+1] = FLOAT_TO_UINT(tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync fDst[i*2+0] = tmpRow[i*4+0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync fDst[i*2+1] = tmpRow[i*4+3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dDst[i*2+0] = tmpRow[i*4+0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dDst[i*2+1] = tmpRow[i*4+3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in put_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (dstFormat == GL_RGB
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_BGR
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SRGB_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SRGB8_EXT
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int r, b;
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync if (dstFormat == GL_RGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SRGB_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SRGB8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync r = 0; b = 2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync r = 2; b = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (dstType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i*3+r] = FLOAT_TO_BYTE(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i*3+1] = FLOAT_TO_BYTE(tmpRow[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i*3+b] = FLOAT_TO_BYTE(tmpRow[i*4+2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i*3+r] = FLOAT_TO_UBYTE(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i*3+1] = FLOAT_TO_UBYTE(tmpRow[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i*3+b] = FLOAT_TO_UBYTE(tmpRow[i*4+2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sDst[i*3+r] = FLOAT_TO_SHORT(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sDst[i*3+1] = FLOAT_TO_SHORT(tmpRow[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sDst[i*3+b] = FLOAT_TO_SHORT(tmpRow[i*4+2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i*3+r] = FLOAT_TO_USHORT(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i*3+1] = FLOAT_TO_USHORT(tmpRow[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i*3+b] = FLOAT_TO_USHORT(tmpRow[i*4+2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync iDst[i*3+r] = FLOAT_TO_INT(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync iDst[i*3+1] = FLOAT_TO_INT(tmpRow[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync iDst[i*3+b] = FLOAT_TO_INT(tmpRow[i*4+2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i*3+r] = FLOAT_TO_UINT(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i*3+1] = FLOAT_TO_UINT(tmpRow[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i*3+b] = FLOAT_TO_UINT(tmpRow[i*4+2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync fDst[i*3+r] = tmpRow[i*4+0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync fDst[i*3+1] = tmpRow[i*4+1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync fDst[i*3+b] = tmpRow[i*4+2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dDst[i*3+r] = tmpRow[i*4+0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dDst[i*3+1] = tmpRow[i*4+1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dDst[i*3+b] = tmpRow[i*4+2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE_3_3_2:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int red = (int) (tmpRow[i*4+r] * 7.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int green = (int) (tmpRow[i*4+1] * 7.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int blue = (int) (tmpRow[i*4+b] * 3.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i] = (red << 5) | (green << 2) | blue;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE_2_3_3_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int red = (int) (tmpRow[i*4+r] * 7.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int green = (int) (tmpRow[i*4+1] * 7.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int blue = (int) (tmpRow[i*4+b] * 3.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i] = red | (green << 3) | (blue << 6);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_5_6_5:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int red = (int) (tmpRow[i*4+r] * 31.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int green = (int) (tmpRow[i*4+1] * 63.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int blue = (int) (tmpRow[i*4+b] * 31.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i] = (red << 11) | (green << 5) | blue;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_5_6_5_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int red = (int) (tmpRow[i*4+r] * 31.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int green = (int) (tmpRow[i*4+1] * 63.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int blue = (int) (tmpRow[i*4+b] * 31.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i] = (blue << 11) | (green << 5) | red;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in put_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (dstFormat == GL_RGBA
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_BGRA
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SRGB_ALPHA_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SRGB8_ALPHA8_EXT
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int r, b;
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync if (dstFormat == GL_RGBA
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#ifdef CR_EXT_texture_sRGB
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SRGB_ALPHA_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync || dstFormat == GL_SRGB8_ALPHA8_EXT
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync#endif
49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1vboxsync ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync r = 0; b = 2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync r = 2; b = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (dstType) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i*4+r] = FLOAT_TO_BYTE(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i*4+1] = FLOAT_TO_BYTE(tmpRow[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i*4+b] = FLOAT_TO_BYTE(tmpRow[i*4+2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bDst[i*4+3] = FLOAT_TO_BYTE(tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i*4+r] = FLOAT_TO_UBYTE(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i*4+1] = FLOAT_TO_UBYTE(tmpRow[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i*4+b] = FLOAT_TO_UBYTE(tmpRow[i*4+2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ubDst[i*4+3] = FLOAT_TO_UBYTE(tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sDst[i*4+r] = FLOAT_TO_SHORT(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sDst[i*4+1] = FLOAT_TO_SHORT(tmpRow[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sDst[i*4+b] = FLOAT_TO_SHORT(tmpRow[i*4+2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sDst[i*4+3] = FLOAT_TO_SHORT(tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i*4+r] = FLOAT_TO_USHORT(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i*4+1] = FLOAT_TO_USHORT(tmpRow[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i*4+b] = FLOAT_TO_USHORT(tmpRow[i*4+2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i*4+3] = FLOAT_TO_USHORT(tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync iDst[i*4+r] = FLOAT_TO_INT(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync iDst[i*4+1] = FLOAT_TO_INT(tmpRow[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync iDst[i*4+b] = FLOAT_TO_INT(tmpRow[i*4+2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync iDst[i*4+3] = FLOAT_TO_INT(tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i*4+r] = FLOAT_TO_UINT(tmpRow[i*4+0]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i*4+1] = FLOAT_TO_UINT(tmpRow[i*4+1]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i*4+b] = FLOAT_TO_UINT(tmpRow[i*4+2]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i*4+3] = FLOAT_TO_UINT(tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync fDst[i*4+r] = tmpRow[i*4+0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync fDst[i*4+1] = tmpRow[i*4+1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync fDst[i*4+b] = tmpRow[i*4+2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync fDst[i*4+3] = tmpRow[i*4+3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dDst[i*4+r] = tmpRow[i*4+0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dDst[i*4+1] = tmpRow[i*4+1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dDst[i*4+b] = tmpRow[i*4+2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dDst[i*4+3] = tmpRow[i*4+3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_5_5_5_1:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int red = (int) (tmpRow[i*4+r] * 31.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int green = (int) (tmpRow[i*4+1] * 31.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int blue = (int) (tmpRow[i*4+b] * 31.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int alpha = (int) (tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i] = (red << 11) | (green << 6) | (blue << 1) | alpha;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_1_5_5_5_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int red = (int) (tmpRow[i*4+r] * 31.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int green = (int) (tmpRow[i*4+1] * 31.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int blue = (int) (tmpRow[i*4+b] * 31.0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int alpha = (int) (tmpRow[i*4+3]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i] = (alpha << 15) | (blue << 10) | (green << 5) | red;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_4_4_4_4:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int red = (int) (tmpRow[i*4+r] * 15.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int green = (int) (tmpRow[i*4+1] * 15.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int blue = (int) (tmpRow[i*4+b] * 15.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int alpha = (int) (tmpRow[i*4+3] * 15.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i] = (red << 12) | (green << 8) | (blue << 4) | alpha;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT_4_4_4_4_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int red = (int) (tmpRow[i*4+r] * 15.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int green = (int) (tmpRow[i*4+1] * 15.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int blue = (int) (tmpRow[i*4+b] * 15.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int alpha = (int) (tmpRow[i*4+3] * 15.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync usDst[i] = (alpha << 12) | (blue << 8) | (green << 4) | red;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_8_8_8_8:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int red = (int) (tmpRow[i*4+r] * 255.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int green = (int) (tmpRow[i*4+1] * 255.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int blue = (int) (tmpRow[i*4+b] * 255.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int alpha = (int) (tmpRow[i*4+3] * 255.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i] = (red << 24) | (green << 16) | (blue << 8) | alpha;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_8_8_8_8_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int red = (int) (tmpRow[i*4+r] * 255.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int green = (int) (tmpRow[i*4+1] * 255.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int blue = (int) (tmpRow[i*4+b] * 255.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int alpha = (int) (tmpRow[i*4+3] * 255.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i] = (alpha << 24) | (blue << 16) | (green << 8) | red;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_10_10_10_2:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int red = (int) (tmpRow[i*4+r] * 1023.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int green = (int) (tmpRow[i*4+1] * 1023.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int blue = (int) (tmpRow[i*4+b] * 1023.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int alpha = (int) (tmpRow[i*4+3] * 3.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i] = (red << 22) | (green << 12) | (blue << 2) | alpha;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT_2_10_10_10_REV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int red = (int) (tmpRow[i*4+r] * 1023.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int green = (int) (tmpRow[i*4+1] * 1023.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int blue = (int) (tmpRow[i*4+b] * 1023.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int alpha = (int) (tmpRow[i*4+3] * 3.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uiDst[i] = (alpha << 30) | (blue << 20) | (green << 10) | red;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected type in put_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("unexpected dest type in put_row in pixel.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef _MSC_VER
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync# pragma optimize("", on) /* bird: see #pragma optimize("g", off) above. */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/**
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Byte-swap an array of GLushorts
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncswap2(GLushort *us, GLuint n)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < n; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync us[i] = (us[i] >> 8) | (us[i] << 8);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/**
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Byte-swap an array of GLuints
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncswap4(GLuint *ui, GLuint n)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < n; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint b = ui[i];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ui[i] = (b >> 24)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync | ((b >> 8) & 0xff00)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync | ((b << 8) & 0xff0000)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync | ((b << 24) & 0xff000000);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/**
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * Return number of bytes of storage needed to accommodate an
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * image with the given format, type, and size.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * \return size in bytes or -1 if bad format or type
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncunsigned int crImageSize( GLenum format, GLenum type, GLsizei width, GLsizei height )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned int bytes = width * height;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (type == GL_BITMAP)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* This was wrong in the old code! */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes = ((width + 7) / 8) * height;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
60c5ad80416e2e87984ea003fac07c55effa5939vboxsync else if (GL_DEPTH_COMPONENT==format && type!=GL_FLOAT)
60c5ad80416e2e87984ea003fac07c55effa5939vboxsync {
ca25732c0c4b1415a535bc0e42c946f5570446d3vboxsync /*GL_DEPTH_COMPONENT with GL_UNSIGNED_BYTE seems to be more than 1 byte per pixel*/
60c5ad80416e2e87984ea003fac07c55effa5939vboxsync bytes = 4 * width * height * crPixelSize( format, type );
60c5ad80416e2e87984ea003fac07c55effa5939vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes = width * height * crPixelSize( format, type );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return bytes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/**
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * Return number of bytes of storage needed to accommodate a
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * 3D texture with the give format, type, and size.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * \return size in bytes or -1 if bad format or type
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncunsigned int crTextureSize( GLenum format, GLenum type, GLsizei width, GLsizei height, GLsizei depth )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned int bytes = width * height;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (type == GL_BITMAP)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Not sure about this one, so just multiply
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * by the depth?
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes = ((width + 7) / 8) * height * depth;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes = width * height * depth * crPixelSize( format, type );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return bytes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic const CRPixelPackState defaultPacking = {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync 0, /* rowLength */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync 0, /* skipRows */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync 0, /* skipPixels */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync 1, /* alignment */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync 0, /* imageHeight */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync 0, /* skipImages */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GL_FALSE, /* swapBytes */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GL_FALSE /* psLSBFirst */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync};
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crPixelCopy1D( GLvoid *dstPtr, GLenum dstFormat, GLenum dstType,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLvoid *srcPtr, GLenum srcFormat, GLenum srcType,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLsizei width, const CRPixelPackState *srcPacking )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crPixelCopy2D( width, 1,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dstPtr, dstFormat, dstType, NULL, /* dst */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcPtr, srcFormat, srcType, srcPacking ); /* src */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crPixelCopy2D( GLsizei width, GLsizei height,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLvoid *dstPtr, GLenum dstFormat, GLenum dstType,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const CRPixelPackState *dstPacking,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLvoid *srcPtr, GLenum srcFormat, GLenum srcType,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const CRPixelPackState *srcPacking )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *src = (const char *) srcPtr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char *dst = (char *) dstPtr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int srcBytesPerPixel;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int dstBytesPerPixel;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int srcBytesPerRow;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int dstBytesPerRow;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int srcRowStrideBytes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int dstRowStrideBytes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int bytesPerRow;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!dstPacking)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dstPacking = &defaultPacking;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!srcPacking)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcPacking = &defaultPacking;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcType == GL_BITMAP)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(dstType == GL_BITMAP);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytesPerRow = (width + 7) / 8;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcPacking->rowLength > 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcRowStrideBytes = (srcPacking->rowLength + 7) / 8;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcRowStrideBytes = bytesPerRow;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dstRowStrideBytes = bytesPerRow;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<height; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy( (void *) dst, (const void *) src, bytesPerRow );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dst += dstRowStrideBytes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync src += srcRowStrideBytes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(dstType != GL_BITMAP);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcBytesPerPixel = crPixelSize( srcFormat, srcType );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dstBytesPerPixel = crPixelSize( dstFormat, dstType );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcBytesPerPixel < 0 || dstBytesPerPixel < 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Stride between rows (in bytes) */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcPacking->rowLength > 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcRowStrideBytes = srcPacking->rowLength * srcBytesPerPixel;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcRowStrideBytes = width * srcBytesPerPixel;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dstPacking->rowLength > 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dstRowStrideBytes = dstPacking->rowLength * dstBytesPerPixel;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dstRowStrideBytes = width * dstBytesPerPixel;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* bytes per row */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcBytesPerRow = width * srcBytesPerPixel;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dstBytesPerRow = width * dstBytesPerPixel;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* handle the alignment */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcPacking->alignment != 1) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync i = ((long) src) % srcPacking->alignment;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync src += srcPacking->alignment - i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync i = (long) srcRowStrideBytes % srcPacking->alignment;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcRowStrideBytes += srcPacking->alignment - i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dstPacking->alignment != 1) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync i = ((long) dst) % dstPacking->alignment;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dst += dstPacking->alignment - i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync i = (long) dstRowStrideBytes % dstPacking->alignment;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dstRowStrideBytes += dstPacking->alignment - i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* handle skip rows */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync src += srcPacking->skipRows * srcRowStrideBytes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dst += dstPacking->skipRows * dstRowStrideBytes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* handle skip pixels */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync src += srcPacking->skipPixels * srcBytesPerPixel;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dst += dstPacking->skipPixels * dstBytesPerPixel;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* we don't do LSBFirst yet */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcPacking->psLSBFirst)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "Sorry, no lsbfirst for you" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dstPacking->psLSBFirst)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "Sorry, no lsbfirst for you" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcFormat == dstFormat && srcType == dstType)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(srcBytesPerRow == dstBytesPerRow);
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync if (srcBytesPerRow==srcRowStrideBytes
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync && srcRowStrideBytes==dstRowStrideBytes)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync crMemcpy( (void *) dst, (const void *) src, height * srcBytesPerRow );
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync }
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync else
6e956d652fa9702d6710100661aa0b22866f79cfvboxsync //crDebug("Sending texture, BytesPerRow!=RowStrideBytes");
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync for (i = 0; i < height; i++)
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync {
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync crMemcpy( (void *) dst, (const void *) src, srcBytesPerRow );
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync#if 0
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync /* check if src XOR dst swapping */
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync if (srcPacking->swapBytes ^ dstPacking->swapBytes) {
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync const GLint size = crSizeOfType(srcType);
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync CRASSERT(srcType == dstType);
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync if (size == 2) {
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync swap2((GLushort *) dst, srcBytesPerRow / size);
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync }
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync else if (size == 4) {
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync swap4((GLuint *) dst, srcBytesPerRow / size);
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync#endif
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync dst += dstRowStrideBytes;
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync src += srcRowStrideBytes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* need to do format and/or type conversion */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char *swapRow = NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLfloat *tmpRow = crAlloc( 4 * width * sizeof(GLfloat) );
138d86b59196f911a9c28b5d0e575046b6e27d10vboxsync
138d86b59196f911a9c28b5d0e575046b6e27d10vboxsync crDebug("Converting texture format");
138d86b59196f911a9c28b5d0e575046b6e27d10vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!tmpRow)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("Out of memory in crPixelCopy2D");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcPacking->swapBytes) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync swapRow = (char *) crAlloc(width * srcBytesPerPixel);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!swapRow) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("Out of memory in crPixelCopy2D");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < height; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* get src row as floats */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcPacking->swapBytes) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLint size = crSizeOfType(srcType);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLint bytes = width * srcBytesPerPixel;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy(swapRow, src, bytes);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (size == 2)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync swap2((GLushort *) swapRow, bytes / 2);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (size == 4)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync swap4((GLuint *) swapRow, bytes / 4);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync get_row(swapRow, srcFormat, srcType, width, tmpRow);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync get_row(src, srcFormat, srcType, width, tmpRow);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* store floats in dest row */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dstPacking->swapBytes) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLint size = crSizeOfType(dstType);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLint bytes = dstBytesPerPixel * width;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync put_row(dst, dstFormat, dstType, width, tmpRow);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (size == 2)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync swap2((GLushort *) dst, bytes / 2);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (size == 4)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync swap4((GLuint *) dst, bytes / 4);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync put_row(dst, dstFormat, dstType, width, tmpRow);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* increment pointers for next row */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dst += dstRowStrideBytes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync src += srcRowStrideBytes;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crFree(tmpRow);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (swapRow)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crFree(swapRow);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
952a01c3ad9ca16fcfb1d97513cda4843d80fa35vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crPixelCopy3D( GLsizei width, GLsizei height, GLsizei depth,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLvoid *dstPtr, GLenum dstFormat, GLenum dstType,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const CRPixelPackState *dstPacking,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLvoid *srcPtr, GLenum srcFormat, GLenum srcType,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const CRPixelPackState *srcPacking )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int tex_size = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void)srcPacking;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void)srcType;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void)srcFormat;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void)dstPacking;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*@todo this should be implemented properly*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
ed7f0e67f6a2eded1e54d86ac337b2c69bffe3f5vboxsync#ifndef DEBUG_misha
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crWarning( "crPixelCopy3D: simply crMemcpy'ing from srcPtr to dstPtr" );
ed7f0e67f6a2eded1e54d86ac337b2c69bffe3f5vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dstFormat != srcFormat)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crWarning( "crPixelCopy3D: formats don't match!" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dstType != srcType)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crWarning( "crPixelCopy3D: formats don't match!" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tex_size = RT_MIN (crTextureSize( dstFormat, dstType, width, height, depth ),
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crTextureSize( srcFormat, srcType, width, height, depth ));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy( (void *) dstPtr, (void *) srcPtr, tex_size );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Round N up to the next multiple of 8 */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define CEIL8(N) (((N) + 7) & ~0x7)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crBitmapCopy( GLsizei width, GLsizei height, GLubyte *dstPtr,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLubyte *srcPtr, const CRPixelPackState *srcPacking )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcPacking->psLSBFirst == GL_FALSE &&
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (srcPacking->rowLength == 0 || srcPacking->rowLength == width) &&
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcPacking->skipRows == 0 &&
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcPacking->skipPixels == 0 &&
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcPacking->alignment == 1) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* simple case */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy(dstPtr, srcPtr, CEIL8(width) * height / 8);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* general case */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLubyte *srcRow;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLint dst_row_length = CEIL8(width) / 8;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLubyte *dstRow;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint src_row_length;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint i, j;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcPacking->rowLength > 0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync src_row_length = srcPacking->rowLength;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync src_row_length = width;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (srcPacking->alignment) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case 1:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync src_row_length = ( ( src_row_length + 7 ) & ~7 ) >> 3;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case 2:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync src_row_length = ( ( src_row_length + 15 ) & ~15 ) >> 3;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case 4:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync src_row_length = ( ( src_row_length + 31 ) & ~31 ) >> 3;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case 8:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync src_row_length = ( ( src_row_length + 63 ) & ~63 ) >> 3;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "Invalid unpack alignment in crBitmapCopy");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* src_row_length and dst_row_length are in bytes */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcRow = srcPtr + src_row_length * srcPacking->skipRows;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dstRow = dstPtr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (srcPacking->psLSBFirst) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (j = 0; j < height; j++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemZero(dstRow, dst_row_length);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLint iByte = (i + srcPacking->skipPixels) / 8;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLint iBit = (i + srcPacking->skipPixels) % 8;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLubyte b = srcRow[iByte];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (b & (1 << iBit))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dstRow[i / 8] |= (128 >> (i % 8));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcRow += src_row_length;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dstRow += dst_row_length;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* unpack MSB first */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (j = 0; j < height; j++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemZero(dstRow, dst_row_length);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < width; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLint iByte = (i + srcPacking->skipPixels) / 8;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLint iBit = (i + srcPacking->skipPixels) % 8;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLubyte b = srcRow[iByte];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (b & (128 >> iBit))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dstRow[i / 8] |= (128 >> (i % 8));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync srcRow += src_row_length;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dstRow += dst_row_length;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsyncstatic int _tnum = 0;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync#pragma pack(1)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsynctypedef struct tgaheader_tag
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync{
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync char idlen;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync char colormap;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync char imagetype;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync short cm_index;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync short cm_len;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync char cm_entrysize;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync short x, y, w, h;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync char depth;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync char imagedesc;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync} tgaheader_t;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync#pragma pack()
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsyncvoid crDumpTGA(GLint w, GLint h, GLvoid *data)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync{
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync char fname[200];
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync if (!w || !h) return;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync sprintf(fname, "tex%i.tga", _tnum++);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync crDumpNamedTGA(fname, w, h, data);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync}
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsyncvoid crDumpNamedTGA(const char* fname, GLint w, GLint h, GLvoid *data)
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync{
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync tgaheader_t header;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync FILE *out;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync out = fopen(fname, "w");
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync if (!out) crError("can't create %s!", fname);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync header.idlen = 0;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync header.colormap = 0;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync header.imagetype = 2;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync header.cm_index = 0;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync header.cm_len = 0;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync header.cm_entrysize = 0;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync header.x = 0;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync header.y = 0;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync header.w = w;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync header.h = h;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync header.depth = 32;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync header.imagedesc = 0x08;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync fwrite(&header, sizeof(header), 1, out);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync fwrite(data, w*h*4, 1, out);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync fclose(out);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync}
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
ed7f0e67f6a2eded1e54d86ac337b2c69bffe3f5vboxsyncvoid crDumpNamedTGAV(GLint w, GLint h, GLvoid *data, const char* fname, va_list va)
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync{
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync char szName[4096];
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync RTStrPrintfV(szName, sizeof(szName), fname, va);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crDumpNamedTGA(szName, w, h, data);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync}
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
ed7f0e67f6a2eded1e54d86ac337b2c69bffe3f5vboxsyncvoid crDumpNamedTGAF(GLint w, GLint h, GLvoid *data, const char* fname, ...)
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync{
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync va_list va;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync int rc;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync va_start(va, fname);
ed7f0e67f6a2eded1e54d86ac337b2c69bffe3f5vboxsync crDumpNamedTGAV(w, h, data, fname, va);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync va_end(va);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync}