in renderscript-toolkit/src/main/cpp/ColorMatrix.cpp [268:349]
Key_t ColorMatrixTask::computeKey(size_t inVectorSize, size_t outVectorSize) {
Key_t key;
key.key = 0;
// Compute a unique code key for this operation
{
#endif // ANDROID_RENDERSCRIPT_TOOLKIT_SUPPORTS_FLOAT
for (uint32_t i=0; i < 16; i++) {
if (mIp[i] != 0) {
key.u.coeffMask |= 1 << i;
}
}
if (mIpa[0] != 0) key.u.addMask |= 0x1;
if (mIpa[1] != 0) key.u.addMask |= 0x2;
if (mIpa[2] != 0) key.u.addMask |= 0x4;
if (mIpa[3] != 0) key.u.addMask |= 0x8;
}
// Look for a dot product where the r,g,b colums are the same
if ((mIp[0] == mIp[1]) && (mIp[0] == mIp[2]) &&
(mIp[4] == mIp[5]) && (mIp[4] == mIp[6]) &&
(mIp[8] == mIp[9]) && (mIp[8] == mIp[10]) &&
(mIp[12] == mIp[13]) && (mIp[12] == mIp[14])) {
if (!key.u.addMask) key.u.dot = 1;
}
// Is alpha a simple copy
if (!(key.u.coeffMask & 0x0888) && (mIp[15] == 256) && !(key.u.addMask & 0x8)) {
key.u.copyAlpha = !(key.u.inType || key.u.outType);
}
//ALOGE("build key %08x, %08x", (int32_t)(key.key >> 32), (int32_t)key.key);
switch (inVectorSize) {
case 4:
key.u.inVecSize = 3;
break;
case 3:
key.u.inVecSize = 2;
key.u.coeffMask &= ~0xF000;
break;
case 2:
key.u.inVecSize = 1;
key.u.coeffMask &= ~0xFF00;
break;
default:
key.u.coeffMask &= ~0xFFF0;
break;
}
switch (outVectorSize) {
case 4:
key.u.outVecSize = 3;
break;
case 3:
key.u.outVecSize = 2;
key.u.coeffMask &= ~0x8888;
key.u.addMask &= 7;
break;
case 2:
key.u.outVecSize = 1;
key.u.coeffMask &= ~0xCCCC;
key.u.addMask &= 3;
break;
default:
key.u.coeffMask &= ~0xEEEE;
key.u.addMask &= 1;
break;
}
if (key.u.inType && !key.u.outType) {
key.u.addMask |= 1;
if (key.u.outVecSize > 0) key.u.addMask |= 2;
if (key.u.outVecSize > 1) key.u.addMask |= 4;
if (key.u.outVecSize > 2) key.u.addMask |= 8;
}
//ALOGE("build key %08x, %08x", (int32_t)(key.key >> 32), (int32_t)key.key);
return key;
}