blob: 80d40b5371b9e0f8f8fbb3bb0ce8c3f4527bf551 [file] [log] [blame]
//-----------------------------------------------------------------------------
// ____ _
// | ___| | ___ _ _
// | ___| | / __)\ \/ /
// | | | |_| ___) | |
// |_| \___|\___)/_/\_\ Image Library
//
// 2007, Intel Corporation, licensed under Apache 2.0
//
// file : FlexColor.h
// author : Scott Ettinger - scott.m.ettinger@intel.com
// description: Color conversion functions
//
// modified :
//-----------------------------------------------------------------------------
#ifndef FLEXCOLOR_H
#define FLEXCOLOR_H
#if defined(HAVE_CONFIG_H)
# include "config.h"
#endif
#include "FlexImage.h"
#include <algorithm>
//////////////////////////////////////////////////////////////////////////////////////////////////
// RGBToGray Functions
//
// Names: ippiRGBToGray, ippiRGBToGrayA
//
///////////////////////////////////////////////////////////////////////////////////////////////////
template<class T>
FIStatus FlexRGBToGray(FlexImage<T,3> &src, FlexImage<T,1> &dst, bool allocate = true);
template<class T>
FIStatus FlexGrayToRGB(FlexImage<T,1> &src, FlexImage<T,3> &dst, bool allocate = true);
//----------------------------------- Implementation -----------------------------------------------
template<class T>
FIStatus FlexRGBToGray(FlexImage<T,3> &src, FlexImage<T,1> &dst, bool allocate)
{
if(allocate)
dst.Reallocate(src.Size());
int w = std::min(src.Width(), dst.Width()); //determine number of pixels to copy (intersection of src and dst areas)
int h = std::min(src.Height(), dst.Height());
T *pSrc = (T *)src.Data(), *pDst = (T *)dst.Data();
for(int j = 0; j < h; j++)
{ T *ps = pSrc, *pd = pDst;
for(int i = 0; i < w; i++)
{ *(pd++) = (T)(ps[0] * 0.299f + ps[1] * .587f + ps[2] * .114f);
ps += 3;
}
pSrc = (T *)((char *)pSrc + src.StepBytes());
pDst = (T *)((char *)pDst + dst.StepBytes());
}
return 0;
}
template<class T>
FIStatus FlexGrayToRGB(FlexImage<T,1> &src, FlexImage<T,3> &dst, bool allocate)
{
if(allocate)
dst.Reallocate(src.Size());
FlexCopyC1CM(src, dst, 0); //duplicate to all 3 image planes
FlexCopyC1CM(src, dst, 1);
FlexCopyC1CM(src, dst, 2);
return 0;
}
// ------------------------------- Functions not included for benchmarks ---------------------------
/*template<class T>
IppStatus ippiRGBToGrayA(FlexImage<T,4> &src, FlexImage<T,1> &dst);
*/
/*
//////////////////////////////////////////////////////////////////////////////////////////////////
// RGBToYCbCr Functions
//
// Names: ippiRGBToYCbCr, ippiRGBToYCbCrA
//
// Template Specializations:
// ippiRGBToYCbCr : 8u_C3
// ippiRGBToYCbCrA : 8u_C4
//
///////////////////////////////////////////////////////////////////////////////////////////////////
IppStatus ippiRGBToYCbCr(FlexImage<Ipp8u,3> &src, FlexImage<Ipp8u,3> &dst);
IppStatus ippiRGBToYCbCrA(FlexImage<Ipp8u,4> &src, FlexImage<Ipp8u,4> &dst);
//////////////////////////////////////////////////////////////////////////////////////////////////
// YCbCrToRGB Functions
//
// Names: ippiYCbCrToRGB, ippiYCbCrToRGBA
//
// Template Specializations:
// ippiYCbCrToRGB : 8u_C3
// ippiYCbCrToRGBA : 8u_C4
//
///////////////////////////////////////////////////////////////////////////////////////////////////
IppStatus ippiYCbCrToRGB(FlexImage<Ipp8u,3> &src, FlexImage<Ipp8u,3> &dst);
IppStatus ippiYCbCrToRGBA(FlexImage<Ipp8u,4> &src, FlexImage<Ipp8u,4> &dst);
template<class T>
IppStatus ippiColorTwist(FlexImage<T, 3> &src, FlexImage<T,3> &dst, const Ipp32f twist[3][4]);
template<class T>
IppStatus ippiColorTwistI(FlexImage<T, 3> &src, const Ipp32f twist[3][4]);
template<class T>
IppStatus ippiColorTwistA(FlexImage<T, 4> &src, FlexImage<T,4> &dst, const Ipp32f twist[3][4]);
template<class T>
IppStatus ippiColorTwistAI(FlexImage<T, 4> &src, const Ipp32f twist[3][4]);
*/
#endif