// Copyright 2020 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.

pub status "#bad header"
pub status "#unsupported BMP file"

pri status "@internal note: short read"

pub const DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE : base.u64 = 0

pub struct decoder? implements base.image_decoder(
	width  : base.u32[..= 0x7FFF_FFFF],
	height : base.u32[..= 0x7FFF_FFFF],

	call_sequence : base.u8,

	top_down      : base.bool,
	pad_per_row   : base.u32[..= 3],
	bytes_per_row : base.u64[..= 0x0000_0001_FFFF_FFFC],  // 4 * 0x7FFF_FFFF
	src_pixfmt    : base.u32,

	io_redirect_fourcc : base.u32,
	io_redirect_pos    : base.u64,

	frame_config_io_position : base.u64,

	bitmap_info_len : base.u32,
	padding         : base.u32,

	bits_per_pixel : base.u32,
	compression    : base.u32,

	// channel_etc's indexes are: B, G, R, A. This is in Wuffs' default order,
	// which isn't the RGBA order they're listed in the wire format.
	channel_masks    : array[4] base.u32,
	channel_shifts   : array[4] base.u8[..= 31],
	channel_num_bits : array[4] base.u8[..= 32],

	dst_x     : base.u32,
	dst_y     : base.u32,
	dst_y_end : base.u32,
	dst_y_inc : base.u32,

	pending_pad : base.u32[..= 3],

	swizzler : base.pixel_swizzler,
	util     : base.utility,
)(
	// scratch is one of:
	//  - 2048 bytes = 256  * (8 bytes per BGRA_NONPREMUL_4X16LE).
	//  - 1024 bytes = 1024 * (1 byte  per INDEXED__BGRA_BINARY), plus
	//    1024 bytes = 256  * (4 bytes per dst_palette entry).
	scratch : array[2048] base.u8,

	src_palette : array[4 * 256] base.u8,
)

pub func decoder.set_quirk_enabled!(quirk: base.u32, enabled: base.bool) {
}

