#include "plugins/gimp/file-jxl-save.h"
+#include <jxl/encode.h>
+#include <jxl/encode_cxx.h>
+
#include <cmath>
+#include <utility>
#include "gobject/gsignal.h"
g_clear_signal_handler(&self->handle_toggle_lossless, self->toggle_lossless);
GtkAdjustment* adj_dist = self->entry_distance;
- jxl_save_opts.quality = gtk_adjustment_get_value(adj_qual);
- jxl_save_opts.UpdateDistance();
+ jxl_save_opts.SetQuality(gtk_adjustment_get_value(adj_qual));
gtk_adjustment_set_value(adj_dist, jxl_save_opts.distance);
self->handle_toggle_lossless = g_signal_connect(
g_clear_signal_handler(&self->handle_entry_quality, self->entry_quality);
g_clear_signal_handler(&self->handle_toggle_lossless, self->toggle_lossless);
- jxl_save_opts.distance = gtk_adjustment_get_value(adj_dist);
- jxl_save_opts.UpdateQuality();
+ jxl_save_opts.SetDistance(gtk_adjustment_get_value(adj_dist));
gtk_adjustment_set_value(adj_qual, jxl_save_opts.quality);
if (!(jxl_save_opts.distance < 0.001)) {
gtk_widget_show(separator);
// Advanced Settings Frame
- std::vector<GtkWidget*> advanced_opts;
-
frame_advanced = gtk_frame_new("Advanced Settings");
gimp_help_set_help_data(frame_advanced,
"Some advanced settings may produce malformed files.",
if (distance < 0.1) {
qual = 100;
- } else if (distance > 6.56) {
- qual = 30 - 5 * log(abs(6.25 * distance - 40)) / log(2.5);
+ } else if (distance > 6.4) {
+ qual = -5.0 / 53.0 * sqrt(6360.0 * distance - 39975.0) + 1725.0 / 53.0;
lossless = false;
} else {
qual = 100 - (distance - 0.1) / 0.09;
}
bool JpegXlSaveOpts::UpdateDistance() {
- float dist;
- if (quality >= 30) {
- dist = 0.1 + (100 - quality) * 0.09;
- } else {
- dist = 6.4 + pow(2.5, (30 - quality) / 5.0) / 6.25;
- }
+ float dist = JxlEncoderDistanceFromQuality(quality);
- if (dist > 15) {
- distance = 15;
+ if (dist > 25) {
+ distance = 25;
} else {
distance = dist;
}
}
bool JpegXlSaveOpts::SetBablModel(std::string model) {
- babl_model_str = model;
+ babl_model_str = std::move(model);
return UpdateBablFormat();
}
bool JpegXlSaveOpts::SetBablType(std::string type) {
- babl_type_str = type;
+ babl_type_str = std::move(type);
return UpdateBablFormat();
}
return false;
}
+ // this sets some basic_info properties
+ jxl_save_opts.SetModel(jxl_save_opts.is_linear);
+
+ if (JXL_ENC_SUCCESS !=
+ JxlEncoderSetBasicInfo(enc.get(), &jxl_save_opts.basic_info)) {
+ g_printerr(SAVE_PROC " Error: JxlEncoderSetBasicInfo failed\n");
+ return false;
+ }
+
// try to use ICC profile
if (!icc.empty() && !jxl_save_opts.is_gray) {
if (JXL_ENC_SUCCESS ==
JxlEncoderSetFrameDistance(frame_settings, jxl_save_opts.distance);
}
- // this sets some basic_info properties
- jxl_save_opts.SetModel(jxl_save_opts.is_linear);
-
- if (JXL_ENC_SUCCESS !=
- JxlEncoderSetBasicInfo(enc.get(), &jxl_save_opts.basic_info)) {
- g_printerr(SAVE_PROC " Error: JxlEncoderSetBasicInfo failed\n");
- return false;
- }
-
// convert precision and colorspace
if (jxl_save_opts.is_linear &&
jxl_save_opts.basic_info.bits_per_sample < 32) {
g_clear_object(&buffer);
// use babl to fix gamma mismatch issues
- if (jxl_save_opts.icc_attached) {
- jxl_save_opts.SetModel(jxl_save_opts.is_linear);
- } else {
- jxl_save_opts.SetModel(!jxl_save_opts.is_linear);
- }
+ jxl_save_opts.SetModel(jxl_save_opts.is_linear);
jxl_save_opts.pixel_format.data_type = JXL_TYPE_FLOAT;
jxl_save_opts.SetBablType("float");
const Babl* destination_format =