From 36bec6e63dd64701c096e6964cbcd97804d6c234 Mon Sep 17 00:00:00 2001 From: Tnze Date: Mon, 2 Jan 2023 22:43:43 +0800 Subject: [PATCH] fix bitsPerBlock calculation bug in NewXXXXPaletteContainerWithData --- level/bitstorage.go | 10 ++++++++++ level/palette.go | 5 ++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/level/bitstorage.go b/level/bitstorage.go index af84d7f..a22f1ea 100644 --- a/level/bitstorage.go +++ b/level/bitstorage.go @@ -67,6 +67,16 @@ func calcBitStorageSize(bits, length int) (size int) { return (length + valuesPerLong - 1) / valuesPerLong } +// calcBitsPerValue calculate when "longs" number of uint64 stores +// "length" number of value, how many bits are used for each value. +func calcBitsPerValue(length, longs int) (bits int) { + if longs == 0 || length == 0 { + return 0 + } + valuePerLong := (length + longs - 1) / longs + return 64 / valuePerLong +} + type newBitStorageErr struct { ArrlLen int WantLen int diff --git a/level/palette.go b/level/palette.go index 99a98ac..7ad6cb5 100644 --- a/level/palette.go +++ b/level/palette.go @@ -2,7 +2,6 @@ package level import ( "io" - "math/bits" "strconv" "github.com/Tnze/go-mc/level/biome" @@ -36,7 +35,7 @@ func NewStatesPaletteContainer(length int, defaultValue BlocksState) *PaletteCon func NewStatesPaletteContainerWithData(length int, data []uint64, pat []BlocksState) *PaletteContainer[BlocksState] { var p palette[BlocksState] - n := bits.Len(uint(len(pat) - 1)) + n := calcBitsPerValue(length, len(data)) switch n { case 0: p = &singleValuePalette[BlocksState]{pat[0]} @@ -78,7 +77,7 @@ func NewBiomesPaletteContainer(length int, defaultValue BiomesState) *PaletteCon func NewBiomesPaletteContainerWithData(length int, data []uint64, pat []BiomesState) *PaletteContainer[BiomesState] { var p palette[BiomesState] - n := bits.Len(uint(len(pat) - 1)) + n := calcBitsPerValue(length, len(data)) switch n { case 0: p = &singleValuePalette[BiomesState]{pat[0]}