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 * 74 + g * 147 + b * 35 ) >> 8; }
00048 static uint8_t premultiply( uint8_t c, uint8_t a ) { return c * 255 / a; }
00049 };
00050
00051 template<>
00052 struct CHANTRAIT<uint16_t>
00053 {
00054 typedef uint32_t Sum;
00055 typedef uint32_t Accum;
00056 typedef int32_t SignedSum;
00057 static uint16_t max() { return 65535; }
00058 static uint16_t convert( uint8_t v ) { return ( v << 8 ) | v; }
00059 static uint16_t convert( uint16_t v ) { return v; }
00060 static uint16_t convert( float v ) { return static_cast<uint16_t>( v * 65535 ); }
00061 static uint16_t grayscale( uint16_t r, uint16_t g, uint16_t b ) { return ( r * 9511 + g * 18674 + b * 4582 ) >> 15; }
00062 };
00063
00064 template<>
00065 struct CHANTRAIT<float>
00066 {
00067 typedef float Sum;
00068 typedef float Accum;
00069 typedef float SignedSum;
00070 static float max() { return 1.0f; }
00071 static float convert( uint8_t v ) { return v / 255.0f; }
00072 static float convert( uint16_t v ) { return v / 65535.0f; }
00073 static float convert( float v ) { return v; }
00074 static float grayscale( float r, float g, float b ) { return r * 0.212f + g * 0.701f + b * 0.087f; }
00076 static float premultiply( float c, float a ) { return c * a; }
00077 };
00078
00079 #define CHANNEL_TYPES (uint8_t)(float)
00080
00081 }