#ifndef LEVELINES_COMMON_H
#define LEVELINES_COMMON_H
+#include <cuda_runtime.h>
-#include <cuda_runtime.h>
+/**
+ * \var Di_Q1
+ * \brief table de coordonnees des segments pour le quadrant 1
+ *
+ */
+const int Di_Q1[6][3] =
+ {{ -1, -1, -1}, /* 0 */
+ { -1, -1, -1}, /* 1 */
+ { -1, -1, -1}, /* 2 */
+ { -1, -1, -1}, /* 3 */
+ { -1, 0, -1}, /* 4 */
+ { 0, -1, 0}}; /* 5 */
+
+/**
+ * \var Dj_Q1
+ * \brief table de coordonnees des segments pour le quadrant 1
+ *
+ */
+const int Dj_Q1[6][3] =
+ {{ 0, 0, 0}, /* 0 */
+ { 0, 1, 0}, /* 1 */
+ { 1, 0, 1}, /* 2 */
+ { 1, 1, 1}, /* 3 */
+ { 1, 1, 1}, /* 4 */
+ { 1, 1, 1}}; /* 5 */
////////////////////////////////////////////////////////////////////////////////
// Reference CPU functions
////////////////////////////////////////////////////////////////////////////////
-//extern "C" void fonc(...);
+extern "C" unsigned int lniv_cpu(unsigned int *image, int i, int j, int idim, int l, int *dout){
+
+ unsigned int value_c ;
+ unsigned int value2_c ;
+ unsigned int d, v, p, d_min, eq_min, eq, sum, sum2 ;
+ unsigned int sum_eq_min ;
+ unsigned int it, jt ;
+
+
+ /* mem */
+ value_c = image[ i*l + j ] ;
+ value2_c = value_c*value_c ;
+
+ // direction d=0
+ sum = value_c ;
+ sum2 = value2_c ;
+ it = i ;
+ jt = j ;
+ for (p=0; p<3; p++)
+ {
+ it += Di_Q1[0][p] ;
+ jt += Dj_Q1[0][p] ;
+ v = image[ it*l + jt ] ;
+ sum += v ;
+ sum2 += v*v ;
+ }
+ eq_min = sum2 - sum*sum/4 ; /* *4 */
+ sum_eq_min = sum ;
+ d_min = 0 ;
+
+ /* direction 1 a 5 */
+ for (d=1; d<6; d++)
+ {
+ sum = value_c ;
+ sum2 = value2_c ;
+ it = i ;
+ jt = j ;
+ for (p=0; p<3; p++)
+ {
+ it += Di_Q1[d][p] ;
+ jt += Dj_Q1[d][p] ;
+ v = image[it*l + jt] ;
+ sum += v ;
+ sum2 += v*v ;
+ }
+ eq = sum2 - sum*sum/4 ; /* *4 */
+ if (eq < eq_min)
+ {
+ eq_min = eq ;
+ sum_eq_min = sum ;
+ d_min = d ; /* pour info */
+ }
+ }
+
+ /* direction 6 a 11 */
+ for (d=0; d<6; d++)
+ {
+ sum = value_c ;
+ sum2 = value2_c ;
+ it = i ;
+ jt = j ;
+ for (p=0; p<3; p++)
+ {
+ it += Dj_Q1[d][p] ;
+ jt -= Di_Q1[d][p] ;
+ v = image[it*l + jt] ;
+ sum += v ;
+ sum2 += v*v ;
+ }
+ eq = sum2 - sum*sum/4 ; /* *4 */
+ if (eq < eq_min)
+ {
+ eq_min = eq ;
+ sum_eq_min = sum ;
+ d_min = d+6 ; /* pour info */
+ }
+ }
+
+ /* direction 12 a 17 */
+ for (d=0; d<6; d++)
+ {
+ sum = value_c ;
+ sum2 = value2_c ;
+ it = i ;
+ jt = j ;
+ for (p=0; p<3; p++)
+ {
+ it -= Di_Q1[d][p] ;
+ jt -= Dj_Q1[d][p] ;
+ v = image[it*l + jt] ;
+ sum += v ;
+ sum2 += v*v ;
+ }
+ eq = sum2 - sum*sum/4 ; /* *4 */
+ if (eq < eq_min)
+ {
+ eq_min = eq ;
+ sum_eq_min = sum ;
+ d_min = d+12 ; /* pour info */
+ }
+ }
+
+ /* direction 18 a 23 */
+ for (d=0; d<6; d++)
+ {
+ sum = value_c ;
+ sum2 = value2_c ;
+ it = i ;
+ jt = j ;
+ for (p=0; p<3; p++)
+ {
+ it -= Dj_Q1[d][p] ;
+ jt += Di_Q1[d][p] ;
+ v = image[it*l + jt] ;
+ sum += v ;
+ sum2 += v*v ;
+ }
+ eq = sum2 - sum*sum/4 ; /* *4 */
+ if (eq < eq_min)
+ {
+ eq_min = eq ;
+ sum_eq_min = sum ;
+ d_min = d+18 ; /* pour info */
+ }
+ }
+
+ *dout = d_min ;
+ return sum_eq_min/4 ;
+ };
+
////////////////////////////////////////////////////////////////////////////////
// GPU functions (in file.cu)