pub func decoder.decode_image_config?(dst: nptr base.image_config, src: base.io_reader) {
	var magic      : base.u32
	var width      : base.u32
	var height     : base.u32
	var planes     : base.u32
	var dst_pixfmt : base.u32

	if (this.call_sequence <> 0) or (this.io_redirect_fourcc == 1) {
		return base."#bad call sequence"
	} else if this.io_redirect_fourcc <> 0 {
		return base."@I/O redirect"
	}

	// Read the BITMAPFILEHEADER (14 bytes).

	magic = args.src.read_u16le_as_u32?()
	if magic <> 'BM'le {
		return "#bad header"
	}

	args.src.skip_u32?(n: 8)

	this.padding = args.src.read_u32le?()
	if this.padding < 14 {
		return "#bad header"
	}
	this.padding -= 14
	this.io_redirect_pos = (this.padding as base.u64) ~sat+ args.src.position()

	// Read the BITMAPINFOHEADER (version 3 / 4 / 5 is 40 / 108 / 124 bytes).

	this.bitmap_info_len = args.src.read_u32le?()
	if this.padding < this.bitmap_info_len {
		return "#bad header"
	}
	this.padding -= this.bitmap_info_len

	if this.bitmap_info_len == 40 {
		if this.bits_per_pixel >= 16 {
			// It's poorly documented, but "length 40" data can be silently
			// augmented with RGB or RGBA channel_masks (12 or 16 bytes).
			if this.padding >= 16 {
				this.bitmap_info_len = 56
				this.padding -= 16
			} else if this.padding >= 12 {
				this.bitmap_info_len = 52
				this.padding -= 12
			}
		}
	} else if (this.bitmap_info_len <> 52) and (this.bitmap_info_len <> 56) and
		(this.bitmap_info_len <> 108) and (this.bitmap_info_len <> 124) {
		return "#unsupported BMP file"
	}

	width = args.src.read_u32le?()
	if width >= 0x8000_0000 {
		return "#bad header"
	}
	this.width = width

	height = args.src.read_u32le?()
	if height == 0x8000_0000 {
		return "#bad header"
	} else if height >= 0x8000_0000 {
		// The &0x7FFF_FFFF is redundant, but proves to the compiler that the
		// result is within this.height's refined bounds.
		this.height = (0 ~mod- height) & 0x7FFF_FFFF
		this.top_down = true
	} else {
		this.height = height
	}

	planes = args.src.read_u16le_as_u32?()
	if planes <> 1 {
		return "#unsupported BMP file"
	}

	this.bits_per_pixel = args.src.read_u16le_as_u32?()
	this.compression = args.src.read_u32le?()
	if this.bits_per_pixel == 0 {
		if this.compression == 4 {
			this.io_redirect_fourcc = 'JPEG'be
			return base."@I/O redirect"
		} else if this.compression == 5 {
			this.io_redirect_fourcc = 'PNG 'be
			return base."@I/O redirect"
		}
		return "#unsupported BMP file"
	}

	// We've already read 20 bytes from the BITMAPINFOHEADER: size (4), width
	// (4), height (4), planes (2), bpp (2), compression (4). Skip the rest of
	// the version 3 BITMAPINFOHEADER (whose total size is 40).
	args.src.skip_u32?(n: 40 - 20)

	// Treat 6 (ALPHABITFIELDS) the same as 3 (BITFIELDS).
	if this.compression == 6 {
		this.compression = 3
	}

	// Read the channel_masks when this.compression is 3 (BITFIELDS).
	if this.compression == 3 {
		if this.bitmap_info_len >= 52 {
			this.channel_masks[2] = args.src.read_u32le?()
			this.channel_masks[1] = args.src.read_u32le?()
			this.channel_masks[0] = args.src.read_u32le?()
			if this.bitmap_info_len >= 56 {
				this.channel_masks[3] = args.src.read_u32le?()
				// Skip the rest of the BITMAPINFOHEADER.
				args.src.skip_u32?(n: this.bitmap_info_len ~mod- 56)
			}
			// If the explicit channel_masks are what the implicit ones would
			// be for no compression, treat it as no compression.
			if (this.channel_masks[0] == 0x0000_00FF) and
				(this.channel_masks[1] == 0x0000_FF00) and
				(this.channel_masks[2] == 0x00FF_0000) {
				if this.bits_per_pixel == 24 {
					this.compression = 0
				} else if this.bits_per_pixel == 32 {
					if (this.channel_masks[3] == 0) or
						(this.channel_masks[3] == 0xFF00_0000) {
						this.compression = 0
					}
				}
			}
			this.process_masks?()
		}
	} else if this.bitmap_info_len >= 40 {
		// Skip the rest of the BITMAPINFOHEADER.
		args.src.skip_u32?(n: this.bitmap_info_len - 40)
		// The palette follows the BITMAPINFOHEADER.
		if this.bits_per_pixel < 16 {
			this.read_palette?(src: args.src)
		}
	} else {
		return "#unsupported BMP file"
	}

	if this.compression == 0 {  // 0 means no compression.
		if this.bits_per_pixel == 8 {
			this.src_pixfmt = base.PIXEL_FORMAT__INDEXED__BGRA_BINARY
		} else if this.bits_per_pixel == 16 {
			// Implement BMP's 16-bit default (BGRX_5551) as BITFIELDS.
			this.compression = 3
			this.channel_masks[0] = 0x001F
			this.channel_masks[1] = 0x03E0
			this.channel_masks[2] = 0x7C00
			this.channel_masks[3] = 0x0000
			this.process_masks?()
			this.src_pixfmt = base.PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE
		} else if this.bits_per_pixel == 24 {
			this.src_pixfmt = base.PIXEL_FORMAT__BGR
		} else if this.bits_per_pixel == 32 {
			if this.channel_masks[3] == 0 {
				this.src_pixfmt = base.PIXEL_FORMAT__BGRX
			} else {
				this.src_pixfmt = base.PIXEL_FORMAT__BGRA_NONPREMUL
			}
		} else {
			return "#unsupported BMP file"
		}

	} else if this.compression == 3 {  // 3 means BITFIELDS.
		if (this.bits_per_pixel == 16) or (this.bits_per_pixel == 32) {
			this.src_pixfmt = base.PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE
		} else {
			return "#unsupported BMP file"
		}

	} else {
		return "#unsupported BMP file"
	}

	// The "((x + 3) >> 2) << 2" dance rounds x up to a multiple of 4.
	if this.bits_per_pixel == 8 {
		this.bytes_per_row = ((((this.width as base.u64) * 1) + 3) >> 2) << 2
		this.pad_per_row = (4 - (this.width & 3)) & 3
	} else if this.bits_per_pixel == 16 {
		this.bytes_per_row = ((((this.width as base.u64) * 2) + 3) >> 2) << 2
		this.pad_per_row = (this.width & 1) * 2
	} else if this.bits_per_pixel == 24 {
		this.bytes_per_row = ((((this.width as base.u64) * 3) + 3) >> 2) << 2
		this.pad_per_row = this.width & 3
	} else if this.bits_per_pixel == 32 {
		this.bytes_per_row = (this.width as base.u64) * 4
		this.pad_per_row = 0
	}

	this.frame_config_io_position = args.src.position()

	if args.dst <> nullptr {
		dst_pixfmt = base.PIXEL_FORMAT__BGRA_NONPREMUL
		if (this.channel_num_bits[0] > 8) or
			(this.channel_num_bits[1] > 8) or
			(this.channel_num_bits[2] > 8) or
			(this.channel_num_bits[3] > 8) {
			dst_pixfmt = base.PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE
		}

		args.dst.set!(
			pixfmt: dst_pixfmt,
			pixsub: 0,
			width: this.width,
			height: this.height,
			first_frame_io_position: this.frame_config_io_position,
			first_frame_is_opaque: this.channel_masks[3] == 0)
	}

	this.call_sequence = 1
}

