Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #pragma once
00024
00025 #include "cinder/Cinder.h"
00026
00027 #include <boost/preprocessor/seq.hpp>
00028
00029 namespace cinder {
00030
00031 template<typename T>
00032 struct CHANTRAIT
00033 {
00034 };
00035
00036 template<>
00037 struct CHANTRAIT<uint8_t>
00038 {
00039 typedef uint32_t Sum;
00040 typedef uint32_t Accum;
00041 typedef int32_t SignedSum;
00042 static uint8_t max() { return 255; }
00043 static uint8_t convert( uint8_t v ) { return v; }
00044 static uint8_t convert( uint16_t v ) { return v / 257; }
00045 static uint8_t convert( float v ) { return static_cast<uint8_t>( v * 255 ); }
00046 static uint8_t grayscale( uint8_t r, uint8_t g, uint8_t b ) { return ( r * 54 + g * 183 + b * 19 ) >> 8; }
00047 static uint8_t premultiply( uint8_t c, uint8_t a ) { return a * c / 255; }
00048
00049 static uint8_t inverse( uint8_t c ) { return ~c; }
00050 };
00051
00052 template<>
00053 struct CHANTRAIT<uint16_t>
00054 {
00055 typedef uint32_t Sum;
00056 typedef uint32_t Accum;
00057 typedef int32_t SignedSum;
00058 static uint16_t max() { return 65535; }
00059 static uint16_t convert( uint8_t v ) { return ( v << 8 ) | v; }
00060 static uint16_t convert( uint16_t v ) { return v; }
00061 static uint16_t convert( float v ) { return static_cast<uint16_t>( v * 65535 ); }
00062 static uint16_t grayscale( uint16_t r, uint16_t g, uint16_t b ) { return ( r * 6966 + g * 23436 + b * 2366 ) >> 15; }
00063 };
00064
00065 template<>
00066 struct CHANTRAIT<float>
00067 {
00068 typedef float Sum;
00069 typedef float Accum;
00070 typedef float SignedSum;
00071 static float max() { return 1.0f; }
00072 static float convert( uint8_t v ) { return v / 255.0f; }
00073 static float convert( uint16_t v ) { return v / 65535.0f; }
00074 static float convert( float v ) { return v; }
00075 static float grayscale( float r, float g, float b ) { return r * 0.2126f + g * 0.7152f + b * 0.0722f; }
00077 static float premultiply( float c, float a ) { return c * a; }
00078 static float inverse( float c ) { return 1.0f - c; }
00079 };
00080
00081 #define CHANNEL_TYPES (uint8_t)(float)
00082
00083 }