diff options
| author | Axel Wagner <axel.wagner.hh@googlemail.com> | 2025-11-19 09:28:16 +0100 |
|---|---|---|
| committer | Sean Liao <sean@liao.dev> | 2025-11-23 03:49:34 -0800 |
| commit | a18294bb6aa8f0dd656f2bcb6742f9de2936d0dc (patch) | |
| tree | 7d9c0dfc5cfbfe4968c6edfaf6b955e06cbb12e9 /src/image | |
| parent | 437323ef7b933255c5c7fbb0775019e95f19b05e (diff) | |
| download | go-a18294bb6aa8f0dd656f2bcb6742f9de2936d0dc.tar.xz | |
cmd/internal/obj/arm64, image/gif, runtime, sort: use math/bits to calculate log2
In several places the integer log2 is calculated using loops or similar
mechanisms. math/bits.Len* provide a simpler and more efficient
mechanisms for this.
Annoyingly, every usage has slightly different ideas of what "log2"
means and how non-positive inputs should be handled. I verified the
replacements in each case by comparing the result for inputs from 0
to 1<<16.
Change-Id: Ie962a74674802da363e0038d34c06979ccb41cf3
Reviewed-on: https://go-review.googlesource.com/c/go/+/721880
Reviewed-by: Mark Freeman <markfreeman@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src/image')
| -rw-r--r-- | src/image/gif/writer.go | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/src/image/gif/writer.go b/src/image/gif/writer.go index 129d0ab282..2a3e33c145 100644 --- a/src/image/gif/writer.go +++ b/src/image/gif/writer.go @@ -15,6 +15,7 @@ import ( "image/draw" "internal/byteorder" "io" + "math/bits" ) // Graphic control extension fields. @@ -23,15 +24,11 @@ const ( gcBlockSize = 0x04 ) -var log2Lookup = [8]int{2, 4, 8, 16, 32, 64, 128, 256} - func log2(x int) int { - for i, v := range log2Lookup { - if x <= v { - return i - } + if x < 2 { + return 0 } - return -1 + return bits.Len(uint(x-1)) - 1 } // writer is a buffered writer. @@ -192,7 +189,7 @@ func (e *encoder) writeHeader() { } func encodeColorTable(dst []byte, p color.Palette, size int) (int, error) { - if uint(size) >= uint(len(log2Lookup)) { + if uint(size) >= 8 { return 0, errors.New("gif: cannot encode color table with more than 256 entries") } for i, c := range p { @@ -212,7 +209,7 @@ func encodeColorTable(dst []byte, p color.Palette, size int) (int, error) { dst[3*i+1] = g dst[3*i+2] = b } - n := log2Lookup[size] + n := 1 << (size + 1) if n > len(p) { // Pad with black. clear(dst[3*len(p) : 3*n]) |
