Imported Upstream version 0.9.0
[platform/upstream/libjxl.git] / plugins / gimp / file-jxl-save.cc
index 5eb1412..45aaa1f 100644 (file)
@@ -5,7 +5,11 @@
 
 #include "plugins/gimp/file-jxl-save.h"
 
+#include <jxl/encode.h>
+#include <jxl/encode_cxx.h>
+
 #include <cmath>
+#include <utility>
 
 #include "gobject/gsignal.h"
 
@@ -116,8 +120,7 @@ bool JpegXlSaveGui::GuiOnChangeQuality(GtkAdjustment* adj_qual,
   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(
@@ -140,8 +143,7 @@ bool JpegXlSaveGui::GuiOnChangeDistance(GtkAdjustment* adj_dist,
   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)) {
@@ -356,8 +358,6 @@ bool JpegXlSaveGui::SaveDialog() {
   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.",
@@ -519,8 +519,8 @@ bool JpegXlSaveOpts::UpdateQuality() {
 
   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;
@@ -539,15 +539,10 @@ bool JpegXlSaveOpts::UpdateQuality() {
 }
 
 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;
   }
@@ -602,12 +597,12 @@ bool JpegXlSaveOpts::UpdateBablFormat() {
 }
 
 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();
 }
 
@@ -727,6 +722,15 @@ bool SaveJpegXlImage(const gint32 image_id, const gint32 drawable_id,
     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 ==
@@ -785,15 +789,6 @@ bool SaveJpegXlImage(const gint32 image_id, const gint32 drawable_id,
     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) {
@@ -832,11 +827,7 @@ bool SaveJpegXlImage(const gint32 image_id, const gint32 drawable_id,
     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 =