 //                dst[3] = alpha;
 //        }
 //    }
-//        
+//
 //    int dstcn, blueIdx;
 //    float hscale;
 //};
-//    
+//
 //
 //struct HLS2RGB_b
 //{
 //    typedef uchar channel_type;
-//    
+//
 //    HLS2RGB_b(int _dstcn, int _blueIdx, int _hrange)
 //    : dstcn(_dstcn), cvt(3, _blueIdx, _hrange)
 //    {}
-//    
+//
 //    void operator()(const uchar* src, uchar* dst, int n) const
 //    {
 //        int i, j, dcn = dstcn;
 //        uchar alpha = ColorChannel<uchar>::max();
 //        float buf[3*BLOCK_SIZE];
-//        
+//
 //        for( i = 0; i < n; i += BLOCK_SIZE, src += BLOCK_SIZE*3 )
 //        {
 //            int dn = std::min(n - i, (int)BLOCK_SIZE);
-//            
+//
 //            for( j = 0; j < dn*3; j += 3 )
 //            {
 //                buf[j] = src[j];

//            f[i] = x < 0.008856f ? x*7.787f + 0.13793103448275862f : cvCbrt(x);
//        }
//        splineBuild(f, LAB_CBRT_TAB_SIZE, LabCbrtTab);
//        
//        scale = 1.f/GammaTabScale;
//        for(i = 0; i <= GAMMA_TAB_SIZE; i++)
//        {

        const float cr = 0.299f;
        const float cg = 0.587f;
        const float cb = 0.114f;

		const int x = blockDim.x * blockIdx.x + threadIdx.x;
		const int y = blockDim.y * blockIdx.y + threadIdx.y;

        if (y < rows && x < cols)
        {
            const float* src = src_ + y * src_step + x * 3;

            float t0 = src[bidx], t1 = src[1], t2 = src[bidx ^ 2];
            *(dst_ + y * dst_step + x) = t0 * cb + t1 * cg + t2 * cr;
        }
