Skip to content

Commit

Permalink
minor cleanups
Browse files Browse the repository at this point in the history
  • Loading branch information
davidbyttow committed Jan 19, 2021
1 parent f2de139 commit 36affb8
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 124 deletions.
109 changes: 24 additions & 85 deletions vips/foreign.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,67 +20,14 @@ void set_double_param(Param *p, gdouble d) {
p->is_set = TRUE;
}

gboolean get_bool_param(Param *p) { return p->value.b; }
gboolean get_int_param(Param *p) { return p->value.i; }
gboolean get_double_param(Param *p) { return p->value.d; }

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

if (imageType == JPEG) {
// 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) {
// page: int, n: int, scale: double
code = vips_webpload_buffer(buf, len, out, "page", params->page, "n",
params->n, NULL);
} else if (imageType == TIFF) {
// 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) {
// page: int, n: int, scale: double
code = vips_gifload_buffer(buf, len, out, "page", params->page, "n",
params->n, NULL);
} else if (imageType == PDF) {
// 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) {
// 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
// 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) {
// page: int, n: int, density: string
code = vips_magickload_buffer(buf, len, out, "page", params->page, "n",
params->n, NULL);
#define SET_BOOL(OP, PARAM, NAME) \
if (PARAM.is_set) { \
vips_object_set(VIPS_OBJECT(OP), NAME, PARAM.value.b, NULL); \
}

return code;
}

#define SET_BOOL(OP, PARAM, NAME) \
if (PARAM.is_set) { \
vips_object_set(VIPS_OBJECT(OP), NAME, get_bool_param(&PARAM), NULL); \
}

#define SET_INT(OP, PARAM, NAME) \
if (PARAM.is_set) { \
vips_object_set(VIPS_OBJECT(OP), NAME, get_int_param(&PARAM), NULL); \
#define SET_INT(OP, PARAM, NAME) \
if (PARAM.is_set) { \
vips_object_set(VIPS_OBJECT(OP), NAME, PARAM.value.i, NULL); \
}

typedef int (*SetLoadOptionsFn)(VipsOperation *operation, LoadParams *params);
Expand Down Expand Up @@ -171,9 +118,7 @@ int load_buffer(const char *operationName, void *buf, size_t len,
}

g_object_get(VIPS_OBJECT(operation), "out", &params->outputImage, NULL);

g_object_unref(operation);

return 0;
}

Expand Down Expand Up @@ -337,25 +282,25 @@ int save_to_buffer(SaveParams *params) {
return 1;
}

#define DEFAULT_PARAM \
{ \
type: \
PARAM_TYPE_NULL, value : 0, is_set : FALSE \
}

static LoadParams defaultLoadParams = {
inputBlob : NULL,
outputImage : NULL,
autorotate : DEFAULT_PARAM,
fail : DEFAULT_PARAM,
page : DEFAULT_PARAM,
n : DEFAULT_PARAM,
dpi : DEFAULT_PARAM,
jpegShrink : DEFAULT_PARAM,
heifThumbnail : DEFAULT_PARAM,
svgUnlimited : DEFAULT_PARAM,
};
LoadParams create_load_params(ImageType inputFormat) {
Param defaultParam = {};
LoadParams p = {
inputFormat : inputFormat,
inputBlob : NULL,
outputImage : NULL,
autorotate : defaultParam,
fail : defaultParam,
page : defaultParam,
n : defaultParam,
dpi : defaultParam,
jpegShrink : defaultParam,
heifThumbnail : defaultParam,
svgUnlimited : defaultParam,
};
return p;
}

// TODO: Change to same pattern as ImportParams
static SaveParams defaultSaveParams = {
inputImage : NULL,
outputBuffer : NULL,
Expand Down Expand Up @@ -392,9 +337,3 @@ SaveParams create_save_params(ImageType outputFormat) {
params.outputFormat = outputFormat;
return params;
}

LoadParams create_load_params(ImageType inputFormat) {
LoadParams params = defaultLoadParams;
params.inputFormat = inputFormat;
return params;
}
55 changes: 27 additions & 28 deletions vips/foreign.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ func isBMP(buf []byte) bool {
return bytes.HasPrefix(buf, bmpHeader)
}

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

loadParams := createLoadParams(imageType, params)
importParams := createImportParams(imageType, params)

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

return loadParams.outputImage, imageType, nil
return importParams.outputImage, imageType, nil
}

