Skip to content

Commit

Permalink
Adds support for loading parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
davidbyttow committed Jan 14, 2021
1 parent 4b84e6d commit e9138bc
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 17 deletions.
45 changes: 35 additions & 10 deletions vips/foreign.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,50 @@

#include "lang.h"

int load_image_buffer(void *buf, size_t len, int imageType, VipsImage **out) {
int load_image_buffer(LoadParams *params, void *buf, size_t len,
VipsImage **out) {
int code = 1;
ImageType imageType = params->inputFormat;

if (imageType == JPEG) {
code = vips_jpegload_buffer(buf, len, out, NULL);
// shrink: int, fail: bool, autorotate: bool
code = vips_jpegload_buffer(buf, len, out, "fail", params->fail,
"autorotate", params->autorotate, "shrink",
params->jpegShrink, NULL);
} else if (imageType == PNG) {
code = vips_pngload_buffer(buf, len, out, NULL);
} else if (imageType == WEBP) {
code = vips_webpload_buffer(buf, len, out, NULL);
// page: int, n: int, scale: double
code = vips_webpload_buffer(buf, len, out, "page", params->page, "n",
params->n, NULL);
} else if (imageType == TIFF) {
code = vips_tiffload_buffer(buf, len, out, NULL);
// page: int, n: int, autorotate: bool, subifd: int
code =
vips_tiffload_buffer(buf, len, out, "page", params->page, "n",
params->n, "autorotate", params->autorotate, NULL);
} else if (imageType == GIF) {
code = vips_gifload_buffer(buf, len, out, NULL);
// page: int, n: int, scale: double
code = vips_gifload_buffer(buf, len, out, "page", params->page, "n",
params->n, NULL);
} else if (imageType == PDF) {
code = vips_pdfload_buffer(buf, len, out, NULL);
// page: int, n: int, dpi: double, scale: double, background: color
code = vips_pdfload_buffer(buf, len, out, "page", params->page, "n",
params->n, "dpi", params->dpi, NULL);
} else if (imageType == SVG) {
code = vips_svgload_buffer(buf, len, out, NULL);
// dpi: double, scale: double, unlimited: bool
code = vips_svgload_buffer(buf, len, out, "dpi", params->dpi, "unlimited",
params->svgUnlimited, NULL);
} else if (imageType == HEIF) {
// added autorotate on load as currently it addresses orientation issues
// https://github.com/libvips/libvips/pull/1680
code = vips_heifload_buffer(buf, len, out, "autorotate", TRUE, NULL);
// page: int, n: int, thumbnail: bool
code = vips_heifload_buffer(buf, len, out, "page", params->page, "n",
params->n, "thumbnail", params->heifThumbnail,
"autorotate", TRUE, NULL);
} else if (imageType == MAGICK) {
code = vips_magickload_buffer(buf, len, out, NULL);
// page: int, n: int, density: string
code = vips_magickload_buffer(buf, len, out, "page", params->page, "n",
params->n, NULL);
}

return code;
Expand Down Expand Up @@ -132,4 +153,8 @@ SaveParams create_save_params(ImageType outputFormat) {
return params;
}

void init_save_params(SaveParams *params) { *params = defaultSaveParams; }
LoadParams create_load_params(ImageType inputFormat) {
LoadParams params;
params.inputFormat = inputFormat;
return params;
}
19 changes: 17 additions & 2 deletions vips/foreign.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ func isBMP(buf []byte) bool {
return bytes.HasPrefix(buf, bmpHeader)
}

func vipsLoadFromBuffer(buf []byte) (*C.VipsImage, ImageType, error) {
func vipsLoadFromBuffer(buf []byte, params *LoadParams) (*C.VipsImage, ImageType, error) {
src := buf
// Reference src here so it's not garbage collected during image initialization.
defer runtime.KeepAlive(src)
Expand All @@ -230,7 +230,9 @@ func vipsLoadFromBuffer(buf []byte) (*C.VipsImage, ImageType, error) {
return nil, ImageTypeUnknown, ErrUnsupportedImageFormat
}

if err := C.load_image_buffer(unsafe.Pointer(&src[0]), C.size_t(len(src)), C.int(imageType), &out); err != 0 {
loadParams := createLoadParams(imageType, params)

if err := C.load_image_buffer(&loadParams, unsafe.Pointer(&src[0]), C.size_t(len(src)), &out); err != 0 {
return nil, ImageTypeUnknown, handleImageError(out)
}

Expand All @@ -252,6 +254,19 @@ func bmpToPNG(src []byte) ([]byte, error) {
return w.Bytes(), nil
}

func createLoadParams(format ImageType, params *LoadParams) C.LoadParams {
p := C.create_load_params(C.ImageType(format))
p.autorotate = C.int(boolToInt(params.AutoRotate))
p.fail = C.int(boolToInt(params.FailOnError))
p.page = C.int(params.Page)
p.n = C.int(params.NumPages)
p.dpi = C.gdouble(params.Density)
p.jpegShrink = C.int(params.JpegShrinkFactor)
p.heifThumbnail = C.int(boolToInt(params.HeifThumbnail))
p.svgUnlimited = C.int(boolToInt(params.SvgUnlimited))
return p
}

func vipsSaveJPEGToBuffer(in *C.VipsImage, params JpegExportParams) ([]byte, error) {
incOpCounter("save_jpeg_buffer")

Expand Down
20 changes: 17 additions & 3 deletions vips/foreign.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,20 @@ typedef enum types {
BMP
} ImageType;

int load_image_buffer(void *buf, size_t len, int imageType, VipsImage **out);
typedef struct LoadParams {
size_t inputLen;
ImageType inputFormat;

BOOL autorotate;
BOOL fail;
int page;
int n;
gdouble dpi;

int jpegShrink;
BOOL heifThumbnail;
BOOL svgUnlimited;
} LoadParams;

typedef struct SaveParams {
VipsImage *inputImage;
Expand Down Expand Up @@ -66,6 +79,7 @@ typedef struct SaveParams {
} SaveParams;

SaveParams create_save_params(ImageType outputFormat);
void init_save_params(SaveParams *params);

int save_to_buffer(SaveParams *params);

LoadParams create_load_params(ImageType inputFormat);
int load_image_buffer(LoadParams *params, void *buf, size_t len, VipsImage **out);
37 changes: 35 additions & 2 deletions vips/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,30 @@ type ImageMetadata struct {
Orientation int
}

// LoadParams are options for loading an image. Some are type-specific.
// For default loading, use NewLoadParams() or specify nil
type LoadParams struct {
AutoRotate bool
FailOnError bool
Page int
NumPages int
Density int

JpegShrinkFactor int
HeifThumbnail bool
SvgUnlimited bool
}

// NewLoadParams creates default LoadParams
func NewLoadParams() *LoadParams {
return &LoadParams{
FailOnError: true,
NumPages: 1,
Density: 72,
JpegShrinkFactor: 1,
}
}

// ExportParams are options when exporting an image to file or buffer.
// Deprecated: Use format-specific params
type ExportParams struct {
Expand Down Expand Up @@ -209,9 +233,18 @@ func NewImageFromFile(file string) (*ImageRef, error) {

// NewImageFromBuffer loads an image buffer and creates a new Image
func NewImageFromBuffer(buf []byte) (*ImageRef, error) {
return LoadImageFromBuffer(buf, nil)
}

// LoadImageFromBuffer loads an image buffer and creates a new Image
func LoadImageFromBuffer(buf []byte, params *LoadParams) (*ImageRef, error) {
startupIfNeeded()

image, format, err := vipsLoadFromBuffer(buf)
if params == nil {
params = NewLoadParams()
}

image, format, err := vipsLoadFromBuffer(buf, params)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -700,7 +733,7 @@ func (r *ImageRef) UnpremultiplyAlpha() error {

// Cast converts the image to a target band format
func (r *ImageRef) Cast(format BandFormat) error {
out, err:= vipsCast(r.image, format)
out, err := vipsCast(r.image, format)
if err != nil {
return err
}
Expand Down

0 comments on commit e9138bc

Please sign in to comment.