Files
sjy01-image-proc/vendor/github.com/go-pdf/fpdf/xcompr.go
2024-10-24 15:46:01 +08:00

80 lines
1.4 KiB
Go

// Copyright ©2021 The go-pdf Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package fpdf
import (
"bytes"
"compress/zlib"
"fmt"
"sync"
)
var xmem = xmempool{
Pool: sync.Pool{
New: func() interface{} {
var m membuffer
return &m
},
},
}
type xmempool struct{ sync.Pool }
func (pool *xmempool) compress(data []byte) *membuffer {
mem := pool.Get().(*membuffer)
buf := &mem.buf
buf.Grow(len(data))
zw, err := zlib.NewWriterLevel(buf, zlib.BestSpeed)
if err != nil {
panic(fmt.Errorf("could not create zlib writer: %w", err))
}
_, err = zw.Write(data)
if err != nil {
panic(fmt.Errorf("could not zlib-compress slice: %w", err))
}
err = zw.Close()
if err != nil {
panic(fmt.Errorf("could not close zlib writer: %w", err))
}
return mem
}
func (pool *xmempool) uncompress(data []byte) (*membuffer, error) {
zr, err := zlib.NewReader(bytes.NewReader(data))
if err != nil {
return nil, err
}
mem := pool.Get().(*membuffer)
mem.buf.Reset()
_, err = mem.buf.ReadFrom(zr)
if err != nil {
mem.release()
return nil, err
}
return mem, nil
}
type membuffer struct {
buf bytes.Buffer
}
func (mem *membuffer) bytes() []byte { return mem.buf.Bytes() }
func (mem *membuffer) release() {
mem.buf.Reset()
xmem.Put(mem)
}
func (mem *membuffer) copy() []byte {
src := mem.bytes()
dst := make([]byte, len(src))
copy(dst, src)
return dst
}