Key_t ColorMatrixTask::computeKey()

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;
}