refactor: bindings

This commit is contained in:
Tomas Aparicio 2015-04-06 13:25:01 +02:00
parent d6f8ad617b
commit 206a1efc66
6 changed files with 129 additions and 47 deletions

View file

@ -94,30 +94,17 @@ func Resize(buf []byte, o Options) ([]byte, error) {
debug("factor: %v, shrink: %v, residual: %v", factor, shrink, residual)
// Try to use libjpeg shrink-on-load
shrinkOnLoad := 1
if imageType == JPEG && shrink >= 2 {
switch {
case shrink >= 8:
factor = factor / 8
shrinkOnLoad = 8
case shrink >= 4:
factor = factor / 4
shrinkOnLoad = 4
case shrink >= 2:
factor = factor / 2
shrinkOnLoad = 2
// Recalculate integral shrink and double residual
tmpImage, factor, err := shrinkJpeg(buf, factor, shrink)
if err != nil {
return nil, err
}
if shrinkOnLoad > 1 {
// Recalculate integral shrink and double residual
if tmpImage != nil {
image = tmpImage
factor = math.Max(factor, 1.0)
shrink = int(math.Floor(factor))
residual = float64(shrink) / factor
// Reload input using shrink-on-load
image, err = vipsShrinkJpeg(buf, shrinkOnLoad)
if err != nil {
return nil, err
}
}
}
@ -279,6 +266,33 @@ func calculateRotationAndFlip(image *C.struct__VipsImage, angle Angle) (Angle, b
return rotate, flip
}
func shrinkJpeg(buf []byte, factor float64, shrink int) (*C.struct__VipsImage, float64, error) {
shrinkOnLoad := 1
switch {
case shrink >= 8:
factor = factor / 8
shrinkOnLoad = 8
case shrink >= 4:
factor = factor / 4
shrinkOnLoad = 4
case shrink >= 2:
factor = factor / 2
shrinkOnLoad = 2
}
if shrinkOnLoad > 1 {
// Reload input using shrink-on-load
image, err := vipsShrinkJpeg(buf, shrinkOnLoad)
if err != nil {
return nil, factor, err
}
return image, factor, err
}
return nil, factor, nil
}
func calculateRotation(angle Angle) Angle {
divisor := angle % 90
if divisor != 0 {