mirror of
https://github.com/imgproxy/imgproxy.git
synced 2025-10-10 20:22:31 +02:00
Cache commonly used C strings
This commit is contained in:
28
process.go
28
process.go
@@ -36,6 +36,8 @@ type cConfig struct {
|
|||||||
|
|
||||||
var cConf cConfig
|
var cConf cConfig
|
||||||
|
|
||||||
|
var cstrings map[string]*C.char
|
||||||
|
|
||||||
func initVips() {
|
func initVips() {
|
||||||
runtime.LockOSThread()
|
runtime.LockOSThread()
|
||||||
defer runtime.UnlockOSThread()
|
defer runtime.UnlockOSThread()
|
||||||
@@ -117,6 +119,17 @@ func shutdownVips() {
|
|||||||
C.vips_shutdown()
|
C.vips_shutdown()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func cachedCString(str string) *C.char {
|
||||||
|
if cstr, ok := cstrings[str]; ok {
|
||||||
|
return cstr
|
||||||
|
}
|
||||||
|
|
||||||
|
cstr := C.CString(str)
|
||||||
|
cstrings[str] = cstr
|
||||||
|
|
||||||
|
return cstr
|
||||||
|
}
|
||||||
|
|
||||||
func extractMeta(img *C.VipsImage) (int, int, int, bool) {
|
func extractMeta(img *C.VipsImage) (int, int, int, bool) {
|
||||||
width := int(img.Xsize)
|
width := int(img.Xsize)
|
||||||
height := int(img.Ysize)
|
height := int(img.Ysize)
|
||||||
@@ -704,20 +717,14 @@ func vipsImageHasAlpha(img *C.struct__VipsImage) bool {
|
|||||||
func vipsGetInt(img *C.struct__VipsImage, name string) (int, error) {
|
func vipsGetInt(img *C.struct__VipsImage, name string) (int, error) {
|
||||||
var i C.int
|
var i C.int
|
||||||
|
|
||||||
cname := C.CString(name)
|
if C.vips_image_get_int(img, cachedCString(name), &i) != 0 {
|
||||||
defer C.free(unsafe.Pointer(cname))
|
|
||||||
|
|
||||||
if C.vips_image_get_int(img, cname, &i) != 0 {
|
|
||||||
return 0, vipsError()
|
return 0, vipsError()
|
||||||
}
|
}
|
||||||
return int(i), nil
|
return int(i), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func vipsSetInt(img *C.struct__VipsImage, name string, value int) {
|
func vipsSetInt(img *C.struct__VipsImage, name string, value int) {
|
||||||
cname := C.CString(name)
|
C.vips_image_set_int(img, cachedCString(name), C.int(value))
|
||||||
defer C.free(unsafe.Pointer(cname))
|
|
||||||
|
|
||||||
C.vips_image_set_int(img, cname, C.int(value))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func vipsPremultiply(img **C.struct__VipsImage) (C.VipsBandFormat, error) {
|
func vipsPremultiply(img **C.struct__VipsImage) (C.VipsBandFormat, error) {
|
||||||
@@ -866,10 +873,7 @@ func vipsImportColourProfile(img **C.struct__VipsImage) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
cprofile := C.CString(profile)
|
if C.vips_icc_import_go(*img, &tmp, cachedCString(profile)) != 0 {
|
||||||
defer C.free(unsafe.Pointer(cprofile))
|
|
||||||
|
|
||||||
if C.vips_icc_import_go(*img, &tmp, cprofile) != 0 {
|
|
||||||
return vipsError()
|
return vipsError()
|
||||||
}
|
}
|
||||||
C.swap_and_clear(img, tmp)
|
C.swap_and_clear(img, tmp)
|
||||||
|
Reference in New Issue
Block a user