fun convert2rgba()

in plot-api/src/commonMain/kotlin/org/jetbrains/letsPlot/util/pngj/ImageLineHelper.kt [62:108]


    fun convert2rgba(line: IImageLineArray, pal: PngChunkPLTE, trns: PngChunkTRNS?, buf: IntArray?): IntArray {
        @Suppress("NAME_SHADOWING")
        var buf = buf
        val imi: ImageInfo = line.imageInfo
        val nsamples: Int = imi.cols * 4
        if (buf == null || buf.size < nsamples) buf = IntArray(nsamples)
        val maxval = if (imi.bitDepth == 16) (1 shl 16) - 1 else 255
        fill(buf, maxval)
        if (imi.indexed) {
            val tlen = trns?.palletteAlpha?.size ?: 0
            for (s in 0 until imi.cols) {
                val index: Int = line.getElem(s)
                pal.getEntryRgb(index, buf, s * 4)
                if (index < tlen) {
                    buf[s * 4 + 3] = trns!!.palletteAlpha[index]
                }
            }
        } else if (imi.greyscale) {
            var unpack: IntArray? = null
            if (imi.bitDepth < 8) unpack = DEPTH_UNPACK[imi.bitDepth]
            var s = 0
            var i = 0
            var p = 0
            while (p < imi.cols) {
                buf[s++] = unpack?.get(line.getElem(i++)) ?: line.getElem(i++)
                buf[s] = buf[s - 1]
                s++
                buf[s] = buf[s - 1]
                s++
                if (imi.channels == 2) buf[s++] = unpack?.get(line.getElem(i++)) ?: line.getElem(i++) else buf[s++] =
                    maxval
                p++
            }
        } else {
            var s = 0
            var i = 0
            var p = 0
            while (p < imi.cols) {
                buf[s++] = line.getElem(i++)
                buf[s++] = line.getElem(i++)
                buf[s++] = line.getElem(i++)
                buf[s++] = if (imi.alpha) line.getElem(i++) else maxval
                p++
            }
        }
        return buf
    }