pub func decoder.decode_frame_config?(dst: nptr base.frame_config, src: base.io_reader) {
	if this.call_sequence < 1 {
		this.decode_image_config?(dst: nullptr, src: args.src)
	} else if this.call_sequence == 1 {
		if this.frame_config_io_position <> args.src.position() {
			return base."#bad restart"
		}
	} else if this.call_sequence == 2 {
		this.skip_frame?(src: args.src)
		return base."@end of data"
	} else {
		return base."@end of data"
	}

	if args.dst <> nullptr {
		args.dst.set!(bounds: this.util.make_rect_ie_u32(
			min_incl_x: 0,
			min_incl_y: 0,
			max_excl_x: this.width,
			max_excl_y: this.height),
			duration: 0,
			index: 0,
			io_position: this.frame_config_io_position,
			disposal: 0,
			opaque_within_bounds: true,
			overwrite_instead_of_blend: false,
			background_color: 0xFF00_0000)
	}

	this.call_sequence = 2
}

pub func decoder.decode_frame?(dst: ptr base.pixel_buffer, src: base.io_reader, blend: base.pixel_blend, workbuf: slice base.u8, opts: nptr base.decode_frame_options) {
	var dst_palette : slice base.u8
	var status      : base.status

	if this.call_sequence < 2 {
		this.decode_frame_config?(dst: nullptr, src: args.src)
	} else if this.call_sequence == 2 {
		// No-op.
	} else {
		return base."@end of data"
	}

	args.src.skip_u32?(n: this.padding)

	if (this.width > 0) and (this.height > 0) {
		this.dst_x = 0
		if this.top_down {
			this.dst_y = 0
			this.dst_y_end = this.height
			this.dst_y_inc = 1
		} else {
			this.dst_y = this.height ~mod- 1
			this.dst_y_end = 0xFFFF_FFFF  // -1 as a base.u32.
			this.dst_y_inc = 0xFFFF_FFFF  // -1 as a base.u32.
		}

		dst_palette = args.dst.palette()
		if dst_palette.length() == 0 {
			dst_palette = this.scratch[1024 ..]
		}

		status = this.swizzler.prepare!(
			dst_pixfmt: args.dst.pixel_format(),
			dst_palette: dst_palette,
			src_pixfmt: this.util.make_pixel_format(repr: this.src_pixfmt),
			src_palette: this.src_palette[..],
			blend: args.blend)
		if not status.is_ok() {
			return status
		}

		while true {
			if this.compression == 0 {
				status = this.swizzle_compress0!(dst: args.dst, src: args.src)
			} else {
				status = this.swizzle_compress3!(dst: args.dst, src: args.src)
			}

			if status.is_ok() {
				break
			} else if status <> "@internal note: short read" {
				return status
			}
			yield? base."$short read"
		} endwhile
	}

	this.call_sequence = 3
}

