155 QString notApplicable = i18nc(
"Not Applicable, used where there's no colorants or gamma curve found",
"N/A");
156 QString notApplicableTooltip = i18nc(
"@info:tooltip",
"This profile has no colorants.");
157 QString profileName = i18nc(
"Shows up instead of the name when there's no profile",
"No Profile Found");
158 QString whatIsColorant = i18n(
"Colorant in d50-adapted xyY.");
163 if (!profileList.isEmpty()) {
170 d->
colorSpaceSelector->lblXYZ_W->setToolTip(QString::number(whitepoint[0],
'f', 4) +
", " + QString::number(whitepoint[1],
'f', 4) +
", " + QString::number(whitepoint[2],
'f', 4));
171 d->
colorSpaceSelector->TongueWidget->setToolTip(
"<html><head/><body><table><tr><th colspan='4'>"+i18nc(
"@info:tooltip",
"This profile has the following xyY colorants:")+
"</th></tr><tr><td>"+
172 i18n(
"Red:") +
"</td><td>"+QString::number(colorants[0],
'f', 4) +
"</td><td>" + QString::number(colorants[1],
'f', 4) +
"</td><td>" + QString::number(colorants[2],
'f', 4)+
"</td></tr><tr><td>"+
173 i18n(
"Green:")+
"</td><td>"+QString::number(colorants[3],
'f', 4) +
"</td><td>" + QString::number(colorants[4],
'f', 4) +
"</td><td>" + QString::number(colorants[5],
'f', 4)+
"</th></tr><tr><td>"+
174 i18n(
"Blue:") +
"</td><td>"+QString::number(colorants[6],
'f', 4) +
"</td><td>" + QString::number(colorants[7],
'f', 4) +
"</td><td>" + QString::number(colorants[8],
'f', 4)+
"</th></tr></table></body></html>");
178 d->
colorSpaceSelector->lblXYZ_W->setToolTip(QString::number(whitepoint2[0],
'f', 4) +
", " + QString::number(whitepoint2[1],
'f', 4) +
", " + QString::number(whitepoint2[2],
'f', 4));
188 QVector <double> estimatedTRC(3);
189 QString estimatedGamma = i18nc(
"Estimated Gamma indicates how the TRC (Tone Response Curve or Tone Reproduction Curve) is bent. A Gamma of 1.0 means linear.",
"<b>Estimated Gamma</b>: ");
190 QString estimatedsRGB = i18nc(
"This is for special Gamma types that LCMS cannot differentiate between",
"<b>Estimated Gamma</b>: sRGB, L* or rec709 TRC");
191 QString whatissRGB = i18nc(
"@info:tooltip",
"The Tone Response Curve of this color space is either sRGB, L* or rec709 TRC.");
194 if (profileList.isEmpty()) {
198 else if (currentModelStr ==
"RGBA") {
209 QString detCharacteristicsStr =
212 QString estimatedCurve =
" Estimated curve: ";
214 QPolygonF greencurve;
217 for (
int i=0; i<=10; i++) {
218 QVector <qreal> linear(3);
221 estimatedCurve = estimatedCurve +
", " + QString::number(linear[0]);
222 QPointF tonepoint(linear[0],i*0.1);
224 tonepoint.setX(linear[1]);
225 greencurve<<tonepoint;
226 tonepoint.setX(linear[2]);
227 bluecurve<<tonepoint;
232 int numPoints = curve.size() / 3;
233 for (
int i = 0; i < numPoints; i++) {
234 redcurve << curve.at(i);
235 greencurve << curve.at(i + numPoints);
236 bluecurve << curve.at(i + 2*numPoints);
243 "<html><head/><body>" + estimatedGamma + detCharacteristicsStr +
"<br/>"
244 + QString::number(estimatedTRC[0]) +
"," + QString::number(estimatedTRC[1]) +
","
245 + QString::number(estimatedTRC[2]) +
"<br/>" + estimatedCurve +
"</body></html>");
247 d->
colorSpaceSelector->TRCwidget->setToolTip(
"<html><head/><body>" + estimatedGamma + detCharacteristicsStr
248 +
"<br/>" + estimatedCurve +
"</body></html>");
251 else if (currentModelStr ==
"GRAYA") {
256 QString detCharacteristicsStr =
259 QString estimatedCurve =
" Estimated curve: ";
262 for (
int i=0; i<=10; i++) {
263 QVector <qreal> linear(3);
266 estimatedCurve = estimatedCurve +
", " + QString::number(linear[0]);
267 QPointF tonepoint(linear[0],i*0.1);
268 tonecurve<<tonepoint;
275 d->
colorSpaceSelector->TRCwidget->setToolTip(
"<html><head/><body>" + estimatedGamma + detCharacteristicsStr
276 +
"<br/>" + QString::number(estimatedTRC[0]) +
"<br/>"
277 + estimatedCurve +
"</body></html>");
279 d->
colorSpaceSelector->TRCwidget->setToolTip(
"<html><head/><body>" + estimatedGamma + detCharacteristicsStr
280 +
"<br/>" + estimatedCurve +
"</body></html>");
283 else if (currentModelStr ==
"CMYKA") {
287 QString estimatedCurve =
" Estimated curve: ";
290 QPolygonF magentacurve;
291 QPolygonF yellowcurve;
293 for (
int i=0; i<=10; i++) {
294 QVector <qreal> linear(3);
297 estimatedCurve = estimatedCurve +
", " + QString::number(linear[0]);
298 QPointF tonepoint(linear[0],i*0.1);
299 tonecurve<<tonepoint;
304 int numPoints = curve.size() / 4;
305 for (
int i = 0; i < numPoints; i++) {
306 cyancurve << curve.at(i);
307 magentacurve << curve.at(i + numPoints);
308 yellowcurve << curve.at(i + 2*numPoints);
309 tonecurve << curve.at(i + 3*numPoints);
311 d->
colorSpaceSelector->TRCwidget->setCMYKCurve(cyancurve, magentacurve, yellowcurve, tonecurve);
313 d->
colorSpaceSelector->TRCwidget->setToolTip(i18nc(
"@info:tooltip",
"Estimated Gamma cannot be retrieved for CMYK."));
315 else if (currentModelStr ==
"XYZA") {
316 QString estimatedCurve =
" Estimated curve: ";
320 for (
int i=0; i<=10; i++) {
321 QVector <qreal> linear(3);
324 estimatedCurve = estimatedCurve +
", " + QString::number(linear[0]);
325 QPointF tonepoint(linear[0],i*0.1);
326 tonecurve<<tonepoint;
335 d->
colorSpaceSelector->TRCwidget->setToolTip(
"<html><head/><body>"+estimatedGamma + QString::number(estimatedTRC[0])+
"< br />"+estimatedCurve+
"</body></html>");
337 else if (currentModelStr ==
"LABA") {
339 QString estimatedCurve =
" Estimated curve: ";
342 for (
int i=0; i<=10; i++) {
343 QVector <qreal> linear(3);
346 estimatedCurve = estimatedCurve +
", " + QString::number(linear[0]);
347 QPointF tonepoint(linear[0],i*0.1);
348 tonecurve<<tonepoint;
357 d->
colorSpaceSelector->TRCwidget->setToolTip(
"<html><head/><body>"+i18nc(
"@info:tooltip",
"This is assumed to be the L * TRC. ")+
"<br />"+estimatedCurve+
"</body></html>");
359 else if (currentModelStr ==
"YCbCrA") {
362 QString estimatedCurve =
" Estimated curve: ";
365 for (
int i=0; i<=10; i++) {
366 QVector <qreal> linear(3);
369 estimatedCurve = estimatedCurve +
", " + QString::number(linear[0]);
370 QPointF tonepoint(linear[0],i*0.1);
371 tonecurve<<tonepoint;
378 d->
colorSpaceSelector->TRCwidget->setToolTip(i18nc(
"@info:tooltip",
"Estimated Gamma cannot be retrieved for YCbCr."));
382 if (!profileList.isEmpty()) {
384 QString(
"<h3>%1</h3>").arg(i18nc(
"About <Profilename>",
"About %1/%2",
currentColorSpace()->name().toHtmlEscaped(), profileName.toHtmlEscaped())));
386 QString(
"<p>%1</p>").arg(i18nc(
"ICC profile version",
"ICC Version: %1", QString::number(
currentColorSpace()->profile()->version()))));
389 QString(
"<p>%1</p>").arg(i18nc(
"Who made the profile?",
"Manufacturer: %1",
currentColorSpace()->profile()->manufacturer())));
392 .arg(i18nc(
"What is the copyright? These are from embedded strings from the icc profile, so they "
393 "default to english.",
397 d->
colorSpaceSelector->textProfileDescription->append(QString(
"<h3>%1</h3>").arg(profileName.toHtmlEscaped()));
400 if (currentModelStr ==
"RGBA") {
401 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"If the selected model is RGB",
402 "<b><a href=\"https://en.wikipedia.org/wiki/RGB_color_space\">RGB (Red, Green, Blue)</a></b>, is the color model used by screens and other light-based media.<br/>"
403 "RGB is an additive color model: adding colors together makes them brighter. This color "
404 "model is the most extensive of all color models, and is recommended as a model for painting,"
405 "that you can later convert to other spaces. RGB is also the recommended colorspace for HDR editing.")+
"</p>");
406 }
else if (currentModelStr ==
"CMYKA") {
407 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"If the selected model is CMYK",
408 "<b><a href=\"https://en.wikipedia.org/wiki/CMYK_color_model\">CMYK (Cyan, Magenta, Yellow, Key)</a></b>, "
409 "is the model used by printers and other ink-based media.<br/>"
410 "CMYK is a subtractive model, meaning that adding colors together will turn them darker. Because of CMYK "
411 "profiles being very specific per printer, it is recommended to work in RGB space, and then later convert "
412 "to a CMYK profile, preferably one delivered by your printer. <br/>"
413 "CMYK is <b>not</b> recommended for painting."
414 "Unfortunately, Krita cannot retrieve colorants or the TRC for this space.")+
"</p>");
415 }
else if (currentModelStr ==
"XYZA") {
416 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"If the selected model is XYZ",
417 "<b><a href=\"https://en.wikipedia.org/wiki/CIE_1931_color_space\">CIE XYZ</a></b>"
418 "is the space determined by the CIE as the space that encompasses all other colors, and used to "
419 "convert colors between profiles. XYZ is an additive color model, meaning that adding colors together "
420 "makes them brighter. XYZ is <b>not</b> recommended for painting, but can be useful to encode in. The Tone Response "
421 "Curve is assumed to be linear.")+
"</p>");
422 }
else if (currentModelStr ==
"GRAYA") {
423 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"If the selected model is Grayscale",
424 "<b><a href=\"https://en.wikipedia.org/wiki/Grayscale\">Grayscale</a></b> only allows for "
425 "gray values and transparent values. Grayscale images use half "
426 "the memory and disk space compared to an RGB image of the same bit-depth.<br/>"
427 "Grayscale is useful for inking and grayscale images. In "
428 "Krita, you can mix Grayscale and RGB layers in the same image.")+
"</p>");
429 }
else if (currentModelStr ==
"LABA") {
430 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"If the selected model is LAB",
431 "<b><a href=\"https://en.wikipedia.org/wiki/Lab_color_space\">L*a*b</a></b>. <b>L</b> stands for Lightness, "
432 "the <b>a</b> and <b>b</b> components represent color channels.<br/>"
433 "L*a*b is a special model for color correction. It is based on human perception, meaning that it "
434 "tries to encode the difference in lightness, red-green balance and yellow-blue balance. "
435 "This makes it useful for color correction, but the vast majority of color maths in the blending "
436 "modes do <b>not</b> work as expected here.<br/>"
437 "Similarly, Krita does not support HDR in LAB, meaning that HDR images converted to LAB lose color "
438 "information. This colorspace is <b>not</b> recommended for painting, nor for export, "
439 "but best as a space to do post-processing in. The TRC is assumed to be the L* TRC.")+
"</p>");
440 }
else if (currentModelStr ==
"YCbCrA") {
441 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"If the selected model is YCbCr",
442 "<b><a href=\"https://en.wikipedia.org/wiki/YCbCr\">YCbCr (Luma, Blue Chroma, Red Chroma)</a></b>, is a "
443 "model designed for video encoding. It is based on human perception, meaning that it tries to "
444 "encode the difference in lightness, red-green balance and yellow-blue balance. Chroma in "
445 "this case is then a word indicating a special type of saturation, in these cases the saturation "
446 "of Red and Blue, of which the desaturated equivalents are Green and Yellow respectively.")+
"</p>");
451 if (currentDepthStr ==
"U8") {
452 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"When the selected Bitdepth is 8",
453 "<b>8 bit integer</b>: The default number of colors per channel. Each channel will have 256 values available, "
454 "leading to a total amount of colors of 256 to the power of the number of channels. Recommended to use for images intended for the web, "
455 "or otherwise simple images.")+
"</p>");
457 else if (currentDepthStr ==
"U16") {
458 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"When the selected Bitdepth is 16",
459 "<b>16 bit integer</b>: Also known as 'deep color'. 16 bit is ideal for editing images with a linear TRC, large "
460 "color space, or just when you need more precise color blending. This does take twice as much space on "
461 "the RAM and hard-drive than any given 8 bit image of the same properties, and for some devices it "
462 "takes much more processing power. We recommend watching the RAM usage of the file carefully, or "
463 "otherwise use 8 bit if your computer slows down. Take care to disable conversion optimization "
464 "when converting from 16 bit/channel to 8 bit/channel.")+
"</p>");
466 else if (currentDepthStr ==
"F16") {
467 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"When the selected Bitdepth is 16 bit float",
468 "<b>16 bit floating point</b>: Also known as 'Half Floating Point', and the standard in VFX industry images. "
469 "16 bit float is ideal for editing images with a linear Tone Response Curve, large color space, or just when you need "
470 "more precise color blending. It being floating point is an absolute requirement for Scene Referred "
471 "(HDR) images. This does take twice as much space on the RAM and hard-drive than any given 8 bit image "
472 "of the same properties, and for some devices it takes much more processing power. We recommend watching "
473 "the RAM usage of the file carefully, or otherwise use 8 bit if your computer slows down.")+
"</p>");
475 else if (currentDepthStr ==
"F32") {
476 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"When the selected Bitdepth is 32bit float",
477 "<b>32 bit float point</b>: Also known as 'Full Floating Point'. 32 bit float is ideal for editing images "
478 "with a linear TRC, large color space, or just when you need more precise color blending. It being "
479 "floating point is an absolute requirement for Scene Referred (HDR) images. This does take four times "
480 "as much space on the RAM and hard-drive than any given 8 bit image of the same properties, and for "
481 "some devices it takes much more processing power. We recommend watching the RAM usage of the file "
482 "carefully, or otherwise use 8 bit if your computer slows down.")+
"</p>");
484 else if (currentDepthStr ==
"F64") {
485 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"When the selected Bitdepth is 64bit float, but this isn't actually available in Krita at the moment.",\
486 "<b>64 bit float point</b>: 64 bit float is as precise as it gets in current technology, and this depth is used "
487 "most of the time for images that are generated or used as an input for software. It being floating point "
488 "is an absolute requirement for Scene Referred (HDR) images. This does take eight times as much space on "
489 "the RAM and hard-drive than any given 8 bit image of the same properties, and for some devices it takes "
490 "much more processing power. We recommend watching the RAM usage of the file carefully, or otherwise use "
491 "8 bit if your computer slows down.")+
"</p>");
493 if (profileList.isEmpty()==
false) {
494 QString possibleConversionIntents =
"<p>"+i18n(
"The following conversion intents are possible: ")+
"<ul>";
496 possibleConversionIntents +=
"<li>"+i18n(
"Perceptual")+
"</li>";
499 possibleConversionIntents +=
"<li>"+i18n(
"Relative Colorimetric")+
"</li>";
502 possibleConversionIntents +=
"<li>"+i18n(
"Absolute Colorimetric")+
"</li>";
505 possibleConversionIntents +=
"<li>"+i18nc(
"ICC profile rendering intent",
"Saturation")+
"</li>";
507 possibleConversionIntents +=
"</ul></ul></p>";
510 if (profileName.contains(
"-elle-")) {
512 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"These are Elle Stone's notes on her profiles that we ship.",
513 "<p><b>Extra notes on profiles by Elle Stone:</b></p>"
514 "<p><i>Krita comes with a number of high quality profiles created by "
515 "<a href=\"https://ninedegreesbelow.com\">Elle Stone</a>. This is a summary. Please check "
516 "<a href=\"https://ninedegreesbelow.com/photography/lcms-make-icc-profiles.html\">the full documentation</a> as well.</i></p>"));
518 if (profileName.contains(
"ACES-")) {
521 "<p>Quoting Wikipedia, 'Academy Color Encoding System (ACES) is a color image "
522 "encoding system proposed by the Academy of Motion Picture Arts and Sciences that will allow for "
523 "a fully encompassing color accurate workflow, with 'seamless interchange of high quality motion "
524 "picture images regardless of source'.</p>"));
526 if (profileName.contains(
"ACEScg-")) {
529 "<p>The ACEScg color space is smaller than the ACES color space, but large enough to contain the 'Rec-2020 gamut "
530 "and the DCI-P3 gamut', unlike the ACES color space it has no negative values and contains only few colors "
531 "that fall just barely outside the area of real colors humans can see</p>"));
533 if (profileName.contains(
"ClayRGB-")) {
536 "<p>To avoid possible copyright infringement issues, I used 'ClayRGB' (following ArgyllCMS) as the base name "
537 "for these profiles. As used below, 'Compatible with Adobe RGB 1998' is terminology suggested in the preamble "
538 "to the AdobeRGB 1998 color space specifications.</p><p>"
539 "The Adobe RGB 1998 color gamut covers a higher "
540 "percentage of real-world cyans, greens, and yellow-greens than sRGB, but still doesn't include all printable "
541 "cyans, greens, yellow-greens, especially when printing using today's high-end, wider gamut, ink jet printers. "
542 "BetaRGB (not included in the profile pack) and Rec.2020 are better matches for the color gamuts of today's "
543 "wide gamut printers.</p><p>"
544 "The Adobe RGB 1998 color gamut is a reasonable approximation to some of today's "
545 "high-end wide gamut monitors.</p>"));
547 if (profileName.contains(
"AllColorsRGB-")) {
550 "<p>This profile's color gamut is roughly the same size and shape as the ACES color space gamut, "
551 "and like the ACES color space, AllColorsRGB holds all possible real colors. But AllColorsRGB "
552 "actually has a slightly larger color gamut (to capture some fringe colors that barely qualify "
553 "as real when viewed by the standard observer) and uses the D50 white point.</p><p>"
554 "Just like the ACES color space, AllColorsRGB holds a high percentage of imaginary colors. See the Completely "
555 "<a href=\"https://ninedegreesbelow.com/photography/xyz-rgb.html\">"
556 "Painless Programmer's Guide to XYZ, RGB, ICC, xyY, and TRCs</a> for more information about imaginary "
558 "There is no particular reason why anyone would want to use this profile "
559 "for editing, unless one needs to make sure your color space really does hold all "
560 "possible real colors.</p>"));
562 if (profileName.contains(
"CIERGB-")) {
565 "<p>This profile is included mostly for its historical significance. "
566 "It's the color space that was used in the original color matching experiments "
567 "that led to the creation of the XYZ reference color space.</p><p>"
568 "The ASTM E white point "
569 "is probably the right E white point to use when making the CIERGB color space profile. "
570 "It's not clear to me what the correct CIERGB primaries really are. "
571 "Lindbloom gives one set. The LCMS version 1 tutorial gives a different set. "
572 "Experts in the field contend that the real primaries "
573 "should be calculated from the spectral wavelengths, so I did.</p>"));
575 if (profileName.contains(
"IdentityRGB-")) {
578 "<p>The IdentityRGB working space is included in the profile pack because it's a mathematically "
579 "obvious way to include all possible visible colors, though it has a higher percentage of "
580 "imaginary colors than the ACES and AllColorsRGB color spaces. I cannot think of any reason "
581 "why you'd ever want to actually edit images in the IdentityRGB working space.</p>"));
583 if (profileName.contains(
"LargeRGB-")) {
586 "<p>To avoid possible copyright infringement issues, I used 'LargeRGB' (following RawTherapee) "
587 "as the base name for these profiles.<p>"
588 "Kodak designed the RIMM/ROMM (ProPhotoRGB) color "
589 "gamut to include all printable and most real world colors. It includes some imaginary colors "
590 "and excludes some of the real world blues and violet blues that can be captured by digital "
591 "cameras. It also excludes some very saturated 'camera-captured' yellows as interpreted by "
592 "some (and probably many) camera matrix input profiles.</p><p>"
593 "The ProPhotoRGB primaries are "
594 "hard-coded into Adobe products such as Lightroom and the Dng-DCP camera 'profiles'. However, "
595 "other than being large enough to hold a lot of colors, ProPhotoRGB has no particular merit "
596 "as an RGB working space. Personally I recommend the Rec.2020 or ACEScg profiles over "
597 "ProPhotoRGB. But if you have an already well-established workflow using ProPhotoRGB, you "
598 "might find a shift to another RGB working space a little odd, at least at first, and so you "
599 "have to weight the pros and cons of changing your workflow.</p>"));
601 if (profileName.contains(
"Rec2020-")) {
604 "<p>Rec.2020 is the up-and-coming replacement for the thoroughly outdated sRGB color space. As of "
605 "June 2015, very few (if any) display devices (and certainly no affordable display devices) can "
606 "display all of Rec.2020. However, display technology is closing in on Rec.2020, movies are "
607 "already being made for Rec.2020, and various cameras offer support for Rec.2020. And in the "
608 "digital darkroom Rec.2020 is much more suitable as a general RGB working space than the "
609 "exceedingly small sRGB color space.</p>"));
611 if (profileName.contains(
"sRGB-")) {
613 "<p>Hewlett-Packard and Microsoft designed sRGB to match the color gamut of consumer-grade CRTs "
614 "from the 1990s. sRGB is the standard color space for the world wide web and is still the best "
615 "choice for exporting images to the internet.</p><p>"
616 "The sRGB color gamut was a good match to "
617 "calibrated decent quality CRTs. But sRGB is not a good match to many consumer-grade LCD monitors, "
618 "which often cannot display the more saturated sRGB blues and magentas (the good news: as technology "
619 "progresses, wider gamuts are trickling down to consumer grade monitors).</p><p>"
620 "Printer color gamuts can easily exceed the sRGB color gamut in cyans, greens, and yellow-greens. Colors from interpolated "
621 "camera raw files also often exceed the sRGB color gamut.</p><p>"
622 "As a very relevant aside, using perceptual "
623 "intent when converting to sRGB does not magically makes otherwise out of gamut colors fit inside the "
624 "sRGB color gamut! The standard sRGB color space (along with all the other the RGB profiles provided "
625 "in my profile pack) is a matrix profile, and matrix profiles don't have perceptual intent tables.</p>"));
627 if (profileName.contains(
"WideRGB-")) {
629 "<p>To avoid possible copyright infringement issues, I used 'WideRGB' as the base name for these profiles.</p><p>"
630 "WideGamutRGB was designed by Adobe to be a wide gamut color space that uses spectral colors "
631 "as its primaries. Pascale's primary values produce a profile that matches old V2 Widegamut profiles "
632 "from Adobe and Canon. It is an interesting color space, but shortly after its introduction, Adobe "
633 "switched their emphasis to the ProPhotoRGB color space.</p>"));
635 if (profileName.contains(
"Gray-")) {
637 "<p>These profiles are for use with RGB images that have been converted to monotone gray (black and white). "
638 "The main reason to convert from RGB to Gray is to save the file space needed to encode the image. "
639 "Google places a premium on fast-loading web pages, and images are one of the slower-loading elements "
640 "of a web page. So converting black and white images to Grayscale images does save some kilobytes. "
641 " For grayscale images uploaded to the internet, convert the image to the V2 Gray profile with the sRGB TRC.</p>"));
643 if (profileName.contains(
"-g10")) {
645 "<p>The profiles that end in '-g10.icc' are linear gamma (gamma=1.0, 'linear light', etc) profiles and "
646 "should only be used when editing at high bit depths (16-bit floating point, 16-bit integer, 32-bit "
647 "floating point, 32-bit integer). Many editing operations produce better results in linear gamma color "
650 if (profileName.contains(
"-labl")) {
652 "<p>The profiles that end in '-labl.icc' have perceptually uniform TRCs. A few editing operations really "
653 "should be done on perceptually uniform RGB. Make sure you use the V4 versions for editing high bit depth "
656 if (profileName.contains(
"-srgbtrc") || profileName.contains(
"-g22") || profileName.contains(
"-g18") || profileName.contains(
"-rec709")) {
658 "<p>The profiles that end in '-srgbtrc.icc', '-g22.icc', and '-rec709.icc' have approximately but not exactly "
659 "perceptually uniform TRCs. ProPhotoRGB's gamma=1.8 TRC is not quite as close to being perceptually uniform.</p>"));
663 "<p>When editing 8-bit images, you should use a profile with a small color gamut and an approximately or "
664 "exactly perceptually uniform TRC. Of the profiles supplied in my profile pack, only the sRGB and AdobeRGB1998 "
665 "(ClayRGB) color spaces are small enough for 8-bit editing. Even with the AdobeRGB1998 color space you need to "
666 "be careful to not cause posterization. And of course you cannot use the linear gamma versions of these profiles "
667 "for 8-bit editing.</p>"));
669 if (profileName.contains(
"-V4-")) {
671 "<p>Use V4 profiles for editing images using high bit depth image editors that use LCMS as the Color Management Module. "
672 "This includes Krita, digiKam/showFoto, and GIMP 2.9.</p>"));
674 if (profileName.contains(
"-V2-")) {
676 "<p>Use V2 profiles for exporting finished images to be uploaded to the web or for use with imaging software that "
677 "cannot read V4 profiles.</p>"));