14d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul/* 24d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * Mesa 3-D graphics library 34d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * 44d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * Copyright (C) 2011 VMware, Inc. All Rights Reserved. 54d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * 64d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 74d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * copy of this software and associated documentation files (the "Software"), 84d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * to deal in the Software without restriction, including without limitation 94d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense, 104d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * and/or sell copies of the Software, and to permit persons to whom the 114d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * Software is furnished to do so, subject to the following conditions: 124d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * 134d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * The above copyright notice and this permission notice shall be included 144d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * in all copies or substantial portions of the Software. 154d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * 164d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 174d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 184d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 194d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 204d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 214d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 224d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul */ 234d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 244d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul/** 254d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * Types, macros, etc for the GLchan datatype. 264d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * The swrast module is kind of hard-coded for 8bpp color channels but 274d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * may be recompiled to use 16- or 32-bit color channels. But that 284d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * feature is seldom used and is likely broken in various ways. 294d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul */ 304d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 314d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#ifndef U_CHAN_H 324d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define U_CHAN_H 334d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 344d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 354d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#include "main/config.h" 364d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 374d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 384d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul/** 392b0aa3fb21386051976bf3c45e6455fc45d69bb3Brian Paul * Default bits per color channel: 8, 16 or 32 402b0aa3fb21386051976bf3c45e6455fc45d69bb3Brian Paul */ 412b0aa3fb21386051976bf3c45e6455fc45d69bb3Brian Paul#ifndef CHAN_BITS 422b0aa3fb21386051976bf3c45e6455fc45d69bb3Brian Paul#define CHAN_BITS 8 432b0aa3fb21386051976bf3c45e6455fc45d69bb3Brian Paul#endif 442b0aa3fb21386051976bf3c45e6455fc45d69bb3Brian Paul 452b0aa3fb21386051976bf3c45e6455fc45d69bb3Brian Paul 462b0aa3fb21386051976bf3c45e6455fc45d69bb3Brian Paul/** 474d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * Color channel data type. 484d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul */ 494d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#if CHAN_BITS == 8 504d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul typedef GLubyte GLchan; 514d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_MAX 255 524d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_MAXF 255.0F 534d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TYPE GL_UNSIGNED_BYTE 544d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#elif CHAN_BITS == 16 554d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul typedef GLushort GLchan; 564d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_MAX 65535 574d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_MAXF 65535.0F 584d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TYPE GL_UNSIGNED_SHORT 594d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#elif CHAN_BITS == 32 604d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul typedef GLfloat GLchan; 614d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_MAX 1.0 624d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_MAXF 1.0F 634d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TYPE GL_FLOAT 644d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#else 654d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#error "illegal number of color channel bits" 664d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#endif 674d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 684d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 694d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#if CHAN_BITS == 8 704d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 714d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TO_UBYTE(c) (c) 724d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TO_USHORT(c) (((c) << 8) | (c)) 734d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TO_SHORT(c) (((c) << 7) | ((c) >> 1)) 744d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TO_FLOAT(c) UBYTE_TO_FLOAT(c) 754d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 764d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CLAMPED_FLOAT_TO_CHAN(c, f) CLAMPED_FLOAT_TO_UBYTE(c, f) 774d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define UNCLAMPED_FLOAT_TO_CHAN(c, f) UNCLAMPED_FLOAT_TO_UBYTE(c, f) 784d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 794d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define COPY_CHAN4(DST, SRC) COPY_4UBV(DST, SRC) 804d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 814d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#elif CHAN_BITS == 16 824d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 834d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TO_UBYTE(c) ((c) >> 8) 844d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TO_USHORT(c) (c) 854d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TO_SHORT(c) ((c) >> 1) 864d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TO_FLOAT(c) ((GLfloat) ((c) * (1.0 / CHAN_MAXF))) 874d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 884d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CLAMPED_FLOAT_TO_CHAN(c, f) CLAMPED_FLOAT_TO_USHORT(c, f) 894d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define UNCLAMPED_FLOAT_TO_CHAN(c, f) UNCLAMPED_FLOAT_TO_USHORT(c, f) 904d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 914d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define COPY_CHAN4(DST, SRC) COPY_4V(DST, SRC) 924d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 934d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#elif CHAN_BITS == 32 944d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 954d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TO_UBYTE(c) FLOAT_TO_UBYTE(c) 964d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TO_USHORT(c) ((GLushort) (CLAMP((c), 0.0f, 1.0f) * 65535.0)) 974d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TO_SHORT(c) ((GLshort) (CLAMP((c), 0.0f, 1.0f) * 32767.0)) 984d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CHAN_TO_FLOAT(c) (c) 994d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 1004d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define CLAMPED_FLOAT_TO_CHAN(c, f) c = (f) 1014d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define UNCLAMPED_FLOAT_TO_CHAN(c, f) c = (f) 1024d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 1034d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define COPY_CHAN4(DST, SRC) COPY_4V(DST, SRC) 1044d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 1054d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#else 1064d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 1074d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#error unexpected CHAN_BITS size 1084d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 1094d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#endif 1104d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 1114d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 1124d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul/** 1134d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * Convert 4 floats to GLchan values. 1144d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * \param dst pointer to destination GLchan[4] array. 1154d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul * \param f pointer to source GLfloat[4] array. 1164d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul */ 1174d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#define UNCLAMPED_FLOAT_TO_RGBA_CHAN(dst, f) \ 1184d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Pauldo { \ 1194d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul UNCLAMPED_FLOAT_TO_CHAN((dst)[0], (f)[0]); \ 1204d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul UNCLAMPED_FLOAT_TO_CHAN((dst)[1], (f)[1]); \ 1214d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul UNCLAMPED_FLOAT_TO_CHAN((dst)[2], (f)[2]); \ 1224d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul UNCLAMPED_FLOAT_TO_CHAN((dst)[3], (f)[3]); \ 1234d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul} while (0) 1244d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 1254d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 1264d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul 1274d53fb525db56d0695eaa5b91bd8f0cefbc25866Brian Paul#endif /* U_CHAN_H */ 128