pri func decoder.swizzle_compress0!(dst: ptr base.pixel_buffer, src: base.io_reader) 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_row   : base.u64
	var dst_palette         : slice base.u8
	var tab                 : table base.u8
	var dst                 : slice base.u8
	var i                   : base.u64
	var n                   : base.u64

	// 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_row = (this.width as base.u64) * dst_bytes_per_pixel
	dst_palette = args.dst.palette()
	if dst_palette.length() == 0 {
		dst_palette = this.scratch[1024 ..]
	}
	tab = args.dst.plane(p: 0)

	while.outer true {
		while this.pending_pad > 0 {
			if args.src.length() <= 0 {
				return "@internal note: short read"
			}
			this.pending_pad -= 1
			args.src.skip_u32_fast!(actual: 1, worst_case: 1)
		} endwhile

		while.inner true {
			if this.dst_x == this.width {
				this.dst_x = 0
				this.dst_y ~mod+= this.dst_y_inc
				if this.dst_y == this.dst_y_end {
					break.outer
				} else if this.pad_per_row <> 0 {
					this.pending_pad = this.pad_per_row
					continue.outer
				}
			}

			dst = tab.row(y: this.dst_y)
			if dst_bytes_per_row < dst.length() {
				dst = dst[.. dst_bytes_per_row]
			}
			i = (this.dst_x as base.u64) * dst_bytes_per_pixel
			if i >= dst.length() {
				// TODO: advance args.src if the dst pixel_buffer bounds is
				// smaller than this BMP's image bounds?
				continue.inner
			}
			n = this.swizzler.swizzle_interleaved_from_reader!(
				dst: dst[i ..],
				dst_palette: dst_palette,
				src: args.src)
			if n == 0 {
				return "@internal note: short read"
			}
			this.dst_x ~sat+= (n & 0xFFFF_FFFF) as base.u32
		} endwhile.inner
	} endwhile.outer

	return ok
}