func bmpToPNG(src []byte) ([]byte, error) {
Expand All @@ -252,32 +252,31 @@ 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))

if params.AutoRotate.IsSet() {
C.set_bool_param(&p.autorotate, toGboolean(params.AutoRotate.Get()))
}
if params.FailOnError.IsSet() {
C.set_bool_param(&p.fail, toGboolean(params.FailOnError.Get()))
}
if params.Page.IsSet() {
C.set_int_param(&p.page, C.gint(params.Page.Get()))
func maybeSetBoolParam(p BoolParameter, cp *C.Param) {
if p.IsSet() {
C.set_bool_param(cp, toGboolean(p.Get()))
}
if params.NumPages.IsSet() {
C.set_int_param(&p.page, C.gint(params.NumPages.Get()))
}

func maybeSetIntParam(p IntParameter, cp *C.Param) {
if p.IsSet() {
C.set_bool_param(cp, C.int(p.Get()))
}
}

func createImportParams(format ImageType, params *ImportParams) C.LoadParams {
p := C.create_load_params(C.ImageType(format))

maybeSetBoolParam(params.AutoRotate, &p.autorotate)
maybeSetBoolParam(params.FailOnError, &p.fail)
maybeSetIntParam(params.Page, &p.page)
maybeSetIntParam(params.NumPages, &p.n)
maybeSetIntParam(params.JpegShrinkFactor, &p.jpegShrink)
maybeSetBoolParam(params.HeifThumbnail, &p.heifThumbnail)
maybeSetBoolParam(params.SvgUnlimited, &p.svgUnlimited)

if params.Density.IsSet() {
C.set_int_param(&p.dpi, C.gint(params.Density.Get()))
}
if params.JpegShrinkFactor.IsSet() {
C.set_int_param(&p.jpegShrink, C.gint(params.JpegShrinkFactor.Get()))
}
if params.HeifThumbnail.IsSet() {
C.set_bool_param(&p.heifThumbnail, toGboolean(params.HeifThumbnail.Get()))
}
if params.SvgUnlimited.IsSet() {
C.set_bool_param(&p.svgUnlimited, toGboolean(params.SvgUnlimited.Get()))
C.set_double_param(&p.dpi, C.gdouble(params.Density.Get()))
}
return p
}
Expand Down
6 changes: 3 additions & 3 deletions vips/foreign.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ typedef struct LoadParams {

} LoadParams;

LoadParams create_load_params(ImageType inputFormat);
int load_from_buffer(LoadParams *params, void *buf, size_t len);

typedef struct SaveParams {
VipsImage *inputImage;
void *outputBuffer;
Expand Down Expand Up @@ -106,6 +109,3 @@ typedef struct SaveParams {
SaveParams create_save_params(ImageType outputFormat);
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);
int load_from_buffer(LoadParams *params, void *buf, size_t len);
16 changes: 8 additions & 8 deletions vips/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,9 @@ func (p *Float64Parameter) Get() float64 {
return p.value.(float64)
}

// LoadParams are options for loading an image. Some are type-specific.
// For default loading, use NewLoadParams() or specify nil
type LoadParams struct {
// ImportParams are options for loading an image. Some are type-specific.
// For default loading, use NewImportParams() or specify nil
type ImportParams struct {
AutoRotate BoolParameter
FailOnError BoolParameter
Page IntParameter
Expand All @@ -106,9 +106,9 @@ type LoadParams struct {
SvgUnlimited BoolParameter
}

// NewLoadParams creates default LoadParams
func NewLoadParams() *LoadParams {
p := &LoadParams{}
// NewImportParams creates default ImportParams
func NewImportParams() *ImportParams {
p := &ImportParams{}
p.FailOnError.Set(true)
return p
}
Expand Down Expand Up @@ -283,11 +283,11 @@ func NewImageFromBuffer(buf []byte) (*ImageRef, error) {
}

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

if params == nil {
params = NewLoadParams()
params = NewImportParams()
}

image, format, err := vipsLoadFromBuffer(buf, params)
Expand Down

0 comments on commit 36affb8

Please sign in to comment.