fun intrinsicLut3d()

in test-app/src/main/java/com/google/android/renderscript_test/IntrinsicLut3d.kt [31:81]


fun intrinsicLut3d(
    context: RenderScript,
    inputArray: ByteArray,
    sizeX: Int,
    sizeY: Int,
    cubeArray: ByteArray,
    cubeSize: Dimension,
    restriction: Range2d?
): ByteArray {
    val scriptLut3d: ScriptIntrinsic3DLUT = ScriptIntrinsic3DLUT.create(
        context, Element.U8_4(
            context
        )
    )
    val builder = Type.Builder(context, Element.U8_4(context))
    builder.setX(sizeX)
    builder.setY(sizeY)
    val arrayType = builder.create()
    val inputAllocation = Allocation.createTyped(context, arrayType)
    val outAllocation = Allocation.createTyped(context, arrayType)
    inputAllocation.copyFrom(inputArray)
    val intrinsicOutArray = ByteArray(sizeX * sizeY * 4)

    val cubeTypeBuilder: Type.Builder =
        Type.Builder(context, Element.U8_4(context))
    cubeTypeBuilder.setX(cubeSize.sizeX)
    cubeTypeBuilder.setY(cubeSize.sizeY)
    cubeTypeBuilder.setZ(cubeSize.sizeZ)
    val cubeType: Type = cubeTypeBuilder.create()
    val cubeAllocation = Allocation.createTyped(context, cubeType)
    cubeAllocation.copyFrom(cubeArray)
    scriptLut3d.setLUT(cubeAllocation)
    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)
        scriptLut3d.forEach(inputAllocation, outAllocation, options)
    } else {
        scriptLut3d.forEach(inputAllocation, outAllocation)
    }

    outAllocation.copyTo(intrinsicOutArray)
    inputAllocation.destroy()
    outAllocation.destroy()
    cubeAllocation.destroy()
    arrayType.destroy()
    cubeType.destroy()
    scriptLut3d.destroy()
    return intrinsicOutArray
}