/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.testapp

import android.renderscript.toolkit.LookupTable
import android.renderscript.toolkit.Range2d

/**
 * Reference implementation of a LookUpTable operation.
 */
@ExperimentalUnsignedTypes
fun referenceLut(
    inputArray: ByteArray,
    sizeX: Int,
    sizeY: Int,
    table: LookupTable,
    restriction: Range2d?
): ByteArray {
    val input = Vector2dArray(inputArray.asUByteArray(), 4, sizeX, sizeY)

    val output = input.createSameSized()
    input.forEach(restriction) { x, y ->
        val oldValue = input[x, y]
        val newValue = byteArrayOf(
            table.red[oldValue[0].toInt()],
            table.green[oldValue[1].toInt()],
            table.blue[oldValue[2].toInt()],
            table.alpha[oldValue[3].toInt()]
        )
        output[x, y] = newValue.asUByteArray()
    }
    return output.values.asByteArray()
}

