Skip to content

Commit 6e78585

Browse files
committed
Restructure and simplify options etc.
1 parent a30adac commit 6e78585

File tree

7 files changed

+157
-320
lines changed

7 files changed

+157
-320
lines changed

‎internal/libwebp/a__encoder.go‎

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,24 +38,24 @@ import (
3838
"image/draw"
3939
"io"
4040
"unsafe"
41+
42+
"github.com/bep/gowebp/libwebp/options"
4143
)
4244

4345
type (
4446
Encoder struct {
45-
options *Options
46-
config *C.WebPConfig
47-
img *image.NRGBA
47+
config *C.WebPConfig
48+
img *image.NRGBA
4849
}
4950
)
5051

51-
func NewEncoder(src image.Image, options *Options) (e *Encoder, err error) {
52-
var config *C.WebPConfig
53-
54-
if config, err = options.GetConfig(); err != nil {
52+
func NewEncoder(src image.Image, options options.EncodingOptions) (*Encoder, error) {
53+
config, err := encodingOptionsToCConfig(options)
54+
if err != nil {
5555
return nil, err
5656
}
5757

58-
e = &Encoder{options: options, config: config}
58+
e := &Encoder{config: config}
5959

6060
switch v := src.(type) {
6161
case *image.NRGBA:
@@ -64,7 +64,7 @@ func NewEncoder(src image.Image, options *Options) (e *Encoder, err error) {
6464
e.img = e.convertToNRGBA(src)
6565
}
6666

67-
return
67+
return e, nil
6868
}
6969

7070
func (e *Encoder) Encode(w io.Writer) error {
@@ -89,9 +89,27 @@ func (e *Encoder) Encode(w io.Writer) error {
8989
return err
9090
}
9191

92-
func (e *Encoder) convertToNRGBA(src image.Image) (dst *image.NRGBA) {
93-
dst = image.NewNRGBA(src.Bounds())
92+
func (e *Encoder) convertToNRGBA(src image.Image) *image.NRGBA {
93+
dst := image.NewNRGBA(src.Bounds())
9494
draw.Draw(dst, dst.Bounds(), src, src.Bounds().Min, draw.Src)
9595

96-
return
96+
return dst
97+
}
98+
99+
func encodingOptionsToCConfig(o options.EncodingOptions) (*C.WebPConfig, error) {
100+
cfg := &C.WebPConfig{}
101+
quality := C.float(o.Quality)
102+
103+
if C.WebPConfigPreset(cfg, C.WebPPreset(o.EncodingPreset), quality) == 0 {
104+
return nil, errors.New("failed to init encoder config")
105+
}
106+
107+
cfg.quality = quality
108+
109+
if C.WebPValidateConfig(cfg) == 0 {
110+
return nil, errors.New("failed to validate config")
111+
}
112+
113+
return cfg, nil
114+
97115
}

‎internal/libwebp/a__options.go‎

Lines changed: 0 additions & 171 deletions
This file was deleted.

‎libwebp/encode.go‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package libwebp
2+
3+
import (
4+
"image"
5+
"io"
6+
7+
"github.com/bep/gowebp/libwebp/options"
8+
9+
"github.com/bep/gowebp/internal/libwebp"
10+
)
11+
12+
// Encode encodes src as Webp into w using the options in o.
13+
func Encode(w io.Writer, src image.Image, o options.EncodingOptions) error {
14+
if enc, err := libwebp.NewEncoder(src, o); err != nil {
15+
return err
16+
} else {
17+
return enc.Encode(w)
18+
}
19+
}

‎libwebp/encode_test.go‎

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package libwebp
2+
3+
import (
4+
"image/jpeg"
5+
"io/ioutil"
6+
"os"
7+
"testing"
8+
9+
"github.com/bep/gowebp/libwebp/options"
10+
)
11+
12+
func TestEncode(t *testing.T) {
13+
t.Run("encode lossy", func(t *testing.T) {
14+
r, err := os.Open("../test_data/images/source.jpg")
15+
if err != nil {
16+
t.Fatal(err)
17+
}
18+
19+
img, err := jpeg.Decode(r)
20+
if err != nil {
21+
t.Fatal(err)
22+
}
23+
24+
if err = Encode(ioutil.Discard, img, options.EncodingOptions{}); err != nil {
25+
t.Fatal(err)
26+
}
27+
})
28+
t.Run("encode lossless", func(t *testing.T) {
29+
r, err := os.Open("../test_data/images/source.jpg")
30+
if err != nil {
31+
t.Fatal(err)
32+
}
33+
34+
img, err := jpeg.Decode(r)
35+
if err != nil {
36+
t.Fatal(err)
37+
}
38+
39+
if err = Encode(ioutil.Discard, img, options.EncodingOptions{Quality: 75}); err != nil {
40+
t.Fatal(err)
41+
}
42+
})
43+
}
44+
45+
func BenchmarkEncode(b *testing.B) {
46+
r, err := os.Open("../test_data/images/source.jpg")
47+
if err != nil {
48+
b.Fatal(err)
49+
}
50+
51+
img, err := jpeg.Decode(r)
52+
if err != nil {
53+
b.Fatal(err)
54+
}
55+
56+
opts := options.EncodingOptions{Quality: 75}
57+
58+
for i := 0; i < b.N; i++ {
59+
if err = Encode(ioutil.Discard, img, opts); err != nil {
60+
b.Fatal(err)
61+
}
62+
}
63+
}
64+
65+
// Just to have something to compare with.
66+
func BenchmarkEncodeJpeg(b *testing.B) {
67+
r, err := os.Open("../test_data/images/source.jpg")
68+
if err != nil {
69+
b.Fatal(err)
70+
}
71+
72+
img, err := jpeg.Decode(r)
73+
if err != nil {
74+
b.Fatal(err)
75+
}
76+
77+
opts := &jpeg.Options{
78+
Quality: 75,
79+
}
80+
81+
for i := 0; i < b.N; i++ {
82+
if err = jpeg.Encode(ioutil.Discard, img, opts); err != nil {
83+
b.Fatal(err)
84+
}
85+
}
86+
}

‎libwebp/options/options.go‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package options
2+
3+
const (
4+
PresetDefault EncodingPreset = iota
5+
PresetPicture
6+
PresetPhoto
7+
PresetDrawing
8+
PresetIcon
9+
PresetText
10+
)
11+
12+
type (
13+
EncodingPreset int
14+
EncodingOptions struct {
15+
16+
// Quality is a number between 0 and 100. Set to 0 for lossless.
17+
Quality int
18+
19+
// The encoding preset to use.
20+
EncodingPreset
21+
}
22+
)

‎libwebp/webp.go‎

Lines changed: 0 additions & 21 deletions
This file was deleted.

0 commit comments

Comments
 (0)