/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Copyright 2010-2017 Danny Robson */ #ifndef __UTIL_COLOUR_HPP #define __UTIL_COLOUR_HPP #include "coord.hpp" #include "introspection.hpp" #include #include namespace util { /// An abstract colour POD type componsed of S components of type T. /// /// Not to be used directly, instead the use of derived types is required. /// This exists purely to simplify generic colour code. template < size_t S, typename T, typename SelfT > struct colour : coord::base { using coord::base::base; template auto cast (void) const { ::util::revalue_t ret; std::transform (std::begin (*this), std::end (*this), std::begin (ret), renormalise); return ret; } }; template struct util::coord::store<1,T,srgba<1,T>> { union { struct { T r; }; T data[1]; }; }; template struct util::coord::store<2,T,srgba<2,T>> { union { struct { T r, g; }; T data[2]; }; }; template struct util::coord::store<3,T,srgba<3,T>> { union { struct { T r, g, b; }; T data[3]; }; }; template struct util::coord::store<4,T,srgba<4,T>> { union { struct { T r, g, b, a; }; T data[4]; }; }; template struct srgba : colour> { using colour>::colour; }; using srgba3f = srgba<3,float>; using srgba4f = srgba<4,float>; using srgba3u = srgba<3,uint8_t>; using srgba4u = srgba<4,uint8_t>; template struct hsva : colour> {}; template struct redim_type< srgba > { template using type = srgba<_S,T>; }; template struct revalue_type> { template using type = srgba; }; template struct is_colour : public std::false_type {}; template < size_t S, typename T, template < size_t, typename > typename ColourT > struct is_colour> :std::conditional_t< std::is_base_of_v< colour>, ColourT >, std::true_type, std::false_type > {}; template constexpr auto is_colour_v = is_colour::value; } #endif