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/**************************************************************************************\
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                   line samplers                                      *
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\**************************************************************************************/
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL int
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvSampleLine( const void* img, CvPoint pt1, CvPoint pt2,
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn              void* _buffer, int connectivity )
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int count = -1;
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvSampleLine" );
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, coi = 0, pix_size;
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat stub, *mat = (CvMat*)img;
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvLineIterator iterator;
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* buffer = (uchar*)_buffer;
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( mat = cvGetMat( mat, &stub, &coi ));
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( coi != 0 )
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadCOI, "" );
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !buffer )
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsNullPtr, "" );
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CALL( count = cvInitLineIterator( mat, pt1, pt2, &iterator, connectivity ));
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    pix_size = CV_ELEM_SIZE(mat->type);
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < count; i++ )
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_MEMCPY_AUTO( buffer, iterator.ptr, pix_size );
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        buffer += pix_size;
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_NEXT_LINE_POINT( iterator );
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return count;
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic const void*
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvAdjustRect( const void* srcptr, int src_step, int pix_size,
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn               CvSize src_size, CvSize win_size,
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn               CvPoint ip, CvRect* pRect )
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvRect rect;
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const char* src = (const char*)srcptr;
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ip.x >= 0 )
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src += ip.x*pix_size;
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.x = 0;
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.x = -ip.x;
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( rect.x > win_size.width )
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            rect.x = win_size.width;
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ip.x + win_size.width < src_size.width )
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.width = win_size.width;
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.width = src_size.width - ip.x - 1;
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( rect.width < 0 )
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            src += rect.width*pix_size;
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            rect.width = 0;
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert( rect.width <= win_size.width );
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ip.y >= 0 )
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src += ip.y * src_step;
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.y = 0;
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.y = -ip.y;
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ip.y + win_size.height < src_size.height )
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.height = win_size.height;
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        rect.height = src_size.height - ip.y - 1;
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( rect.height < 0 )
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            src += rect.height*src_step;
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            rect.height = 0;
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *pRect = rect;
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return src - rect.x*pix_size;
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_GET_RECT_SUB_PIX_FUNC( flavor, srctype, dsttype, worktype, \
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        cast_macro, scale_macro, cast_macro2 )\
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvGetRectSubPix_##flavor##_C1R                         \
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const srctype* src, int src_step, CvSize src_size,                        \
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  dsttype* dst, int dst_step, CvSize win_size, CvPoint2D32f center )        \
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                           \
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint ip;                                                             \
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype  a11, a12, a21, a22, b1, b2;                                   \
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float a, b;                                                             \
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, j;                                                               \
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    center.x -= (win_size.width-1)*0.5f;                                    \
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    center.y -= (win_size.height-1)*0.5f;                                   \
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ip.x = cvFloor( center.x );                                             \
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ip.y = cvFloor( center.y );                                             \
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a = center.x - ip.x;                                                    \
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    b = center.y - ip.y;                                                    \
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a11 = scale_macro((1.f-a)*(1.f-b));                                     \
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a12 = scale_macro(a*(1.f-b));                                           \
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a21 = scale_macro((1.f-a)*b);                                           \
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a22 = scale_macro(a*b);                                                 \
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    b1 = scale_macro(1.f - b);                                              \
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    b2 = scale_macro(b);                                                    \
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_step /= sizeof(src[0]);                                             \
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step /= sizeof(dst[0]);                                             \
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( 0 <= ip.x && ip.x + win_size.width < src_size.width &&              \
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        0 <= ip.y && ip.y + win_size.height < src_size.height )             \
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        /* extracted rectangle is totally inside the image */               \
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src += ip.y * src_step + ip.x;                                      \
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( icvCopySubpix_##flavor##_C1R_p &&                               \
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvCopySubpix_##flavor##_C1R_p( src, src_step*sizeof(src[0]),   \
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            dst, dst_step*sizeof(dst[0]),   \
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            win_size, a, b ) >= 0 )         \
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return CV_OK;                                                   \
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < win_size.height; i++, src += src_step,              \
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              dst += dst_step )             \
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( j = 0; j <= win_size.width - 2; j += 2 )                   \
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                               \
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s0 = cast_macro(src[j])*a11 +                      \
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src[j+1])*a12 +                    \
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src[j+src_step])*a21 +             \
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src[j+src_step+1])*a22;            \
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s1 = cast_macro(src[j+1])*a11 +                    \
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src[j+2])*a12 +                    \
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src[j+src_step+1])*a21 +           \
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src[j+src_step+2])*a22;            \
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j] = (dsttype)cast_macro2(s0);                          \
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j+1] = (dsttype)cast_macro2(s1);                        \
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                               \
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; j < win_size.width; j++ )                                \
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                               \
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s0 = cast_macro(src[j])*a11 +                      \
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src[j+1])*a12 +                    \
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src[j+src_step])*a21 +             \
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src[j+src_step+1])*a22;            \
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j] = (dsttype)cast_macro2(s0);                          \
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                               \
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else                                                                    \
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvRect r;                                                           \
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src = (const srctype*)icvAdjustRect( src, src_step*sizeof(*src),    \
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               sizeof(*src), src_size, win_size,ip, &r);    \
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < win_size.height; i++, dst += dst_step )             \
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            const srctype *src2 = src + src_step;                           \
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( i < r.y || i >= r.height )                                  \
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                src2 -= src_step;                                           \
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( j = 0; j < r.x; j++ )                                      \
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                               \
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s0 = cast_macro(src[r.x])*b1 +                     \
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src2[r.x])*b2;                     \
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j] = (dsttype)cast_macro2(s0);                          \
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                               \
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; j < r.width; j++ )                                       \
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                               \
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s0 = cast_macro(src[j])*a11 +                      \
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src[j+1])*a12 +                    \
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src2[j])*a21 +                     \
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src2[j+1])*a22;                    \
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j] = (dsttype)cast_macro2(s0);                          \
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                               \
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; j < win_size.width; j++ )                                \
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                               \
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s0 = cast_macro(src[r.width])*b1 +                 \
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              cast_macro(src2[r.width])*b2;                 \
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j] = (dsttype)cast_macro2(s0);                          \
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                               \
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( i < r.height )                                              \
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                src = src2;                                                 \
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                           \
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_GET_RECT_SUB_PIX_FUNC_C3( flavor, srctype, dsttype, worktype, \
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        cast_macro, scale_macro, mul_macro )\
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL icvGetRectSubPix_##flavor##_C3R                  \
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const srctype* src, int src_step, CvSize src_size,                        \
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  dsttype* dst, int dst_step, CvSize win_size, CvPoint2D32f center )        \
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                           \
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint ip;                                                             \
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype a, b;                                                          \
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, j;                                                               \
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    center.x -= (win_size.width-1)*0.5f;                                    \
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    center.y -= (win_size.height-1)*0.5f;                                   \
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ip.x = cvFloor( center.x );                                             \
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ip.y = cvFloor( center.y );                                             \
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a = scale_macro( center.x - ip.x );                                     \
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    b = scale_macro( center.y - ip.y );                                     \
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_step /= sizeof( src[0] );                                           \
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step /= sizeof( dst[0] );                                           \
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( 0 <= ip.x && ip.x + win_size.width < src_size.width &&              \
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        0 <= ip.y && ip.y + win_size.height < src_size.height )             \
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        /* extracted rectangle is totally inside the image */               \
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src += ip.y * src_step + ip.x*3;                                    \
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < win_size.height; i++, src += src_step,              \
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              dst += dst_step )             \
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( j = 0; j < win_size.width; j++ )                           \
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                               \
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s0 = cast_macro(src[j*3]);                         \
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s1 = cast_macro(src[j*3 + src_step]);              \
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 += mul_macro( a, (cast_macro(src[j*3+3]) - s0));         \
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 += mul_macro( a, (cast_macro(src[j*3+3+src_step]) - s1));\
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j*3] = (dsttype)(s0 + mul_macro( b, (s1 - s0)));        \
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 = cast_macro(src[j*3+1]);                                \
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 = cast_macro(src[j*3+1 + src_step]);                     \
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 += mul_macro( a, (cast_macro(src[j*3+4]) - s0));         \
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 += mul_macro( a, (cast_macro(src[j*3+4+src_step]) - s1));\
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j*3+1] = (dsttype)(s0 + mul_macro( b, (s1 - s0)));      \
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 = cast_macro(src[j*3+2]);                                \
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 = cast_macro(src[j*3+2 + src_step]);                     \
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 += mul_macro( a, (cast_macro(src[j*3+5]) - s0));         \
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 += mul_macro( a, (cast_macro(src[j*3+5+src_step]) - s1));\
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j*3+2] = (dsttype)(s0 + mul_macro( b, (s1 - s0)));      \
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                               \
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else                                                                    \
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvRect r;                                                           \
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src = (const srctype*)icvAdjustRect( src, src_step*sizeof(*src),    \
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                             sizeof(*src)*3, src_size, win_size, ip, &r );  \
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < win_size.height; i++, dst += dst_step )             \
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            const srctype *src2 = src + src_step;                           \
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( i < r.y || i >= r.height )                                  \
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                src2 -= src_step;                                           \
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( j = 0; j < r.x; j++ )                                      \
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                               \
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s0 = cast_macro(src[r.x*3]);                       \
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s1 = cast_macro(src2[r.x*3]);                      \
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j*3] = (dsttype)(s0 + mul_macro( b, (s1 - s0)));        \
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 = cast_macro(src[r.x*3+1]);                              \
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 = cast_macro(src2[r.x*3+1]);                             \
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j*3+1] = (dsttype)(s0 + mul_macro( b, (s1 - s0)));      \
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 = cast_macro(src[r.x*3+2]);                              \
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 = cast_macro(src2[r.x*3+2]);                             \
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j*3+2] = (dsttype)(s0 + mul_macro( b, (s1 - s0)));      \
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                               \
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; j < r.width; j++ )                                       \
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                               \
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s0 = cast_macro(src[j*3]);                         \
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s1 = cast_macro(src2[j*3]);                        \
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 += mul_macro( a, (cast_macro(src[j*3 + 3]) - s0));       \
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 += mul_macro( a, (cast_macro(src2[j*3 + 3]) - s1));      \
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j*3] = (dsttype)(s0 + mul_macro( b, (s1 - s0)));        \
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 = cast_macro(src[j*3+1]);                                \
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 = cast_macro(src2[j*3+1]);                               \
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 += mul_macro( a, (cast_macro(src[j*3 + 4]) - s0));       \
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 += mul_macro( a, (cast_macro(src2[j*3 + 4]) - s1));      \
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j*3+1] = (dsttype)(s0 + mul_macro( b, (s1 - s0)));      \
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 = cast_macro(src[j*3+2]);                                \
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 = cast_macro(src2[j*3+2]);                               \
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 += mul_macro( a, (cast_macro(src[j*3 + 5]) - s0));       \
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 += mul_macro( a, (cast_macro(src2[j*3 + 5]) - s1));      \
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j*3+2] = (dsttype)(s0 + mul_macro( b, (s1 - s0)));      \
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                               \
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; j < win_size.width; j++ )                                \
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                               \
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s0 = cast_macro(src[r.width*3]);                   \
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype s1 = cast_macro(src2[r.width*3]);                  \
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j*3] = (dsttype)(s0 + mul_macro( b, (s1 - s0)));        \
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 = cast_macro(src[r.width*3+1]);                          \
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 = cast_macro(src2[r.width*3+1]);                         \
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j*3+1] = (dsttype)(s0 + mul_macro( b, (s1 - s0)));      \
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s0 = cast_macro(src[r.width*3+2]);                          \
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                s1 = cast_macro(src2[r.width*3+2]);                         \
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j*3+2] = (dsttype)(s0 + mul_macro( b, (s1 - s0)));      \
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                               \
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( i < r.height )                                              \
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                src = src2;                                                 \
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                           \
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL icvGetRectSubPix_8u32f_C1R
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const uchar* src, int src_step, CvSize src_size,
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  float* dst, int dst_step, CvSize win_size, CvPoint2D32f center )
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint ip;
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float  a12, a22, b1, b2;
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float a, b;
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double s = 0;
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, j;
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    center.x -= (win_size.width-1)*0.5f;
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    center.y -= (win_size.height-1)*0.5f;
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ip.x = cvFloor( center.x );
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ip.y = cvFloor( center.y );
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( win_size.width <= 0 || win_size.height <= 0 )
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADRANGE_ERR;
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a = center.x - ip.x;
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    b = center.y - ip.y;
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a = MAX(a,0.0001f);
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a12 = a*(1.f-b);
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    a22 = a*b;
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    b1 = 1.f - b;
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    b2 = b;
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    s = (1. - a)/a;
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_step /= sizeof(src[0]);
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step /= sizeof(dst[0]);
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( 0 <= ip.x && ip.x + win_size.width < src_size.width &&
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        0 <= ip.y && ip.y + win_size.height < src_size.height )
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        // extracted rectangle is totally inside the image
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src += ip.y * src_step + ip.x;
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if 0
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( icvCopySubpix_8u32f_C1R_p &&
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            icvCopySubpix_8u32f_C1R_p( src, src_step, dst,
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst_step*sizeof(dst[0]), win_size, a, b ) >= 0 )
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            return CV_OK;
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( ; win_size.height--; src += src_step, dst += dst_step )
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float prev = (1 - a)*(b1*CV_8TO32F(src[0]) + b2*CV_8TO32F(src[src_step]));
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( j = 0; j < win_size.width; j++ )
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                float t = a12*CV_8TO32F(src[j+1]) + a22*CV_8TO32F(src[j+1+src_step]);
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j] = prev + t;
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                prev = (float)(t*s);
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvRect r;
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        src = (const uchar*)icvAdjustRect( src, src_step*sizeof(*src),
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               sizeof(*src), src_size, win_size,ip, &r);
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( i = 0; i < win_size.height; i++, dst += dst_step )
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            const uchar *src2 = src + src_step;
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( i < r.y || i >= r.height )
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                src2 -= src_step;
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( j = 0; j < r.x; j++ )
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                float s0 = CV_8TO32F(src[r.x])*b1 +
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                           CV_8TO32F(src2[r.x])*b2;
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j] = (float)(s0);
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( j < r.width )
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                float prev = (1 - a)*(b1*CV_8TO32F(src[j]) + b2*CV_8TO32F(src2[j]));
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( ; j < r.width; j++ )
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float t = a12*CV_8TO32F(src[j+1]) + a22*CV_8TO32F(src2[j+1]);
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[j] = prev + t;
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    prev = (float)(t*s);
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( ; j < win_size.width; j++ )
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                float s0 = CV_8TO32F(src[r.width])*b1 +
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                           CV_8TO32F(src2[r.width])*b2;
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[j] = (float)(s0);
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( i < r.height )
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                src = src2;
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_SHIFT             16
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_SCALE(x)          cvRound((x)*(1 << ICV_SHIFT))
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_MUL_SCALE(x,y)    (((x)*(y) + (1 << (ICV_SHIFT-1))) >> ICV_SHIFT)
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DESCALE(x)        (((x)+(1 << (ICV_SHIFT-1))) >> ICV_SHIFT)
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCopySubpix_8u_C1R_t icvCopySubpix_8u_C1R_p = 0;
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCopySubpix_8u32f_C1R_t icvCopySubpix_8u32f_C1R_p = 0;
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvCopySubpix_32f_C1R_t icvCopySubpix_32f_C1R_p = 0;
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_GET_RECT_SUB_PIX_FUNC( 8u, uchar, uchar, int, CV_NOP, ICV_SCALE, ICV_DESCALE )
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//ICV_DEF_GET_RECT_SUB_PIX_FUNC( 8u32f, uchar, float, float, CV_8TO32F, CV_NOP, CV_NOP )
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_GET_RECT_SUB_PIX_FUNC( 32f, float, float, float, CV_NOP, CV_NOP, CV_NOP )
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_GET_RECT_SUB_PIX_FUNC_C3( 8u, uchar, uchar, int, CV_NOP, ICV_SCALE, ICV_MUL_SCALE )
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_GET_RECT_SUB_PIX_FUNC_C3( 8u32f, uchar, float, float, CV_8TO32F, CV_NOP, CV_MUL )
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_GET_RECT_SUB_PIX_FUNC_C3( 32f, float, float, float, CV_NOP, CV_NOP, CV_MUL )
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  ICV_DEF_INIT_SUBPIX_TAB( FUNCNAME, FLAG )                  \
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void icvInit##FUNCNAME##FLAG##Table( CvFuncTable* tab )      \
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8U] = (void*)icv##FUNCNAME##_8u_##FLAG;           \
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f_##FLAG;         \
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[1] = (void*)icv##FUNCNAME##_8u32f_##FLAG;            \
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_SUBPIX_TAB( GetRectSubPix, C1R )
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_SUBPIX_TAB( GetRectSubPix, C3R )
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvGetRectSubPixFunc)( const void* src, int src_step,
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                    CvSize src_size, void* dst,
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                    int dst_step, CvSize win_size,
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                    CvPoint2D32f center );
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetRectSubPix( const void* srcarr, void* dstarr, CvPoint2D32f center )
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static CvFuncTable gr_tab[2];
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static int inittab = 0;
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetRectSubPix" );
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub, *src = (CvMat*)srcarr;
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub, *dst = (CvMat*)dstarr;
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize src_size, dst_size;
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvGetRectSubPixFunc func;
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int cn, src_step, dst_step;
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitGetRectSubPixC1RTable( gr_tab + 0 );
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitGetRectSubPixC3RTable( gr_tab + 1 );
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src))
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src = cvGetMat( src, &srcstub ));
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst))
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = cvGetMat( dst, &dststub ));
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cn = CV_MAT_CN( src->type );
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (cn != 1 && cn != 3) || !CV_ARE_CNS_EQ( src, dst ))
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_size = cvGetMatSize( src );
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_size = cvGetMatSize( dst );
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_step = src->step ? src->step : CV_STUB_STEP;
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step = dst->step ? dst->step : CV_STUB_STEP;
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( dst_size.width > src_size.width || dst_size.height > src_size.height )
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadSize, "destination ROI must be smaller than source ROI" );
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_ARE_DEPTHS_EQ( src, dst ))
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = (CvGetRectSubPixFunc)(gr_tab[cn != 1].fn_2d[CV_MAT_DEPTH(src->type)]);
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_DEPTH( src->type ) != CV_8U || CV_MAT_DEPTH( dst->type ) != CV_32F )
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = (CvGetRectSubPixFunc)(gr_tab[cn != 1].fn_2d[1]);
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !func )
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPPI_CALL( func( src->data.ptr, src_step, src_size,
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     dst->data.ptr, dst_step, dst_size, center ));
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_32F8U(x)  ((uchar)cvRound(x))
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC( flavor, srctype, dsttype,      \
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                             worktype, cast_macro, cvt )    \
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus CV_STDCALL                                                         \
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetQuadrangleSubPix_##flavor##_C1R                                       \
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const srctype * src, int src_step, CvSize src_size,                       \
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  dsttype *dst, int dst_step, CvSize win_size, const float *matrix )        \
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                           \
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x, y;                                                               \
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double dx = (win_size.width - 1)*0.5;                                   \
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double dy = (win_size.height - 1)*0.5;                                  \
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double A11 = matrix[0], A12 = matrix[1], A13 = matrix[2]-A11*dx-A12*dy; \
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double A21 = matrix[3], A22 = matrix[4], A23 = matrix[5]-A21*dx-A22*dy; \
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_step /= sizeof(srctype);                                            \
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step /= sizeof(dsttype);                                            \
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( y = 0; y < win_size.height; y++, dst += dst_step )                 \
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double xs = A12*y + A13;                                            \
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double ys = A22*y + A23;                                            \
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double xe = A11*(win_size.width-1) + A12*y + A13;                   \
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double ye = A21*(win_size.width-1) + A22*y + A23;                   \
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)(cvFloor(xs)-1) < (unsigned)(src_size.width - 3) &&   \
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)(cvFloor(ys)-1) < (unsigned)(src_size.height - 3) &&  \
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)(cvFloor(xe)-1) < (unsigned)(src_size.width - 3) &&   \
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)(cvFloor(ye)-1) < (unsigned)(src_size.height - 3))    \
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < win_size.width; x++ )                           \
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                               \
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int ixs = cvFloor( xs );                                    \
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int iys = cvFloor( ys );                                    \
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const srctype *ptr = src + src_step*iys + ixs;              \
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double a = xs - ixs, b = ys - iys, a1 = 1.f - a;            \
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype p0 = cvt(ptr[0])*a1 + cvt(ptr[1])*a;               \
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype p1 = cvt(ptr[src_step])*a1 + cvt(ptr[src_step+1])*a;\
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                xs += A11;                                                  \
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ys += A21;                                                  \
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x] = cast_macro(p0 + b * (p1 - p0));                    \
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                               \
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else                                                                \
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < win_size.width; x++ )                           \
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                               \
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int ixs = cvFloor( xs ), iys = cvFloor( ys );               \
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double a = xs - ixs, b = ys - iys, a1 = 1.f - a;            \
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const srctype *ptr0, *ptr1;                                 \
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype p0, p1;                                            \
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                xs += A11; ys += A21;                                       \
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( (unsigned)iys < (unsigned)(src_size.height-1) )         \
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    ptr0 = src + src_step*iys, ptr1 = ptr0 + src_step;      \
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else                                                        \
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    ptr0 = ptr1 = src + (iys < 0 ? 0 : src_size.height-1)*src_step; \
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( (unsigned)ixs < (unsigned)(src_size.width-1) )          \
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {                                                           \
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    p0 = cvt(ptr0[ixs])*a1 + cvt(ptr0[ixs+1])*a;            \
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    p1 = cvt(ptr1[ixs])*a1 + cvt(ptr1[ixs+1])*a;            \
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }                                                           \
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else                                                        \
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {                                                           \
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    ixs = ixs < 0 ? 0 : src_size.width - 1;                 \
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    p0 = cvt(ptr0[ixs]); p1 = cvt(ptr1[ixs]);               \
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }                                                           \
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x] = cast_macro(p0 + b * (p1 - p0));                    \
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                               \
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                           \
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define ICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC_C3( flavor, srctype, dsttype,   \
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                worktype, cast_macro, cvt ) \
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL                                                  \
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvGetQuadrangleSubPix_##flavor##_C3R                                       \
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn( const srctype * src, int src_step, CvSize src_size,                       \
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  dsttype *dst, int dst_step, CvSize win_size, const float *matrix )        \
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                           \
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x, y;                                                               \
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double dx = (win_size.width - 1)*0.5;                                   \
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double dy = (win_size.height - 1)*0.5;                                  \
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double A11 = matrix[0], A12 = matrix[1], A13 = matrix[2]-A11*dx-A12*dy; \
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double A21 = matrix[3], A22 = matrix[4], A23 = matrix[5]-A21*dx-A22*dy; \
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_step /= sizeof(srctype);                                            \
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_step /= sizeof(dsttype);                                            \
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( y = 0; y < win_size.height; y++, dst += dst_step )                 \
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                       \
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double xs = A12*y + A13;                                            \
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double ys = A22*y + A23;                                            \
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double xe = A11*(win_size.width-1) + A12*y + A13;                   \
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double ye = A21*(win_size.width-1) + A22*y + A23;                   \
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( (unsigned)(cvFloor(xs)-1) < (unsigned)(src_size.width - 3) &&   \
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)(cvFloor(ys)-1) < (unsigned)(src_size.height - 3) &&  \
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)(cvFloor(xe)-1) < (unsigned)(src_size.width - 3) &&   \
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)(cvFloor(ye)-1) < (unsigned)(src_size.height - 3))    \
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < win_size.width; x++ )                           \
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                               \
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int ixs = cvFloor( xs );                                    \
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int iys = cvFloor( ys );                                    \
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const srctype *ptr = src + src_step*iys + ixs*3;            \
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double a = xs - ixs, b = ys - iys, a1 = 1.f - a;            \
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                worktype p0, p1;                                            \
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                xs += A11;                                                  \
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ys += A21;                                                  \
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                p0 = cvt(ptr[0])*a1 + cvt(ptr[3])*a;                        \
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                p1 = cvt(ptr[src_step])*a1 + cvt(ptr[src_step+3])*a;        \
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x*3] = cast_macro(p0 + b * (p1 - p0));                  \
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                p0 = cvt(ptr[1])*a1 + cvt(ptr[4])*a;                        \
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                p1 = cvt(ptr[src_step+1])*a1 + cvt(ptr[src_step+4])*a;      \
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x*3+1] = cast_macro(p0 + b * (p1 - p0));                \
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                p0 = cvt(ptr[2])*a1 + cvt(ptr[5])*a;                        \
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                p1 = cvt(ptr[src_step+2])*a1 + cvt(ptr[src_step+5])*a;      \
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                dst[x*3+2] = cast_macro(p0 + b * (p1 - p0));                \
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                               \
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        else                                                                \
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                   \
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( x = 0; x < win_size.width; x++ )                           \
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                               \
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int ixs = cvFloor(xs), iys = cvFloor(ys);                   \
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                double a = xs - ixs, b = ys - iys;                          \
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                const srctype *ptr0, *ptr1;                                 \
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                xs += A11; ys += A21;                                       \
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( (unsigned)iys < (unsigned)(src_size.height-1) )         \
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    ptr0 = src + src_step*iys, ptr1 = ptr0 + src_step;      \
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else                                                        \
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    ptr0 = ptr1 = src + (iys < 0 ? 0 : src_size.height-1)*src_step; \
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( (unsigned)ixs < (unsigned)(src_size.width - 1) )        \
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {                                                           \
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double a1 = 1.f - a;                                    \
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    worktype p0, p1;                                        \
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    ptr0 += ixs*3; ptr1 += ixs*3;                           \
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    p0 = cvt(ptr0[0])*a1 + cvt(ptr0[3])*a;                  \
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    p1 = cvt(ptr1[0])*a1 + cvt(ptr1[3])*a;                  \
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[x*3] = cast_macro(p0 + b * (p1 - p0));              \
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    p0 = cvt(ptr0[1])*a1 + cvt(ptr0[4])*a;                  \
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    p1 = cvt(ptr1[1])*a1 + cvt(ptr1[4])*a;                  \
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[x*3+1] = cast_macro(p0 + b * (p1 - p0));            \
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    p0 = cvt(ptr0[2])*a1 + cvt(ptr0[5])*a;                  \
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    p1 = cvt(ptr1[2])*a1 + cvt(ptr1[5])*a;                  \
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[x*3+2] = cast_macro(p0 + b * (p1 - p0));            \
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }                                                           \
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else                                                        \
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {                                                           \
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double b1 = 1.f - b;                                    \
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    ixs = ixs < 0 ? 0 : src_size.width - 1;                 \
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    ptr0 += ixs*3; ptr1 += ixs*3;                           \
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[x*3] = cast_macro(cvt(ptr0[0])*b1 + cvt(ptr1[0])*b);\
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[x*3+1]=cast_macro(cvt(ptr0[1])*b1 + cvt(ptr1[1])*b);\
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    dst[x*3+2]=cast_macro(cvt(ptr0[2])*b1 + cvt(ptr1[2])*b);\
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }                                                           \
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                               \
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                   \
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                       \
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                            \
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_OK;                                                           \
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*#define srctype uchar
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define dsttype uchar
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define worktype float
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cvt CV_8TO32F
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cast_macro ICV_32F8U
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef srctype
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef dsttype
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef worktype
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef cvt
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#undef cast_macro*/
7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC( 8u, uchar, uchar, double, ICV_32F8U, CV_8TO32F )
7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC( 32f, float, float, double, CV_CAST_32F, CV_NOP )
7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC( 8u32f, uchar, float, double, CV_CAST_32F, CV_8TO32F )
7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC_C3( 8u, uchar, uchar, double, ICV_32F8U, CV_8TO32F )
7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC_C3( 32f, float, float, double, CV_CAST_32F, CV_NOP )
7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC_C3( 8u32f, uchar, float, double, CV_CAST_32F, CV_8TO32F )
7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_SUBPIX_TAB( GetQuadrangleSubPix, C1R )
7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennICV_DEF_INIT_SUBPIX_TAB( GetQuadrangleSubPix, C3R )
7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvGetQuadrangleSubPixFunc)(
8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         const void* src, int src_step,
8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         CvSize src_size, void* dst,
8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         int dst_step, CvSize win_size,
8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                         const float* matrix );
8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvGetQuadrangleSubPix( const void* srcarr, void* dstarr, const CvMat* mat )
8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static  CvFuncTable  gq_tab[2];
8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static  int inittab = 0;
8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvGetQuadrangleSubPix" );
8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat srcstub, *src = (CvMat*)srcarr;
8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat dststub, *dst = (CvMat*)dstarr;
8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize src_size, dst_size;
8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvGetQuadrangleSubPixFunc func;
8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float m[6];
8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int k, cn;
8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !inittab )
8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitGetQuadrangleSubPixC1RTable( gq_tab + 0 );
8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        icvInitGetQuadrangleSubPixC3RTable( gq_tab + 1 );
8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        inittab = 1;
8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(src))
8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src = cvGetMat( src, &srcstub ));
8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(dst))
8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( dst = cvGetMat( dst, &dststub ));
8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT(mat))
8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg, "map matrix is not valid" );
8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cn = CV_MAT_CN( src->type );
8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (cn != 1 && cn != 3) || !CV_ARE_CNS_EQ( src, dst ))
8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    src_size = cvGetMatSize( src );
8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dst_size = cvGetMatSize( dst );
8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*if( dst_size.width > src_size.width || dst_size.height > src_size.height )
8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadSize, "destination ROI must not be larger than source ROI" );*/
8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( mat->rows != 2 || mat->cols != 3 )
8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadArg,
8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        "Transformation matrix must be 2x3" );
8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_TYPE( mat->type ) == CV_32FC1 )
8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( k = 0; k < 3; k++ )
8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            m[k] = mat->data.fl[k];
8576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            m[3 + k] = ((float*)(mat->data.ptr + mat->step))[k];
8586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_MAT_TYPE( mat->type ) == CV_64FC1 )
8616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( k = 0; k < 3; k++ )
8636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
8646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            m[k] = (float)mat->data.db[k];
8656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            m[3 + k] = (float)((double*)(mat->data.ptr + mat->step))[k];
8666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
8676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
8696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat,
8706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            "The transformation matrix should have 32fC1 or 64fC1 type" );
8716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_ARE_DEPTHS_EQ( src, dst ))
8736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = (CvGetQuadrangleSubPixFunc)(gq_tab[cn != 1].fn_2d[CV_MAT_DEPTH(src->type)]);
8756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
8776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
8786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( CV_MAT_DEPTH( src->type ) != CV_8U || CV_MAT_DEPTH( dst->type ) != CV_32F )
8796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR( CV_StsUnsupportedFormat, "" );
8806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        func = (CvGetQuadrangleSubPixFunc)(gq_tab[cn != 1].fn_2d[1]);
8826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
8836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !func )
8856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" );
8866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPPI_CALL( func( src->data.ptr, src->step, src_size,
8886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     dst->data.ptr, dst->step, dst_size, m ));
8896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
8916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */
895