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//
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                For Open Source Computer Vision Library
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cv.h"
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_INTEGRAL_OP_C1( flavor, arrtype, sumtype, sqsumtype, worktype,  \
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                cast_macro, cast_sqr_macro )    \
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                      \
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvIntegralImage_##flavor##_C1R( const arrtype* src, int srcstep,\
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 sumtype* sum, int sumstep,     \
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 sqsumtype* sqsum, int sqsumstep,\
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 sumtype* tilted, int tiltedstep,\
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 CvSize size )                  \
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x, y;                                                   \
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sumtype s;                                                  \
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sqsumtype sq;                                               \
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sumtype* buf = 0;                                           \
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                  \
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    memset( sum, 0, (size.width+1)*sizeof(sum[0]));             \
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sumstep /= sizeof(sum[0]);                                  \
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sum += sumstep + 1;                                         \
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sqsum )                                                 \
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        memset( sqsum, 0, (size.width+1)*sizeof(sqsum[0]));     \
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sqsumstep /= sizeof(sqsum[0]);                          \
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sqsum += sqsumstep + 1;                                 \
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( tilted )                                                \
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        memset( tilted, 0, (size.width+1)*sizeof(tilted[0]));   \
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tiltedstep /= sizeof(tilted[0]);                        \
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        tilted += tiltedstep + 1;                               \
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sqsum == 0 && tilted == 0 )                             \
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( y = 0; y < size.height; y++, src += srcstep,       \
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                          sum += sumstep )      \
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sum[-1] = 0;                                        \
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0, s = 0; x < size.width; x++ )            \
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sumtype t = cast_macro(src[x]);                 \
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s += t;                                         \
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sum[x] = sum[x - sumstep] + s;                  \
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( tilted == 0 )                                      \
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( y = 0; y < size.height; y++, src += srcstep,       \
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        sum += sumstep, sqsum += sqsumstep )    \
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sum[-1] = 0;                                        \
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sqsum[-1] = 0;                                      \
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0, s = 0, sq = 0; x < size.width; x++ )    \
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype it = src[x];                           \
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sumtype t = cast_macro(it);                     \
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sqsumtype tq = cast_sqr_macro(it);              \
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s += t;                                         \
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sq += tq;                                       \
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t = sum[x - sumstep] + s;                       \
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tq = sqsum[x - sqsumstep] + sq;                 \
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sum[x] = t;                                     \
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sqsum[x] = tq;                                  \
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else                                                        \
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( sqsum == 0 )                                        \
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            assert(0);                                          \
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return CV_NULLPTR_ERR;                              \
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buf = (sumtype*)cvStackAlloc((size.width + 1 )* sizeof(buf[0]));\
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sum[-1] = tilted[-1] = 0;                               \
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sqsum[-1] = 0;                                          \
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( x = 0, s = 0, sq = 0; x < size.width; x++ )        \
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype it = src[x];                               \
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sumtype t = cast_macro(it);                         \
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sqsumtype tq = cast_sqr_macro(it);                  \
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            buf[x] = tilted[x] = t;                             \
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            s += t;                                             \
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sq += tq;                                           \
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sum[x] = s;                                         \
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sqsum[x] = sq;                                      \
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( size.width == 1 )                                   \
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            buf[1] = 0;                                         \
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( y = 1; y < size.height; y++ )                      \
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            worktype it;                                        \
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sumtype t0;                                         \
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sqsumtype tq0;                                      \
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            src += srcstep;                                     \
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sum += sumstep;                                     \
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sqsum += sqsumstep;                                 \
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tilted += tiltedstep;                               \
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            it = src[0/*x*/];                                   \
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            s = t0 = cast_macro(it);                            \
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sq = tq0 = cast_sqr_macro(it);                      \
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sum[-1] = 0;                                        \
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sqsum[-1] = 0;                                      \
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            /*tilted[-1] = buf[0];*/                            \
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tilted[-1] = tilted[-tiltedstep];                   \
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sum[0] = sum[-sumstep] + t0;                        \
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sqsum[0] = sqsum[-sqsumstep] + tq0;                 \
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            tilted[0] = tilted[-tiltedstep] + t0 + buf[1];      \
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 1; x < size.width - 1; x++ )               \
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sumtype t1 = buf[x];                            \
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                buf[x-1] = t1 + t0;                             \
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                it = src[x];                                    \
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = cast_macro(it);                            \
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tq0 = cast_sqr_macro(it);                       \
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s += t0;                                        \
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sq += tq0;                                      \
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sum[x] = sum[x - sumstep] + s;                  \
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sqsum[x] = sqsum[x - sqsumstep] + sq;           \
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t1 += buf[x+1] + t0 + tilted[x - tiltedstep - 1];\
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tilted[x] = t1;                                 \
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( size.width > 1 )                                \
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sumtype t1 = buf[x];                            \
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                buf[x-1] = t1 + t0;                             \
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                it = src[x];    /*+*/                           \
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                t0 = cast_macro(it);                            \
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tq0 = cast_sqr_macro(it);                       \
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s += t0;                                        \
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sq += tq0;                                      \
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sum[x] = sum[x - sumstep] + s;                  \
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sqsum[x] = sqsum[x - sqsumstep] + sq;           \
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                tilted[x] = t0 + t1 + tilted[x - tiltedstep - 1];\
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                buf[x] = t0;                                    \
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INTEGRAL_OP_C1( 8u32s, uchar, int, double, int, CV_NOP, CV_8TO32F_SQR )
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INTEGRAL_OP_C1( 8u64f, uchar, double, double, int, CV_8TO32F, CV_8TO32F_SQR )
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INTEGRAL_OP_C1( 32f64f, float, double, double, double, CV_NOP, CV_SQR )
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INTEGRAL_OP_C1( 64f, double, double, double, double, CV_NOP, CV_SQR )
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_INTEGRAL_OP_CN( flavor, arrtype, sumtype, sqsumtype,    \
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                worktype, cast_macro, cast_sqr_macro )  \
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                      \
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvIntegralImage_##flavor##_CnR( const arrtype* src, int srcstep,\
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 sumtype* sum, int sumstep,     \
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 sqsumtype* sqsum, int sqsumstep,\
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 CvSize size, int cn )          \
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                               \
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x, y;                                                   \
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    srcstep /= sizeof(src[0]);                                  \
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    memset( sum, 0, (size.width+1)*cn*sizeof(sum[0]));          \
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sumstep /= sizeof(sum[0]);                                  \
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sum += sumstep + cn;                                        \
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sqsum )                                                 \
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        memset( sqsum, 0, (size.width+1)*cn*sizeof(sqsum[0]));  \
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sqsumstep /= sizeof(sqsum[0]);                          \
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sqsum += sqsumstep + cn;                                \
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size.width *= cn;                                           \
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sqsum == 0 )                                            \
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( y = 0; y < size.height; y++, src += srcstep,       \
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                          sum += sumstep )      \
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = -cn; x < 0; x++ )                          \
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sum[x] = 0;                                     \
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < size.width; x++ )                   \
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sum[x] = cast_macro(src[x]) + sum[x - cn];      \
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < size.width; x++ )                   \
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sum[x] = sum[x] + sum[x - sumstep];             \
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else                                                        \
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                           \
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( y = 0; y < size.height; y++, src += srcstep,       \
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        sum += sumstep, sqsum += sqsumstep )    \
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                       \
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = -cn; x < 0; x++ )                          \
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sum[x] = 0;                                     \
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sqsum[x] = 0;                                   \
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < size.width; x++ )                   \
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype it = src[x];                           \
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sumtype t = cast_macro(it) + sum[x-cn];         \
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sqsumtype tq = cast_sqr_macro(it) + sqsum[x-cn];\
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sum[x] = t;                                     \
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sqsum[x] = tq;                                  \
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < size.width; x++ )                   \
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                   \
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sumtype t = sum[x] + sum[x - sumstep];          \
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sqsumtype tq = sqsum[x] + sqsum[x - sqsumstep]; \
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sum[x] = t;                                     \
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                sqsum[x] = tq;                                  \
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                   \
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                       \
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                           \
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                \
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                               \
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INTEGRAL_OP_CN( 8u32s, uchar, int, double, int, CV_NOP, CV_8TO32F_SQR )
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INTEGRAL_OP_CN( 8u64f, uchar, double, double, int, CV_8TO32F, CV_8TO32F_SQR )
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INTEGRAL_OP_CN( 32f64f, float, double, double, double, CV_NOP, CV_SQR )
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INTEGRAL_OP_CN( 64f, double, double, double, double, CV_NOP, CV_SQR )
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void icvInitIntegralImageTable( CvFuncTable* table_c1, CvFuncTable* table_cn )
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table_c1->fn_2d[CV_8U] = (void*)icvIntegralImage_8u64f_C1R;
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table_c1->fn_2d[CV_32F] = (void*)icvIntegralImage_32f64f_C1R;
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table_c1->fn_2d[CV_64F] = (void*)icvIntegralImage_64f_C1R;
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table_cn->fn_2d[CV_8U] = (void*)icvIntegralImage_8u64f_CnR;
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table_cn->fn_2d[CV_32F] = (void*)icvIntegralImage_32f64f_CnR;
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table_cn->fn_2d[CV_64F] = (void*)icvIntegralImage_64f_CnR;
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvIntegralImageFuncC1)(
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const void* src, int srcstep, void* sum, int sumstep,
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void* sqsum, int sqsumstep, void* tilted, int tiltedstep,
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size );
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL * CvIntegralImageFuncCn)(
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const void* src, int srcstep, void* sum, int sumstep,
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void* sqsum, int sqsumstep, CvSize size, int cn );
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvIntegral_8u32s_C1R_t icvIntegral_8u32s_C1R_p = 0;
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvSqrIntegral_8u32s64f_C1R_t icvSqrIntegral_8u32s64f_C1R_p = 0;
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvIntegral( const CvArr* image, CvArr* sumImage,
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CvArr* sumSqImage, CvArr* tiltedSumImage )
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable tab_c1, tab_cn;
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvIntegralImage" );
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat src_stub, *src = (CvMat*)image;
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat sum_stub, *sum = (CvMat*)sumImage;
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat sqsum_stub, *sqsum = (CvMat*)sumSqImage;
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat tilted_stub, *tilted = (CvMat*)tiltedSumImage;
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int coi0 = 0, coi1 = 0, coi2 = 0, coi3 = 0;
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int depth, cn;
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int src_step, sum_step, sqsum_step, tilted_step;
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvIntegralImageFuncC1 func_c1 = 0;
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvIntegralImageFuncCn func_cn = 0;
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size;
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitIntegralImageTable( &tab_c1, &tab_cn );
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( src = cvGetMat( src, &src_stub, &coi0 ));
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( sum = cvGetMat( sum, &sum_stub, &coi1 ));
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sum->width != src->width + 1 ||
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        sum->height != src->height + 1 )
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedSizes, "" );
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (CV_MAT_DEPTH( sum->type ) != CV_64F &&
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (CV_MAT_DEPTH( src->type ) != CV_8U ||
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn         CV_MAT_DEPTH( sum->type ) != CV_32S )) ||
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        !CV_ARE_CNS_EQ( src, sum ))
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat,
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        "Sum array must have 64f type (or 32s type in case of 8u source array) "
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        "and the same number of channels as the source array" );
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( sqsum )
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( sqsum = cvGetMat( sqsum, &sqsum_stub, &coi2 ));
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( sum, sqsum ) )
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedSizes, "" );
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_DEPTH( sqsum->type ) != CV_64F || !CV_ARE_CNS_EQ( src, sqsum ))
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat,
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      "Squares sum array must be 64f "
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      "and the same number of channels as the source array" );
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( tilted )
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !sqsum )
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsNullPtr,
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "Squared sum array must be passed if tilted sum array is passed" );
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( tilted = cvGetMat( tilted, &tilted_stub, &coi3 ));
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_SIZES_EQ( sum, tilted ) )
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedSizes, "" );
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !CV_ARE_TYPES_EQ( sum, tilted ) )
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnmatchedFormats,
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      "Sum and tilted sum must have the same types" );
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_CN(tilted->type) != 1 )
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsNotImplemented,
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                      "Tilted sum can not be computed for multi-channel arrays" );
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi0 || coi1 || coi2 || coi3 )
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "COI is not supported by the function" );
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    depth = CV_MAT_DEPTH(src->type);
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cn = CV_MAT_CN(src->type);
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_DEPTH( sum->type ) == CV_32S )
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func_c1 = (CvIntegralImageFuncC1)icvIntegralImage_8u32s_C1R;
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func_cn = (CvIntegralImageFuncCn)icvIntegralImage_8u32s_CnR;
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func_c1 = (CvIntegralImageFuncC1)tab_c1.fn_2d[depth];
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func_cn = (CvIntegralImageFuncCn)tab_cn.fn_2d[depth];
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( !func_c1 && !func_cn )
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "This source image format is unsupported" );
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size = cvGetMatSize(src);
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_step = src->step ? src->step : CV_STUB_STEP;
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sum_step = sum->step ? sum->step : CV_STUB_STEP;
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    sqsum_step = !sqsum ? 0 : sqsum->step ? sqsum->step : CV_STUB_STEP;
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tilted_step = !tilted ? 0 : tilted->step ? tilted->step : CV_STUB_STEP;
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( cn == 1 )
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( depth == CV_8U && !tilted && CV_MAT_DEPTH(sum->type) == CV_32S )
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( !sqsum && icvIntegral_8u32s_C1R_p &&
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                icvIntegral_8u32s_C1R_p( src->data.ptr, src_step,
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            sum->data.i, sum_step, size, 0 ) >= 0 )
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                EXIT;
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( sqsum && icvSqrIntegral_8u32s64f_C1R_p &&
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                icvSqrIntegral_8u32s64f_C1R_p( src->data.ptr, src_step, sum->data.i,
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            sum_step, sqsum->data.db, sqsum_step, size, 0, 0 ) >= 0 )
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                EXIT;
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func_c1( src->data.ptr, src_step, sum->data.ptr, sum_step,
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        sqsum ? sqsum->data.ptr : 0, sqsum_step,
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        tilted ? tilted->data.ptr : 0, tilted_step, size ));
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( func_cn( src->data.ptr, src_step, sum->data.ptr, sum_step,
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        sqsum ? sqsum->data.ptr : 0, sqsum_step, size, cn ));
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */
436