|
@@ -1,5 +1,6 @@
|
|
|
#include "vips.h"
|
|
|
#include <string.h>
|
|
|
+#include <math.h>
|
|
|
|
|
|
#define VIPS_SUPPORT_SMARTCROP \
|
|
|
(VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 5))
|
|
@@ -43,6 +44,9 @@
|
|
|
#define VIPS_SUPPORT_FIND_TRIM \
|
|
|
(VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 6))
|
|
|
|
|
|
+#define VIPS_SUPPORT_PNG_BITDEPTH \
|
|
|
+ (VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 10))
|
|
|
+
|
|
|
#define EXIF_ORIENTATION "exif-ifd0-Orientation"
|
|
|
|
|
|
#if (VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 8))
|
|
@@ -642,15 +646,29 @@ vips_jpegsave_go(VipsImage *in, void **buf, size_t *len, int quality, int interl
|
|
|
|
|
|
int
|
|
|
vips_pngsave_go(VipsImage *in, void **buf, size_t *len, int interlace, int quantize, int colors) {
|
|
|
+ if (!quantize)
|
|
|
+ return vips_pngsave_buffer(
|
|
|
+ in, buf, len,
|
|
|
+ "filter", VIPS_FOREIGN_PNG_FILTER_NONE,
|
|
|
+ "interlace", interlace,
|
|
|
+ NULL
|
|
|
+ );
|
|
|
+
|
|
|
+ int bitdepth = ceil(log2(colors));
|
|
|
+
|
|
|
return vips_pngsave_buffer(
|
|
|
in, buf, len,
|
|
|
"filter", VIPS_FOREIGN_PNG_FILTER_NONE,
|
|
|
"interlace", interlace,
|
|
|
-#if VIPS_SUPPORT_PNG_QUANTIZATION
|
|
|
+#if VIPS_SUPPORT_PNG_BITDEPTH
|
|
|
+ "palette", quantize,
|
|
|
+ "bitdepth", bitdepth,
|
|
|
+#elif VIPS_SUPPORT_PNG_QUANTIZATION // VIPS_SUPPORT_PNG_BITDEPTH
|
|
|
"palette", quantize,
|
|
|
"colours", colors,
|
|
|
#endif // VIPS_SUPPORT_PNG_QUANTIZATION
|
|
|
- NULL);
|
|
|
+ NULL
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
int
|