pri func decoder.swizzle_compress3!(dst: ptr base.pixel_buffer, src: base.io_reader) 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_row   : base.u64
	var dst_palette         : slice base.u8
	var tab                 : table base.u8
	var dst                 : slice base.u8
	var i                   : base.u64
	var n                   : base.u64

	var p0      : base.u32[..= 256]
	var p1      : base.u32[..= 256]
	var p1_temp : base.u32

	var num_bits : base.u32[..= 32]
	var c        : base.u32
	var c32      : base.u32
	var channel  : base.u32[..= 4]

	// 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_row = (this.width as base.u64) * dst_bytes_per_pixel
	dst_palette = args.dst.palette()
	if dst_palette.length() == 0 {
		dst_palette = this.scratch[1024 ..]
	}
	tab = args.dst.plane(p: 0)

	while.outer true {
		while this.pending_pad > 0 {
			if args.src.length() <= 0 {
				return "@internal note: short read"
			}
			this.pending_pad -= 1
			args.src.skip_u32_fast!(actual: 1, worst_case: 1)
		} endwhile

		while.inner true {
			if this.dst_x == this.width {
				this.dst_x = 0
				this.dst_y ~mod+= this.dst_y_inc
				if this.dst_y == this.dst_y_end {
					break.outer
				} else if this.pad_per_row <> 0 {
					this.pending_pad = this.pad_per_row
					continue.outer
				}
			}

			// -------- BEGIN convert to PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE.
			p1_temp = this.width ~mod- this.dst_x
			p1 = p1_temp.min(a: 256)
			p0 = 0
			while (p0 < p1) and (args.src.length() >= 2) {
				assert p0 < 256 via "a < b: a < c; c <= b"(c: p1)
				if this.bits_per_pixel == 16 {
					if args.src.length() < 2 {
						break
					}
					c32 = args.src.peek_u16le_as_u32()
					args.src.skip_u32_fast!(actual: 2, worst_case: 2)
				} else {
					if args.src.length() < 4 {
						break
					}
					c32 = args.src.peek_u32le()
					args.src.skip_u32_fast!(actual: 4, worst_case: 4)
				}

				channel = 0
				while channel < 4,
					inv p0 < 256,
				{
					if this.channel_num_bits[channel] == 0 {
						this.scratch[(8 * p0) + (2 * channel) + 0] = 0xFF
						this.scratch[(8 * p0) + (2 * channel) + 1] = 0xFF
					} else {
						c = (c32 & this.channel_masks[channel]) >> this.channel_shifts[channel]
						num_bits = this.channel_num_bits[channel] as base.u32
						while num_bits < 16,
							inv p0 < 256,
							inv channel < 4,
							post num_bits >= 16,
						{
							c |= c ~mod<< num_bits
							num_bits *= 2
						} endwhile
						c >>= num_bits - 16
						this.scratch[(8 * p0) + (2 * channel) + 0] = (0xFF & (c >> 0)) as base.u8
						this.scratch[(8 * p0) + (2 * channel) + 1] = (0xFF & (c >> 8)) as base.u8
					}

					channel += 1
				} endwhile

				p0 += 1
			} endwhile
			// -------- END   convert to PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE.

			dst = tab.row(y: this.dst_y)
			if dst_bytes_per_row < dst.length() {
				dst = dst[.. dst_bytes_per_row]
			}
			i = (this.dst_x as base.u64) * dst_bytes_per_pixel
			if i >= dst.length() {
				// TODO: advance args.src if the dst pixel_buffer bounds is
				// smaller than this BMP's image bounds?
				continue.inner
			}

			n = this.swizzler.swizzle_interleaved_from_slice!(
				dst: dst[i ..],
				dst_palette: dst_palette,
				src: this.scratch[.. 8 * p0])
			if n == 0 {
				return "@internal note: short read"
			}
			this.dst_x ~sat+= (n & 0xFFFF_FFFF) as base.u32
		} endwhile.inner
	} endwhile.outer

	return ok
}

pri func decoder.skip_frame?(src: base.io_reader) {
	args.src.skip_u32?(n: this.padding)
	args.src.skip?(n: this.bytes_per_row * (this.height as base.u64))

	this.call_sequence = 3
}

pub func decoder.frame_dirty_rect() base.rect_ie_u32 {
	return this.util.make_rect_ie_u32(
		min_incl_x: 0,
		min_incl_y: 0,
		max_excl_x: this.width,
		max_excl_y: this.height)
}

pub func decoder.num_animation_loops() base.u32 {
	return 0
}

pub func decoder.num_decoded_frame_configs() base.u64 {
	if this.call_sequence > 1 {
		return 1
	}
	return 0
}

