in renderscript-toolkit/src/main/cpp/ColorMatrix.cpp [804:904]
static void One(void *out,
const void *py, const float* coeff, const float *add,
uint32_t vsin, uint32_t vsout, bool fin, bool fout) {
float4 f = 0.f;
if (fin) {
switch(vsin) {
case 3:
f = ((const float4 *)py)[0];
break;
case 2:
f = ((const float4 *)py)[0];
f.w = 0.f;
break;
case 1:
f.xy = ((const float2 *)py)[0];
break;
case 0:
f.x = ((const float *)py)[0];
break;
}
} else {
switch(vsin) {
case 3:
f = convert<float4>(((const uchar4 *)py)[0]);
break;
case 2:
f = convert<float4>(((const uchar4 *)py)[0]);
f.w = 0.f;
break;
case 1:
f.xy = convert<float2>(((const uchar2 *)py)[0]);
break;
case 0:
f.x = (float)(((const uchar *)py)[0]);
break;
}
}
//ALOGE("f1 %f %f %f %f", f.x, f.y, f.z, f.w);
float4 sum;
sum.x = f.x * coeff[0] +
f.y * coeff[4] +
f.z * coeff[8] +
f.w * coeff[12];
sum.y = f.x * coeff[1] +
f.y * coeff[5] +
f.z * coeff[9] +
f.w * coeff[13];
sum.z = f.x * coeff[2] +
f.y * coeff[6] +
f.z * coeff[10] +
f.w * coeff[14];
sum.w = f.x * coeff[3] +
f.y * coeff[7] +
f.z * coeff[11] +
f.w * coeff[15];
//ALOGE("f2 %f %f %f %f", sum.x, sum.y, sum.z, sum.w);
sum.x += add[0];
sum.y += add[1];
sum.z += add[2];
sum.w += add[3];
//ALOGE("fout %i vs %i, sum %f %f %f %f", fout, vsout, sum.x, sum.y, sum.z, sum.w);
if (fout) {
switch(vsout) {
case 3:
case 2:
((float4 *)out)[0] = sum;
break;
case 1:
((float2 *)out)[0] = sum.xy;
break;
case 0:
((float *)out)[0] = sum.x;
break;
}
} else {
sum.x = sum.x < 0 ? 0 : (sum.x > 255.5 ? 255.5 : sum.x);
sum.y = sum.y < 0 ? 0 : (sum.y > 255.5 ? 255.5 : sum.y);
sum.z = sum.z < 0 ? 0 : (sum.z > 255.5 ? 255.5 : sum.z);
sum.w = sum.w < 0 ? 0 : (sum.w > 255.5 ? 255.5 : sum.w);
switch(vsout) {
case 3:
case 2:
((uchar4 *)out)[0] = convert<uchar4>(sum);
break;
case 1:
((uchar2 *)out)[0] = convert<uchar2>(sum.xy);
break;
case 0:
((uchar *)out)[0] = sum.x;
break;
}
}
//ALOGE("out %p %f %f %f %f", out, ((float *)out)[0], ((float *)out)[1], ((float *)out)[2],
// ((float *)out)[3]);
}