diff --git a/vips/bmp.go b/vips/bmp.go index 2c702f9f..8c94ee79 100644 --- a/vips/bmp.go +++ b/vips/bmp.go @@ -56,9 +56,9 @@ func prepareBmpCanvas(width, height, bands int) (*C.VipsImage, []byte, error) { return tmp, ptrToBytes(data, datalen), nil } -func bmpClearOnPanic(img **C.VipsImage) { +func bmpClearOnPanic(img *C.VipsImage) { if rerr := recover(); rerr != nil { - C.clear_image(img) + C.unref_image(img) panic(rerr) } } @@ -86,7 +86,7 @@ func (img *Image) decodeBmpPaletted(r io.Reader, width, height, bpp int, palette return err } - defer bmpClearOnPanic(&tmp) + defer bmpClearOnPanic(tmp) // Each row is 4-byte aligned. cap := 8 / bpp @@ -101,7 +101,7 @@ func (img *Image) decodeBmpPaletted(r io.Reader, width, height, bpp int, palette for y := y0; y != y1; y += yDelta { if _, err = io.ReadFull(r, b); err != nil { - C.clear_image(&tmp) + C.unref_image(tmp) return err } @@ -126,7 +126,7 @@ func (img *Image) decodeBmpPaletted(r io.Reader, width, height, bpp int, palette } } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) bmpSetBitDepth(img, len(palette)) @@ -140,7 +140,7 @@ func (img *Image) decodeBmpRLE(r io.Reader, width, height, bpp int, palette []Co return err } - defer bmpClearOnPanic(&tmp) + defer bmpClearOnPanic(tmp) b := make([]byte, 256) @@ -156,7 +156,7 @@ Loop: for { b1, b2, err := readPair() if err != nil { - C.clear_image(&tmp) + C.unref_image(tmp) return err } @@ -174,7 +174,7 @@ Loop: case 2: dx, dy, err := readPair() if err != nil { - C.clear_image(&tmp) + C.unref_image(tmp) return err } @@ -188,7 +188,7 @@ Loop: n := ((pixelsCount+cap-1)/cap + 1) &^ 1 if _, err := io.ReadFull(r, b[:n]); err != nil { - C.clear_image(&tmp) + C.unref_image(tmp) return err } @@ -248,7 +248,7 @@ Loop: } } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) bmpSetBitDepth(img, len(palette)) @@ -273,7 +273,7 @@ func (img *Image) decodeBmpRGB(r io.Reader, width, height, bands int, topDown, n return err } - defer bmpClearOnPanic(&tmp) + defer bmpClearOnPanic(tmp) // Each row is 4-byte aligned. b := make([]byte, (bands*width+3)&^3) @@ -287,7 +287,7 @@ func (img *Image) decodeBmpRGB(r io.Reader, width, height, bands int, topDown, n for y := y0; y != y1; y += yDelta { if _, err = io.ReadFull(r, b); err != nil { - C.clear_image(&tmp) + C.unref_image(tmp) return err } @@ -304,7 +304,7 @@ func (img *Image) decodeBmpRGB(r io.Reader, width, height, bands int, topDown, n } } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -317,7 +317,7 @@ func (img *Image) decodeBmpRGB16(r io.Reader, width, height int, topDown, bmp565 return err } - defer bmpClearOnPanic(&tmp) + defer bmpClearOnPanic(tmp) // Each row is 4-byte aligned. b := make([]byte, (2*width+3)&^3) @@ -331,7 +331,7 @@ func (img *Image) decodeBmpRGB16(r io.Reader, width, height int, topDown, bmp565 for y := y0; y != y1; y += yDelta { if _, err = io.ReadFull(r, b); err != nil { - C.clear_image(&tmp) + C.unref_image(tmp) return err } @@ -350,7 +350,7 @@ func (img *Image) decodeBmpRGB16(r io.Reader, width, height int, topDown, bmp565 } } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } diff --git a/vips/vips.c b/vips/vips.c index 9edf0e92..58250101 100644 --- a/vips/vips.c +++ b/vips/vips.c @@ -15,10 +15,9 @@ vips_initialize() } void -clear_image(VipsImage **in) +unref_image(VipsImage *in) { - if (G_IS_OBJECT(*in)) - g_clear_object(in); + VIPS_UNREF(in); } void @@ -27,13 +26,6 @@ g_free_go(void **buf) g_free(*buf); } -void -swap_and_clear(VipsImage **in, VipsImage *out) -{ - clear_image(in); - *in = out; -} - int gif_resolution_limit() { @@ -50,7 +42,7 @@ vips_health() int res = vips_black(&t[0], 4, 4, "bands", 4, NULL) || !(t[1] = vips_image_copy_memory(t[0])); - clear_image(&base); + VIPS_UNREF(base); return res; } @@ -142,7 +134,7 @@ vips_black_go(VipsImage **out, int width, int height, int bands) int res = vips_black(&tmp, width, height, "bands", bands, NULL) || vips_copy(tmp, out, "interpretation", VIPS_INTERPRETATION_sRGB, NULL); - clear_image(&tmp); + VIPS_UNREF(tmp); return res; } @@ -167,7 +159,7 @@ vips_fix_scRGB_alpha_tiff(VipsImage *in, VipsImage **out) vips_cast(t[2], &t[3], in->BandFmt, NULL) || vips_bandjoin2(t[0], t[3], out, NULL); - clear_image(&base); + VIPS_UNREF(base); return res; #endif @@ -196,7 +188,7 @@ vips_fix_BW_float_tiff(VipsImage *in, VipsImage **out) vips_linear1(t[1], &t[2], 65535.0, 0, NULL) || vips_cast_ushort(t[2], &t[3], NULL) || vips_copy(t[3], &t[4], "interpretation", VIPS_INTERPRETATION_GREY16, NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } @@ -212,7 +204,7 @@ vips_fix_BW_float_tiff(VipsImage *in, VipsImage **out) vips_bandjoin(rgb, &t[5], 3, NULL) || vips_colourspace(t[5], &t[6], VIPS_INTERPRETATION_GREY16, "source_space", VIPS_INTERPRETATION_scRGB, NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } @@ -225,7 +217,7 @@ vips_fix_BW_float_tiff(VipsImage *in, VipsImage **out) else res = vips_icc_remove(t[6], out); - clear_image(&base); + VIPS_UNREF(base); return res; } @@ -366,7 +358,7 @@ vips_resize_go(VipsImage *in, VipsImage **out, double wscale, double hscale) vips_unpremultiply(t[2], &t[3], NULL) || vips_cast(t[3], out, format, NULL); - clear_image(&base); + VIPS_UNREF(base); return res; } @@ -499,7 +491,7 @@ vips_icc_import_go(VipsImage *in, VipsImage **out) if (vips_extract_band(in, &t[0], 0, "n", bands, NULL) || vips_extract_band(in, &t[1], bands, "n", 1, NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } @@ -508,7 +500,7 @@ vips_icc_import_go(VipsImage *in, VipsImage **out) } if (vips_icc_import(in, out, "embedded", TRUE, "pcs", vips_icc_get_pcs(in), NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } @@ -521,14 +513,14 @@ vips_icc_import_go(VipsImage *in, VipsImage **out) if (vips_cast(t[1], &t[3], t[2]->BandFmt, NULL) || vips_linear1(t[3], &t[4], 1.0 / 255.0, 0, NULL) || vips_bandjoin2(t[2], t[4], out, NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } } vips_image_set_int(*out, "imgproxy-icc-imported", 1); - clear_image(&base); + VIPS_UNREF(base); return 0; } @@ -606,7 +598,7 @@ vips_apply_filters(VipsImage *in, VipsImage **out, double blur_sigma, if ( vips_premultiply(in, &t[0], NULL) || vips_cast(t[0], &t[1], format, NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } @@ -616,7 +608,7 @@ vips_apply_filters(VipsImage *in, VipsImage **out, double blur_sigma, if (blur_sigma > 0.0) { if (vips_gaussblur(in, &t[2], blur_sigma, NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } @@ -625,7 +617,7 @@ vips_apply_filters(VipsImage *in, VipsImage **out, double blur_sigma, if (sharp_sigma > 0.0) { if (vips_sharpen(in, &t[3], "sigma", sharp_sigma, NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } @@ -645,7 +637,7 @@ vips_apply_filters(VipsImage *in, VipsImage **out, double blur_sigma, if (tw > w || th > h) { if (vips_embed(in, &t[4], 0, 0, tw, th, "extend", VIPS_EXTEND_MIRROR, NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } @@ -655,7 +647,7 @@ vips_apply_filters(VipsImage *in, VipsImage **out, double blur_sigma, if ( vips_shrink(in, &t[5], pixelate_pixels, pixelate_pixels, NULL) || vips_zoom(t[5], &t[6], pixelate_pixels, pixelate_pixels, NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } @@ -663,7 +655,7 @@ vips_apply_filters(VipsImage *in, VipsImage **out, double blur_sigma, if (tw > w || th > h) { if (vips_extract_area(in, &t[7], 0, 0, w, h, NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } @@ -673,7 +665,7 @@ vips_apply_filters(VipsImage *in, VipsImage **out, double blur_sigma, if (premultiplied) { if (vips_unpremultiply(in, &t[8], NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } @@ -684,7 +676,7 @@ vips_apply_filters(VipsImage *in, VipsImage **out, double blur_sigma, vips_colourspace(in, &t[9], interpretation, NULL) || vips_cast(t[9], out, format, NULL); - clear_image(&base); + VIPS_UNREF(base); return res; } @@ -719,7 +711,7 @@ vips_trim(VipsImage *in, VipsImage **out, double threshold, if (vips_image_guess_interpretation(in) != VIPS_INTERPRETATION_sRGB) { if (vips_colourspace(in, &t[0], VIPS_INTERPRETATION_sRGB, NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } tmp = t[0]; @@ -728,7 +720,7 @@ vips_trim(VipsImage *in, VipsImage **out, double threshold, if (vips_image_hasalpha(tmp)) { RGB f_bg = { 255.0, 0, 255.0 }; if (vips_flatten_go(tmp, &t[1], f_bg)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } tmp = t[1]; @@ -740,7 +732,7 @@ vips_trim(VipsImage *in, VipsImage **out, double threshold, if (smart) { if (vips_getpoint(tmp, &img_bg, &img_bgn, 0, 0, NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } bga = vips_array_double_new(img_bg, img_bgn); @@ -752,7 +744,7 @@ vips_trim(VipsImage *in, VipsImage **out, double threshold, int left, right, top, bot, width, height, diff; int res = vips_find_trim(tmp, &left, &top, &width, &height, "background", bga, "threshold", threshold, NULL); - clear_image(&base); + VIPS_UNREF(base); vips_area_unref((VipsArea *) bga); g_free(img_bg); @@ -813,11 +805,11 @@ vips_replicate_go(VipsImage *in, VipsImage **out, int width, int height, int cen const int top = centered ? (tmp->Ysize - height) / 2 : 0; if (vips_extract_area(tmp, out, left, top, width, height, NULL)) { - clear_image(&tmp); + VIPS_UNREF(tmp); return 1; } - clear_image(&tmp); + VIPS_UNREF(tmp); return 0; } @@ -838,7 +830,7 @@ vips_embed_go(VipsImage *in, VipsImage **out, int x, int y, int width, int heigh vips_embed(in, out, x, y, width, height, "extend", VIPS_EXTEND_BLACK, NULL); if (tmp) - clear_image(&tmp); + VIPS_UNREF(tmp); return ret; } @@ -862,7 +854,7 @@ vips_apply_watermark(VipsImage *in, VipsImage *watermark, VipsImage **out, int l vips_extract_band(watermark, &t[2], watermark->Bands - 1, "n", 1, NULL) || vips_linear1(t[2], &t[3], opacity, 0, NULL) || vips_bandjoin2(t[1], t[3], &t[4], NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } @@ -877,7 +869,7 @@ vips_apply_watermark(VipsImage *in, VipsImage *watermark, VipsImage **out, int l "x", left, "y", top, "compositing_space", in->Type, NULL) || vips_cast(t[5], &t[6], vips_image_get_format(in), NULL)) { - clear_image(&base); + VIPS_UNREF(base); return 1; } @@ -890,7 +882,7 @@ vips_apply_watermark(VipsImage *in, VipsImage *watermark, VipsImage **out, int l res = vips_copy(t[6], out, NULL); } - clear_image(&base); + VIPS_UNREF(base); return res; } diff --git a/vips/vips.go b/vips/vips.go index 3be3f00b..ab79a780 100644 --- a/vips/vips.go +++ b/vips/vips.go @@ -331,6 +331,13 @@ func ptrToBytes(ptr unsafe.Pointer, size int) []byte { return (*[math.MaxInt32]byte)(ptr)[:int(size):int(size)] } +func (img *Image) swapAndUnref(newImg *C.VipsImage) { + if img.VipsImage != nil { + C.unref_image(img.VipsImage) + } + img.VipsImage = newImg +} + func (img *Image) Width() int { return int(img.VipsImage.Xsize) } @@ -390,11 +397,11 @@ func (img *Image) Load(imgdata *imagedata.ImageData, shrink int, scale float64, return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) if imgdata.Type == imagetype.TIFF { if C.vips_fix_float_tiff(img.VipsImage, &tmp) == 0 { - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) } else { log.Warnf("Can't fix TIFF: %s", Error()) } @@ -417,7 +424,7 @@ func (img *Image) LoadThumbnail(imgdata *imagedata.ImageData) error { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -476,7 +483,8 @@ func (img *Image) Save(imgtype imagetype.Type, quality int) (*imagedata.ImageDat func (img *Image) Clear() { if img.VipsImage != nil { - C.clear_image(&img.VipsImage) + C.unref_image(img.VipsImage) + img.VipsImage = nil } } @@ -487,7 +495,7 @@ func (img *Image) LineCache(lines int) error { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -503,7 +511,7 @@ func (img *Image) Arrayjoin(in []*Image) error { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -623,7 +631,7 @@ func (img *Image) CastUchar() error { if C.vips_cast_go(img.VipsImage, &tmp, C.VIPS_FORMAT_UCHAR) != 0 { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) } return nil @@ -636,7 +644,7 @@ func (img *Image) Rad2Float() error { if C.vips_rad2float_go(img.VipsImage, &tmp) != 0 { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) } return nil @@ -653,7 +661,7 @@ func (img *Image) Resize(wscale, hscale float64) error { C.vips_image_set_int(tmp, cachedCString("imgproxy-scaled-down"), 1) } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -673,7 +681,7 @@ func (img *Image) Rotate(angle int) error { C.vips_autorot_remove_angle(tmp) - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -684,7 +692,7 @@ func (img *Image) Flip() error { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -695,7 +703,7 @@ func (img *Image) Crop(left, top, width, height int) error { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -713,7 +721,7 @@ func (img *Image) SmartCrop(width, height int) error { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -729,7 +737,7 @@ func (img *Image) Trim(threshold float64, smart bool, color Color, equalHor bool return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -739,7 +747,7 @@ func (img *Image) Flatten(bg Color) error { if C.vips_flatten_go(img.VipsImage, &tmp, cRGB(bg)) != 0 { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -751,7 +759,7 @@ func (img *Image) ApplyFilters(blurSigma, sharpSigma float32, pixelatePixels int return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -771,7 +779,7 @@ func (img *Image) BackupColourProfile() { var tmp *C.VipsImage if C.vips_icc_backup(img.VipsImage, &tmp) == 0 { - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) } else { log.Warningf("Can't backup ICC profile: %s", Error()) } @@ -781,7 +789,7 @@ func (img *Image) RestoreColourProfile() { var tmp *C.VipsImage if C.vips_icc_restore(img.VipsImage, &tmp) == 0 { - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) } else { log.Warningf("Can't restore ICC profile: %s", Error()) } @@ -806,7 +814,7 @@ func (img *Image) ImportColourProfile() error { } if C.vips_icc_import_go(img.VipsImage, &tmp) == 0 { - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) } else { log.Warningf("Can't import ICC profile: %s", Error()) } @@ -828,7 +836,7 @@ func (img *Image) ExportColourProfile() error { } if C.vips_icc_export_go(img.VipsImage, &tmp) == 0 { - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) } else { log.Warningf("Can't export ICC profile: %s", Error()) } @@ -845,7 +853,7 @@ func (img *Image) ExportColourProfileToSRGB() error { } if C.vips_icc_export_srgb(img.VipsImage, &tmp) == 0 { - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) } else { log.Warningf("Can't export ICC profile: %s", Error()) } @@ -864,7 +872,7 @@ func (img *Image) TransformColourProfileToSRGB() error { } if C.vips_icc_transform_srgb(img.VipsImage, &tmp) == 0 { - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) } else { log.Warningf("Can't transform ICC profile to sRGB: %s", Error()) } @@ -876,7 +884,7 @@ func (img *Image) RemoveColourProfile() error { var tmp *C.VipsImage if C.vips_icc_remove(img.VipsImage, &tmp) == 0 { - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) } else { log.Warningf("Can't remove ICC profile: %s", Error()) } @@ -899,7 +907,7 @@ func (img *Image) Colorspace(colorspace C.VipsInterpretation) error { if C.vips_colourspace_go(img.VipsImage, &tmp, colorspace) != 0 { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) } return nil @@ -910,7 +918,7 @@ func (img *Image) CopyMemory() error { if tmp = C.vips_image_copy_memory(img.VipsImage); tmp == nil { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -920,7 +928,7 @@ func (img *Image) Replicate(width, height int, centered bool) error { if C.vips_replicate_go(img.VipsImage, &tmp, C.int(width), C.int(height), gbool(centered)) != 0 { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -931,7 +939,7 @@ func (img *Image) Embed(width, height int, offX, offY int) error { if C.vips_embed_go(img.VipsImage, &tmp, C.int(offX), C.int(offY), C.int(width), C.int(height)) != 0 { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -942,7 +950,7 @@ func (img *Image) ApplyWatermark(wm *Image, left, top int, opacity float64) erro if C.vips_apply_watermark(img.VipsImage, wm.VipsImage, &tmp, C.int(left), C.int(top), C.double(opacity)) != 0 { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -953,7 +961,7 @@ func (img *Image) Strip(keepExifCopyright bool) error { if C.vips_strip(img.VipsImage, &tmp, gbool(keepExifCopyright)) != 0 { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } @@ -964,7 +972,7 @@ func (img *Image) StripAll() error { if C.vips_strip_all(img.VipsImage, &tmp) != 0 { return Error() } - C.swap_and_clear(&img.VipsImage, tmp) + img.swapAndUnref(tmp) return nil } diff --git a/vips/vips.h b/vips/vips.h index 1930d36c..41cfa59a 100644 --- a/vips/vips.h +++ b/vips/vips.h @@ -12,11 +12,9 @@ typedef struct _RGB { int vips_initialize(); -void clear_image(VipsImage **in); +void unref_image(VipsImage *in); void g_free_go(void **buf); -void swap_and_clear(VipsImage **in, VipsImage *out); - int gif_resolution_limit(); int vips_health();