fun intrinsicColorMatrix()

in test-app/src/main/java/com/google/android/renderscript_test/IntrinsicColorMatrix.kt [32:108]


fun intrinsicColorMatrix(
    context: RenderScript,
    conversion: Tester.ColorMatrixConversionType,
    inputArray: ByteArray,
    inputVectorSize: Int,
    sizeX: Int,
    sizeY: Int,
    outputVectorSize: Int,
    matrix: FloatArray,
    addVector: FloatArray,
    restriction: Range2d?
): ByteArray {
    val scriptColorMatrix = ScriptIntrinsicColorMatrix.create(context)
    val inputBuilder = Type.Builder(
        context, renderScriptVectorElementForU8(
            context,
            inputVectorSize
        )
    )
    inputBuilder.setX(sizeX)
    inputBuilder.setY(sizeY)
    val inputArrayType = inputBuilder.create()
    val inputAllocation = Allocation.createTyped(context, inputArrayType)
    val outputBuilder = Type.Builder(
        context, renderScriptVectorElementForU8(
            context,
            outputVectorSize
        )
    )
    outputBuilder.setX(sizeX)
    outputBuilder.setY(sizeY)
    val outputArrayType = outputBuilder.create()
    val outAllocation = Allocation.createTyped(context, outputArrayType)

    inputAllocation.copyFrom(inputArray)
    val intrinsicOutArray = ByteArray(sizeX * sizeY * paddedSize(outputVectorSize))
    when (conversion) {
        Tester.ColorMatrixConversionType.RGB_TO_YUV -> scriptColorMatrix.setRGBtoYUV()
        Tester.ColorMatrixConversionType.YUV_TO_RGB -> scriptColorMatrix.setYUVtoRGB()
        Tester.ColorMatrixConversionType.GREYSCALE -> scriptColorMatrix.setGreyscale()
        Tester.ColorMatrixConversionType.RANDOM -> {
            val m = Matrix4f()
            var index = 0
            // RS is column major
            for (x in 0..3) {
                for (y in 0..3) {
                    m.set(x, y, matrix[index++])
                }
            }
            scriptColorMatrix.setColorMatrix(m)
        }
    }
    val vector = Float4(
        addVector[0],
        addVector[1],
        addVector[2],
        addVector[3]
    )
    scriptColorMatrix.setAdd(vector)
    if (restriction != null) {
        outAllocation.copyFrom(intrinsicOutArray) // To initialize to zero
        val options = Script.LaunchOptions()
        options.setX(restriction.startX, restriction.endX)
        options.setY(restriction.startY, restriction.endY)
        scriptColorMatrix.forEach(inputAllocation, outAllocation, options)
    } else {
        scriptColorMatrix.forEach(inputAllocation, outAllocation)
    }
    outAllocation.copyTo(intrinsicOutArray)

    inputAllocation.destroy()
    outAllocation.destroy()
    inputArrayType.destroy()
    outputArrayType.destroy()
    scriptColorMatrix.destroy()
    return intrinsicOutArray
}