Skip to content

Commit

Permalink
simplify webpDecodeRGBA and fix test
Browse files Browse the repository at this point in the history
  • Loading branch information
chai2010 committed Feb 11, 2016
1 parent c12e58f commit d5259d1
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 126 deletions.
21 changes: 0 additions & 21 deletions bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,27 +70,6 @@ func BenchmarkDecodeRGBA(b *testing.B) {
b.StopTimer()
}

func BenchmarkDecodeRGBAEx(b *testing.B) {
data, err := ioutil.ReadFile("./testdata/1_webp_ll.webp")
if err != nil {
b.Fatal(err)
}
cbuf := NewCBuffer(len(data))
copy(cbuf.CData(), data)
b.ResetTimer()
for i := 0; i < b.N; i++ {
m, pix, err := DecodeRGBAEx(cbuf.CData(), cbuf)
if err != nil {
b.Fatal(err)
}
_ = m
b.StopTimer()
pix.Close()
b.StartTimer()
}
b.StopTimer()
}

func BenchmarkEncodeAndDecode(b *testing.B) {
var buf bytes.Buffer

Expand Down
33 changes: 12 additions & 21 deletions capi.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,6 @@ package webp
#include <stdlib.h>
#include <string.h>
struct cgoWebpDecodeRGBAReturn {
int ok;
int width;
int height;
uint8_t* ptr;
} cgoWebpDecodeRGBA(const uint8_t* data, size_t data_size) {
struct cgoWebpDecodeRGBAReturn t;
t.ptr = webpDecodeRGBA(data, data_size, &t.width, &t.height);
t.ok = (t.ptr != NULL)? 1: 0;
return t;
}
struct cgoWebpEncodeGrayReturn {
int ok;
Expand Down Expand Up @@ -237,7 +226,8 @@ func webpDecodeGray(data []byte) (pix []byte, width, height int, err error) {
}
defer C.free(unsafe.Pointer(cptr))

pix = append([]byte{}, ((*[1 << 30]byte)(unsafe.Pointer(cptr)))[0:len(pix):len(pix)]...)
pix = make([]byte, int(cw*ch*1))
copy(pix, ((*[1 << 30]byte)(unsafe.Pointer(cptr)))[0:len(pix):len(pix)])
width, height = int(cw), int(ch)
return
}
Expand All @@ -256,28 +246,29 @@ func webpDecodeRGB(data []byte) (pix []byte, width, height int, err error) {
}
defer C.free(unsafe.Pointer(cptr))

pix = append([]byte{}, ((*[1 << 30]byte)(unsafe.Pointer(cptr)))[0:len(pix):len(pix)]...)
pix = make([]byte, int(cw*ch*3))
copy(pix, ((*[1 << 30]byte)(unsafe.Pointer(cptr)))[0:len(pix):len(pix)])
width, height = int(cw), int(ch)
return
}

