package dt1

const (
	blockDataLength = 256
)

// DecodeTileGfxData decodes tile graphics data for a slice of dt1 blocks
func DecodeTileGfxData(blocks []Block, pixels *[]byte, tileYOffset, tileWidth int32) {
	for _, block := range blocks {
		if block.Format() == BlockFormatIsometric {
			// 3D isometric decoding
			xjump := []int32{14, 12, 10, 8, 6, 4, 2, 0, 2, 4, 6, 8, 10, 12, 14}
			nbpix := []int32{4, 8, 12, 16, 20, 24, 28, 32, 28, 24, 20, 16, 12, 8, 4}
			blockX := int32(block.X)
			blockY := int32(block.Y)
			length := int32(blockDataLength)
			x := int32(0)
			y := int32(0)
			idx := 0

			for length > 0 {
				x = xjump[y]
				n := nbpix[y]
				length -= n

				for n > 0 {
					offset := ((blockY + y + tileYOffset) * tileWidth) + (blockX + x)
					(*pixels)[offset] = block.EncodedData[idx]
					x++
					n--
					idx++
				}
				y++
			}

			continue
		}
		// RLE Encoding
		blockX := int32(block.X)
		blockY := int32(block.Y)
		x := int32(0)
		y := int32(0)
		idx := 0
		length := block.Length

		for length > 0 {
			b1 := block.EncodedData[idx]
			b2 := block.EncodedData[idx+1]
			idx += 2
			length -= 2

			if (b1 | b2) == 0 {
				x = 0
				y++

				continue
			}

			x += int32(b1)
			length -= int32(b2)

			for b2 > 0 {
				offset := ((blockY + y + tileYOffset) * tileWidth) + (blockX + x)
				(*pixels)[offset] = block.EncodedData[idx]
				idx++
				x++
				b2--
			}
		}
	}
}
