| 1287 | { |
| 1288 | |
| 1289 | template<typename T, typename WT> static void |
| 1290 | transform_( const T* src, T* dst, const WT* m, int len, int scn, int dcn ) |
| 1291 | { |
| 1292 | int x; |
| 1293 | |
| 1294 | if( scn == 2 && dcn == 2 ) |
| 1295 | { |
| 1296 | for( x = 0; x < len*2; x += 2 ) |
| 1297 | { |
| 1298 | WT v0 = src[x], v1 = src[x+1]; |
| 1299 | T t0 = saturate_cast<T>(m[0]*v0 + m[1]*v1 + m[2]); |
| 1300 | T t1 = saturate_cast<T>(m[3]*v0 + m[4]*v1 + m[5]); |
| 1301 | dst[x] = t0; dst[x+1] = t1; |
| 1302 | } |
| 1303 | } |
| 1304 | else if( scn == 3 && dcn == 3 ) |
| 1305 | { |
| 1306 | for( x = 0; x < len*3; x += 3 ) |
| 1307 | { |
| 1308 | WT v0 = src[x], v1 = src[x+1], v2 = src[x+2]; |
| 1309 | T t0 = saturate_cast<T>(m[0]*v0 + m[1]*v1 + m[2]*v2 + m[3]); |
| 1310 | T t1 = saturate_cast<T>(m[4]*v0 + m[5]*v1 + m[6]*v2 + m[7]); |
| 1311 | T t2 = saturate_cast<T>(m[8]*v0 + m[9]*v1 + m[10]*v2 + m[11]); |
| 1312 | dst[x] = t0; dst[x+1] = t1; dst[x+2] = t2; |
| 1313 | } |
| 1314 | } |
| 1315 | else if( scn == 3 && dcn == 1 ) |
| 1316 | { |
| 1317 | for( x = 0; x < len; x++, src += 3 ) |
| 1318 | dst[x] = saturate_cast<T>(m[0]*src[0] + m[1]*src[1] + m[2]*src[2] + m[3]); |
| 1319 | } |
| 1320 | else if( scn == 4 && dcn == 4 ) |
| 1321 | { |
| 1322 | for( x = 0; x < len*4; x += 4 ) |
| 1323 | { |
| 1324 | WT v0 = src[x], v1 = src[x+1], v2 = src[x+2], v3 = src[x+3]; |
| 1325 | T t0 = saturate_cast<T>(m[0]*v0 + m[1]*v1 + m[2]*v2 + m[3]*v3 + m[4]); |
| 1326 | T t1 = saturate_cast<T>(m[5]*v0 + m[6]*v1 + m[7]*v2 + m[8]*v3 + m[9]); |
| 1327 | dst[x] = t0; dst[x+1] = t1; |
| 1328 | t0 = saturate_cast<T>(m[10]*v0 + m[11]*v1 + m[12]*v2 + m[13]*v3 + m[14]); |
| 1329 | t1 = saturate_cast<T>(m[15]*v0 + m[16]*v1 + m[17]*v2 + m[18]*v3 + m[19]); |
| 1330 | dst[x+2] = t0; dst[x+3] = t1; |
| 1331 | } |
| 1332 | } |
| 1333 | else |
| 1334 | { |
| 1335 | for( x = 0; x < len; x++, src += scn, dst += dcn ) |
| 1336 | { |
| 1337 | const WT* _m = m; |
| 1338 | int j, k; |
| 1339 | for( j = 0; j < dcn; j++, _m += scn + 1 ) |
| 1340 | { |
| 1341 | WT s = _m[scn]; |
| 1342 | for( k = 0; k < scn; k++ ) |
| 1343 | s += _m[k]*src[k]; |
| 1344 | dst[j] = saturate_cast<T>(s); |
| 1345 | } |
| 1346 | } |
no outgoing calls
no test coverage detected