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