// Copyright 2021 The Wuffs Authors.
//
// 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
//
//    https://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.

pri func decoder.filter_and_swizzle_tricky!(dst: ptr base.pixel_buffer, workbuf: slice base.u8) base.status {
    var dst_pixfmt          : base.pixel_format
    var dst_bits_per_pixel  : base.u32[..= 256]
    var dst_bytes_per_pixel : base.u64[..= 32]
    var dst_bytes_per_row1  : base.u64
    var dst_palette         : slice base.u8
    var tab                 : table base.u8

    var src_bytes_per_pixel : base.u64[..= 8]

    var x        : base.u32
    var y        : base.u32
    var i        : base.u64[..= 0x1FFF_FFC0]
    var dst      : slice base.u8
    var filter   : base.u8
    var s        : slice base.u8
    var curr_row : slice base.u8
    var prev_row : slice base.u8

    var bits_unpacked   : array[8] base.u8
    var bits_packed     : base.u8
    var packs_remaining : base.u8
    var multiplier      : base.u8
    var shift           : base.u8[..= 7]

    // TODO: the dst_pixfmt variable shouldn't be necessary. We should be able
    // to chain the two calls: "args.dst.pixel_format().bits_per_pixel()".
    dst_pixfmt = args.dst.pixel_format()
    dst_bits_per_pixel = dst_pixfmt.bits_per_pixel()
    if (dst_bits_per_pixel & 7) <> 0 {
        return base."#unsupported option"
    }
    dst_bytes_per_pixel = (dst_bits_per_pixel / 8) as base.u64
    dst_bytes_per_row1 = (this.frame_rect_x1 as base.u64) * dst_bytes_per_pixel
    dst_palette = args.dst.palette_or_else(fallback: this.dst_palette[..])
    tab = args.dst.plane(p: 0)

    src_bytes_per_pixel = 1
    if this.depth >= 8 {
        src_bytes_per_pixel = (NUM_CHANNELS[this.color_type] as base.u64) *
                ((this.depth >> 3) as base.u64)
    }

    if (this.chunk_type_array[0] == 'I') {
        y = INTERLACING[this.interlace_pass][5] as base.u32
    } else {
        y = this.frame_rect_y0
    }
    while y < this.frame_rect_y1 {
        assert y < 0x00FF_FFFF via "a < b: a < c; c <= b"(c: this.frame_rect_y1)
        dst = tab.row_u32(y: y)
        if dst_bytes_per_row1 < dst.length() {
            dst = dst[.. dst_bytes_per_row1]
        }

        if 1 > args.workbuf.length() {
            return "#internal error: inconsistent workbuf length"
        }
        filter = args.workbuf[0]
        args.workbuf = args.workbuf[1 ..]
        if this.pass_bytes_per_row > args.workbuf.length() {
            return "#internal error: inconsistent workbuf length"
        }
        curr_row = args.workbuf[.. this.pass_bytes_per_row]
        args.workbuf = args.workbuf[this.pass_bytes_per_row ..]

        if filter == 0 {
            // No-op.
        } else if filter == 1 {
            this.filter_1!(curr: curr_row)
        } else if filter == 2 {
            this.filter_2!(curr: curr_row, prev: prev_row)
        } else if filter == 3 {
            this.filter_3!(curr: curr_row, prev: prev_row)
        } else if filter == 4 {
            this.filter_4!(curr: curr_row, prev: prev_row)
        } else {
            return "#bad filter"
        }

        s = curr_row
        if (this.chunk_type_array[0] == 'I') {
            x = INTERLACING[this.interlace_pass][2] as base.u32
        } else {
            x = this.frame_rect_x0
        }
        if this.depth == 8 {
            while x < this.frame_rect_x1,
                    inv y < 0x00FF_FFFF,
            {
                assert x < 0x00FF_FFFF via "a < b: a < c; c <= b"(c: this.frame_rect_x1)
                i = (x as base.u64) * dst_bytes_per_pixel
                if i <= dst.length() {
                    if this.color_type == 4 {
                        if 2 <= s.length() {
                            bits_unpacked[0] = s[0]
                            bits_unpacked[1] = s[0]
                            bits_unpacked[2] = s[0]
                            bits_unpacked[3] = s[1]
                            s = s[2 ..]
                            this.swizzler.swizzle_interleaved_from_slice!(
                                    dst: dst[i ..],
                                    dst_palette: dst_palette,
                                    src: bits_unpacked[.. 4])
                        }

                    } else if ((this.remap_transparency & 0xFFFF_FFFF) as base.u32) <> 0 {
                        if this.color_type == 0 {
                            if 1 <= s.length() {
                                bits_unpacked[0] = s[0]
                                bits_unpacked[1] = s[0]
                                bits_unpacked[2] = s[0]
                                bits_unpacked[3] = 0xFF
                                s = s[1 ..]
                                if ((this.remap_transparency & 0xFFFF_FFFF) as base.u32) == (
                                        ((bits_unpacked[0] as base.u32) << 0) |
                                        ((bits_unpacked[1] as base.u32) << 8) |
                                        ((bits_unpacked[2] as base.u32) << 16) |
                                        ((bits_unpacked[3] as base.u32) << 24)) {
                                    bits_unpacked[0] = 0
                                    bits_unpacked[1] = 0
                                    bits_unpacked[2] = 0
                                    bits_unpacked[3] = 0
                                }
                                this.swizzler.swizzle_interleaved_from_slice!(
                                        dst: dst[i ..],
                                        dst_palette: dst_palette,
                                        src: bits_unpacked[.. 4])
                            }
                        } else {
                            if 3 <= s.length() {
                                bits_unpacked[0] = s[2]
                                bits_unpacked[1] = s[1]
                                bits_unpacked[2] = s[0]
                                bits_unpacked[3] = 0xFF
                                s = s[3 ..]
                                if ((this.remap_transparency & 0xFFFF_FFFF) as base.u32) == (
                                        ((bits_unpacked[0] as base.u32) << 0) |
                                        ((bits_unpacked[1] as base.u32) << 8) |
                                        ((bits_unpacked[2] as base.u32) << 16) |
                                        ((bits_unpacked[3] as base.u32) << 24)) {
                                    bits_unpacked[0] = 0
                                    bits_unpacked[1] = 0
                                    bits_unpacked[2] = 0
                                    bits_unpacked[3] = 0
                                }
                                this.swizzler.swizzle_interleaved_from_slice!(
                                        dst: dst[i ..],
                                        dst_palette: dst_palette,
                                        src: bits_unpacked[.. 4])
                            }
                        }

                    } else if src_bytes_per_pixel <= s.length() {
                        this.swizzler.swizzle_interleaved_from_slice!(
                                dst: dst[i ..],
                                dst_palette: dst_palette,
                                src: s[.. src_bytes_per_pixel])
                        s = s[src_bytes_per_pixel ..]
                    }
                }
                x += (1 as base.u32) << INTERLACING[this.interlace_pass][0]
            } endwhile

        } else if this.depth < 8 {
            multiplier = 1
            if this.color_type == 0 {  // Color type 0 means base.PIXEL_FORMAT__Y.
                multiplier = LOW_BIT_DEPTH_MULTIPLIERS[this.depth]
            }
            shift = (8 - this.depth) & 7
            packs_remaining = 0

            while x < this.frame_rect_x1,
                    inv y < 0x00FF_FFFF,
                    inv this.depth < 8,
            {
                assert x < 0x00FF_FFFF via "a < b: a < c; c <= b"(c: this.frame_rect_x1)
                i = (x as base.u64) * dst_bytes_per_pixel
                if i <= dst.length() {
                    if (packs_remaining == 0) and (1 <= s.length()) {
                        packs_remaining = LOW_BIT_DEPTH_NUM_PACKS[this.depth]
                        bits_packed = s[0]
                        s = s[1 ..]
                    }
                    bits_unpacked[0] = (bits_packed >> shift) ~mod* multiplier
                    bits_packed = bits_packed ~mod<< this.depth
                    packs_remaining = packs_remaining ~mod- 1

                    if ((this.remap_transparency & 0xFFFF_FFFF) as base.u32) <> 0 {
                        bits_unpacked[1] = bits_unpacked[0]
                        bits_unpacked[2] = bits_unpacked[0]
                        bits_unpacked[3] = 0xFF
                        if ((this.remap_transparency & 0xFFFF_FFFF) as base.u32) == (
                                ((bits_unpacked[0] as base.u32) << 0) |
                                ((bits_unpacked[1] as base.u32) << 8) |
                                ((bits_unpacked[2] as base.u32) << 16) |
                                ((bits_unpacked[3] as base.u32) << 24)) {
                            bits_unpacked[0] = 0
                            bits_unpacked[1] = 0
                            bits_unpacked[2] = 0
                            bits_unpacked[3] = 0
                        }
                        this.swizzler.swizzle_interleaved_from_slice!(
                                dst: dst[i ..],
                                dst_palette: dst_palette,
                                src: bits_unpacked[.. 4])

                    } else {
                        this.swizzler.swizzle_interleaved_from_slice!(
                                dst: dst[i ..],
                                dst_palette: dst_palette,
                                src: bits_unpacked[.. 1])
                    }
                }
                x += (1 as base.u32) << INTERLACING[this.interlace_pass][0]
            } endwhile

        } else {
            while x < this.frame_rect_x1,
                    inv y < 0x00FF_FFFF,
            {
                assert x < 0x00FF_FFFF via "a < b: a < c; c <= b"(c: this.frame_rect_x1)
                i = (x as base.u64) * dst_bytes_per_pixel
                if i <= dst.length() {
                    if this.color_type == 0 {
                        if 2 <= s.length() {
                            bits_unpacked[0] = s[1]
                            bits_unpacked[1] = s[0]
                            bits_unpacked[2] = s[1]
                            bits_unpacked[3] = s[0]
                            bits_unpacked[4] = s[1]
                            bits_unpacked[5] = s[0]
                            bits_unpacked[6] = 0xFF
                            bits_unpacked[7] = 0xFF
                            s = s[2 ..]
                            if this.remap_transparency == (
                                    ((bits_unpacked[0] as base.u64) << 0) |
                                    ((bits_unpacked[1] as base.u64) << 8) |
                                    ((bits_unpacked[2] as base.u64) << 16) |
                                    ((bits_unpacked[3] as base.u64) << 24) |
                                    ((bits_unpacked[4] as base.u64) << 32) |
                                    ((bits_unpacked[5] as base.u64) << 40) |
                                    ((bits_unpacked[6] as base.u64) << 48) |
                                    ((bits_unpacked[7] as base.u64) << 56)) {
                                bits_unpacked[0] = 0
                                bits_unpacked[1] = 0
                                bits_unpacked[2] = 0
                                bits_unpacked[3] = 0
                                bits_unpacked[4] = 0
                                bits_unpacked[5] = 0
                                bits_unpacked[6] = 0
                                bits_unpacked[7] = 0
                            }
                        }

                    } else if this.color_type == 2 {
                        if 6 <= s.length() {
                            bits_unpacked[0] = s[5]
                            bits_unpacked[1] = s[4]
                            bits_unpacked[2] = s[3]
                            bits_unpacked[3] = s[2]
                            bits_unpacked[4] = s[1]
                            bits_unpacked[5] = s[0]
                            bits_unpacked[6] = 0xFF
                            bits_unpacked[7] = 0xFF
                            s = s[6 ..]
                            if this.remap_transparency == (
                                    ((bits_unpacked[0] as base.u64) << 0) |
                                    ((bits_unpacked[1] as base.u64) << 8) |
                                    ((bits_unpacked[2] as base.u64) << 16) |
                                    ((bits_unpacked[3] as base.u64) << 24) |
                                    ((bits_unpacked[4] as base.u64) << 32) |
                                    ((bits_unpacked[5] as base.u64) << 40) |
                                    ((bits_unpacked[6] as base.u64) << 48) |
                                    ((bits_unpacked[7] as base.u64) << 56)) {
                                bits_unpacked[0] = 0
                                bits_unpacked[1] = 0
                                bits_unpacked[2] = 0
                                bits_unpacked[3] = 0
                                bits_unpacked[4] = 0
                                bits_unpacked[5] = 0
                                bits_unpacked[6] = 0
                                bits_unpacked[7] = 0
                            }
                        }

                    } else if this.color_type == 4 {
                        if 4 <= s.length() {
                            bits_unpacked[0] = s[1]
                            bits_unpacked[1] = s[0]
                            bits_unpacked[2] = s[1]
                            bits_unpacked[3] = s[0]
                            bits_unpacked[4] = s[1]
                            bits_unpacked[5] = s[0]
                            bits_unpacked[6] = s[3]
                            bits_unpacked[7] = s[2]
                            s = s[4 ..]
                        }

                    } else {
                        if 8 <= s.length() {
                            bits_unpacked[0] = s[5]
                            bits_unpacked[1] = s[4]
                            bits_unpacked[2] = s[3]
                            bits_unpacked[3] = s[2]
                            bits_unpacked[4] = s[1]
                            bits_unpacked[5] = s[0]
                            bits_unpacked[6] = s[7]
                            bits_unpacked[7] = s[6]
                            s = s[8 ..]
                        }
                    }

                    this.swizzler.swizzle_interleaved_from_slice!(
                            dst: dst[i ..],
                            dst_palette: dst_palette,
                            src: bits_unpacked[.. 8])
                }
                x += (1 as base.u32) << INTERLACING[this.interlace_pass][0]
            } endwhile
        }

        prev_row = curr_row
        y += (1 as base.u32) << INTERLACING[this.interlace_pass][3]
    } endwhile

    return ok
}
