config.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package vips
  2. /*
  3. #include "vips.h"
  4. */
  5. import "C"
  6. import (
  7. "errors"
  8. "github.com/imgproxy/imgproxy/v3/ensure"
  9. "github.com/imgproxy/imgproxy/v3/env"
  10. )
  11. var (
  12. IMGPROXY_JPEG_PROGRESSIVE = env.Describe("IMGPROXY_JPEG_PROGRESSIVE", "boolean")
  13. IMGPROXY_PNG_INTERLACED = env.Describe("IMGPROXY_PNG_INTERLACED", "boolean")
  14. IMGPROXY_PNG_QUANTIZE = env.Describe("IMGPROXY_PNG_QUANTIZE", "boolean")
  15. IMGPROXY_PNG_QUANTIZATION_COLORS = env.Describe("IMGPROXY_PNG_QUANTIZATION_COLORS", "number between 2 and 256")
  16. IMGPROXY_WEBP_PRESET = env.DescribeByMap("IMGPROXY_WEBP_PRESET", WebpPresets)
  17. IMGPROXY_AVIF_SPEED = env.Describe("IMGPROXY_AVIF_SPEED", "number between 0 and 9")
  18. IMGPROXY_WEBP_EFFORT = env.Describe("IMGPROXY_WEBP_EFFORT", "number between 1 and 6")
  19. IMGPROXY_JXL_EFFORT = env.Describe("IMGPROXY_JXL_EFFORT", "number between 1 and 9")
  20. IMGPROXY_PNG_UNLIMITED = env.Describe("IMGPROXY_PNG_UNLIMITED", "boolean")
  21. IMGPROXY_SVG_UNLIMITED = env.Describe("IMGPROXY_SVG_UNLIMITED", "boolean")
  22. IMGPROXY_VIPS_LEAK_CHECK = env.Describe("IMGPROXY_VIPS_LEAK_CHECK", "boolean")
  23. IMGPROXY_VIPS_CACHE_TRACE = env.Describe("IMGPROXY_VIPS_CACHE_TRACE", "boolean")
  24. )
  25. type Config struct {
  26. // Whether to save JPEG as progressive
  27. JpegProgressive bool
  28. // Whether to save PNG as interlaced
  29. PngInterlaced bool
  30. // Whether to save PNG with adaptive palette
  31. PngQuantize bool
  32. // Number of colors for adaptive palette
  33. PngQuantizationColors int
  34. // WebP preset to use when saving WebP images
  35. WebpPreset WebpPreset
  36. // AVIF saving speed
  37. AvifSpeed int
  38. // WebP saving effort
  39. WebpEffort int
  40. // JPEG XL saving effort
  41. JxlEffort int
  42. // Whether to not apply any limits when loading PNG
  43. PngUnlimited bool
  44. // Whether to not apply any limits when loading JPEG
  45. SvgUnlimited bool
  46. // Whether to enable libvips memory leak check
  47. LeakCheck bool
  48. // Whether to enable libvips operation cache tracing
  49. CacheTrace bool
  50. }
  51. func NewDefaultConfig() Config {
  52. return Config{
  53. JpegProgressive: false,
  54. PngInterlaced: false,
  55. PngQuantize: false,
  56. PngQuantizationColors: 256,
  57. WebpPreset: C.VIPS_FOREIGN_WEBP_PRESET_DEFAULT,
  58. AvifSpeed: 8,
  59. WebpEffort: 4,
  60. JxlEffort: 4,
  61. PngUnlimited: false,
  62. SvgUnlimited: false,
  63. LeakCheck: false,
  64. CacheTrace: false,
  65. }
  66. }
  67. func LoadConfigFromEnv(c *Config) (*Config, error) {
  68. c = ensure.Ensure(c, NewDefaultConfig)
  69. err := errors.Join(
  70. env.Bool(&c.JpegProgressive, IMGPROXY_JPEG_PROGRESSIVE),
  71. env.Bool(&c.PngInterlaced, IMGPROXY_PNG_INTERLACED),
  72. env.Bool(&c.PngQuantize, IMGPROXY_PNG_QUANTIZE),
  73. env.Int(&c.PngQuantizationColors, IMGPROXY_PNG_QUANTIZATION_COLORS),
  74. env.Int(&c.AvifSpeed, IMGPROXY_AVIF_SPEED),
  75. env.Int(&c.WebpEffort, IMGPROXY_WEBP_EFFORT),
  76. env.Int(&c.JxlEffort, IMGPROXY_JXL_EFFORT),
  77. env.Bool(&c.PngUnlimited, IMGPROXY_PNG_UNLIMITED),
  78. env.Bool(&c.SvgUnlimited, IMGPROXY_SVG_UNLIMITED),
  79. env.FromMap(&c.WebpPreset, WebpPresets, IMGPROXY_WEBP_PRESET),
  80. env.Bool(&c.LeakCheck, IMGPROXY_VIPS_LEAK_CHECK),
  81. env.Bool(&c.CacheTrace, IMGPROXY_VIPS_CACHE_TRACE),
  82. )
  83. return c, err
  84. }
  85. func (c *Config) Validate() error {
  86. if c.PngQuantizationColors < 2 || c.PngQuantizationColors > 256 {
  87. return IMGPROXY_PNG_QUANTIZATION_COLORS.ErrorRange()
  88. }
  89. if c.WebpPreset < C.VIPS_FOREIGN_WEBP_PRESET_DEFAULT || c.WebpPreset >= C.VIPS_FOREIGN_WEBP_PRESET_LAST {
  90. return IMGPROXY_WEBP_PRESET.ErrorRange()
  91. }
  92. if c.AvifSpeed < 0 || c.AvifSpeed > 9 {
  93. return IMGPROXY_AVIF_SPEED.ErrorRange()
  94. }
  95. if c.JxlEffort < 1 || c.JxlEffort > 9 {
  96. return IMGPROXY_JXL_EFFORT.ErrorRange()
  97. }
  98. if c.WebpEffort < 1 || c.WebpEffort > 6 {
  99. return IMGPROXY_WEBP_EFFORT.ErrorRange()
  100. }
  101. return nil
  102. }