pub func decoder.num_decoded_frames() base.u64 {
	if this.call_sequence > 2 {
		return 1
	}
	return 0
}

pub func decoder.restart_frame!(index: base.u64, io_position: base.u64) base.status {
	if this.call_sequence == 0 {
		return base."#bad call sequence"
	}
	if args.index <> 0 {
		return base."#bad argument"
	}
	this.call_sequence = 1
	this.frame_config_io_position = args.io_position
	return ok
}

pub func decoder.set_report_metadata!(fourcc: base.u32, report: base.bool) {
	// No-op. BMP doesn't support metadata.
}

pub func decoder.tell_me_more?(dst: base.io_writer, minfo: nptr base.more_information, src: base.io_reader) {
	if this.io_redirect_fourcc <= 1 {
		return base."#no more information"
	}
	if args.minfo <> nullptr {
		args.minfo.set!(
			flavor: 1,  // WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_REDIRECT
			w: this.io_redirect_fourcc,
			x: 0,
			y: this.io_redirect_pos,
			z: 0xFFFF_FFFF_FFFF_FFFF)
	}
	// Setting io_redirect_fourcc to a dummy value of 1 will cause future calls
	// to return an error.
	this.io_redirect_fourcc = 1
}

pub func decoder.workbuf_len() base.range_ii_u64 {
	return this.util.make_range_ii_u64(min_incl: 0, max_incl: 0)
}

pri func decoder.read_palette?(src: base.io_reader) {
	var i    : base.u32
	var argb : base.u32

	if this.bitmap_info_len < 40 {
		while (i < 256) and (this.padding >= 3) {
			this.padding -= 3
			argb = args.src.read_u24le_as_u32?()
			argb |= 0xFF00_0000
			this.src_palette[(4 * i) + 0] = ((argb >> 0) & 0xFF) as base.u8
			this.src_palette[(4 * i) + 1] = ((argb >> 8) & 0xFF) as base.u8
			this.src_palette[(4 * i) + 2] = ((argb >> 16) & 0xFF) as base.u8
			this.src_palette[(4 * i) + 3] = ((argb >> 24) & 0xFF) as base.u8
			i += 1
		} endwhile
	} else {
		while (i < 256) and (this.padding >= 4) {
			this.padding -= 4
			argb = args.src.read_u32le?()
			argb |= 0xFF00_0000
			this.src_palette[(4 * i) + 0] = ((argb >> 0) & 0xFF) as base.u8
			this.src_palette[(4 * i) + 1] = ((argb >> 8) & 0xFF) as base.u8
			this.src_palette[(4 * i) + 2] = ((argb >> 16) & 0xFF) as base.u8
			this.src_palette[(4 * i) + 3] = ((argb >> 24) & 0xFF) as base.u8
			i += 1
		} endwhile
	}

	while i < 256 {
		this.src_palette[(4 * i) + 0] = 0x00
		this.src_palette[(4 * i) + 1] = 0x00
		this.src_palette[(4 * i) + 2] = 0x00
		this.src_palette[(4 * i) + 3] = 0xFF
		i += 1
	} endwhile
}

pri func decoder.process_masks?() {
	var i    : base.u32
	var mask : base.u32
	var n    : base.u32

	while i < 4 {
		mask = this.channel_masks[i]
		if mask <> 0 {
			n = 0
			while (mask & 1) == 0,
				inv i < 4,
			{
				n ~mod+= 1
				mask >>= 1
			} endwhile
			this.channel_shifts[i] = (n & 31) as base.u8

			n = 0
			while (mask & 1) == 1,
				inv i < 4,
			{
				n ~mod+= 1
				mask >>= 1
			} endwhile
			if (mask <> 0) or (n > 32) {
				return "#bad header"
			}
			this.channel_num_bits[i] = n as base.u8
		} else if i <> 3 {
			return "#bad header"
		}

		i += 1
	} endwhile
}
