154{
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.");
159
162
163 if (!profileList.isEmpty()) {
168
170 d->
colorSpaceSelector->lblXYZ_W->setToolTip(QString::number(whitepoint.
x,
'f', 4) +
", " + QString::number(whitepoint.
y,
'f', 4) +
", " + QString::number(whitepoint.
Y,
'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].x, 'f', 4) + "</td><td>" + QString::number(colorants[0].y, 'f', 4) + "</td><td>" + QString::number(colorants[0].Y, 'f', 4)+"</td></tr><tr><td>"+
173 i18n("Green:")+"</td><td>"+QString::number(colorants[1].x, 'f', 4) + "</td><td>" + QString::number(colorants[1].y, 'f', 4) + "</td><td>" + QString::number(colorants[1].Y, 'f', 4)+"</th></tr><tr><td>"+
174 i18n("Blue:") +"</td><td>"+QString::number(colorants[2].x, 'f', 4) + "</td><td>" + QString::number(colorants[2].y, 'f', 4) + "</td><td>" + QString::number(colorants[2].Y, 'f', 4)+"</th></tr></table></body></html>");
175 } else {
178 d->
colorSpaceSelector->lblXYZ_W->setToolTip(QString::number(whitepoint2.
x,
'f', 4) +
", " + QString::number(whitepoint2.
y,
'f', 4) +
", " + QString::number(whitepoint2.
Y,
'f', 4));
180 }
181 } else {
185 }
186
187
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.");
193
194 if (profileList.isEmpty()) {
197 }
198 else if (currentModelStr == "RGBA") {
204 QString detCharacteristicsStr =
207 QString estimatedCurve = " Estimated curve: ";
208 QPolygonF redcurve;
209 QPolygonF greencurve;
210 QPolygonF bluecurve;
212 for (int i=0; i<=10; i++) {
213 QVector <qreal> linear(3);
214 linear.fill(i*0.1);
216 estimatedCurve = estimatedCurve + ", " + QString::number(linear[0]);
217 QPointF tonepoint(linear[0],i*0.1);
218 redcurve<<tonepoint;
219 tonepoint.setX(linear[1]);
220 greencurve<<tonepoint;
221 tonepoint.setX(linear[2]);
222 bluecurve<<tonepoint;
223 }
225 } else {
227 int numPoints = curve.size() / 3;
228 for (int i = 0; i < numPoints; i++) {
229 redcurve << curve.at(i);
230 greencurve << curve.at(i + numPoints);
231 bluecurve << curve.at(i + 2*numPoints);
232 }
234 }
235
238 "<html><head/><body>" + estimatedGamma + detCharacteristicsStr + "<br/>"
239 + QString::number(estimatedTRC[0]) + "," + QString::number(estimatedTRC[1]) + ","
240 + QString::number(estimatedTRC[2]) + "<br/>" + estimatedCurve + "</body></html>");
241 } else {
242 d->
colorSpaceSelector->TRCwidget->setToolTip(
"<html><head/><body>" + estimatedGamma + detCharacteristicsStr
243 + "<br/>" + estimatedCurve + "</body></html>");
244 }
245 }
246 else if (currentModelStr == "GRAYA") {
251 QString detCharacteristicsStr =
254 QString estimatedCurve = " Estimated curve: ";
255 QPolygonF tonecurve;
257 for (int i=0; i<=10; i++) {
258 QVector <qreal> linear(3);
259 linear.fill(i*0.1);
261 estimatedCurve = estimatedCurve + ", " + QString::number(linear[0]);
262 QPointF tonepoint(linear[0],i*0.1);
263 tonecurve<<tonepoint;
264 }
265 } else {
267 }
270 d->
colorSpaceSelector->TRCwidget->setToolTip(
"<html><head/><body>" + estimatedGamma + detCharacteristicsStr
271 + "<br/>" + QString::number(estimatedTRC[0]) + "<br/>"
272 + estimatedCurve + "</body></html>");
273 } else {
274 d->
colorSpaceSelector->TRCwidget->setToolTip(
"<html><head/><body>" + estimatedGamma + detCharacteristicsStr
275 + "<br/>" + estimatedCurve + "</body></html>");
276 }
277 }
278 else if (currentModelStr == "CMYKA") {
282 QString estimatedCurve = " Estimated curve: ";
283 QPolygonF tonecurve;
284 QPolygonF cyancurve;
285 QPolygonF magentacurve;
286 QPolygonF yellowcurve;
288 for (int i=0; i<=10; i++) {
289 QVector <qreal> linear(3);
290 linear.fill(i*0.1);
292 estimatedCurve = estimatedCurve + ", " + QString::number(linear[0]);
293 QPointF tonepoint(linear[0],i*0.1);
294 tonecurve<<tonepoint;
295 }
297 } else {
299 int numPoints = curve.size() / 4;
300 for (int i = 0; i < numPoints; i++) {
301 cyancurve << curve.at(i);
302 magentacurve << curve.at(i + numPoints);
303 yellowcurve << curve.at(i + 2*numPoints);
304 tonecurve << curve.at(i + 3*numPoints);
305 }
306 d->
colorSpaceSelector->TRCwidget->setCMYKCurve(cyancurve, magentacurve, yellowcurve, tonecurve);
307 }
308 d->
colorSpaceSelector->TRCwidget->setToolTip(i18nc(
"@info:tooltip",
"Estimated Gamma cannot be retrieved for CMYK."));
309 }
310 else if (currentModelStr == "XYZA") {
311 QString estimatedCurve = " Estimated curve: ";
313 QPolygonF tonecurve;
315 for (int i=0; i<=10; i++) {
316 QVector <qreal> linear(3);
317 linear.fill(i*0.1);
319 estimatedCurve = estimatedCurve + ", " + QString::number(linear[0]);
320 QPointF tonepoint(linear[0],i*0.1);
321 tonecurve<<tonepoint;
322 }
324 } else {
326 }
330 d->
colorSpaceSelector->TRCwidget->setToolTip(
"<html><head/><body>"+estimatedGamma + QString::number(estimatedTRC[0])+
"< br />"+estimatedCurve+
"</body></html>");
331 }
332 else if (currentModelStr == "LABA") {
334 QString estimatedCurve = " Estimated curve: ";
335 QPolygonF tonecurve;
337 for (int i=0; i<=10; i++) {
338 QVector <qreal> linear(3);
339 linear.fill(i*0.1);
341 estimatedCurve = estimatedCurve + ", " + QString::number(linear[0]);
342 QPointF tonepoint(linear[0],i*0.1);
343 tonecurve<<tonepoint;
344 }
346 } else {
348 }
352 d->
colorSpaceSelector->TRCwidget->setToolTip(
"<html><head/><body>"+i18nc(
"@info:tooltip",
"This is assumed to be the L * TRC. ")+
"<br />"+estimatedCurve+
"</body></html>");
353 }
354 else if (currentModelStr == "YCbCrA") {
357 QString estimatedCurve = " Estimated curve: ";
358 QPolygonF tonecurve;
360 for (int i=0; i<=10; i++) {
361 QVector <qreal> linear(3);
362 linear.fill(i*0.1);
364 estimatedCurve = estimatedCurve + ", " + QString::number(linear[0]);
365 QPointF tonepoint(linear[0],i*0.1);
366 tonecurve<<tonepoint;
367 }
369 } else {
371 }
373 d->
colorSpaceSelector->TRCwidget->setToolTip(i18nc(
"@info:tooltip",
"Estimated Gamma cannot be retrieved for YCbCr."));
374 }
375
377 if (!profileList.isEmpty()) {
379 QString(
"<h3>%1</h3>").arg(i18nc(
"About <Profilename>",
"About %1/%2",
currentColorSpace()->
name().toHtmlEscaped(), profileName.toHtmlEscaped())));
381 QString(
"<p>%1</p>").arg(i18nc(
"ICC profile version",
"ICC Version: %1", QString::number(
currentColorSpace()->profile()->version()))));
384 QString(
"<p>%1</p>").arg(i18nc(
"Who made the profile?",
"Manufacturer: %1",
currentColorSpace()->profile()->manufacturer())));
386 QString("<p>%1</p>")
387 .arg(i18nc("What is the copyright? These are from embedded strings from the icc profile, so they "
388 "default to english.",
389 "Copyright: %1",
391 } else {
392 d->
colorSpaceSelector->textProfileDescription->append(QString(
"<h3>%1</h3>").arg(profileName.toHtmlEscaped()));
393 }
394
395 if (currentModelStr == "RGBA") {
396 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"If the selected model is RGB",
397 "<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/>"
398 "RGB is an additive color model: adding colors together makes them brighter. This color "
399 "model is the most extensive of all color models, and is recommended as a model for painting,"
400 "that you can later convert to other spaces. RGB is also the recommended colorspace for HDR editing.")+"</p>");
401 } else if (currentModelStr == "CMYKA") {
402 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"If the selected model is CMYK",
403 "<b><a href=\"https://en.wikipedia.org/wiki/CMYK_color_model\">CMYK (Cyan, Magenta, Yellow, Key)</a></b>, "
404 "is the model used by printers and other ink-based media.<br/>"
405 "CMYK is a subtractive model, meaning that adding colors together will turn them darker. Because of CMYK "
406 "profiles being very specific per printer, it is recommended to work in RGB space, and then later convert "
407 "to a CMYK profile, preferably one delivered by your printer. <br/>"
408 "CMYK is <b>not</b> recommended for painting."
409 "Unfortunately, Krita cannot retrieve colorants or the TRC for this space.")+"</p>");
410 } else if (currentModelStr == "XYZA") {
411 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"If the selected model is XYZ",
412 "<b><a href=\"https://en.wikipedia.org/wiki/CIE_1931_color_space\">CIE XYZ</a></b>"
413 "is the space determined by the CIE as the space that encompasses all other colors, and used to "
414 "convert colors between profiles. XYZ is an additive color model, meaning that adding colors together "
415 "makes them brighter. XYZ is <b>not</b> recommended for painting, but can be useful to encode in. The Tone Response "
416 "Curve is assumed to be linear.")+"</p>");
417 } else if (currentModelStr == "GRAYA") {
418 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"If the selected model is Grayscale",
419 "<b><a href=\"https://en.wikipedia.org/wiki/Grayscale\">Grayscale</a></b> only allows for "
420 "gray values and transparent values. Grayscale images use half "
421 "the memory and disk space compared to an RGB image of the same bit-depth.<br/>"
422 "Grayscale is useful for inking and grayscale images. In "
423 "Krita, you can mix Grayscale and RGB layers in the same image.")+"</p>");
424 } else if (currentModelStr == "LABA") {
425 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"If the selected model is LAB",
426 "<b><a href=\"https://en.wikipedia.org/wiki/Lab_color_space\">L*a*b</a></b>. <b>L</b> stands for Lightness, "
427 "the <b>a</b> and <b>b</b> components represent color channels.<br/>"
428 "L*a*b is a special model for color correction. It is based on human perception, meaning that it "
429 "tries to encode the difference in lightness, red-green balance and yellow-blue balance. "
430 "This makes it useful for color correction, but the vast majority of color maths in the blending "
431 "modes do <b>not</b> work as expected here.<br/>"
432 "Similarly, Krita does not support HDR in LAB, meaning that HDR images converted to LAB lose color "
433 "information. This colorspace is <b>not</b> recommended for painting, nor for export, "
434 "but best as a space to do post-processing in. The TRC is assumed to be the L* TRC.")+"</p>");
435 } else if (currentModelStr == "YCbCrA") {
436 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"If the selected model is YCbCr",
437 "<b><a href=\"https://en.wikipedia.org/wiki/YCbCr\">YCbCr (Luma, Blue Chroma, Red Chroma)</a></b>, is a "
438 "model designed for video encoding. It is based on human perception, meaning that it tries to "
439 "encode the difference in lightness, red-green balance and yellow-blue balance. Chroma in "
440 "this case is then a word indicating a special type of saturation, in these cases the saturation "
441 "of Red and Blue, of which the desaturated equivalents are Green and Yellow respectively.")+"</p>");
442 }
443
445
446 if (currentDepthStr == "U8") {
447 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"When the selected Bitdepth is 8",
448 "<b>8 bit integer</b>: The default number of colors per channel. Each channel will have 256 values available, "
449 "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, "
450 "or otherwise simple images.")+"</p>");
451 }
452 else if (currentDepthStr == "U16") {
453 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"When the selected Bitdepth is 16",
454 "<b>16 bit integer</b>: Also known as 'deep color'. 16 bit is ideal for editing images with a linear TRC, large "
455 "color space, or just when you need more precise color blending. This does take twice as much space on "
456 "the RAM and hard-drive than any given 8 bit image of the same properties, and for some devices it "
457 "takes much more processing power. We recommend watching the RAM usage of the file carefully, or "
458 "otherwise use 8 bit if your computer slows down. Take care to disable conversion optimization "
459 "when converting from 16 bit/channel to 8 bit/channel.")+"</p>");
460 }
461 else if (currentDepthStr == "F16") {
462 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"When the selected Bitdepth is 16 bit float",
463 "<b>16 bit floating point</b>: Also known as 'Half Floating Point', and the standard in VFX industry images. "
464 "16 bit float is ideal for editing images with a linear Tone Response Curve, large color space, or just when you need "
465 "more precise color blending. It being floating point is an absolute requirement for Scene Referred "
466 "(HDR) images. This does take twice as much space on the RAM and hard-drive than any given 8 bit image "
467 "of the same properties, and for some devices it takes much more processing power. We recommend watching "
468 "the RAM usage of the file carefully, or otherwise use 8 bit if your computer slows down.")+"</p>");
469 }
470 else if (currentDepthStr == "F32") {
471 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"When the selected Bitdepth is 32bit float",
472 "<b>32 bit float point</b>: Also known as 'Full Floating Point'. 32 bit float is ideal for editing images "
473 "with a linear TRC, large color space, or just when you need more precise color blending. It being "
474 "floating point is an absolute requirement for Scene Referred (HDR) images. This does take four times "
475 "as much space on the RAM and hard-drive than any given 8 bit image of the same properties, and for "
476 "some devices it takes much more processing power. We recommend watching the RAM usage of the file "
477 "carefully, or otherwise use 8 bit if your computer slows down.")+"</p>");
478 }
479 else if (currentDepthStr == "F64") {
480 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"When the selected Bitdepth is 64bit float, but this isn't actually available in Krita at the moment.",\
481 "<b>64 bit float point</b>: 64 bit float is as precise as it gets in current technology, and this depth is used "
482 "most of the time for images that are generated or used as an input for software. It being floating point "
483 "is an absolute requirement for Scene Referred (HDR) images. This does take eight times as much space on "
484 "the RAM and hard-drive than any given 8 bit image of the same properties, and for some devices it takes "
485 "much more processing power. We recommend watching the RAM usage of the file carefully, or otherwise use "
486 "8 bit if your computer slows down.")+"</p>");
487 }
488 if (profileList.isEmpty()==false) {
489 QString possibleConversionIntents = "<p>"+i18n("The following conversion intents are possible: ")+"<ul>";
491 possibleConversionIntents += "<li>"+i18n("Perceptual")+"</li>";
492 }
494 possibleConversionIntents += "<li>"+i18n("Relative Colorimetric")+"</li>";
495 }
497 possibleConversionIntents += "<li>"+i18n("Absolute Colorimetric")+"</li>";
498 }
500 possibleConversionIntents += "<li>"+i18nc("ICC profile rendering intent", "Saturation")+"</li>";
501 }
502 possibleConversionIntents += "</ul></ul></p>";
504 }
505 if (profileName.contains("-elle-")) {
506
507 d->
colorSpaceSelector->textProfileDescription->append(
"<p>"+i18nc(
"These are Elle Stone's notes on her profiles that we ship.",
508 "<p><b>Extra notes on profiles by Elle Stone:</b></p>"
509 "<p><i>Krita comes with a number of high quality profiles created by "
510 "<a href=\"https://ninedegreesbelow.com\">Elle Stone</a>. This is a summary. Please check "
511 "<a href=\"https://ninedegreesbelow.com/photography/lcms-make-icc-profiles.html\">the full documentation</a> as well.</i></p>"));
512
513 if (profileName.contains("ACES-")) {
514
516 "<p>Quoting Wikipedia, 'Academy Color Encoding System (ACES) is a color image "
517 "encoding system proposed by the Academy of Motion Picture Arts and Sciences that will allow for "
518 "a fully encompassing color accurate workflow, with 'seamless interchange of high quality motion "
519 "picture images regardless of source'.</p>"));
520 }
521 if (profileName.contains("ACEScg-")) {
522
524 "<p>The ACEScg color space is smaller than the ACES color space, but large enough to contain the 'Rec-2020 gamut "
525 "and the DCI-P3 gamut', unlike the ACES color space it has no negative values and contains only few colors "
526 "that fall just barely outside the area of real colors humans can see</p>"));
527 }
528 if (profileName.contains("ClayRGB-")) {
529
531 "<p>To avoid possible copyright infringement issues, I used 'ClayRGB' (following ArgyllCMS) as the base name "
532 "for these profiles. As used below, 'Compatible with Adobe RGB 1998' is terminology suggested in the preamble "
533 "to the AdobeRGB 1998 color space specifications.</p><p>"
534 "The Adobe RGB 1998 color gamut covers a higher "
535 "percentage of real-world cyans, greens, and yellow-greens than sRGB, but still doesn't include all printable "
536 "cyans, greens, yellow-greens, especially when printing using today's high-end, wider gamut, ink jet printers. "
537 "BetaRGB (not included in the profile pack) and Rec.2020 are better matches for the color gamuts of today's "
538 "wide gamut printers.</p><p>"
539 "The Adobe RGB 1998 color gamut is a reasonable approximation to some of today's "
540 "high-end wide gamut monitors.</p>"));
541 }
542 if (profileName.contains("AllColorsRGB-")) {
543
545 "<p>This profile's color gamut is roughly the same size and shape as the ACES color space gamut, "
546 "and like the ACES color space, AllColorsRGB holds all possible real colors. But AllColorsRGB "
547 "actually has a slightly larger color gamut (to capture some fringe colors that barely qualify "
548 "as real when viewed by the standard observer) and uses the D50 white point.</p><p>"
549 "Just like the ACES color space, AllColorsRGB holds a high percentage of imaginary colors. See the Completely "
550 "<a href=\"https://ninedegreesbelow.com/photography/xyz-rgb.html\">"
551 "Painless Programmer's Guide to XYZ, RGB, ICC, xyY, and TRCs</a> for more information about imaginary "
552 "colors.</p><p>"
553 "There is no particular reason why anyone would want to use this profile "
554 "for editing, unless one needs to make sure your color space really does hold all "
555 "possible real colors.</p>"));
556 }
557 if (profileName.contains("CIERGB-")) {
558
560 "<p>This profile is included mostly for its historical significance. "
561 "It's the color space that was used in the original color matching experiments "
562 "that led to the creation of the XYZ reference color space.</p><p>"
563 "The ASTM E white point "
564 "is probably the right E white point to use when making the CIERGB color space profile. "
565 "It's not clear to me what the correct CIERGB primaries really are. "
566 "Lindbloom gives one set. The LCMS version 1 tutorial gives a different set. "
567 "Experts in the field contend that the real primaries "
568 "should be calculated from the spectral wavelengths, so I did.</p>"));
569 }
570 if (profileName.contains("IdentityRGB-")) {
571
573 "<p>The IdentityRGB working space is included in the profile pack because it's a mathematically "
574 "obvious way to include all possible visible colors, though it has a higher percentage of "
575 "imaginary colors than the ACES and AllColorsRGB color spaces. I cannot think of any reason "
576 "why you'd ever want to actually edit images in the IdentityRGB working space.</p>"));
577 }
578 if (profileName.contains("LargeRGB-")) {
579
581 "<p>To avoid possible copyright infringement issues, I used 'LargeRGB' (following RawTherapee) "
582 "as the base name for these profiles.<p>"
583 "Kodak designed the RIMM/ROMM (ProPhotoRGB) color "
584 "gamut to include all printable and most real world colors. It includes some imaginary colors "
585 "and excludes some of the real world blues and violet blues that can be captured by digital "
586 "cameras. It also excludes some very saturated 'camera-captured' yellows as interpreted by "
587 "some (and probably many) camera matrix input profiles.</p><p>"
588 "The ProPhotoRGB primaries are "
589 "hard-coded into Adobe products such as Lightroom and the Dng-DCP camera 'profiles'. However, "
590 "other than being large enough to hold a lot of colors, ProPhotoRGB has no particular merit "
591 "as an RGB working space. Personally I recommend the Rec.2020 or ACEScg profiles over "
592 "ProPhotoRGB. But if you have an already well-established workflow using ProPhotoRGB, you "
593 "might find a shift to another RGB working space a little odd, at least at first, and so you "
594 "have to weight the pros and cons of changing your workflow.</p>"));
595 }
596 if (profileName.contains("Rec2020-")) {
597
599 "<p>Rec.2020 is the up-and-coming replacement for the thoroughly outdated sRGB color space. As of "
600 "June 2015, very few (if any) display devices (and certainly no affordable display devices) can "
601 "display all of Rec.2020. However, display technology is closing in on Rec.2020, movies are "
602 "already being made for Rec.2020, and various cameras offer support for Rec.2020. And in the "
603 "digital darkroom Rec.2020 is much more suitable as a general RGB working space than the "
604 "exceedingly small sRGB color space.</p>"));
605 }
606 if (profileName.contains("sRGB-")) {
608 "<p>Hewlett-Packard and Microsoft designed sRGB to match the color gamut of consumer-grade CRTs "
609 "from the 1990s. sRGB is the standard color space for the world wide web and is still the best "
610 "choice for exporting images to the internet.</p><p>"
611 "The sRGB color gamut was a good match to "
612 "calibrated decent quality CRTs. But sRGB is not a good match to many consumer-grade LCD monitors, "
613 "which often cannot display the more saturated sRGB blues and magentas (the good news: as technology "
614 "progresses, wider gamuts are trickling down to consumer grade monitors).</p><p>"
615 "Printer color gamuts can easily exceed the sRGB color gamut in cyans, greens, and yellow-greens. Colors from interpolated "
616 "camera raw files also often exceed the sRGB color gamut.</p><p>"
617 "As a very relevant aside, using perceptual "
618 "intent when converting to sRGB does not magically makes otherwise out of gamut colors fit inside the "
619 "sRGB color gamut! The standard sRGB color space (along with all the other the RGB profiles provided "
620 "in my profile pack) is a matrix profile, and matrix profiles don't have perceptual intent tables.</p>"));
621 }
622 if (profileName.contains("WideRGB-")) {
624 "<p>To avoid possible copyright infringement issues, I used 'WideRGB' as the base name for these profiles.</p><p>"
625 "WideGamutRGB was designed by Adobe to be a wide gamut color space that uses spectral colors "
626 "as its primaries. Pascale's primary values produce a profile that matches old V2 Widegamut profiles "
627 "from Adobe and Canon. It is an interesting color space, but shortly after its introduction, Adobe "
628 "switched their emphasis to the ProPhotoRGB color space.</p>"));
629 }
630 if (profileName.contains("Gray-")) {
632 "<p>These profiles are for use with RGB images that have been converted to monotone gray (black and white). "
633 "The main reason to convert from RGB to Gray is to save the file space needed to encode the image. "
634 "Google places a premium on fast-loading web pages, and images are one of the slower-loading elements "
635 "of a web page. So converting black and white images to Grayscale images does save some kilobytes. "
636 " For grayscale images uploaded to the internet, convert the image to the V2 Gray profile with the sRGB TRC.</p>"));
637 }
638 if (profileName.contains("-g10")) {
640 "<p>The profiles that end in '-g10.icc' are linear gamma (gamma=1.0, 'linear light', etc) profiles and "
641 "should only be used when editing at high bit depths (16-bit floating point, 16-bit integer, 32-bit "
642 "floating point, 32-bit integer). Many editing operations produce better results in linear gamma color "
643 "spaces.</p>"));
644 }
645 if (profileName.contains("-labl")) {
647 "<p>The profiles that end in '-labl.icc' have perceptually uniform TRCs. A few editing operations really "
648 "should be done on perceptually uniform RGB. Make sure you use the V4 versions for editing high bit depth "
649 "images.</p>"));
650 }
651 if (profileName.contains("-srgbtrc") || profileName.contains("-g22") || profileName.contains("-g18") || profileName.contains("-rec709")) {
653 "<p>The profiles that end in '-srgbtrc.icc', '-g22.icc', and '-rec709.icc' have approximately but not exactly "
654 "perceptually uniform TRCs. ProPhotoRGB's gamma=1.8 TRC is not quite as close to being perceptually uniform.</p>"));
655 }
658 "<p>When editing 8-bit images, you should use a profile with a small color gamut and an approximately or "
659 "exactly perceptually uniform TRC. Of the profiles supplied in my profile pack, only the sRGB and AdobeRGB1998 "
660 "(ClayRGB) color spaces are small enough for 8-bit editing. Even with the AdobeRGB1998 color space you need to "
661 "be careful to not cause posterization. And of course you cannot use the linear gamma versions of these profiles "
662 "for 8-bit editing.</p>"));
663 }
664 if (profileName.contains("-V4-")) {
666 "<p>Use V4 profiles for editing images using high bit depth image editors that use LCMS as the Color Management Module. "
667 "This includes Krita, digiKam/showFoto, and GIMP 2.9.</p>"));
668 }
669 if (profileName.contains("-V2-")) {
671 "<p>Use V2 profiles for exporting finished images to be uploaded to the web or for use with imaging software that "
672 "cannot read V4 profiles.</p>"));
673 }
674 }
675
676
678
679}
TransferCharacteristics
The transferCharacteristics enum Enum of transfer characteristics, follows ITU H.273 for values 0 to ...
QString nameWhitePoint(KoColorimetryUtils::xyY whitePoint)
virtual const KoColorProfile * profile() const =0
QPolygonF estimatedTRCXYY() const
const char * name(StandardAction id)
static QString getTransferCharacteristicName(TransferCharacteristics curve)
getTransferCharacteristicName
virtual void linearizeFloatValue(QVector< qreal > &Value) const =0
virtual KoColorimetryUtils::xyY getWhitePointxyY() const =0
virtual QVector< qreal > getEstimatedTRC() const =0
virtual QVector< KoColorimetryUtils::xyY > getColorantsxyY() const =0
virtual TransferCharacteristics getTransferCharacteristics() const
getTransferCharacteristics This function should be subclassed at some point so we can get the value f...
QString colorSpaceId(const QString &colorModelId, const QString &colorDepthId) const
QList< const KoColorProfile * > profilesFor(const QString &csID) const