16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M///////////////////////////////////////////////////////////////////////////////////////
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  By downloading, copying, installing or using the software you agree to this license.
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  If you do not agree to this license, do not download, install,
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  copy or use the software.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                For Open Source Computer Vision Library
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/********************************* COPYRIGHT NOTICE *******************************\
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  The function for RGB to Lab conversion is based on the MATLAB script
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  RGB2Lab.m translated by Mark Ruzon from C code by Yossi Rubner, 23 September 1997.
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  See the page [http://vision.stanford.edu/~ruzon/software/rgblab.html]
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\**********************************************************************************/
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/********************************* COPYRIGHT NOTICE *******************************\
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  Original code for Bayer->BGR/RGB conversion is provided by Dirk Schaefer
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  from MD-Mathematische Dienste GmbH. Below is the copyright notice:
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    By downloading, copying, installing or using the software you agree
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    to this license. If you do not agree to this license, do not download,
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    install, copy or use the software.
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Contributors License Agreement:
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      Copyright (c) 2002,
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      MD-Mathematische Dienste GmbH
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      Im Defdahl 5-10
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      44141 Dortmund
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      Germany
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      www.md-it.de
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Redistribution and use in source and binary forms,
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    with or without modification, are permitted provided
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    that the following conditions are met:
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Redistributions of source code must retain
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    the above copyright notice, this list of conditions and the following disclaimer.
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Redistributions in binary form must reproduce the above copyright notice,
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    this list of conditions and the following disclaimer in the documentation
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    and/or other materials provided with the distribution.
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    The name of Contributor may not be used to endorse or promote products
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    derived from this software without specific prior written permission.
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    THE POSSIBILITY OF SUCH DAMAGE.
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\**********************************************************************************/
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cv.h"
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvColorCvtFunc0)(
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const void* src, int srcstep, void* dst, int dststep, CvSize size );
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvColorCvtFunc1)(
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const void* src, int srcstep, void* dst, int dststep,
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size, int param0 );
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvColorCvtFunc2)(
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const void* src, int srcstep, void* dst, int dststep,
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size, int param0, int param1 );
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvColorCvtFunc3)(
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const void* src, int srcstep, void* dst, int dststep,
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size, int param0, int param1, int param2 );
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                 Various 3/4-channel to 3/4-channel RGB transformations                 *
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMPL_BGRX2BGR( flavor, arrtype )                             \
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                              \
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2BGR_##flavor##_CnC3R( const arrtype* src, int srcstep,          \
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              arrtype* dst, int dststep,                \
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              CvSize size, int src_cn, int blue_idx )   \
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;                                                              \
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                          \
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                          \
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;                                       \
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;                                                    \
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )              \
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, src += src_cn )             \
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                               \
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            arrtype t0=src[blue_idx], t1=src[1], t2=src[blue_idx^2];    \
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = t0;                                                \
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = t1;                                              \
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+2] = t2;                                              \
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                               \
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                       \
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMPL_BGR2BGRX( flavor, arrtype )                             \
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                              \
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGR2BGRx_##flavor##_C3C4R( const arrtype* src, int srcstep,          \
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              arrtype* dst, int dststep,                \
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              CvSize size, int blue_idx )               \
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;                                                              \
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                          \
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                          \
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*3;                                            \
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 4;                                                    \
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )              \
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 4, src += 3 )                  \
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                               \
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            arrtype t0=src[blue_idx], t1=src[1], t2=src[blue_idx^2];    \
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = t0;                                                \
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = t1;                                              \
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+2] = t2;                                              \
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+3] = 0;                                               \
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                               \
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                       \
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMPL_BGRA2RGBA( flavor, arrtype )                            \
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                              \
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRA2RGBA_##flavor##_C4R( const arrtype* src, int srcstep,           \
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             arrtype* dst, int dststep, CvSize size )   \
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;                                                              \
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                          \
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                          \
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 4;                                                    \
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )              \
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 4 )                            \
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                               \
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            arrtype t0 = src[2], t1 = src[1], t2 = src[0], t3 = src[3]; \
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = t0;                                                \
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = t1;                                              \
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+2] = t2;                                              \
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+3] = t3;                                              \
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                               \
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                       \
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRX2BGR( 8u, uchar )
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRX2BGR( 16u, ushort )
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRX2BGR( 32f, int )
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGR2BGRX( 8u, uchar )
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGR2BGRX( 16u, ushort )
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGR2BGRX( 32f, int )
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRA2RGBA( 8u, uchar )
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRA2RGBA( 16u, ushort )
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRA2RGBA( 32f, int )
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*           Transforming 16-bit (565 or 555) RGB to/from 24/32-bit (888[8]) RGB          *
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGR5x52BGRx_8u_C2CnR( const uchar* src, int srcstep,
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         uchar* dst, int dststep,
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         CvSize size, int dst_cn,
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         int blue_idx, int green_bits )
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( green_bits == 5 || green_bits == 6 );
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep -= size.width*dst_cn;
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( green_bits == 6 )
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i++, dst += dst_cn )
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                unsigned t = ((const ushort*)src)[i];
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[blue_idx] = (uchar)(t << 3);
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[1] = (uchar)((t >> 3) & ~3);
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[blue_idx ^ 2] = (uchar)((t >> 8) & ~7);
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( dst_cn == 4 )
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[3] = 0;
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i++, dst += dst_cn )
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                unsigned t = ((const ushort*)src)[i];
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[blue_idx] = (uchar)(t << 3);
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[1] = (uchar)((t >> 2) & ~7);
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[blue_idx ^ 2] = (uchar)((t >> 7) & ~7);
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( dst_cn == 4 )
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[3] = 0;
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2BGR5x5_8u_CnC2R( const uchar* src, int srcstep,
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         uchar* dst, int dststep,
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         CvSize size, int src_cn,
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         int blue_idx, int green_bits )
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( green_bits == 6 )
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i++, src += src_cn )
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int t = (src[blue_idx] >> 3)|((src[1]&~3) << 3)|((src[blue_idx^2]&~7) << 8);
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((ushort*)dst)[i] = (ushort)t;
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i++, src += src_cn )
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int t = (src[blue_idx] >> 3)|((src[1]&~7) << 2)|((src[blue_idx^2]&~7) << 7);
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((ushort*)dst)[i] = (ushort)t;
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////////// IPP Color Conversion Functions //////////////////////////////
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvRGB2XYZ_8u_C3R_t  icvRGB2XYZ_8u_C3R_p = 0;
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvRGB2XYZ_16u_C3R_t icvRGB2XYZ_16u_C3R_p = 0;
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvRGB2XYZ_32f_C3R_t icvRGB2XYZ_32f_C3R_p = 0;
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvXYZ2RGB_8u_C3R_t  icvXYZ2RGB_8u_C3R_p = 0;
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvXYZ2RGB_16u_C3R_t icvXYZ2RGB_16u_C3R_p = 0;
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvXYZ2RGB_32f_C3R_t icvXYZ2RGB_32f_C3R_p = 0;
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvRGB2HSV_8u_C3R_t  icvRGB2HSV_8u_C3R_p = 0;
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvHSV2RGB_8u_C3R_t  icvHSV2RGB_8u_C3R_p = 0;
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGR2Lab_8u_C3R_t  icvBGR2Lab_8u_C3R_p = 0;
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvLab2BGR_8u_C3R_t  icvLab2BGR_8u_C3R_p = 0;
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvRGB2HLS_8u_C3R_t  icvRGB2HLS_8u_C3R_p = 0;
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvRGB2HLS_32f_C3R_t icvRGB2HLS_32f_C3R_p = 0;
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvHLS2RGB_8u_C3R_t  icvHLS2RGB_8u_C3R_p = 0;
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvHLS2RGB_32f_C3R_t icvHLS2RGB_32f_C3R_p = 0;
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvRGB2Luv_8u_C3R_t  icvRGB2Luv_8u_C3R_p = 0;
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvLuv2RGB_8u_C3R_t  icvLuv2RGB_8u_C3R_p = 0;
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//icvRGB2Luv_32f_C3R_t icvRGB2Luv_32f_C3R_p = 0;
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//icvLuv2RGB_32f_C3R_t icvLuv2RGB_32f_C3R_p = 0;
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//icvRGB2Luv_32f_C3R_t icvRGB2Luv_32f_C3R_p = 0;
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//icvLuv2RGB_32f_C3R_t icvLuv2RGB_32f_C3R_p = 0;
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMPL_BGRx2ABC_IPP( flavor, arrtype )                         \
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                              \
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2ABC_IPP_##flavor##_CnC3R( const arrtype* src, int srcstep,      \
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arrtype* dst, int dststep, CvSize size, int src_cn,                 \
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int blue_idx, CvColorCvtFunc0 ipp_func )                            \
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int block_size = MIN(1 << 14, size.width);                          \
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arrtype* buffer;                                                    \
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, di, k;                                                       \
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int do_copy = src_cn > 3 || blue_idx != 2 || src == dst;            \
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus status = CV_OK;                                            \
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !do_copy )                                                      \
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return ipp_func( src, srcstep, dst, dststep, size );            \
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                          \
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                          \
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    buffer = (arrtype*)cvStackAlloc( block_size*3*sizeof(buffer[0]) );  \
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;                                       \
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )              \
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += block_size )                   \
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                               \
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            arrtype* dst1 = dst + i*3;                                  \
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            di = MIN(block_size, size.width - i);                       \
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( k = 0; k < di*3; k += 3, src += src_cn )               \
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                           \
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                arrtype b = src[blue_idx];                              \
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                arrtype g = src[1];                                     \
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                arrtype r = src[blue_idx^2];                            \
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                buffer[k] = r;                                          \
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                buffer[k+1] = g;                                        \
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                buffer[k+2] = b;                                        \
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                           \
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            status = ipp_func( buffer, CV_STUB_STEP,                    \
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               dst1, CV_STUB_STEP, cvSize(di,1) );      \
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( status < 0 )                                            \
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return status;                                          \
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                               \
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                       \
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2ABC_IPP_8u_CnC3R( const uchar* src, int srcstep,
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* dst, int dststep, CvSize size, int src_cn,
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int blue_idx, CvColorCvtFunc0 ipp_func )
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int block_size = MIN(1 << 14, size.width);
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* buffer;
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, di, k;
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int do_copy = src_cn > 3 || blue_idx != 2 || src == dst;
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus status = CV_OK;
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !do_copy )
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return ipp_func( src, srcstep, dst, dststep, size );
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    buffer = (uchar*)cvStackAlloc( block_size*3*sizeof(buffer[0]) );
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += block_size )
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            uchar* dst1 = dst + i*3;
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            di = MIN(block_size, size.width - i);
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( k = 0; k < di*3; k += 3, src += src_cn )
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                uchar b = src[blue_idx];
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                uchar g = src[1];
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                uchar r = src[blue_idx^2];
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                buffer[k] = r;
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                buffer[k+1] = g;
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                buffer[k+2] = b;
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            status = ipp_func( buffer, CV_STUB_STEP,
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               dst1, CV_STUB_STEP, cvSize(di,1) );
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( status < 0 )
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return status;
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//CV_IMPL_BGRx2ABC_IPP( 8u, uchar )
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRx2ABC_IPP( 16u, ushort )
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRx2ABC_IPP( 32f, float )
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMPL_ABC2BGRx_IPP( flavor, arrtype )                         \
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                              \
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvABC2BGRx_IPP_##flavor##_C3CnR( const arrtype* src, int srcstep,      \
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arrtype* dst, int dststep, CvSize size, int dst_cn,                 \
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int blue_idx, CvColorCvtFunc0 ipp_func )                            \
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int block_size = MIN(1 << 10, size.width);                          \
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arrtype* buffer;                                                    \
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, di, k;                                                       \
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int do_copy = dst_cn > 3 || blue_idx != 2 || src == dst;            \
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus status = CV_OK;                                            \
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !do_copy )                                                      \
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return ipp_func( src, srcstep, dst, dststep, size );            \
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                          \
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                          \
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    buffer = (arrtype*)cvStackAlloc( block_size*3*sizeof(buffer[0]) );  \
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep -= size.width*dst_cn;                                       \
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )              \
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += block_size )                   \
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                               \
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            const arrtype* src1 = src + i*3;                            \
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            di = MIN(block_size, size.width - i);                       \
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            status = ipp_func( src1, CV_STUB_STEP,                      \
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               buffer, CV_STUB_STEP, cvSize(di,1) );    \
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( status < 0 )                                            \
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return status;                                          \
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( k = 0; k < di*3; k += 3, dst += dst_cn )               \
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                           \
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                arrtype r = buffer[k];                                  \
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                arrtype g = buffer[k+1];                                \
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                arrtype b = buffer[k+2];                                \
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[blue_idx] = b;                                      \
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[1] = g;                                             \
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[blue_idx^2] = r;                                    \
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( dst_cn == 4 )                                       \
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[3] = 0;                                         \
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                           \
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                               \
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                        \
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                       \
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_ABC2BGRx_IPP( 8u, uchar )
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_ABC2BGRx_IPP( 16u, ushort )
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_ABC2BGRx_IPP( 32f, float )
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////////////////////////////////////////////////////////////////////////
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                 Color to/from Grayscale                                *
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define fix(x,n)      (int)((x)*(1 << (n)) + 0.5)
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define descale       CV_DESCALE
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cscGr_32f  0.299f
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cscGg_32f  0.587f
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cscGb_32f  0.114f
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* BGR/RGB -> Gray */
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define csc_shift  14
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cscGr  fix(cscGr_32f,csc_shift)
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cscGg  fix(cscGg_32f,csc_shift)
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cscGb  /*fix(cscGb_32f,csc_shift)*/ ((1 << csc_shift) - cscGr - cscGg)
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMPL_GRAY2BGRX( flavor, arrtype )                    \
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                      \
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGray2BGRx_##flavor##_C1CnR( const arrtype* src, int srcstep, \
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       arrtype* dst, int dststep, CvSize size,  \
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       int dst_cn )                             \
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;                                                      \
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                  \
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(src[0]);                                  \
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep -= size.width*dst_cn;                               \
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )      \
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( dst_cn == 3 )                                       \
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i++, dst += 3 )         \
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[0] = dst[1] = dst[2] = src[i];              \
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else                                                    \
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i++, dst += 4 )         \
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[0] = dst[1] = dst[2] = src[i];              \
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[3] = 0;                                     \
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_GRAY2BGRX( 8u, uchar )
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_GRAY2BGRX( 16u, ushort )
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_GRAY2BGRX( 32f, float )
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGR5x52Gray_8u_C2C1R( const uchar* src, int srcstep,
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         uchar* dst, int dststep,
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         CvSize size, int green_bits )
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( green_bits == 5 || green_bits == 6 );
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( green_bits == 6 )
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i++ )
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int t = ((ushort*)src)[i];
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t = ((t << 3) & 0xf8)*cscGb + ((t >> 3) & 0xfc)*cscGg +
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    ((t >> 8) & 0xf8)*cscGr;
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = (uchar)CV_DESCALE(t,csc_shift);
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i++ )
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int t = ((ushort*)src)[i];
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t = ((t << 3) & 0xf8)*cscGb + ((t >> 2) & 0xf8)*cscGg +
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    ((t >> 7) & 0xf8)*cscGr;
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = (uchar)CV_DESCALE(t,csc_shift);
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGray2BGR5x5_8u_C1C2R( const uchar* src, int srcstep,
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         uchar* dst, int dststep,
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                         CvSize size, int green_bits )
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( green_bits == 5 || green_bits == 6 );
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( green_bits == 6 )
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i++ )
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int t = src[i];
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((ushort*)dst)[i] = (ushort)((t >> 3)|((t & ~3) << 3)|((t & ~7) << 8));
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i++ )
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int t = src[i] >> 3;
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((ushort*)dst)[i] = (ushort)(t|(t << 5)|(t << 10));
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2Gray_8u_CnC1R( const uchar* src, int srcstep,
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       uchar* dst, int dststep, CvSize size,
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       int src_cn, int blue_idx )
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( size.width*size.height >= 1024 )
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int* tab = (int*)cvStackAlloc( 256*3*sizeof(tab[0]) );
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int r = 0, g = 0, b = (1 << (csc_shift-1));
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < 256; i++ )
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tab[i] = b;
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tab[i+256] = g;
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tab[i+512] = r;
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            g += cscGg;
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !blue_idx )
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                b += cscGb, r += cscGr;
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                b += cscGr, r += cscGb;
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src += srcstep, dst += dststep )
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i++, src += src_cn )
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int t0 = tab[src[0]] + tab[src[1] + 256] + tab[src[2] + 512];
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = (uchar)(t0 >> csc_shift);
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src += srcstep, dst += dststep )
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i++, src += src_cn )
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int t0 = src[blue_idx]*cscGb + src[1]*cscGg + src[blue_idx^2]*cscGr;
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[i] = (uchar)CV_DESCALE(t0, csc_shift);
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2Gray_16u_CnC1R( const ushort* src, int srcstep,
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        ushort* dst, int dststep, CvSize size,
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        int src_cn, int blue_idx )
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int cb = cscGb, cr = cscGr;
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( blue_idx )
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cb = cscGr, cr = cscGb;
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i++, src += src_cn )
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = (ushort)CV_DESCALE((unsigned)(src[0]*cb +
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    src[1]*cscGg + src[2]*cr), csc_shift);
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2Gray_32f_CnC1R( const float* src, int srcstep,
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        float* dst, int dststep, CvSize size,
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        int src_cn, int blue_idx )
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float cb = cscGb_32f, cr = cscGr_32f;
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( blue_idx )
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cb = cscGr_32f, cr = cscGb_32f;
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i++, src += src_cn )
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = src[0]*cb + src[1]*cscGg_32f + src[2]*cr;
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                     RGB <-> YCrCb                                      *
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* BGR/RGB -> YCrCb */
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define yuvYr_32f cscGr_32f
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define yuvYg_32f cscGg_32f
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define yuvYb_32f cscGb_32f
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define yuvCr_32f 0.713f
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define yuvCb_32f 0.564f
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define yuv_shift 14
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define yuvYr  fix(yuvYr_32f,yuv_shift)
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define yuvYg  fix(yuvYg_32f,yuv_shift)
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define yuvYb  fix(yuvYb_32f,yuv_shift)
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define yuvCr  fix(yuvCr_32f,yuv_shift)
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define yuvCb  fix(yuvCb_32f,yuv_shift)
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define yuv_descale(x)  CV_DESCALE((x), yuv_shift)
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define yuv_prescale(x) ((x) << yuv_shift)
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  yuvRCr_32f   1.403f
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  yuvGCr_32f   (-0.714f)
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  yuvGCb_32f   (-0.344f)
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  yuvBCb_32f   1.773f
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  yuvRCr   fix(yuvRCr_32f,yuv_shift)
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  yuvGCr   (-fix(-yuvGCr_32f,yuv_shift))
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  yuvGCb   (-fix(-yuvGCb_32f,yuv_shift))
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  yuvBCb   fix(yuvBCb_32f,yuv_shift)
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMPL_BGRx2YCrCb( flavor, arrtype, worktype, scale_macro, cast_macro,     \
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            YUV_YB, YUV_YG, YUV_YR, YUV_CR, YUV_CB, YUV_Cx_BIAS )   \
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                                  \
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2YCrCb_##flavor##_CnC3R( const arrtype* src, int srcstep,            \
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    arrtype* dst, int dststep, CvSize size, int src_cn, int blue_idx )      \
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                           \
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;                                                                  \
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                              \
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(src[0]);                                              \
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;                                           \
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;                                                        \
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )                  \
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, src += src_cn )                 \
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype b = src[blue_idx], r = src[2^blue_idx], y;             \
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            y = scale_macro(b*YUV_YB + src[1]*YUV_YG + r*YUV_YR);           \
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            r = scale_macro((r - y)*YUV_CR) + YUV_Cx_BIAS;                  \
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            b = scale_macro((b - y)*YUV_CB) + YUV_Cx_BIAS;                  \
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = cast_macro(y);                                         \
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = cast_macro(r);                                       \
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+2] = cast_macro(b);                                       \
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                           \
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRx2YCrCb( 8u, uchar, int, yuv_descale, CV_CAST_8U,
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    yuvYb, yuvYg, yuvYr, yuvCr, yuvCb, 128 )
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRx2YCrCb( 16u, ushort, int, yuv_descale, CV_CAST_16U,
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    yuvYb, yuvYg, yuvYr, yuvCr, yuvCb, 32768 )
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRx2YCrCb( 32f, float, float, CV_NOP, CV_NOP,
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    yuvYb_32f, yuvYg_32f, yuvYr_32f, yuvCr_32f, yuvCb_32f, 0.5f )
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMPL_YCrCb2BGRx( flavor, arrtype, worktype, prescale_macro,      \
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    scale_macro, cast_macro, YUV_BCb, YUV_GCr, YUV_GCb, YUV_RCr, YUV_Cx_BIAS)\
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                                  \
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvYCrCb2BGRx_##flavor##_C3CnR( const arrtype* src, int srcstep,            \
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                arrtype* dst, int dststep, CvSize size,     \
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                int dst_cn, int blue_idx )                  \
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                           \
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;                                                                  \
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                              \
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(src[0]);                                              \
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep -= size.width*dst_cn;                                           \
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;                                                        \
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )                  \
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, dst += dst_cn )                 \
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype Y = prescale_macro(src[i]),                            \
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     Cr = src[i+1] - YUV_Cx_BIAS,                           \
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     Cb = src[i+2] - YUV_Cx_BIAS;                           \
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype b, g, r;                                               \
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            b = scale_macro( Y + YUV_BCb*Cb );                              \
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            g = scale_macro( Y + YUV_GCr*Cr + YUV_GCb*Cb );                 \
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            r = scale_macro( Y + YUV_RCr*Cr );                              \
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[blue_idx] = cast_macro(b);                                  \
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[1] = cast_macro(g);                                         \
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[blue_idx^2] = cast_macro(r);                                \
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( dst_cn == 4 )                                               \
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[3] = 0;                                                 \
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                           \
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_YCrCb2BGRx( 8u, uchar, int, yuv_prescale, yuv_descale, CV_CAST_8U,
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    yuvBCb, yuvGCr, yuvGCb, yuvRCr, 128 )
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_YCrCb2BGRx( 16u, ushort, int, yuv_prescale, yuv_descale, CV_CAST_16U,
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    yuvBCb, yuvGCr, yuvGCb, yuvRCr, 32768 )
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_YCrCb2BGRx( 32f, float, float, CV_NOP, CV_NOP, CV_NOP,
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    yuvBCb_32f, yuvGCr_32f, yuvGCb_32f, yuvRCr_32f, 0.5f )
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                      RGB <-> XYZ                                       *
7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzXr_32f  0.412453f
7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzXg_32f  0.357580f
7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzXb_32f  0.180423f
7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzYr_32f  0.212671f
7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzYg_32f  0.715160f
7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzYb_32f  0.072169f
7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzZr_32f  0.019334f
8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzZg_32f  0.119193f
8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzZb_32f  0.950227f
8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzRx_32f  3.240479f
8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzRy_32f  (-1.53715f)
8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzRz_32f  (-0.498535f)
8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzGx_32f  (-0.969256f)
8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzGy_32f  1.875991f
8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzGz_32f  0.041556f
8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzBx_32f  0.055648f
8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzBy_32f  (-0.204043f)
8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzBz_32f  1.057311f
8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyz_shift  10
8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzXr_32s  fix(xyzXr_32f, xyz_shift )
8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzXg_32s  fix(xyzXg_32f, xyz_shift )
8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzXb_32s  fix(xyzXb_32f, xyz_shift )
8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzYr_32s  fix(xyzYr_32f, xyz_shift )
8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzYg_32s  fix(xyzYg_32f, xyz_shift )
8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzYb_32s  fix(xyzYb_32f, xyz_shift )
8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzZr_32s  fix(xyzZr_32f, xyz_shift )
8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzZg_32s  fix(xyzZg_32f, xyz_shift )
8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzZb_32s  fix(xyzZb_32f, xyz_shift )
8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzRx_32s  fix(3.240479f, xyz_shift )
8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzRy_32s  -fix(1.53715f, xyz_shift )
8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzRz_32s  -fix(0.498535f, xyz_shift )
8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzGx_32s  -fix(0.969256f, xyz_shift )
8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzGy_32s  fix(1.875991f, xyz_shift )
8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzGz_32s  fix(0.041556f, xyz_shift )
8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzBx_32s  fix(0.055648f, xyz_shift )
8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzBy_32s  -fix(0.204043f, xyz_shift )
8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyzBz_32s  fix(1.057311f, xyz_shift )
8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define xyz_descale(x) CV_DESCALE((x),xyz_shift)
8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMPL_BGRx2XYZ( flavor, arrtype, worktype,                        \
8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          scale_macro, cast_macro, suffix )                 \
8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                                  \
8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2XYZ_##flavor##_CnC3R( const arrtype* src, int srcstep,              \
8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              arrtype* dst, int dststep, CvSize size,       \
8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              int src_cn, int blue_idx )                    \
8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                           \
8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;                                                                  \
8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype t, matrix[] =                                                  \
8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        xyzXb##suffix, xyzXg##suffix, xyzXr##suffix,                        \
8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        xyzYb##suffix, xyzYg##suffix, xyzYr##suffix,                        \
8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        xyzZb##suffix, xyzZg##suffix, xyzZr##suffix                         \
8566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };                                                                      \
8576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
8586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( icvRGB2XYZ_##flavor##_C3R_p )                                       \
8596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return icvBGRx2ABC_IPP_##flavor##_CnC3R( src, srcstep,              \
8606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst, dststep, size, src_cn, blue_idx,                           \
8616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvRGB2XYZ_##flavor##_C3R_p );                                  \
8626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
8636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                              \
8646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                              \
8656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;                                           \
8666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;                                                        \
8676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
8686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( blue_idx )                                                          \
8696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
8706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_SWAP( matrix[0], matrix[2], t );                                 \
8716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_SWAP( matrix[3], matrix[5], t );                                 \
8726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_SWAP( matrix[6], matrix[8], t );                                 \
8736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
8746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
8756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )                  \
8766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
8776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, src += src_cn )                 \
8786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
8796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype x = scale_macro(src[0]*matrix[0] +                     \
8806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    src[1]*matrix[1] + src[2]*matrix[2]);                   \
8816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype y = scale_macro(src[0]*matrix[3] +                     \
8826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    src[1]*matrix[4] + src[2]*matrix[5]);                   \
8836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype z = scale_macro(src[0]*matrix[6] +                     \
8846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    src[1]*matrix[7] + src[2]*matrix[8]);                   \
8856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
8866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = (arrtype)(x);                                          \
8876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = (arrtype)(y);                                        \
8886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+2] = cast_macro(z); /*sum of weights for z > 1*/          \
8896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
8906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
8916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
8926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                           \
8936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRx2XYZ( 8u, uchar, int, xyz_descale, CV_CAST_8U, _32s )
8976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRx2XYZ( 16u, ushort, int, xyz_descale, CV_CAST_16U, _32s )
8986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_BGRx2XYZ( 32f, float, float, CV_NOP, CV_NOP, _32f )
8996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMPL_XYZ2BGRx( flavor, arrtype, worktype, scale_macro,           \
9026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          cast_macro, suffix )                              \
9036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                                  \
9046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvXYZ2BGRx_##flavor##_C3CnR( const arrtype* src, int srcstep,              \
9056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              arrtype* dst, int dststep, CvSize size,       \
9066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              int dst_cn, int blue_idx )                    \
9076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                           \
9086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;                                                                  \
9096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype t, matrix[] =                                                  \
9106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
9116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        xyzBx##suffix, xyzBy##suffix, xyzBz##suffix,                        \
9126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        xyzGx##suffix, xyzGy##suffix, xyzGz##suffix,                        \
9136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        xyzRx##suffix, xyzRy##suffix, xyzRz##suffix                         \
9146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };                                                                      \
9156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
9166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( icvXYZ2RGB_##flavor##_C3R_p )                                       \
9176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return icvABC2BGRx_IPP_##flavor##_C3CnR( src, srcstep,              \
9186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst, dststep, size, dst_cn, blue_idx,                           \
9196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvXYZ2RGB_##flavor##_C3R_p );                                  \
9206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
9216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                              \
9226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);                                              \
9236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep -= size.width*dst_cn;                                           \
9246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;                                                        \
9256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
9266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( blue_idx )                                                          \
9276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
9286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_SWAP( matrix[0], matrix[6], t );                                 \
9296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_SWAP( matrix[1], matrix[7], t );                                 \
9306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_SWAP( matrix[2], matrix[8], t );                                 \
9316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
9326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
9336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )                  \
9346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
9356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, dst += dst_cn )                 \
9366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
9376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype b = scale_macro(src[i]*matrix[0] +                     \
9386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    src[i+1]*matrix[1] + src[i+2]*matrix[2]);               \
9396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype g = scale_macro(src[i]*matrix[3] +                     \
9406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    src[i+1]*matrix[4] + src[i+2]*matrix[5]);               \
9416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype r = scale_macro(src[i]*matrix[6] +                     \
9426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    src[i+1]*matrix[7] + src[i+2]*matrix[8]);               \
9436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
9446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[0] = cast_macro(b);                                         \
9456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[1] = cast_macro(g);                                         \
9466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[2] = cast_macro(r);                                         \
9476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
9486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( dst_cn == 4 )                                               \
9496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[3] = 0;                                                 \
9506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
9516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
9526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
9536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                           \
9546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_XYZ2BGRx( 8u, uchar, int, xyz_descale, CV_CAST_8U, _32s )
9576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_XYZ2BGRx( 16u, ushort, int, xyz_descale, CV_CAST_16U, _32s )
9586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL_XYZ2BGRx( 32f, float, float, CV_NOP, CV_NOP, _32f )
9596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
9626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                          Non-linear Color Space Transformations                        *
9636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
9646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// driver color space conversion function for 8u arrays that uses 32f function
9666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// with appropriate pre- and post-scaling.
9676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
9686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvABC2BGRx_8u_C3CnR( const uchar* src, int srcstep, uchar* dst, int dststep,
9696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      CvSize size, int dst_cn, int blue_idx, CvColorCvtFunc2 cvtfunc_32f,
9706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     const float* pre_coeffs, int postscale )
9716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int block_size = MIN(1 << 8, size.width);
9736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float* buffer = (float*)cvStackAlloc( block_size*3*sizeof(buffer[0]) );
9746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, di, k;
9756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus status = CV_OK;
9766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep -= size.width*dst_cn;
9786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
9806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
9816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += block_size )
9826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
9836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            const uchar* src1 = src + i*3;
9846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            di = MIN(block_size, size.width - i);
9856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( k = 0; k < di*3; k += 3 )
9876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
9886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                float a = CV_8TO32F(src1[k])*pre_coeffs[0] + pre_coeffs[1];
9896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                float b = CV_8TO32F(src1[k+1])*pre_coeffs[2] + pre_coeffs[3];
9906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                float c = CV_8TO32F(src1[k+2])*pre_coeffs[4] + pre_coeffs[5];
9916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                buffer[k] = a;
9926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                buffer[k+1] = b;
9936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                buffer[k+2] = c;
9946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
9956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            status = cvtfunc_32f( buffer, 0, buffer, 0, cvSize(di,1), 3, blue_idx );
9976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( status < 0 )
9986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return status;
9996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( postscale )
10016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
10026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( k = 0; k < di*3; k += 3, dst += dst_cn )
10036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
10046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int b = cvRound(buffer[k]*255.);
10056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int g = cvRound(buffer[k+1]*255.);
10066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int r = cvRound(buffer[k+2]*255.);
10076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[0] = CV_CAST_8U(b);
10096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[1] = CV_CAST_8U(g);
10106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[2] = CV_CAST_8U(r);
10116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( dst_cn == 4 )
10126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dst[3] = 0;
10136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
10146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
10156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
10166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
10176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( k = 0; k < di*3; k += 3, dst += dst_cn )
10186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
10196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int b = cvRound(buffer[k]);
10206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int g = cvRound(buffer[k+1]);
10216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int r = cvRound(buffer[k+2]);
10226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[0] = CV_CAST_8U(b);
10246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[1] = CV_CAST_8U(g);
10256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[2] = CV_CAST_8U(r);
10266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( dst_cn == 4 )
10276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dst[3] = 0;
10286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
10296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
10306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
10326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
10346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// driver color space conversion function for 8u arrays that uses 32f function
10386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// with appropriate pre- and post-scaling.
10396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
10406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2ABC_8u_CnC3R( const uchar* src, int srcstep, uchar* dst, int dststep,
10416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      CvSize size, int src_cn, int blue_idx, CvColorCvtFunc2 cvtfunc_32f,
10426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      int prescale, const float* post_coeffs )
10436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int block_size = MIN(1 << 8, size.width);
10456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float* buffer = (float*)cvStackAlloc( block_size*3*sizeof(buffer[0]) );
10466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, di, k;
10476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvStatus status = CV_OK;
10486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;
10506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
10526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
10536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += block_size )
10546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
10556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            uchar* dst1 = dst + i*3;
10566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            di = MIN(block_size, size.width - i);
10576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( prescale )
10596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
10606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( k = 0; k < di*3; k += 3, src += src_cn )
10616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
10626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float b = CV_8TO32F(src[0])*0.0039215686274509803f;
10636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float g = CV_8TO32F(src[1])*0.0039215686274509803f;
10646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float r = CV_8TO32F(src[2])*0.0039215686274509803f;
10656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    buffer[k] = b;
10676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    buffer[k+1] = g;
10686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    buffer[k+2] = r;
10696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
10706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
10716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
10726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
10736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( k = 0; k < di*3; k += 3, src += src_cn )
10746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
10756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float b = CV_8TO32F(src[0]);
10766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float g = CV_8TO32F(src[1]);
10776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float r = CV_8TO32F(src[2]);
10786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    buffer[k] = b;
10806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    buffer[k+1] = g;
10816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    buffer[k+2] = r;
10826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
10836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
10846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            status = cvtfunc_32f( buffer, 0, buffer, 0, cvSize(di,1), 3, blue_idx );
10866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( status < 0 )
10876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                return status;
10886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( k = 0; k < di*3; k += 3 )
10906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
10916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int a = cvRound( buffer[k]*post_coeffs[0] + post_coeffs[1] );
10926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int b = cvRound( buffer[k+1]*post_coeffs[2] + post_coeffs[3] );
10936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int c = cvRound( buffer[k+2]*post_coeffs[4] + post_coeffs[5] );
10946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst1[k] = CV_CAST_8U(a);
10956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst1[k+1] = CV_CAST_8U(b);
10966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst1[k+2] = CV_CAST_8U(c);
10976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
10986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
10996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
11006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
11026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
11066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                      RGB <-> HSV                                       *
11076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
11086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const uchar icvHue255To180[] =
11106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      0,   1,   1,   2,   3,   4,   4,   5,   6,   6,   7,   8,   8,   9,  10,  11,
11126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     11,  12,  13,  13,  14,  15,  16,  16,  17,  18,  18,  19,  20,  20,  21,  22,
11136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     23,  23,  24,  25,  25,  26,  27,  28,  28,  29,  30,  30,  31,  32,  32,  33,
11146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     34,  35,  35,  36,  37,  37,  38,  39,  40,  40,  41,  42,  42,  43,  44,  44,
11156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     45,  46,  47,  47,  48,  49,  49,  50,  51,  52,  52,  53,  54,  54,  55,  56,
11166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     56,  57,  58,  59,  59,  60,  61,  61,  62,  63,  64,  64,  65,  66,  66,  67,
11176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     68,  68,  69,  70,  71,  71,  72,  73,  73,  74,  75,  76,  76,  77,  78,  78,
11186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     79,  80,  80,  81,  82,  83,  83,  84,  85,  85,  86,  87,  88,  88,  89,  90,
11196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     90,  91,  92,  92,  93,  94,  95,  95,  96,  97,  97,  98,  99, 100, 100, 101,
11206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    102, 102, 103, 104, 104, 105, 106, 107, 107, 108, 109, 109, 110, 111, 112, 112,
11216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    113, 114, 114, 115, 116, 116, 117, 118, 119, 119, 120, 121, 121, 122, 123, 124,
11226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    124, 125, 126, 126, 127, 128, 128, 129, 130, 131, 131, 132, 133, 133, 134, 135,
11236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    136, 136, 137, 138, 138, 139, 140, 140, 141, 142, 143, 143, 144, 145, 145, 146,
11246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    147, 148, 148, 149, 150, 150, 151, 152, 152, 153, 154, 155, 155, 156, 157, 157,
11256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    158, 159, 160, 160, 161, 162, 162, 163, 164, 164, 165, 166, 167, 167, 168, 169,
11266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    169, 170, 171, 172, 172, 173, 174, 174, 175, 176, 176, 177, 178, 179, 179, 180
11276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
11286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const uchar icvHue180To255[] =
11316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      0,   1,   3,   4,   6,   7,   9,  10,  11,  13,  14,  16,  17,  18,  20,  21,
11336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     23,  24,  26,  27,  28,  30,  31,  33,  34,  35,  37,  38,  40,  41,  43,  44,
11346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     45,  47,  48,  50,  51,  52,  54,  55,  57,  58,  60,  61,  62,  64,  65,  67,
11356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     68,  69,  71,  72,  74,  75,  77,  78,  79,  81,  82,  84,  85,  86,  88,  89,
11366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     91,  92,  94,  95,  96,  98,  99, 101, 102, 103, 105, 106, 108, 109, 111, 112,
11376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    113, 115, 116, 118, 119, 120, 122, 123, 125, 126, 128, 129, 130, 132, 133, 135,
11386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    136, 137, 139, 140, 142, 143, 145, 146, 147, 149, 150, 152, 153, 154, 156, 157,
11396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    159, 160, 162, 163, 164, 166, 167, 169, 170, 171, 173, 174, 176, 177, 179, 180,
11406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    181, 183, 184, 186, 187, 188, 190, 191, 193, 194, 196, 197, 198, 200, 201, 203,
11416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    204, 205, 207, 208, 210, 211, 213, 214, 215, 217, 218, 220, 221, 222, 224, 225,
11426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    227, 228, 230, 231, 232, 234, 235, 237, 238, 239, 241, 242, 244, 245, 247, 248,
11436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    249, 251, 252, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
11446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
11456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
11466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
11476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
11486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
11496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
11526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2HSV_8u_CnC3R( const uchar* src, int srcstep, uchar* dst, int dststep,
11536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      CvSize size, int src_cn, int blue_idx )
11546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const int hsv_shift = 12;
11566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const int div_table[] = {
11586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        0, 1044480, 522240, 348160, 261120, 208896, 174080, 149211,
11596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        130560, 116053, 104448, 94953, 87040, 80345, 74606, 69632,
11606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        65280, 61440, 58027, 54973, 52224, 49737, 47476, 45412,
11616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        43520, 41779, 40172, 38684, 37303, 36017, 34816, 33693,
11626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        32640, 31651, 30720, 29842, 29013, 28229, 27486, 26782,
11636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        26112, 25475, 24869, 24290, 23738, 23211, 22706, 22223,
11646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        21760, 21316, 20890, 20480, 20086, 19707, 19342, 18991,
11656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        18651, 18324, 18008, 17703, 17408, 17123, 16846, 16579,
11666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        16320, 16069, 15825, 15589, 15360, 15137, 14921, 14711,
11676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        14507, 14308, 14115, 13926, 13743, 13565, 13391, 13221,
11686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        13056, 12895, 12738, 12584, 12434, 12288, 12145, 12006,
11696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        11869, 11736, 11605, 11478, 11353, 11231, 11111, 10995,
11706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        10880, 10768, 10658, 10550, 10445, 10341, 10240, 10141,
11716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        10043, 9947, 9854, 9761, 9671, 9582, 9495, 9410,
11726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        9326, 9243, 9162, 9082, 9004, 8927, 8852, 8777,
11736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        8704, 8632, 8561, 8492, 8423, 8356, 8290, 8224,
11746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        8160, 8097, 8034, 7973, 7913, 7853, 7795, 7737,
11756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        7680, 7624, 7569, 7514, 7461, 7408, 7355, 7304,
11766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        7253, 7203, 7154, 7105, 7057, 7010, 6963, 6917,
11776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        6872, 6827, 6782, 6739, 6695, 6653, 6611, 6569,
11786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        6528, 6487, 6447, 6408, 6369, 6330, 6292, 6254,
11796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        6217, 6180, 6144, 6108, 6073, 6037, 6003, 5968,
11806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        5935, 5901, 5868, 5835, 5803, 5771, 5739, 5708,
11816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        5677, 5646, 5615, 5585, 5556, 5526, 5497, 5468,
11826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        5440, 5412, 5384, 5356, 5329, 5302, 5275, 5249,
11836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        5222, 5196, 5171, 5145, 5120, 5095, 5070, 5046,
11846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        5022, 4998, 4974, 4950, 4927, 4904, 4881, 4858,
11856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        4836, 4813, 4791, 4769, 4748, 4726, 4705, 4684,
11866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        4663, 4642, 4622, 4601, 4581, 4561, 4541, 4522,
11876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        4502, 4483, 4464, 4445, 4426, 4407, 4389, 4370,
11886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        4352, 4334, 4316, 4298, 4281, 4263, 4246, 4229,
11896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        4212, 4195, 4178, 4161, 4145, 4128, 4112, 4096
11906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
11916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
11936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( icvRGB2HSV_8u_C3R_p )
11946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
11956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvStatus status = icvBGRx2ABC_IPP_8u_CnC3R( src, srcstep, dst, dststep, size,
11966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                src_cn, blue_idx, icvRGB2HSV_8u_C3R_p );
11976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( status >= 0 )
11986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
11996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= 3;
12006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; size.height--; dst += dststep )
12016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
12026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( i = 0; i <= size.width - 12; i += 12 )
12036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
12046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar t0 = icvHue255To180[dst[i]], t1 = icvHue255To180[dst[i+3]];
12056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[i] = t0; dst[i+3] = t1;
12066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    t0 = icvHue255To180[dst[i+6]]; t1 = icvHue255To180[dst[i+9]];
12076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[i+6] = t0; dst[i+9] = t1;
12086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
12096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( ; i < size.width; i += 3 )
12106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[i] = icvHue255To180[dst[i]];
12116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
12126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
12136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return status;
12146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
12156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;
12176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;
12186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
12206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
12216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, src += src_cn )
12226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
12236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int b = (src)[blue_idx], g = (src)[1], r = (src)[2^blue_idx];
12246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int h, s, v = b;
12256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int vmin = b, diff;
12266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int vr, vg;
12276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALC_MAX_8U( v, g );
12296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALC_MAX_8U( v, r );
12306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALC_MIN_8U( vmin, g );
12316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_CALC_MIN_8U( vmin, r );
12326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            diff = v - vmin;
12346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            vr = v == r ? -1 : 0;
12356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            vg = v == g ? -1 : 0;
12366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            s = diff * div_table[v] >> hsv_shift;
12386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            h = (vr & (g - b)) +
12396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                (~vr & ((vg & (b - r + 2 * diff)) + ((~vg) & (r - g + 4 * diff))));
12406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            h = ((h * div_table[diff] * 15 + (1 << (hsv_shift + 6))) >> (7 + hsv_shift))\
12416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                + (h < 0 ? 30*6 : 0);
12426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = (uchar)h;
12446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = (uchar)s;
12456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+2] = (uchar)v;
12466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
12476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
12486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
12506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
12546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2HSV_32f_CnC3R( const float* src, int srcstep,
12556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       float* dst, int dststep,
12566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CvSize size, int src_cn, int blue_idx )
12576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
12596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);
12606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);
12616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;
12626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;
12636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
12656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
12666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, src += src_cn )
12676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
12686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float b = src[blue_idx], g = src[1], r = src[2^blue_idx];
12696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float h, s, v;
12706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float vmin, diff;
12726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            v = vmin = r;
12746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( v < g ) v = g;
12756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( v < b ) v = b;
12766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( vmin > g ) vmin = g;
12776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( vmin > b ) vmin = b;
12786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            diff = v - vmin;
12806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            s = diff/(float)(fabs(v) + FLT_EPSILON);
12816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            diff = (float)(60./(diff + FLT_EPSILON));
12826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( v == r )
12836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                h = (g - b)*diff;
12846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else if( v == g )
12856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                h = (b - r)*diff + 120.f;
12866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
12876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                h = (r - g)*diff + 240.f;
12886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( h < 0 ) h += 360.f;
12906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = h;
12926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = s;
12936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+2] = v;
12946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
12956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
12966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
12986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
13026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvHSV2BGRx_32f_C3CnR( const float* src, int srcstep, float* dst,
13036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       int dststep, CvSize size, int dst_cn, int blue_idx )
13046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
13056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
13066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);
13076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);
13086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep -= size.width*dst_cn;
13096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;
13106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
13126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, dst += dst_cn )
13146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float h = src[i], s = src[i+1], v = src[i+2];
13166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float b, g, r;
13176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( s == 0 )
13196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                b = g = r = v;
13206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
13216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
13226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                static const int sector_data[][3]=
13236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {{1,3,0}, {1,0,2}, {3,0,1}, {0,2,1}, {0,1,3}, {2,1,0}};
13246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                float tab[4];
13256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int sector;
13266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                h *= 0.016666666666666666f; // h /= 60;
13276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( h < 0 )
13286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do h += 6; while( h < 0 );
13296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else if( h >= 6 )
13306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do h -= 6; while( h >= 6 );
13316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sector = cvFloor(h);
13326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                h -= sector;
13336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tab[0] = v;
13356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tab[1] = v*(1.f - s);
13366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tab[2] = v*(1.f - s*h);
13376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tab[3] = v*(1.f - s*(1.f - h));
13386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                b = tab[sector_data[sector][0]];
13406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                g = tab[sector_data[sector][1]];
13416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r = tab[sector_data[sector][2]];
13426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
13436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[blue_idx] = b;
13456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[1] = g;
13466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[blue_idx^2] = r;
13476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( dst_cn == 4 )
13486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[3] = 0;
13496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
13506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
13516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
13536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
13546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
13576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvHSV2BGRx_8u_C3CnR( const uchar* src, int srcstep, uchar* dst, int dststep,
13586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      CvSize size, int dst_cn, int blue_idx )
13596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
13606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const float pre_coeffs[] = { 2.f, 0.f, 0.0039215686274509803f, 0.f, 1.f, 0.f };
13616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( icvHSV2RGB_8u_C3R_p )
13636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
13646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int block_size = MIN(1 << 14, size.width);
13656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        uchar* buffer;
13666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i, di, k;
13676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvStatus status = CV_OK;
13686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buffer = (uchar*)cvStackAlloc( block_size*3*sizeof(buffer[0]) );
13706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dststep -= size.width*dst_cn;
13716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src += srcstep, dst += dststep )
13736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
13746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i += block_size )
13756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
13766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const uchar* src1 = src + i*3;
13776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                di = MIN(block_size, size.width - i);
13786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( k = 0; k < di*3; k += 3 )
13796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
13806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar h = icvHue180To255[src1[k]];
13816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar s = src1[k+1];
13826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar v = src1[k+2];
13836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    buffer[k] = h;
13846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    buffer[k+1] = s;
13856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    buffer[k+2] = v;
13866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
13876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                status = icvHSV2RGB_8u_C3R_p( buffer, di*3,
13896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                buffer, di*3, cvSize(di,1) );
13906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( status < 0 )
13916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    return status;
13926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( k = 0; k < di*3; k += 3, dst += dst_cn )
13946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
13956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar r = buffer[k];
13966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar g = buffer[k+1];
13976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar b = buffer[k+2];
13986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[blue_idx] = b;
13996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[1] = g;
14006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[blue_idx^2] = r;
14016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( dst_cn == 4 )
14026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dst[3] = 0;
14036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
14046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
14056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
14066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_OK;
14086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return icvABC2BGRx_8u_C3CnR( src, srcstep, dst, dststep, size, dst_cn, blue_idx,
14116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 (CvColorCvtFunc2)icvHSV2BGRx_32f_C3CnR, pre_coeffs, 0 );
14126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
14136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
14166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                     RGB <-> HLS                                        *
14176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
14186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
14206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2HLS_32f_CnC3R( const float* src, int srcstep, float* dst, int dststep,
14216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CvSize size, int src_cn, int blue_idx )
14226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
14236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
14246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( icvRGB2HLS_32f_C3R_p )
14266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvStatus status = icvBGRx2ABC_IPP_32f_CnC3R( src, srcstep, dst, dststep, size,
14286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                     src_cn, blue_idx, icvRGB2HLS_32f_C3R_p );
14296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( status >= 0 )
14306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
14316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= 3;
14326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dststep /= sizeof(dst[0]);
14336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; size.height--; dst += dststep )
14356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
14366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( i = 0; i <= size.width - 12; i += 12 )
14376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
14386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float t0 = dst[i]*360.f, t1 = dst[i+3]*360.f;
14396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[i] = t0; dst[i+3] = t1;
14406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    t0 = dst[i+6]*360.f; t1 = dst[i+9]*360.f;
14416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[i+6] = t0; dst[i+9] = t1;
14426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
14436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( ; i < size.width; i += 3 )
14446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[i] = dst[i]*360.f;
14456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
14466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
14476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return status;
14486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);
14516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);
14526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;
14536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;
14546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
14566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
14576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, src += src_cn )
14586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
14596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float b = src[blue_idx], g = src[1], r = src[2^blue_idx];
14606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float h = 0.f, s = 0.f, l;
14616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float vmin, vmax, diff;
14626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            vmax = vmin = r;
14646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( vmax < g ) vmax = g;
14656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( vmax < b ) vmax = b;
14666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( vmin > g ) vmin = g;
14676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( vmin > b ) vmin = b;
14686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            diff = vmax - vmin;
14706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            l = (vmax + vmin)*0.5f;
14716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( diff > FLT_EPSILON )
14736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
14746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s = l < 0.5f ? diff/(vmax + vmin) : diff/(2 - vmax - vmin);
14756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                diff = 60.f/diff;
14766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( vmax == r )
14786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    h = (g - b)*diff;
14796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else if( vmax == g )
14806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    h = (b - r)*diff + 120.f;
14816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else
14826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    h = (r - g)*diff + 240.f;
14836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( h < 0.f ) h += 360.f;
14856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
14866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = h;
14886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = l;
14896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+2] = s;
14906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
14916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
14926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
14946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
14956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
14986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvHLS2BGRx_32f_C3CnR( const float* src, int srcstep, float* dst, int dststep,
14996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CvSize size, int dst_cn, int blue_idx )
15006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
15016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
15026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);
15036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);
15046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( icvHLS2RGB_32f_C3R_p )
15066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int block_size = MIN(1 << 10, size.width);
15086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        float* buffer;
15096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int di, k;
15106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvStatus status = CV_OK;
15116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buffer = (float*)cvStackAlloc( block_size*3*sizeof(buffer[0]) );
15136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dststep -= size.width*dst_cn;
15146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src += srcstep, dst += dststep )
15166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
15176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i += block_size )
15186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
15196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const float* src1 = src + i*3;
15206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                di = MIN(block_size, size.width - i);
15216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( k = 0; k < di*3; k += 3 )
15226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
15236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float h = src1[k]*0.0027777777777777779f; // /360.
15246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float s = src1[k+1], v = src1[k+2];
15256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    buffer[k] = h; buffer[k+1] = s; buffer[k+2] = v;
15266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
15276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                status = icvHLS2RGB_32f_C3R_p( buffer, di*3*sizeof(dst[0]),
15296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                buffer, di*3*sizeof(dst[0]), cvSize(di,1) );
15306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( status < 0 )
15316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    return status;
15326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( k = 0; k < di*3; k += 3, dst += dst_cn )
15346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
15356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float r = buffer[k], g = buffer[k+1], b = buffer[k+2];
15366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[blue_idx] = b; dst[1] = g; dst[blue_idx^2] = r;
15376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( dst_cn == 4 )
15386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dst[3] = 0;
15396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
15406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
15416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
15426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_OK;
15446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
15456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep -= size.width*dst_cn;
15476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;
15486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
15506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
15516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, dst += dst_cn )
15526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
15536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float h = src[i], l = src[i+1], s = src[i+2];
15546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float b, g, r;
15556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( s == 0 )
15576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                b = g = r = l;
15586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
15596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
15606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                static const int sector_data[][3]=
15616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {{1,3,0}, {1,0,2}, {3,0,1}, {0,2,1}, {0,1,3}, {2,1,0}};
15626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                float tab[4];
15636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int sector;
15646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                float p2 = l <= 0.5f ? l*(1 + s) : l + s - l*s;
15666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                float p1 = 2*l - p2;
15676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                h *= 0.016666666666666666f; // h /= 60;
15696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( h < 0 )
15706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do h += 6; while( h < 0 );
15716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else if( h >= 6 )
15726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    do h -= 6; while( h >= 6 );
15736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                assert( 0 <= h && h < 6 );
15756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sector = cvFloor(h);
15766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                h -= sector;
15776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tab[0] = p2;
15796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tab[1] = p1;
15806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tab[2] = p1 + (p2 - p1)*(1-h);
15816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tab[3] = p1 + (p2 - p1)*h;
15826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                b = tab[sector_data[sector][0]];
15846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                g = tab[sector_data[sector][1]];
15856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                r = tab[sector_data[sector][2]];
15866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
15876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[blue_idx] = b;
15896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[1] = g;
15906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[blue_idx^2] = r;
15916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( dst_cn == 4 )
15926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[3] = 0;
15936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
15946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
15956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
15976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
15986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
16006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2HLS_8u_CnC3R( const uchar* src, int srcstep, uchar* dst, int dststep,
16016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      CvSize size, int src_cn, int blue_idx )
16026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
16036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const float post_coeffs[] = { 0.5f, 0.f, 255.f, 0.f, 255.f, 0.f };
16046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( icvRGB2HLS_8u_C3R_p )
16066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvStatus status = icvBGRx2ABC_IPP_8u_CnC3R( src, srcstep, dst, dststep, size,
16086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                    src_cn, blue_idx, icvRGB2HLS_8u_C3R_p );
16096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( status >= 0 )
16106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
16116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            size.width *= 3;
16126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; size.height--; dst += dststep )
16136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
16146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int i;
16156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( i = 0; i <= size.width - 12; i += 12 )
16166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
16176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar t0 = icvHue255To180[dst[i]], t1 = icvHue255To180[dst[i+3]];
16186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[i] = t0; dst[i+3] = t1;
16196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    t0 = icvHue255To180[dst[i+6]]; t1 = icvHue255To180[dst[i+9]];
16206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[i+6] = t0; dst[i+9] = t1;
16216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
16226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( ; i < size.width; i += 3 )
16236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[i] = icvHue255To180[dst[i]];
16246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
16256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
16266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return status;
16276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
16286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return icvBGRx2ABC_8u_CnC3R( src, srcstep, dst, dststep, size, src_cn, blue_idx,
16306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 (CvColorCvtFunc2)icvBGRx2HLS_32f_CnC3R, 1, post_coeffs );
16316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
16326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
16356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvHLS2BGRx_8u_C3CnR( const uchar* src, int srcstep, uchar* dst, int dststep,
16366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      CvSize size, int dst_cn, int blue_idx )
16376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
16386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const float pre_coeffs[] = { 2.f, 0.f, 0.0039215686274509803f, 0.f,
16396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        0.0039215686274509803f, 0.f };
16406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( icvHLS2RGB_8u_C3R_p )
16426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
16436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int block_size = MIN(1 << 14, size.width);
16446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        uchar* buffer;
16456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i, di, k;
16466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvStatus status = CV_OK;
16476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buffer = (uchar*)cvStackAlloc( block_size*3*sizeof(buffer[0]) );
16496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dststep -= size.width*dst_cn;
16506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; size.height--; src += srcstep, dst += dststep )
16526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
16536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( i = 0; i < size.width; i += block_size )
16546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
16556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const uchar* src1 = src + i*3;
16566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                di = MIN(block_size, size.width - i);
16576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( k = 0; k < di*3; k += 3 )
16586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
16596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar h = icvHue180To255[src1[k]];
16606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar l = src1[k+1];
16616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar s = src1[k+2];
16626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    buffer[k] = h;
16636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    buffer[k+1] = l;
16646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    buffer[k+2] = s;
16656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
16666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                status = icvHLS2RGB_8u_C3R_p( buffer, di*3,
16686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                buffer, di*3, cvSize(di,1) );
16696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( status < 0 )
16706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    return status;
16716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( k = 0; k < di*3; k += 3, dst += dst_cn )
16736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
16746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar r = buffer[k];
16756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar g = buffer[k+1];
16766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    uchar b = buffer[k+2];
16776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[blue_idx] = b;
16786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[1] = g;
16796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[blue_idx^2] = r;
16806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( dst_cn == 4 )
16816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        dst[3] = 0;
16826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
16836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
16846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
16856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_OK;
16876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
16886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return icvABC2BGRx_8u_C3CnR( src, srcstep, dst, dststep, size, dst_cn, blue_idx,
16906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 (CvColorCvtFunc2)icvHLS2BGRx_32f_C3CnR, pre_coeffs, 1 );
16916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
16926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
16956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                     RGB <-> L*a*b*                                     *
16966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
16976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labXr_32f  0.433953f /* = xyzXr_32f / 0.950456 */
16996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labXg_32f  0.376219f /* = xyzXg_32f / 0.950456 */
17006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labXb_32f  0.189828f /* = xyzXb_32f / 0.950456 */
17016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labYr_32f  0.212671f /* = xyzYr_32f */
17036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labYg_32f  0.715160f /* = xyzYg_32f */
17046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labYb_32f  0.072169f /* = xyzYb_32f */
17056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labZr_32f  0.017758f /* = xyzZr_32f / 1.088754 */
17076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labZg_32f  0.109477f /* = xyzZg_32f / 1.088754 */
17086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labZb_32f  0.872766f /* = xyzZb_32f / 1.088754 */
17096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labRx_32f  3.0799327f  /* = xyzRx_32f * 0.950456 */
17116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labRy_32f  (-1.53715f) /* = xyzRy_32f */
17126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labRz_32f  (-0.542782f)/* = xyzRz_32f * 1.088754 */
17136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labGx_32f  (-0.921235f)/* = xyzGx_32f * 0.950456 */
17156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labGy_32f  1.875991f   /* = xyzGy_32f */
17166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labGz_32f  0.04524426f /* = xyzGz_32f * 1.088754 */
17176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labBx_32f  0.0528909755f /* = xyzBx_32f * 0.950456 */
17196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labBy_32f  (-0.204043f)  /* = xyzBy_32f */
17206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labBz_32f  1.15115158f   /* = xyzBz_32f * 1.088754 */
17216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  labT_32f   0.008856f
17236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labT   fix(labT_32f*255,lab_shift)
17256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef lab_shift
17276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define lab_shift 10
17286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labXr  fix(labXr_32f,lab_shift)
17296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labXg  fix(labXg_32f,lab_shift)
17306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labXb  fix(labXb_32f,lab_shift)
17316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labYr  fix(labYr_32f,lab_shift)
17336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labYg  fix(labYg_32f,lab_shift)
17346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labYb  fix(labYb_32f,lab_shift)
17356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labZr  fix(labZr_32f,lab_shift)
17376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labZg  fix(labZg_32f,lab_shift)
17386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labZb  fix(labZb_32f,lab_shift)
17396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labSmallScale_32f  7.787f
17416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labSmallShift_32f  0.13793103448275862f  /* 16/116 */
17426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labLScale_32f      116.f
17436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labLShift_32f      16.f
17446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labLScale2_32f     903.3f
17456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labSmallScale fix(31.27 /* labSmallScale_32f*(1<<lab_shift)/255 */,lab_shift)
17476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labSmallShift fix(141.24138 /* labSmallScale_32f*(1<<lab) */,lab_shift)
17486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labLScale fix(295.8 /* labLScale_32f*255/100 */,lab_shift)
17496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labLShift fix(41779.2 /* labLShift_32f*1024*255/100 */,lab_shift)
17506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define labLScale2 fix(labLScale2_32f*0.01,lab_shift)
17516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* 1024*(([0..511]./255)**(1./3)) */
17536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic ushort icvLabCubeRootTab[] = {
17546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn       0,  161,  203,  232,  256,  276,  293,  308,  322,  335,  347,  359,  369,  379,  389,  398,
17556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     406,  415,  423,  430,  438,  445,  452,  459,  465,  472,  478,  484,  490,  496,  501,  507,
17566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     512,  517,  523,  528,  533,  538,  542,  547,  552,  556,  561,  565,  570,  574,  578,  582,
17576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     586,  590,  594,  598,  602,  606,  610,  614,  617,  621,  625,  628,  632,  635,  639,  642,
17586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     645,  649,  652,  655,  659,  662,  665,  668,  671,  674,  677,  680,  684,  686,  689,  692,
17596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     695,  698,  701,  704,  707,  710,  712,  715,  718,  720,  723,  726,  728,  731,  734,  736,
17606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     739,  741,  744,  747,  749,  752,  754,  756,  759,  761,  764,  766,  769,  771,  773,  776,
17616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     778,  780,  782,  785,  787,  789,  792,  794,  796,  798,  800,  803,  805,  807,  809,  811,
17626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     813,  815,  818,  820,  822,  824,  826,  828,  830,  832,  834,  836,  838,  840,  842,  844,
17636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     846,  848,  850,  852,  854,  856,  857,  859,  861,  863,  865,  867,  869,  871,  872,  874,
17646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     876,  878,  880,  882,  883,  885,  887,  889,  891,  892,  894,  896,  898,  899,  901,  903,
17656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     904,  906,  908,  910,  911,  913,  915,  916,  918,  920,  921,  923,  925,  926,  928,  929,
17666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     931,  933,  934,  936,  938,  939,  941,  942,  944,  945,  947,  949,  950,  952,  953,  955,
17676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     956,  958,  959,  961,  962,  964,  965,  967,  968,  970,  971,  973,  974,  976,  977,  979,
17686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     980,  982,  983,  985,  986,  987,  989,  990,  992,  993,  995,  996,  997,  999, 1000, 1002,
17696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1003, 1004, 1006, 1007, 1009, 1010, 1011, 1013, 1014, 1015, 1017, 1018, 1019, 1021, 1022, 1024,
17706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1025, 1026, 1028, 1029, 1030, 1031, 1033, 1034, 1035, 1037, 1038, 1039, 1041, 1042, 1043, 1044,
17716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1046, 1047, 1048, 1050, 1051, 1052, 1053, 1055, 1056, 1057, 1058, 1060, 1061, 1062, 1063, 1065,
17726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1066, 1067, 1068, 1070, 1071, 1072, 1073, 1074, 1076, 1077, 1078, 1079, 1081, 1082, 1083, 1084,
17736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1085, 1086, 1088, 1089, 1090, 1091, 1092, 1094, 1095, 1096, 1097, 1098, 1099, 1101, 1102, 1103,
17746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1104, 1105, 1106, 1107, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1117, 1118, 1119, 1120, 1121,
17756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1122, 1123, 1124, 1125, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1138, 1139,
17766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1154, 1155, 1156,
17776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172,
17786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188,
17796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204,
17806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1215, 1216, 1217, 1218, 1219,
17816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1230, 1231, 1232, 1233, 1234,
17826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249,
17836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1250, 1251, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1259, 1260, 1261, 1262, 1263,
17846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1264, 1265, 1266, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1273, 1274, 1275, 1276, 1277,
17856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    1278, 1279, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1285, 1286, 1287, 1288, 1289, 1290, 1291
17866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn};
17876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
17906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2Lab_8u_CnC3R( const uchar* src, int srcstep, uchar* dst, int dststep,
17916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      CvSize size, int src_cn, int blue_idx )
17926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
17936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
17946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*if( icvBGR2Lab_8u_C3R_p )
17966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return icvBGRx2ABC_IPP_8u_CnC3R( src, srcstep, dst, dststep, size,
17976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         src_cn, blue_idx^2, icvBGR2Lab_8u_C3R_p );*/
17986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;
18006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;
18016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
18036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
18046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, src += src_cn )
18056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
18066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int b = src[blue_idx], g = src[1], r = src[2^blue_idx];
18076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int x, y, z, f;
18086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int L, a;
18096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x = b*labXb + g*labXg + r*labXr;
18116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            y = b*labYb + g*labYg + r*labYr;
18126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            z = b*labZb + g*labZg + r*labZr;
18136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            f = x > labT;
18156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x = CV_DESCALE( x, lab_shift );
18166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( f )
18186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                assert( (unsigned)x < 512 ), x = icvLabCubeRootTab[x];
18196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
18206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                x = CV_DESCALE(x*labSmallScale + labSmallShift,lab_shift);
18216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            f = z > labT;
18236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            z = CV_DESCALE( z, lab_shift );
18246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( f )
18266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                assert( (unsigned)z < 512 ), z = icvLabCubeRootTab[z];
18276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
18286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                z = CV_DESCALE(z*labSmallScale + labSmallShift,lab_shift);
18296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            f = y > labT;
18316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            y = CV_DESCALE( y, lab_shift );
18326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( f )
18346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
18356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                assert( (unsigned)y < 512 ), y = icvLabCubeRootTab[y];
18366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                L = CV_DESCALE(y*labLScale - labLShift, 2*lab_shift );
18376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
18386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
18396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
18406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                L = CV_DESCALE(y*labLScale2,lab_shift);
18416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                y = CV_DESCALE(y*labSmallScale + labSmallShift,lab_shift);
18426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
18436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a = CV_DESCALE( 500*(x - y), lab_shift ) + 128;
18456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            b = CV_DESCALE( 200*(y - z), lab_shift ) + 128;
18466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = CV_CAST_8U(L);
18486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = CV_CAST_8U(a);
18496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+2] = CV_CAST_8U(b);
18506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
18516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
18526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
18546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
18556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
18586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2Lab_32f_CnC3R( const float* src, int srcstep, float* dst, int dststep,
18596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CvSize size, int src_cn, int blue_idx )
18606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
18616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
18626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);
18636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);
18646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;
18656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;
18666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
18686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
18696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, src += src_cn )
18706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
18716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float b = src[blue_idx], g = src[1], r = src[2^blue_idx];
18726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float x, y, z;
18736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float L, a;
18746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x = b*labXb_32f + g*labXg_32f + r*labXr_32f;
18766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            y = b*labYb_32f + g*labYg_32f + r*labYr_32f;
18776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            z = b*labZb_32f + g*labZg_32f + r*labZr_32f;
18786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( x > labT_32f )
18806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                x = cvCbrt(x);
18816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
18826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                x = x*labSmallScale_32f + labSmallShift_32f;
18836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( z > labT_32f )
18856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                z = cvCbrt(z);
18866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
18876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                z = z*labSmallScale_32f + labSmallShift_32f;
18886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
18896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( y > labT_32f )
18906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
18916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                y = cvCbrt(y);
18926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                L = y*labLScale_32f - labLShift_32f;
18936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
18946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
18956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
18966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                L = y*labLScale2_32f;
18976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                y = y*labSmallScale_32f + labSmallShift_32f;
18986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
18996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            a = 500.f*(x - y);
19016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            b = 200.f*(y - z);
19026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = L;
19046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = a;
19056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+2] = b;
19066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
19106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
19116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
19146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvLab2BGRx_32f_C3CnR( const float* src, int srcstep, float* dst, int dststep,
19156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CvSize size, int dst_cn, int blue_idx )
19166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
19176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
19186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);
19196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);
19206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep -= size.width*dst_cn;
19216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;
19226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
19246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, dst += dst_cn )
19266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float L = src[i], a = src[i+1], b = src[i+2];
19286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float x, y, z;
19296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float g, r;
19306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            L = (L + labLShift_32f)*(1.f/labLScale_32f);
19326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x = (L + a*0.002f);
19336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            z = (L - b*0.005f);
19346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            y = L*L*L;
19356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x = x*x*x;
19366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            z = z*z*z;
19376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            b = x*labBx_32f + y*labBy_32f + z*labBz_32f;
19396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            g = x*labGx_32f + y*labGy_32f + z*labGz_32f;
19406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            r = x*labRx_32f + y*labRy_32f + z*labRz_32f;
19416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[blue_idx] = b;
19436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[1] = g;
19446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[blue_idx^2] = r;
19456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( dst_cn == 4 )
19466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[3] = 0;
19476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
19486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
19496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
19516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
19526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
19556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvLab2BGRx_8u_C3CnR( const uchar* src, int srcstep, uchar* dst, int dststep,
19566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      CvSize size, int dst_cn, int blue_idx )
19576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
19586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // L: [0..255] -> [0..100]
19596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // a: [0..255] -> [-128..127]
19606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // b: [0..255] -> [-128..127]
19616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const float pre_coeffs[] = { 0.39215686274509809f, 0.f, 1.f, -128.f, 1.f, -128.f };
19626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( icvLab2BGR_8u_C3R_p )
19646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return icvABC2BGRx_IPP_8u_C3CnR( src, srcstep, dst, dststep, size,
19656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         dst_cn, blue_idx^2, icvLab2BGR_8u_C3R_p );
19666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return icvABC2BGRx_8u_C3CnR( src, srcstep, dst, dststep, size, dst_cn, blue_idx,
19686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 (CvColorCvtFunc2)icvLab2BGRx_32f_C3CnR, pre_coeffs, 1 );
19696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
19706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
19736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                     RGB <-> L*u*v*                                     *
19746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
19756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define luvUn_32f  0.19793943f
19776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define luvVn_32f  0.46831096f
19786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define luvYmin_32f  0.05882353f /* 15/255 */
19796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
19816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2Luv_32f_CnC3R( const float* src, int srcstep, float* dst, int dststep,
19826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CvSize size, int src_cn, int blue_idx )
19836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
19846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
19856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*if( icvRGB2Luv_32f_C3R_p )
19876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return icvBGRx2ABC_IPP_32f_CnC3R( src, srcstep, dst, dststep, size,
19886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                          src_cn, blue_idx, icvRGB2Luv_32f_C3R_p );*/
19896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);
19916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);
19926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep -= size.width*src_cn;
19936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;
19946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
19956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
19966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
19976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, src += src_cn )
19986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
19996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float b = src[blue_idx], g = src[1], r = src[2^blue_idx];
20006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float x, y, z;
20016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float L, u, v, t;
20026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x = b*xyzXb_32f + g*xyzXg_32f + r*xyzXr_32f;
20046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            y = b*xyzYb_32f + g*xyzYg_32f + r*xyzYr_32f;
20056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            z = b*xyzZb_32f + g*xyzZg_32f + r*xyzZr_32f;
20066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !x && !y && !z )
20086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                L = u = v = 0.f;
20096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
20106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
20116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( y > labT_32f )
20126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    L = labLScale_32f * cvCbrt(y) - labLShift_32f;
20136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else
20146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    L = labLScale2_32f * y;
20156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t = 1.f / (x + 15 * y + 3 * z);
20176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                u = 4.0f * x * t;
20186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                v = 9.0f * y * t;
20196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                u = 13*L*(u - luvUn_32f);
20216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                v = 13*L*(v - luvVn_32f);
20226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
20236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i] = L;
20256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+1] = u;
20266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[i+2] = v;
20276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
20286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
20296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
20316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
20326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
20356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvLuv2BGRx_32f_C3CnR( const float* src, int srcstep, float* dst, int dststep,
20366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CvSize size, int dst_cn, int blue_idx )
20376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
20386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
20396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*if( icvLuv2RGB_32f_C3R_p )
20416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return icvABC2BGRx_IPP_32f_C3CnR( src, srcstep, dst, dststep, size,
20426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                          dst_cn, blue_idx, icvLuv2RGB_32f_C3R_p );*/
20436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);
20456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep /= sizeof(dst[0]);
20466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dststep -= size.width*dst_cn;
20476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= 3;
20486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height--; src += srcstep, dst += dststep )
20506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
20516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < size.width; i += 3, dst += dst_cn )
20526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
20536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float L = src[i], u = src[i+1], v = src[i+2];
20546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float x, y, z, t, u1, v1, b, g, r;
20556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( L >= 8 )
20576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
20586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t = (L + labLShift_32f) * (1.f/labLScale_32f);
20596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                y = t*t*t;
20606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
20616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else
20626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
20636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                y = L * (1.f/labLScale2_32f);
20646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                L = MAX( L, 0.001f );
20656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
20666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t = 1.f/(13.f * L);
20686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            u1 = u*t + luvUn_32f;
20696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            v1 = v*t + luvVn_32f;
20706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            x = 2.25f * u1 * y / v1 ;
20716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            z = (12 - 3 * u1 - 20 * v1) * y / (4 * v1);
20726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            b = xyzBx_32f*x + xyzBy_32f*y + xyzBz_32f*z;
20746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            g = xyzGx_32f*x + xyzGy_32f*y + xyzGz_32f*z;
20756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            r = xyzRx_32f*x + xyzRy_32f*y + xyzRz_32f*z;
20766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[blue_idx] = b;
20786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[1] = g;
20796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[blue_idx^2] = r;
20806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( dst_cn == 4 )
20816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[3] = 0.f;
20826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
20836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
20846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
20866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
20876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
20896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
20906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBGRx2Luv_8u_CnC3R( const uchar* src, int srcstep, uchar* dst, int dststep,
20916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      CvSize size, int src_cn, int blue_idx )
20926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
20936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // L: [0..100] -> [0..255]
20946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // u: [-134..220] -> [0..255]
20956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // v: [-140..122] -> [0..255]
20966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    //static const float post_coeffs[] = { 2.55f, 0.f, 1.f, 83.f, 1.f, 140.f };
20976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const float post_coeffs[] = { 2.55f, 0.f, 0.72033898305084743f, 96.525423728813564f,
20986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         0.99609375f, 139.453125f };
20996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( icvRGB2Luv_8u_C3R_p )
21016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return icvBGRx2ABC_IPP_8u_CnC3R( src, srcstep, dst, dststep, size,
21026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         src_cn, blue_idx, icvRGB2Luv_8u_C3R_p );
21036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return icvBGRx2ABC_8u_CnC3R( src, srcstep, dst, dststep, size, src_cn, blue_idx,
21056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 (CvColorCvtFunc2)icvBGRx2Luv_32f_CnC3R, 1, post_coeffs );
21066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
21076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
21106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvLuv2BGRx_8u_C3CnR( const uchar* src, int srcstep, uchar* dst, int dststep,
21116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      CvSize size, int dst_cn, int blue_idx )
21126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
21136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // L: [0..255] -> [0..100]
21146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // u: [0..255] -> [-134..220]
21156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    // v: [0..255] -> [-140..122]
21166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static const float pre_coeffs[] = { 0.39215686274509809f, 0.f, 1.388235294117647f, -134.f,
21176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        1.003921568627451f, -140.f };
21186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( icvLuv2RGB_8u_C3R_p )
21206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return icvABC2BGRx_IPP_8u_C3CnR( src, srcstep, dst, dststep, size,
21216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         dst_cn, blue_idx, icvLuv2RGB_8u_C3R_p );
21226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return icvABC2BGRx_8u_C3CnR( src, srcstep, dst, dststep, size, dst_cn, blue_idx,
21246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 (CvColorCvtFunc2)icvLuv2BGRx_32f_C3CnR, pre_coeffs, 1 );
21256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
21266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
21286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                            Bayer Pattern -> RGB conversion                             *
21296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
21306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
21326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvBayer2BGR_8u_C1C3R( const uchar* bayer0, int bayer_step,
21336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       uchar *dst0, int dst_step,
21346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                       CvSize size, int code )
21356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
21366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int blue = code == CV_BayerBG2BGR || code == CV_BayerGB2BGR ? -1 : 1;
21376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int start_with_green = code == CV_BayerGB2BGR || code == CV_BayerGR2BGR;
21386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    memset( dst0, 0, size.width*3*sizeof(dst0[0]) );
21406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    memset( dst0 + (size.height - 1)*dst_step, 0, size.width*3*sizeof(dst0[0]) );
21416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst0 += dst_step + 3 + 1;
21426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.height -= 2;
21436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width -= 2;
21446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( ; size.height-- > 0; bayer0 += bayer_step, dst0 += dst_step )
21466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
21476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int t0, t1;
21486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        const uchar* bayer = bayer0;
21496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        uchar* dst = dst0;
21506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        const uchar* bayer_end = bayer + size.width;
21516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        dst[-4] = dst[-3] = dst[-2] = dst[size.width*3-1] =
21536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[size.width*3] = dst[size.width*3+1] = 0;
21546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( size.width <= 0 )
21566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            continue;
21576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( start_with_green )
21596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
21606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (bayer[1] + bayer[bayer_step*2+1] + 1) >> 1;
21616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = (bayer[bayer_step] + bayer[bayer_step+2] + 1) >> 1;
21626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[-blue] = (uchar)t0;
21636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[0] = bayer[bayer_step+1];
21646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[blue] = (uchar)t1;
21656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            bayer++;
21666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst += 3;
21676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
21686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( blue > 0 )
21706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
21716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; bayer <= bayer_end - 2; bayer += 2, dst += 6 )
21726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
21736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = (bayer[0] + bayer[2] + bayer[bayer_step*2] +
21746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      bayer[bayer_step*2+2] + 2) >> 2;
21756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = (bayer[1] + bayer[bayer_step] +
21766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      bayer[bayer_step+2] + bayer[bayer_step*2+1]+2) >> 2;
21776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[-1] = (uchar)t0;
21786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[0] = (uchar)t1;
21796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[1] = bayer[bayer_step+1];
21806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
21816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = (bayer[2] + bayer[bayer_step*2+2] + 1) >> 1;
21826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = (bayer[bayer_step+1] + bayer[bayer_step+3] + 1) >> 1;
21836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[2] = (uchar)t0;
21846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[3] = bayer[bayer_step+2];
21856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[4] = (uchar)t1;
21866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
21876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
21886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else
21896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
21906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; bayer <= bayer_end - 2; bayer += 2, dst += 6 )
21916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
21926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = (bayer[0] + bayer[2] + bayer[bayer_step*2] +
21936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      bayer[bayer_step*2+2] + 2) >> 2;
21946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = (bayer[1] + bayer[bayer_step] +
21956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      bayer[bayer_step+2] + bayer[bayer_step*2+1]+2) >> 2;
21966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[1] = (uchar)t0;
21976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[0] = (uchar)t1;
21986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[-1] = bayer[bayer_step+1];
21996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = (bayer[2] + bayer[bayer_step*2+2] + 1) >> 1;
22016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 = (bayer[bayer_step+1] + bayer[bayer_step+3] + 1) >> 1;
22026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[4] = (uchar)t0;
22036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[3] = bayer[bayer_step+2];
22046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[2] = (uchar)t1;
22056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
22066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
22076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( bayer < bayer_end )
22096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
22106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t0 = (bayer[0] + bayer[2] + bayer[bayer_step*2] +
22116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  bayer[bayer_step*2+2] + 2) >> 2;
22126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            t1 = (bayer[1] + bayer[bayer_step] +
22136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                  bayer[bayer_step+2] + bayer[bayer_step*2+1]+2) >> 2;
22146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[-blue] = (uchar)t0;
22156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[0] = (uchar)t1;
22166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst[blue] = bayer[bayer_step+1];
22176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            bayer++;
22186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst += 3;
22196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
22206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        blue = -blue;
22226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        start_with_green = !start_with_green;
22236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
22246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
22266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
22276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
22306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                   The main function                                    *
22316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
22326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
22346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvCvtColor( const CvArr* srcarr, CvArr* dstarr, int code )
22356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
22366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvCvtColor" );
22376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
22396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub, *src = (CvMat*)srcarr;
22416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub, *dst = (CvMat*)dstarr;
22426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
22436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src_step, dst_step;
22446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src_cn, dst_cn, depth;
22456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvColorCvtFunc0 func0 = 0;
22466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvColorCvtFunc1 func1 = 0;
22476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvColorCvtFunc2 func2 = 0;
22486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvColorCvtFunc3 func3 = 0;
22496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int param[] = { 0, 0, 0, 0 };
22506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( src = cvGetMat( srcarr, &srcstub ));
22526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( dst = cvGetMat( dstarr, &dststub ));
22536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src, dst ))
22556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedSizes, "" );
22566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_DEPTHS_EQ( src, dst ))
22586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedFormats, "" );
22596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    depth = CV_MAT_DEPTH(src->type);
22616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( depth != CV_8U && depth != CV_16U && depth != CV_32F )
22626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
22636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_cn = CV_MAT_CN( src->type );
22656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_cn = CV_MAT_CN( dst->type );
22666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize( src );
22676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_step = src->step;
22686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step = dst->step;
22696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_IS_MAT_CONT(src->type & dst->type) &&
22716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        code != CV_BayerBG2BGR && code != CV_BayerGB2BGR &&
22726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        code != CV_BayerRG2BGR && code != CV_BayerGR2BGR )
22736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
22746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.width *= size.height;
22756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        size.height = 1;
22766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src_step = dst_step = CV_STUB_STEP;
22776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
22786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    switch( code )
22806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
22816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR2BGRA:
22826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGB2BGRA:
22836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( src_cn != 3 || dst_cn != 4 )
22846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels,
22856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Incorrect number of channels for this conversion code" );
22866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func1 = depth == CV_8U ? (CvColorCvtFunc1)icvBGR2BGRx_8u_C3C4R :
22886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                depth == CV_16U ? (CvColorCvtFunc1)icvBGR2BGRx_16u_C3C4R :
22896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                depth == CV_32F ? (CvColorCvtFunc1)icvBGR2BGRx_32f_C3C4R : 0;
22906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[0] = code == CV_BGR2BGRA ? 0 : 2; // blue_idx
22916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
22926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
22936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGRA2BGR:
22946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGBA2BGR:
22956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGB2BGR:
22966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (src_cn != 3 && src_cn != 4) || dst_cn != 3 )
22976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels,
22986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Incorrect number of channels for this conversion code" );
22996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func2 = depth == CV_8U ? (CvColorCvtFunc2)icvBGRx2BGR_8u_CnC3R :
23016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                depth == CV_16U ? (CvColorCvtFunc2)icvBGRx2BGR_16u_CnC3R :
23026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                depth == CV_32F ? (CvColorCvtFunc2)icvBGRx2BGR_32f_CnC3R : 0;
23036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[0] = src_cn;
23046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[1] = code == CV_BGRA2BGR ? 0 : 2; // blue_idx
23056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
23066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGRA2RGBA:
23086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( src_cn != 4 || dst_cn != 4 )
23096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels,
23106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Incorrect number of channels for this conversion code" );
23116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func0 = depth == CV_8U ? (CvColorCvtFunc0)icvBGRA2RGBA_8u_C4R :
23136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                depth == CV_16U ? (CvColorCvtFunc0)icvBGRA2RGBA_16u_C4R :
23146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                depth == CV_32F ? (CvColorCvtFunc0)icvBGRA2RGBA_32f_C4R : 0;
23156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
23166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR2BGR565:
23186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR2BGR555:
23196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGB2BGR565:
23206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGB2BGR555:
23216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGRA2BGR565:
23226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGRA2BGR555:
23236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGBA2BGR565:
23246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGBA2BGR555:
23256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (src_cn != 3 && src_cn != 4) || dst_cn != 2 )
23266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels,
23276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Incorrect number of channels for this conversion code" );
23286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( depth != CV_8U )
23306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadDepth,
23316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Conversion to/from 16-bit packed RGB format "
23326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "is only possible for 8-bit images (8-bit grayscale, 888 BGR/RGB or 8888 BGRA/RGBA)" );
23336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func3 = (CvColorCvtFunc3)icvBGRx2BGR5x5_8u_CnC2R;
23356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[0] = src_cn;
23366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[1] = code == CV_BGR2BGR565 || code == CV_BGR2BGR555 ||
23376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   code == CV_BGRA2BGR565 || code == CV_BGRA2BGR555 ? 0 : 2; // blue_idx
23386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[2] = code == CV_BGR2BGR565 || code == CV_RGB2BGR565 ||
23396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   code == CV_BGRA2BGR565 || code == CV_RGBA2BGR565 ? 6 : 5; // green_bits
23406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
23416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR5652BGR:
23436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR5552BGR:
23446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR5652RGB:
23456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR5552RGB:
23466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR5652BGRA:
23476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR5552BGRA:
23486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR5652RGBA:
23496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR5552RGBA:
23506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( src_cn != 2 || (dst_cn != 3 && dst_cn != 4))
23516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels,
23526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Incorrect number of channels for this conversion code" );
23536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( depth != CV_8U )
23556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadDepth,
23566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Conversion to/from 16-bit packed BGR format "
23576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "is only possible for 8-bit images (8-bit grayscale, 888 BGR/BGR or 8888 BGRA/BGRA)" );
23586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func3 = (CvColorCvtFunc3)icvBGR5x52BGRx_8u_C2CnR;
23606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[0] = dst_cn;
23616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[1] = code == CV_BGR5652BGR || code == CV_BGR5552BGR ||
23626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   code == CV_BGR5652BGRA || code == CV_BGR5552BGRA ? 0 : 2; // blue_idx
23636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[2] = code == CV_BGR5652BGR || code == CV_BGR5652RGB ||
23646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   code == CV_BGR5652BGRA || code == CV_BGR5652RGBA ? 6 : 5; // green_bits
23656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
23666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR2GRAY:
23686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGRA2GRAY:
23696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGB2GRAY:
23706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGBA2GRAY:
23716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (src_cn != 3 && src_cn != 4) || dst_cn != 1 )
23726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels,
23736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Incorrect number of channels for this conversion code" );
23746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func2 = depth == CV_8U ? (CvColorCvtFunc2)icvBGRx2Gray_8u_CnC1R :
23766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                depth == CV_16U ? (CvColorCvtFunc2)icvBGRx2Gray_16u_CnC1R :
23776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                depth == CV_32F ? (CvColorCvtFunc2)icvBGRx2Gray_32f_CnC1R : 0;
23786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[0] = src_cn;
23806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[1] = code == CV_BGR2GRAY || code == CV_BGRA2GRAY ? 0 : 2;
23816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
23826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR5652GRAY:
23846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR5552GRAY:
23856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( src_cn != 2 || dst_cn != 1 )
23866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels,
23876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Incorrect number of channels for this conversion code" );
23886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( depth != CV_8U )
23906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadDepth,
23916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Conversion to/from 16-bit packed BGR format "
23926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "is only possible for 8-bit images (888 BGR/BGR or 8888 BGRA/BGRA)" );
23936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func2 = (CvColorCvtFunc2)icvBGR5x52Gray_8u_C2C1R;
23956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[0] = code == CV_BGR5652GRAY ? 6 : 5; // green_bits
23976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
23986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
23996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_GRAY2BGR:
24006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_GRAY2BGRA:
24016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( src_cn != 1 || (dst_cn != 3 && dst_cn != 4))
24026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels,
24036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Incorrect number of channels for this conversion code" );
24046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func1 = depth == CV_8U ? (CvColorCvtFunc1)icvGray2BGRx_8u_C1CnR :
24066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                depth == CV_16U ? (CvColorCvtFunc1)icvGray2BGRx_16u_C1CnR :
24076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                depth == CV_32F ? (CvColorCvtFunc1)icvGray2BGRx_32f_C1CnR : 0;
24086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[0] = dst_cn;
24106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
24116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_GRAY2BGR565:
24136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_GRAY2BGR555:
24146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( src_cn != 1 || dst_cn != 2 )
24156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels,
24166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Incorrect number of channels for this conversion code" );
24176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( depth != CV_8U )
24196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadDepth,
24206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Conversion to/from 16-bit packed BGR format "
24216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "is only possible for 8-bit images (888 BGR/BGR or 8888 BGRA/BGRA)" );
24226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func2 = (CvColorCvtFunc2)icvGray2BGR5x5_8u_C1C2R;
24246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[0] = code == CV_GRAY2BGR565 ? 6 : 5; // green_bits
24256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
24266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR2YCrCb:
24286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGB2YCrCb:
24296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR2XYZ:
24306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGB2XYZ:
24316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR2HSV:
24326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGB2HSV:
24336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR2Lab:
24346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGB2Lab:
24356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR2Luv:
24366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGB2Luv:
24376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BGR2HLS:
24386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_RGB2HLS:
24396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (src_cn != 3 && src_cn != 4) || dst_cn != 3 )
24406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels,
24416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Incorrect number of channels for this conversion code" );
24426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( depth == CV_8U )
24446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            func2 = code == CV_BGR2YCrCb || code == CV_RGB2YCrCb ? (CvColorCvtFunc2)icvBGRx2YCrCb_8u_CnC3R :
24456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_BGR2XYZ || code == CV_RGB2XYZ ? (CvColorCvtFunc2)icvBGRx2XYZ_8u_CnC3R :
24466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_BGR2HSV || code == CV_RGB2HSV ? (CvColorCvtFunc2)icvBGRx2HSV_8u_CnC3R :
24476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_BGR2Lab || code == CV_RGB2Lab ? (CvColorCvtFunc2)icvBGRx2Lab_8u_CnC3R :
24486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_BGR2Luv || code == CV_RGB2Luv ? (CvColorCvtFunc2)icvBGRx2Luv_8u_CnC3R :
24496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_BGR2HLS || code == CV_RGB2HLS ? (CvColorCvtFunc2)icvBGRx2HLS_8u_CnC3R : 0;
24506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( depth == CV_16U )
24516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            func2 = code == CV_BGR2YCrCb || code == CV_RGB2YCrCb ? (CvColorCvtFunc2)icvBGRx2YCrCb_16u_CnC3R :
24526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_BGR2XYZ || code == CV_RGB2XYZ ? (CvColorCvtFunc2)icvBGRx2XYZ_16u_CnC3R : 0;
24536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( depth == CV_32F )
24546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            func2 = code == CV_BGR2YCrCb || code == CV_RGB2YCrCb ? (CvColorCvtFunc2)icvBGRx2YCrCb_32f_CnC3R :
24556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_BGR2XYZ || code == CV_RGB2XYZ ? (CvColorCvtFunc2)icvBGRx2XYZ_32f_CnC3R :
24566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_BGR2HSV || code == CV_RGB2HSV ? (CvColorCvtFunc2)icvBGRx2HSV_32f_CnC3R :
24576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_BGR2Lab || code == CV_RGB2Lab ? (CvColorCvtFunc2)icvBGRx2Lab_32f_CnC3R :
24586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_BGR2Luv || code == CV_RGB2Luv ? (CvColorCvtFunc2)icvBGRx2Luv_32f_CnC3R :
24596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_BGR2HLS || code == CV_RGB2HLS ? (CvColorCvtFunc2)icvBGRx2HLS_32f_CnC3R : 0;
24606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[0] = src_cn;
24626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[1] = code == CV_BGR2XYZ || code == CV_BGR2YCrCb || code == CV_BGR2HSV ||
24636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   code == CV_BGR2Lab || code == CV_BGR2Luv || code == CV_BGR2HLS ? 0 : 2;
24646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
24656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_YCrCb2BGR:
24676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_YCrCb2RGB:
24686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_XYZ2BGR:
24696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_XYZ2RGB:
24706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_HSV2BGR:
24716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_HSV2RGB:
24726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_Lab2BGR:
24736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_Lab2RGB:
24746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_Luv2BGR:
24756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_Luv2RGB:
24766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_HLS2BGR:
24776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_HLS2RGB:
24786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( src_cn != 3 || (dst_cn != 3 && dst_cn != 4) )
24796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels,
24806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Incorrect number of channels for this conversion code" );
24816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
24826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( depth == CV_8U )
24836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            func2 = code == CV_YCrCb2BGR || code == CV_YCrCb2RGB ? (CvColorCvtFunc2)icvYCrCb2BGRx_8u_C3CnR :
24846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_XYZ2BGR || code == CV_XYZ2RGB ? (CvColorCvtFunc2)icvXYZ2BGRx_8u_C3CnR :
24856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_HSV2BGR || code == CV_HSV2RGB ? (CvColorCvtFunc2)icvHSV2BGRx_8u_C3CnR :
24866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_HLS2BGR || code == CV_HLS2RGB ? (CvColorCvtFunc2)icvHLS2BGRx_8u_C3CnR :
24876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_Lab2BGR || code == CV_Lab2RGB ? (CvColorCvtFunc2)icvLab2BGRx_8u_C3CnR :
24886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_Luv2BGR || code == CV_Luv2RGB ? (CvColorCvtFunc2)icvLuv2BGRx_8u_C3CnR : 0;
24896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( depth == CV_16U )
24906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            func2 = code == CV_YCrCb2BGR || code == CV_YCrCb2RGB ? (CvColorCvtFunc2)icvYCrCb2BGRx_16u_C3CnR :
24916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_XYZ2BGR || code == CV_XYZ2RGB ? (CvColorCvtFunc2)icvXYZ2BGRx_16u_C3CnR : 0;
24926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else if( depth == CV_32F )
24936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            func2 = code == CV_YCrCb2BGR || code == CV_YCrCb2RGB ? (CvColorCvtFunc2)icvYCrCb2BGRx_32f_C3CnR :
24946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_XYZ2BGR || code == CV_XYZ2RGB ? (CvColorCvtFunc2)icvXYZ2BGRx_32f_C3CnR :
24956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_HSV2BGR || code == CV_HSV2RGB ? (CvColorCvtFunc2)icvHSV2BGRx_32f_C3CnR :
24966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_HLS2BGR || code == CV_HLS2RGB ? (CvColorCvtFunc2)icvHLS2BGRx_32f_C3CnR :
24976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_Lab2BGR || code == CV_Lab2RGB ? (CvColorCvtFunc2)icvLab2BGRx_32f_C3CnR :
24986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    code == CV_Luv2BGR || code == CV_Luv2RGB ? (CvColorCvtFunc2)icvLuv2BGRx_32f_C3CnR : 0;
24996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[0] = dst_cn;
25016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[1] = code == CV_XYZ2BGR || code == CV_YCrCb2BGR || code == CV_HSV2BGR ||
25026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                   code == CV_Lab2BGR || code == CV_Luv2BGR || code == CV_HLS2BGR ? 0 : 2;
25036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
25046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BayerBG2BGR:
25066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BayerGB2BGR:
25076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BayerRG2BGR:
25086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    case CV_BayerGR2BGR:
25096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( src_cn != 1 || dst_cn != 3 )
25106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadNumChannels,
25116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Incorrect number of channels for this conversion code" );
25126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( depth != CV_8U )
25146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_BadDepth,
25156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Bayer pattern can be converted only to 8-bit 3-channel BGR/RGB image" );
25166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func1 = (CvColorCvtFunc1)icvBayer2BGR_8u_C1C3R;
25186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        param[0] = code; // conversion code
25196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        break;
25206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    default:
25216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
25226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
25236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( func0 )
25256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
25266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func0( src->data.ptr, src_step, dst->data.ptr, dst_step, size ));
25276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
25286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( func1 )
25296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
25306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func1( src->data.ptr, src_step,
25316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst->data.ptr, dst_step, size, param[0] ));
25326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
25336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( func2 )
25346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
25356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func2( src->data.ptr, src_step,
25366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst->data.ptr, dst_step, size, param[0], param[1] ));
25376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
25386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( func3 )
25396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
25406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func3( src->data.ptr, src_step,
25416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            dst->data.ptr, dst_step, size, param[0], param[1], param[2] ));
25426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
25436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
25446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "The image format is not supported" );
25456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
25476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
25486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */
25506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
25516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2552