1/*M///////////////////////////////////////////////////////////////////////////////////////
2//
3//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4//
5//  By downloading, copying, installing or using the software you agree to this license.
6//  If you do not agree to this license, do not download, install,
7//  copy or use the software.
8//
9//
10//                        Intel License Agreement
11//                For Open Source Computer Vision Library
12//
13// Copyright (C) 2000, Intel Corporation, all rights reserved.
14// Third party copyrights are property of their respective owners.
15//
16// Redistribution and use in source and binary forms, with or without modification,
17// are permitted provided that the following conditions are met:
18//
19//   * Redistribution's of source code must retain the above copyright notice,
20//     this list of conditions and the following disclaimer.
21//
22//   * Redistribution's in binary form must reproduce the above copyright notice,
23//     this list of conditions and the following disclaimer in the documentation
24//     and/or other materials provided with the distribution.
25//
26//   * The name of Intel Corporation may not be used to endorse or promote products
27//     derived from this software without specific prior written permission.
28//
29// This software is provided by the copyright holders and contributors "as is" and
30// any express or implied warranties, including, but not limited to, the implied
31// warranties of merchantability and fitness for a particular purpose are disclaimed.
32// In no event shall the Intel Corporation or contributors be liable for any direct,
33// indirect, incidental, special, exemplary, or consequential damages
34// (including, but not limited to, procurement of substitute goods or services;
35// loss of use, data, or profits; or business interruption) however caused
36// and on any theory of liability, whether in contract, strict liability,
37// or tort (including negligence or otherwise) arising in any way out of
38// the use of this software, even if advised of the possibility of such damage.
39//
40//M*/
41#include "_cvaux.h"
42#include "_cvvm.h"
43
44/* Valery Mosyagin */
45
46static CvStatus
47icvFindRuns( int numLines,      /* number of scanlines      */
48             uchar * prewarp_1, /* prewarp image 1          */
49             uchar * prewarp_2, /* prewarp image 2          */
50             int *line_lens_1,  /* line lengths 1           */
51             int *line_lens_2,  /* line lengths 2           */
52             int *runs_1,       /* result runs  1           */
53             int *runs_2,       /* result runs  2           */
54             int *num_runs_1,   /* numbers of first runs    */
55             int *num_runs_2 )
56{
57    CvStatus err;
58
59    err = icvFindRunsInOneImage( numLines, prewarp_1, line_lens_1, runs_1, num_runs_1 );
60
61    if( err != CV_NO_ERR )
62        return err;
63
64    err = icvFindRunsInOneImage( numLines, prewarp_2, line_lens_2, runs_2, num_runs_2 );
65
66    return err;
67
68}
69
70
71/*======================================================================================*/
72
73CV_INLINE int
74icvGetColor( uchar * valueRGB )
75{
76    int R = *valueRGB;
77    int G = *(valueRGB + 1);
78    int B = *(valueRGB + 2);
79
80    return ( ((R + G + B) >> 3) & 0xFFFC );
81}                               /* vm_GetColor */
82
83
84/*======================================================================================*/
85
86CvStatus
87icvFindRunsInOneImage( int numLines,    /* number of scanlines      */
88                       uchar * prewarp, /* prewarp image            */
89                       int *line_lens,  /* line lengths in pixels   */
90                       int *runs,       /* result runs              */
91                       int *num_runs )
92{
93    int epiLine;
94    int run_index;
95    int curr_color;
96    int index;
97    int color;
98    uchar *curr_point;
99    int num;
100
101
102    run_index = 0;
103
104    curr_point = prewarp;
105
106    for( epiLine = 0; epiLine < numLines; epiLine++ )
107    {
108
109        curr_color = icvGetColor( curr_point );
110
111        runs[run_index++] = 0;
112        runs[run_index++] = curr_color;
113
114        curr_point += 3;
115
116        num = 1;
117        for( index = 1; index < line_lens[epiLine]; index++ )
118        {
119
120            color = icvGetColor( curr_point );
121
122            if( color != curr_color )
123            {
124                runs[run_index++] = index;
125                runs[run_index++] = color;
126                curr_color = color;
127                num++;
128            }
129
130            curr_point += 3;
131        }
132
133        runs[run_index++] = index;
134        num_runs[epiLine] = num;
135    }
136
137    return CV_NO_ERR;
138}
139
140
141/*======================================================================================*/
142
143CV_IMPL void
144cvFindRuns( int numLines,       /* number of scanlines   */
145            uchar * prewarp_1,  /* prewarp image 1       */
146            uchar * prewarp_2,  /* prewarp image 2       */
147            int *line_lens_1,   /* line lengths 1        */
148            int *line_lens_2,   /* line lengths 2        */
149            int *runs_1,        /* result runs  1        */
150            int *runs_2,        /* result runs  2        */
151            int *num_runs_1,    /* numbers of first runs */
152            int *num_runs_2 )
153{
154    CV_FUNCNAME( "cvFindRuns" );
155    __BEGIN__;
156
157    IPPI_CALL( icvFindRuns( numLines,   /* number of scanlines   */
158                            prewarp_1,  /* prewarp image 1       */
159                            prewarp_2,  /* prewarp image 2       */
160                            line_lens_1,        /* line lengths 1        */
161                            line_lens_2,        /* line lengths 2        */
162                            runs_1,     /* result runs  1        */
163                            runs_2,     /* result runs  2        */
164                            num_runs_1, /* numbers of first runs */
165                            num_runs_2 ));
166    __CLEANUP__;
167    __END__;
168}
169