func webpDecodeRGBA(data []byte, cbuf CBuffer) (pix CBuffer, width, height int, err error) {
func webpDecodeRGBA(data []byte) (pix []byte, width, height int, err error) {
if len(data) == 0 {
err = errors.New("webpDecodeRGBA: bad arguments")
return
}
isCBuf := cbuf.Own(data)
cData := cgoSafePtr(data, isCBuf)
defer cgoFreePtr(cData, isCBuf)

rv := C.cgoWebpDecodeRGBA((*C.uint8_t)(cData), C.size_t(len(data)))
if rv.ok != 1 {
var cw, ch C.int
var cptr = C.webpDecodeRGBA((*C.uint8_t)(unsafe.Pointer(&data[0])), C.size_t(len(data)), &cw, &ch)
if cptr == nil {
err = errors.New("webpDecodeRGBA: failed")
return
}
defer C.free(unsafe.Pointer(cptr))

width, height = int(rv.width), int(rv.height)
pix = newCBufferFrom(unsafe.Pointer(rv.ptr), width*height*4)
pix = make([]byte, int(cw*ch*4))
copy(pix, ((*[1 << 30]byte)(unsafe.Pointer(cptr)))[0:len(pix):len(pix)])
width, height = int(cw), int(ch)
return
}

Expand Down
44 changes: 7 additions & 37 deletions reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,27 +15,14 @@ import (
"os"
)

func LoadConfig(name string, cbuf ...CBuffer) (config image.Config, err error) {
func LoadConfig(name string) (config image.Config, err error) {
f, err := os.Open(name)
if err != nil {
return image.Config{}, err
}
defer f.Close()

if len(cbuf) == 0 || cbuf[0] == nil {
cbuf = []CBuffer{NewCBuffer(maxWebpHeaderSize)}
defer cbuf[0].Close()
}
if len(cbuf[0].CData()) < maxWebpHeaderSize {
if err = cbuf[0].Resize(maxWebpHeaderSize); err != nil {
return
}
}

header := cbuf[0].CData()
if len(header) > maxWebpHeaderSize {
header = header[:maxWebpHeaderSize]
}
header := make([]byte, maxWebpHeaderSize)
n, err := f.Read(header)
if err != nil && err != io.EOF {
return
Expand All @@ -52,7 +39,7 @@ func LoadConfig(name string, cbuf ...CBuffer) (config image.Config, err error) {
return
}

func Load(name string, cbuf ...CBuffer) (m image.Image, err error) {
func Load(name string) (m image.Image, err error) {
f, err := os.Open(name)
if err != nil {
return nil, err
Expand All @@ -66,32 +53,15 @@ func Load(name string, cbuf ...CBuffer) (m image.Image, err error) {
if fi.Size() > (2 << 30) {
return nil, errors.New("webp: Load, file size is too large (> 2GB)!")
}
if len(cbuf) == 0 || cbuf[0] == nil {
cbuf = []CBuffer{NewCBuffer(int(fi.Size()))}
defer cbuf[0].Close()
}

if len(cbuf[0].CData()) < int(fi.Size()) {
if err = cbuf[0].Resize(int(fi.Size())); err != nil {
return
}
}
data := cbuf[0].CData()
if n := int(fi.Size()); len(data) > n {
data = data[:n]
}

_, err = f.Read(data)
if err != nil {
data := make([]byte, int(fi.Size()))
if _, err = f.Read(data); err != nil {
return nil, err
}
m, pix, err := DecodeRGBAEx(data, cbuf[0])
if err != nil {
if m, err = DecodeRGBA(data); err != nil {
return
}
pix.Close()

return m, nil
return
}

// DecodeConfig returns the color model and dimensions of a WEBP image without
Expand Down
28 changes: 0 additions & 28 deletions reader_example_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,6 @@ func ExampleLoadConfig() {
// Height = 301
}

func ExampleLoadConfig_cbuf() {
cbuf := NewCBuffer(0)
defer cbuf.Close()

cfg, err := LoadConfig("./testdata/1_webp_ll.webp", cbuf)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Width = %d\n", cfg.Width)
fmt.Printf("Height = %d\n", cfg.Height)
// Output:
// Width = 400
// Height = 301
}

func ExampleLoad() {
m, err := Load("./testdata/1_webp_ll.webp")
if err != nil {
Expand All @@ -45,16 +30,3 @@ func ExampleLoad() {
// Output:
// Bounds = (0,0)-(400,301)
}

func ExampleLoad_cbuf() {
cbuf := NewCBuffer(8 << 20) // 8MB
defer cbuf.Close()

m, err := Load("./testdata/1_webp_ll.webp", cbuf)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Bounds = %v\n", m.Bounds())
// Output:
// Bounds = (0,0)-(400,301)
}
21 changes: 2 additions & 19 deletions webp.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,29 +48,12 @@ func DecodeRGB(data []byte) (m *RGBImage, err error) {
}

func DecodeRGBA(data []byte) (m *image.RGBA, err error) {
pix, w, h, err := webpDecodeRGBA(data, nilCBuffer)
pix, w, h, err := webpDecodeRGBA(data)
if err != nil {
return
}
defer pix.Close()
m = &image.RGBA{
Pix: append([]byte{}, pix.CData()...),
Stride: 4 * w,
Rect: image.Rect(0, 0, w, h),
}
return
}

func DecodeRGBAEx(data []byte, cbuf CBuffer) (m *image.RGBA, pix CBuffer, err error) {
if cbuf == nil {
cbuf = nilCBuffer
}
pix, w, h, err := webpDecodeRGBA(data, cbuf)
if err != nil {
return
}
m = &image.RGBA{
Pix: pix.CData(),
Pix: pix,
Stride: 4 * w,
Rect: image.Rect(0, 0, w, h),
}
Expand Down

0 comments on commit d5259d1

Please sign in to comment.