23 flattenLayers->setToolTip(i18nc(
"JPEG-XL encoder options",
"Flatten the image and save as single layer image (default)"));
24 haveAnimation->setToolTip(i18nc(
"JPEG-XL encoder options",
"Flatten the image and render animation frames as animated image"));
25 multiLayer->setToolTip(i18nc(
"JPEG-XL encoder options",
"Rasterize layers (including group and filter layers) and save as multi-layered image"));
26 multiPage->setToolTip(i18nc(
"JPEG-XL encoder options",
"Rasterize layers (including group and filter layers) and save as multi-page image"));
30 resampling->addItem(i18nc(
"JPEG-XL encoder options",
"Default (only for low quality)"), -1);
31 resampling->addItem(i18nc(
"JPEG-XL encoder options",
"No downsampling"), 1);
32 resampling->addItem(i18nc(
"JPEG-XL encoder options",
"2x2 downsampling"), 2);
33 resampling->addItem(i18nc(
"JPEG-XL encoder options",
"4x4 downsampling"), 4);
34 resampling->addItem(i18nc(
"JPEG-XL encoder options",
"8x8 downsampling"), 8);
36 extraChannelResampling->addItem(i18nc(
"JPEG-XL encoder options",
"Default (only for low quality)"), -1);
37 extraChannelResampling->addItem(i18nc(
"JPEG-XL encoder options",
"No downsampling"), 1);
38 extraChannelResampling->addItem(i18nc(
"JPEG-XL encoder options",
"2x2 downsampling"), 2);
39 extraChannelResampling->addItem(i18nc(
"JPEG-XL encoder options",
"4x4 downsampling"), 4);
40 extraChannelResampling->addItem(i18nc(
"JPEG-XL encoder options",
"8x8 downsampling"), 8);
44 dots->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
45 dots->addItem(i18nc(
"JPEG-XL encoder options",
"Disabled"), 0);
46 dots->addItem(i18nc(
"JPEG-XL encoder options",
"Enabled"), 1);
50 patches->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
51 patches->addItem(i18nc(
"JPEG-XL encoder options",
"Disabled"), 0);
52 patches->addItem(i18nc(
"JPEG-XL encoder options",
"Enabled"), 1);
56 gaborish->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
57 gaborish->addItem(i18nc(
"JPEG-XL encoder options",
"Disabled"), 0);
58 gaborish->addItem(i18nc(
"JPEG-XL encoder options",
"Enabled"), 1);
62 modular->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
63 modular->addItem(i18nc(
"JPEG-XL encoder options",
"VarDCT mode (e.g. for photographic images)"), 0);
64 modular->addItem(i18nc(
"JPEG-XL encoder options",
"Modular mode (e.g. for lossless images)"), 1);
68 keepInvisible->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
69 keepInvisible->addItem(i18nc(
"JPEG-XL encoder options",
"Disabled"), 0);
70 keepInvisible->addItem(i18nc(
"JPEG-XL encoder options",
"Enabled"), 1);
74 groupOrder->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
75 groupOrder->addItem(i18nc(
"JPEG-XL encoder options",
"Scanline order"), 0);
76 groupOrder->addItem(i18nc(
"JPEG-XL encoder options",
"Center-first order"), 1);
80 responsive->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
81 responsive->addItem(i18nc(
"JPEG-XL encoder options",
"Disabled"), 0);
82 responsive->addItem(i18nc(
"JPEG-XL encoder options",
"Enabled"), 1);
86 progressiveAC->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
87 progressiveAC->addItem(i18nc(
"JPEG-XL encoder options",
"Disabled"), 0);
88 progressiveAC->addItem(i18nc(
"JPEG-XL encoder options",
"Enabled"), 1);
92 qProgressiveAC->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
93 qProgressiveAC->addItem(i18nc(
"JPEG-XL encoder options",
"Disabled"), 0);
94 qProgressiveAC->addItem(i18nc(
"JPEG-XL encoder options",
"Enabled"), 1);
98 progressiveDC->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
99 progressiveDC->addItem(i18nc(
"JPEG-XL encoder options",
"Disabled"), 0);
100 progressiveDC->addItem(i18nc(
"JPEG-XL encoder options",
"64x64 lower resolution pass"), 1);
101 progressiveDC->addItem(i18nc(
"JPEG-XL encoder options",
"512x512 + 64x64 lower resolution passes"), 2);
105 lossyPalette->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
106 lossyPalette->addItem(i18nc(
"JPEG-XL encoder options",
"Disabled"), 0);
107 lossyPalette->addItem(i18nc(
"JPEG-XL encoder options",
"Enabled"), 1);
111 modularGroupSize->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
112 modularGroupSize->addItem(i18nc(
"JPEG-XL encoder options",
"128"), 0);
113 modularGroupSize->addItem(i18nc(
"JPEG-XL encoder options",
"256"), 1);
114 modularGroupSize->addItem(i18nc(
"JPEG-XL encoder options",
"512"), 2);
115 modularGroupSize->addItem(i18nc(
"JPEG-XL encoder options",
"1024"), 3);
119 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
120 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Zero"), 0);
121 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Left"), 1);
122 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Top"), 2);
123 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Avg0"), 3);
124 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Select"), 4);
125 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Gradient"), 5);
126 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Weighted"), 6);
127 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Top right"), 7);
128 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Top left"), 8);
129 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Left left"), 9);
130 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Avg1"), 10);
131 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Avg2"), 11);
132 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Avg3"), 12);
133 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Toptop predictive average"), 13);
134 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Gradient + Weighted"), 14);
135 modularPredictor->addItem(i18nc(
"JPEG-XL encoder options",
"Use all predictors"), 15);
139 jpegReconCFL->addItem(i18nc(
"JPEG-XL encoder options",
"Default (encoder chooses)"), -1);
140 jpegReconCFL->addItem(i18nc(
"JPEG-XL encoder options",
"Disabled"), 0);
141 jpegReconCFL->addItem(i18nc(
"JPEG-XL encoder options",
"Enabled"), 1);
147 qOverload<int>(&QComboBox::currentIndexChanged),
171 haveAnimation->setChecked(cfg->getBool(
"haveAnimation",
false));
172 flattenLayers->setChecked(cfg->getBool(
"flattenLayers",
true));
173 multiLayer->setChecked(cfg->getBool(
"multiLayer",
false));
174 multiPage->setChecked(cfg->getBool(
"multiPage",
false));
175 lossyEncoding->setChecked(!cfg->getBool(
"lossless",
true));
176 effort->setValue(cfg->getInt(
"effort", 7));
177 decodingSpeed->setValue(cfg->getInt(
"decodingSpeed", 0));
178 lossyQuality->setValue(cfg->getInt(
"lossyQuality", 100));
179 forceModular->setChecked(cfg->getBool(
"forceModular",
false));
181#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 9, 0)
182 losslessAlpha->setEnabled(
false);
184 losslessAlpha->setChecked(cfg->getBool(
"losslessAlpha",
false));
189 forceCicpLossless->setChecked(cfg->getBool(
"forceCicpLossless",
false));
191 SpaceList conversionOptionsList = {
192 {i18nc(
"Color space option",
"Save as is"),
194 "The image will be stored without conversion, the ICC profile will be converted to CICP or embedded if "
195 "it was not possible."),
197 {i18nc(
"Color space name",
"Rec 2100 PQ"),
199 "The image will be converted to Rec 2020 linear first, and then encoded with a perceptual quantizer "
201 " (also known as SMPTE 2048 curve). Recommended for HDR images where the absolute brightness is "
204 {i18nc(
"Color space name",
"Rec 2100 HLG"),
206 "The image will be converted to Rec 2020 linear first, and then encoded with a Hybrid Log Gamma curve."
207 " Recommended for HDR images where the display may not understand HDR."),
212 conversionOptionsList << std::make_tuple<QString, QString, QString>(
213 i18nc(
"Color space option plus transfer function name",
"Keep colorants, encode PQ"),
215 "The image will be linearized first, and then encoded with a perceptual quantizer curve"
216 " (also known as the SMPTE 2048 curve). Recommended for images where the absolute brightness is "
220 conversionOptionsList << std::make_tuple<QString, QString, QString>(
221 i18nc(
"Color space option plus transfer function name",
"Keep colorants, encode HLG"),
223 "The image will be linearized first, and then encoded with a Hybrid Log Gamma curve."
224 " Recommended for images intended for screens which cannot understand PQ"),
227 conversionOptionsList << std::make_tuple<QString, QString, QString>(
228 i18nc(
"Color space option plus transfer function name",
"Keep colorants, encode SMPTE ST 428"),
230 "The image will be linearized first, and then encoded with SMPTE ST 428."
231 " Krita always opens images like these as linear floating point, this option is there to reverse "
236 for (
int i = 0; i < conversionOptionsList.size(); i++) {
237 const auto &option = conversionOptionsList.at(i);
238 cmbConversionPolicy->addItem(std::get<0>(option), std::get<2>(option));
239 cmbConversionPolicy->setItemData(i, std::get<1>(option), Qt::ToolTipRole);
241 const QString optionName = cfg->getString(
"floatingPointConversionOption",
"Rec2100PQ");
242 cmbConversionPolicy->setCurrentIndex(cmbConversionPolicy->findData(optionName, Qt::UserRole));
243 spnNits->setValue(cfg->getDouble(
"HLGnominalPeak", 1000.0));
244 spnGamma->setValue(cfg->getDouble(
"HLGgamma", 1.2));
245 chkHLGOOTF->setChecked(cfg->getBool(
"removeHGLOOTF",
true));
247 resampling->setCurrentIndex(resampling->findData(cfg->getInt(
"resampling", -1)));
248 extraChannelResampling->setCurrentIndex(
249 extraChannelResampling->findData(cfg->getInt(
"extraChannelResampling", -1)));
250 photonNoise->setValue(cfg->getInt(
"photonNoise", 0));
251 dots->setCurrentIndex(dots->findData(cfg->getInt(
"dots", -1)));
252 patches->setCurrentIndex(patches->findData(cfg->getInt(
"patches", -1)));
253 epf->setValue(cfg->getInt(
"epf", -1));
254 gaborish->setCurrentIndex(gaborish->findData(cfg->getInt(
"gaborish", -1)));
255 modular->setCurrentIndex(modular->findData(cfg->getInt(
"modularSetVal", -1)));
256 keepInvisible->setCurrentIndex(keepInvisible->findData(cfg->getInt(
"keepInvisible", -1)));
257 groupOrder->setCurrentIndex(groupOrder->findData(cfg->getInt(
"groupOrder", -1)));
258 responsive->setCurrentIndex(responsive->findData(cfg->getInt(
"responsive", -1)));
259 progressiveAC->setCurrentIndex(progressiveAC->findData(cfg->getInt(
"progressiveAC", -1)));
260 qProgressiveAC->setCurrentIndex(qProgressiveAC->findData(cfg->getInt(
"qProgressiveAC", -1)));
261 progressiveDC->setCurrentIndex(progressiveDC->findData(cfg->getInt(
"progressiveDC", -1)));
262 channelColorsGlobalPercent->setValue(cfg->getInt(
"channelColorsGlobalPercent", -1));
263 channelColorsGroupPercent->setValue(cfg->getInt(
"channelColorsGroupPercent", -1));
264 paletteColors->setValue(cfg->getInt(
"paletteColors", -1));
265 lossyPalette->setCurrentIndex(lossyPalette->findData(cfg->getInt(
"lossyPalette", -1)));
266 modularGroupSize->setCurrentIndex(modularGroupSize->findData(cfg->getInt(
"modularGroupSize", -1)));
267 modularPredictor->setCurrentIndex(modularPredictor->findData(cfg->getInt(
"modularPredictor", -1)));
268 modularMATreeLearningPercent->setValue(cfg->getInt(
"modularMATreeLearningPercent", -1));
269 jpegReconCFL->setCurrentIndex(jpegReconCFL->findData(cfg->getInt(
"jpegReconCFL", -1)));
272 i18nc(
"{n} is the number value, % is the percent sign",
"{n}%"));
274 i18nc(
"{n} is the number value, % is the percent sign",
"{n}%"));
276 i18nc(
"{n} is the number value, % is the percent sign",
"{n}%"));
278 chkAuthor->setChecked(cfg->getBool(
"storeAuthor",
false));
279 exif->setChecked(cfg->getBool(
"exif",
true));
280 xmp->setChecked(cfg->getBool(
"xmp",
true));
281 iptc->setChecked(cfg->getBool(
"iptc",
true));
282 chkMetadata->setChecked(cfg->getBool(
"storeMetaData",
true));
290 cfg->setProperty(
"haveAnimation", haveAnimation->isChecked());
291 cfg->setProperty(
"flattenLayers", flattenLayers->isChecked());
292 cfg->setProperty(
"multiLayer", multiLayer->isChecked());
293 cfg->setProperty(
"multiPage", multiPage->isChecked());
294 cfg->setProperty(
"lossless", !lossyEncoding->isChecked());
295 cfg->setProperty(
"effort", effort->value());
296 cfg->setProperty(
"decodingSpeed", decodingSpeed->value());
297 cfg->setProperty(
"lossyQuality", lossyQuality->value());
298 cfg->setProperty(
"forceModular", forceModular->isChecked());
299 cfg->setProperty(
"modularSetVal", modular->currentData());
300 cfg->setProperty(
"losslessAlpha", losslessAlpha->isChecked());
302 cfg->setProperty(
"forceCicpLossless", forceCicpLossless->isChecked());
303 cfg->setProperty(
"floatingPointConversionOption", cmbConversionPolicy->currentData(Qt::UserRole).toString());
304 cfg->setProperty(
"HLGnominalPeak", spnNits->value());
305 cfg->setProperty(
"HLGgamma", spnGamma->value());
306 cfg->setProperty(
"removeHGLOOTF", chkHLGOOTF->isChecked());
308 cfg->setProperty(
"resampling", resampling->currentData());
309 cfg->setProperty(
"extraChannelResampling", extraChannelResampling->currentData());
310 cfg->setProperty(
"photonNoise", photonNoise->value());
311 cfg->setProperty(
"dots", dots->currentData());
312 cfg->setProperty(
"patches", patches->currentData());
313 cfg->setProperty(
"epf", epf->value());
314 cfg->setProperty(
"gaborish", gaborish->currentData());
316 if (forceModular->isChecked() && lossyEncoding->isChecked()) {
317 cfg->setProperty(
"modular", 1);
319 cfg->setProperty(
"modular", modular->currentData());
321 cfg->setProperty(
"keepInvisible", keepInvisible->currentData());
322 cfg->setProperty(
"groupOrder", groupOrder->currentData());
323 cfg->setProperty(
"responsive", responsive->currentData());
324 cfg->setProperty(
"progressiveAC", progressiveAC->currentData());
325 cfg->setProperty(
"qProgressiveAC", qProgressiveAC->currentData());
326 cfg->setProperty(
"progressiveDC", progressiveDC->currentData());
327 cfg->setProperty(
"channelColorsGlobalPercent", channelColorsGlobalPercent->value());
328 cfg->setProperty(
"channelColorsGroupPercent", channelColorsGroupPercent->value());
329 cfg->setProperty(
"paletteColors", paletteColors->value());
330 cfg->setProperty(
"lossyPalette", lossyPalette->currentData());
331 cfg->setProperty(
"modularGroupSize", modularGroupSize->currentData());
332 cfg->setProperty(
"modularPredictor", modularPredictor->currentData());
333 cfg->setProperty(
"modularMATreeLearningPercent", modularMATreeLearningPercent->value());
334 cfg->setProperty(
"jpegReconCFL", jpegReconCFL->currentData());
336 cfg->setProperty(
"storeAuthor", chkAuthor->isChecked());
337 cfg->setProperty(
"exif", exif->isChecked());
338 cfg->setProperty(
"xmp", xmp->isChecked());
339 cfg->setProperty(
"iptc", iptc->isChecked());
340 cfg->setProperty(
"storeMetaData", chkMetadata->isChecked());
342 QString enabledFilters;
344 enabledFilters += filter->id() +
',';
346 cfg->setProperty(
"filters", enabledFilters);