/* * 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-2015 Danny Robson */ #ifndef __UTIL_COLOUR_HPP #define __UTIL_COLOUR_HPP #include "coord.hpp" #include "introspection.hpp" #include namespace util { /// An RGBA colour POD type. template struct colour : public coord::base { using coord::base::base; using base_t = coord::base; // overloaded cast operator which assumes values are unit normalised template colour cast (void) const; static colour from_html (const std::string&); static colour from_x11 (const std::string&); static colour from_string (const std::string&); }; // Convenience types template using colour1 = colour<1,T>; template using colour3 = colour<3,T>; template using colour4 = colour<4,T>; typedef colour1 colour1u; typedef colour3 colour3u; typedef colour4 colour4u; typedef colour1 colour1f; typedef colour3 colour3f; typedef colour4 colour4f; // RGB/HSV conversions colour3f rgb_to_hsv (colour3f); colour3f hsv_to_rgb (colour3f); // ostream/istream operators template std::ostream& operator<< (std::ostream&, util::colour); template std::istream& operator>> (std::istream&, util::colour&); // type name introspection specialisation template struct type_name> { static constexpr const char value[] = "colour"; }; } #include "colour.ipp" #endif