25#define SCALE_TO_FLOAT(v) KoColorSpaceMaths<_channel_type_, float>::scaleToA(v)
26#define SCALE_FROM_FLOAT(v) \
27 KoColorSpaceMaths<float, _channel_type_>::scaleToA(v)
31template<
typename _channel_type_,
typename traits>
46 transform(
const quint8 *src, quint8 *dst, qint32 nPixels)
const override
48 const float gmicUnitValue2KritaUnitValue =
51 const auto *srcPixel =
reinterpret_cast<const RGBPixel *
>(src);
52 auto *dstPixel =
reinterpret_cast<KoRgbF32Traits::Pixel *
>(dst);
71template<
typename _channel_type_,
typename traits>
84 transform(
const quint8 *src, quint8 *dst, qint32 nPixels)
const override
86 const auto *srcPixel =
87 reinterpret_cast<const KoRgbF32Traits::Pixel *
>(src);
88 auto *dstPixel =
reinterpret_cast<RGBPixel *
>(dst);
90 const float gmicUnitValue2KritaUnitValue =
97 * gmicUnitValue2KritaUnitValue);
101 * gmicUnitValue2KritaUnitValue);
113template<
typename _channel_type_,
typename traits>
126 transform(
const quint8 *src, quint8 *dst, qint32 nPixels)
const override
128 const auto *srcPixel =
129 reinterpret_cast<const KoRgbF32Traits::Pixel *
>(src);
130 auto *dstPixel =
reinterpret_cast<RGBPixel *
>(dst);
132 const float gmicUnitValue2KritaUnitValue =
137 while (nPixels > 0) {
138 dstPixel->red = dstPixel->green = dstPixel->blue =
141 * gmicUnitValue2KritaUnitValue);
153template<
typename _channel_type_,
typename traits>
166 transform(
const quint8 *src, quint8 *dst, qint32 nPixels)
const override
168 const auto *srcPixel =
169 reinterpret_cast<const KoRgbF32Traits::Pixel *
>(src);
170 auto *dstPixel =
reinterpret_cast<RGBPixel *
>(dst);
172 const float gmicUnitValue2KritaUnitValue =
177 while (nPixels > 0) {
178 dstPixel->red = dstPixel->green = dstPixel->blue =
181 * gmicUnitValue2KritaUnitValue);
258 dbgKrita <<
"Unsupported color space for fast pixel transformation to "
265 if (gmicSpectrum == 3 || gmicSpectrum == 4) {
266 colorTransformation =
268 }
else if (gmicSpectrum == 1) {
269 colorTransformation =
272 }
else if (gmicSpectrum == 2) {
273 colorTransformation =
280 if (gmicSpectrum == 3 || gmicSpectrum == 4) {
281 colorTransformation =
283 }
else if (gmicSpectrum == 1) {
284 colorTransformation =
287 }
else if (gmicSpectrum == 2) {
288 colorTransformation =
295 if (gmicSpectrum == 3 || gmicSpectrum == 4) {
296 colorTransformation =
299 }
else if (gmicSpectrum == 1) {
300 colorTransformation =
303 }
else if (gmicSpectrum == 2) {
304 colorTransformation =
310 if (gmicSpectrum == 3 || gmicSpectrum == 4) {
311 colorTransformation =
314 }
else if (gmicSpectrum == 1) {
315 colorTransformation =
318 }
else if (gmicSpectrum == 2) {
319 colorTransformation =
325 dbgKrita <<
"Unsupported color space " << colorSpace->
id()
326 <<
" for fast pixel transformation to gmic pixel format";
330 return colorTransformation;
338 dbgKrita <<
"Unsupported color space for fast pixel transformation to "
345 colorTransformation =
350 colorTransformation =
355 colorTransformation =
358 colorTransformation =
361 dbgKrita <<
"Unsupported color space " << colorSpace->
id()
362 <<
" for fast pixel transformation to gmic pixel format";
365 return colorTransformation;
378 if (!gmicToDstPixelFormat) {
379 dbgPlugins <<
"Fall-back to slow color conversion";
389 const auto width =
static_cast<size_t>(gmicImage.
m_width);
390 const auto height =
static_cast<size_t>(gmicImage.
m_height);
392 const auto *rgbaFloat32bitcolorSpace =
398 const quint32 dstNumChannels = rgbaFloat32bitcolorSpace->
channelCount();
404 std::vector<float *> planes(dstNumChannels);
405 const size_t channelOffset = width * height;
406 for (
int channelIndex = 0; channelIndex < gmicImage.
m_spectrum;
408 planes[channelIndex] = gmicImage.
m_data + channelOffset * channelIndex;
412 channelIndex < (int)dstNumChannels;
414 planes[channelIndex] = 0;
419 size_t rowsRemaining = height;
421 const auto floatPixelSize = rgbaFloat32bitcolorSpace->pixelSize();
424 const auto tileWidth =
426 const auto tileHeight =
428 Q_ASSERT(tileWidth == 64);
429 Q_ASSERT(tileHeight == 64);
430 std::vector<quint8> convertedTile(
431 static_cast<size_t>(rgbaFloat32bitcolorSpace->pixelSize()) * tileWidth
437 const auto nPixels = tileWidth * tileHeight;
439 reinterpret_cast<KoRgbF32Traits::Pixel *
>(convertedTile.data());
440 for (
size_t pixelIndex = 0; pixelIndex < nPixels;
441 pixelIndex++, srcPixel++) {
442 srcPixel->alpha = gmicUnitValue;
446 while (rowsRemaining > 0) {
449 size_t columnsRemaining = width;
450 const auto numContiguousImageRows =
453 size_t rowsToWork = qMin(numContiguousImageRows, rowsRemaining);
455 while (columnsRemaining > 0) {
456 const auto numContiguousImageColumns =
459 qMin(numContiguousImageColumns, columnsRemaining);
461 const auto dataIdx = dataX + dataY * width;
462 const auto tileRowStride =
463 (tileWidth - columnsToWork) * floatPixelSize;
465 auto *tileItStart = convertedTile.data();
467 const auto channelSize =
sizeof(float);
468 for (
int i = 0; i < numChannels; i++) {
469 float *planeIt = planes[i] + dataIdx;
470 const auto dataStride = width - columnsToWork;
471 quint8 *tileIt = tileItStart;
473 for (
size_t row = 0; row < rowsToWork; row++) {
474 for (
size_t col = 0; col < columnsToWork; col++) {
475 memcpy(tileIt, planeIt, channelSize);
476 tileIt += floatPixelSize;
480 tileIt += tileRowStride;
481 planeIt += dataStride;
483 tileItStart += channelSize;
486 it->
moveTo(imageX, imageY);
487 quint8 *dstTileItStart = it->
rawData();
489 convertedTile.data();
492 for (
size_t row = 0; row < rowsToWork; row++) {
493 gmicToDstPixelFormat->transform(
496 static_cast<int>(columnsToWork));
497 dstTileItStart += dstColorSpace->
pixelSize() * tileWidth;
498 tileItStart += floatPixelSize * tileWidth;
501 imageX +=
static_cast<int>(columnsToWork);
502 dataX += columnsToWork;
503 columnsRemaining -= columnsToWork;
506 imageY +=
static_cast<int>(rowsToWork);
508 rowsRemaining -= rowsToWork;
511 dst->
crop(x, y,
static_cast<qint32
>(width),
static_cast<qint32
>(height));
520 if (!pixelToGmicPixelFormat) {
521 dbgPlugins <<
"Fall-back to slow color conversion method";
528 <<
"Image rectangle is empty! Using supplied gmic layer dimension";
531 static_cast<int>(gmicImage.
m_width),
532 static_cast<int>(gmicImage.
m_height));
535 const auto x = rc.x();
536 const auto y = rc.y();
537 const size_t width = rc.width() < 0 ? 0 :
static_cast<size_t>(rc.width());
538 const size_t height =
539 rc.height() < 0 ? 0 :
static_cast<size_t>(rc.height());
541 const qint32 numChannels = 4;
543 const size_t greenOffset =
545 const size_t blueOffset = greenOffset * 2;
546 const size_t alphaOffset = greenOffset * 3;
548 const std::array<float *, 4> planes = {gmicImage.
m_data,
549 gmicImage.
m_data + greenOffset,
550 gmicImage.
m_data + blueOffset,
551 gmicImage.
m_data + alphaOffset};
557 Q_ASSERT(tileWidth == 64);
558 Q_ASSERT(tileHeight == 64);
565 Q_CHECK_PTR(rgbaFloat32bitcolorSpace);
566 const auto dstPixelSize = rgbaFloat32bitcolorSpace->
pixelSize();
567 const auto srcPixelSize = dev->
pixelSize();
569 std::vector<quint8> dstTile(dstPixelSize *
static_cast<size_t>(tileWidth)
570 *
static_cast<size_t>(tileHeight));
575 it->
moveTo(imageX, imageY);
576 size_t rowsRemaining = height;
578 while (rowsRemaining > 0) {
581 size_t columnsRemaining = width;
584 const auto rowsToWork =
585 qMin(numContiguousImageRows,
static_cast<qint32
>(rowsRemaining));
586 const auto convertedTileY = tileHeight - rowsToWork;
587 Q_ASSERT(convertedTileY >= 0);
589 while (columnsRemaining > 0) {
590 const auto numContiguousImageColumns =
592 const auto columnsToWork =
593 qMin(numContiguousImageColumns, columnsRemaining);
594 const auto convertedTileX =
595 tileWidth -
static_cast<qint32
>(columnsToWork);
596 Q_ASSERT(convertedTileX >= 0);
598 const auto dataIdx = dataX + dataY * width;
599 const auto dstTileIndex =
600 convertedTileX + convertedTileY * tileWidth;
601 const auto tileRowStride =
602 (
static_cast<size_t>(tileWidth) - columnsToWork) * dstPixelSize;
603 const auto srcTileRowStride =
604 (
static_cast<size_t>(tileWidth) - columnsToWork) * srcPixelSize;
606 it->
moveTo(imageX, imageY);
607 quint8 *tileItStart = dstTile.data() + dstTileIndex * dstPixelSize;
610 auto *dstTileIt = tileItStart;
613 auto row = rowsToWork;
615 pixelToGmicPixelFormat->transform(
618 static_cast<qint32
>(columnsToWork));
619 srcTileIt += columnsToWork * srcPixelSize;
620 srcTileIt += srcTileRowStride;
622 dstTileIt += columnsToWork * dstPixelSize;
623 dstTileIt += tileRowStride;
630 const auto channelSize =
sizeof(float);
631 for (
size_t i = 0; i < numChannels; i++) {
632 float *planeIt = planes.at(i) + dataIdx;
633 const auto dataStride = (width - columnsToWork);
634 quint8 *tileIt = tileItStart;
636 for (
int row = 0; row < rowsToWork; row++) {
637 for (
size_t col = 0; col < columnsToWork; col++) {
638 memcpy(planeIt, tileIt, channelSize);
639 tileIt += dstPixelSize;
643 tileIt += tileRowStride;
644 planeIt += dataStride;
647 tileItStart += channelSize;
650 imageX +=
static_cast<int>(columnsToWork);
651 dataX += columnsToWork;
652 columnsRemaining -= columnsToWork;
655 imageY +=
static_cast<int>(rowsToWork);
657 rowsRemaining -= rowsToWork;
672 static_cast<int>(gmicImage.
m_width),
673 static_cast<int>(gmicImage.
m_height));
681 Q_CHECK_PTR(rgbaFloat32bitcolorSpace);
686 const size_t greenOffset =
688 const size_t blueOffset = greenOffset * 2;
689 const size_t alphaOffset = greenOffset * 3;
691 const auto renderingIntent =
693 const auto conversionFlags =
699 const size_t optimalBufferSize =
701 std::vector<quint8> floatRGBApixelStorage(
702 rgbaFloat32bitcolorSpace->
pixelSize() * optimalBufferSize);
703 quint8 *floatRGBApixel = floatRGBApixelStorage.data();
705 const auto pixelSize = rgbaFloat32bitcolorSpace->
pixelSize();
706 for (
int y = 0; y < rc.height(); y++) {
708 while (x < rc.width()) {
709 it->
moveTo(rc.x() + x, rc.y() + y);
710 auto numContiguousColumns =
713 numContiguousColumns =
714 qMin(numContiguousColumns,
static_cast<size_t>(rc.width() - x));
719 rgbaFloat32bitcolorSpace,
720 static_cast<quint32
>(numContiguousColumns),
723 pixelToGmicPixelFormat->transform(
726 static_cast<qint32
>(numContiguousColumns));
728 auto pos =
static_cast<size_t>(y) * gmicImage.
m_width
729 +
static_cast<size_t>(x);
730 for (
size_t bx = 0; bx < numContiguousColumns; bx++) {
731 memcpy(gmicImage.
m_data + pos,
732 floatRGBApixel + bx * pixelSize,
734 memcpy(gmicImage.
m_data + pos + greenOffset,
735 floatRGBApixel + bx * pixelSize + 4,
737 memcpy(gmicImage.
m_data + pos + blueOffset,
738 floatRGBApixel + bx * pixelSize + 8,
740 memcpy(gmicImage.
m_data + pos + alphaOffset,
741 floatRGBApixel + bx * pixelSize + 12,
746 x +=
static_cast<int>(numContiguousColumns);
753 float gmicMaxChannelValue)
765 const size_t greenOffset =
767 const size_t blueOffset = greenOffset * 2;
768 const size_t alphaOffset = greenOffset * 3;
771 static_cast<int>(gmicImage.
m_width),
772 static_cast<int>(gmicImage.
m_height));
780 const size_t optimalBufferSize =
782 std::vector<quint8> floatRGBApixelStorage(
783 rgbaFloat32bitcolorSpace->
pixelSize() * optimalBufferSize);
784 quint8 *floatRGBApixel = floatRGBApixelStorage.data();
785 const auto pixelSize = rgbaFloat32bitcolorSpace->
pixelSize();
787 const auto renderingIntent =
789 const auto conversionFlags =
793 const float multiplied =
799 for (
int y = 0; y < rc.height(); y++) {
801 while (x < rc.width()) {
803 auto numContiguousColumns =
806 numContiguousColumns =
807 qMin(numContiguousColumns,
808 static_cast<size_t>(rc.width() - x));
810 size_t pos =
static_cast<size_t>(y) * gmicImage.
m_width
811 +
static_cast<size_t>(x);
812 for (
size_t bx = 0; bx < numContiguousColumns; bx++) {
813 r = g = b = gmicImage.
m_data[pos] * multiplied;
816 memcpy(floatRGBApixel + bx * pixelSize, &r, 4);
817 memcpy(floatRGBApixel + bx * pixelSize + 4, &g, 4);
818 memcpy(floatRGBApixel + bx * pixelSize + 8, &b, 4);
819 memcpy(floatRGBApixel + bx * pixelSize + 12, &a, 4);
826 static_cast<quint32
>(numContiguousColumns),
829 x +=
static_cast<int>(numContiguousColumns);
836 for (
int y = 0; y < rc.height(); y++) {
838 while (x < rc.width()) {
840 auto numContiguousColumns =
843 numContiguousColumns =
844 qMin(numContiguousColumns,
845 static_cast<size_t>(rc.width() - x));
847 size_t pos =
static_cast<size_t>(y) * gmicImage.
m_width
848 +
static_cast<size_t>(x);
849 for (
size_t bx = 0; bx < numContiguousColumns; bx++) {
850 r = g = b = gmicImage.
m_data[pos] * multiplied;
851 a = gmicImage.
m_data[pos + greenOffset] * multiplied;
853 memcpy(floatRGBApixel + bx * pixelSize, &r, 4);
854 memcpy(floatRGBApixel + bx * pixelSize + 4, &g, 4);
855 memcpy(floatRGBApixel + bx * pixelSize + 8, &b, 4);
856 memcpy(floatRGBApixel + bx * pixelSize + 12, &a, 4);
863 static_cast<quint32
>(numContiguousColumns),
866 x +=
static_cast<int>(numContiguousColumns);
873 for (
int y = 0; y < rc.height(); y++) {
875 while (x < rc.width()) {
877 auto numContiguousColumns =
880 numContiguousColumns =
881 qMin(numContiguousColumns,
882 static_cast<size_t>(rc.width() - x));
884 size_t pos =
static_cast<size_t>(y) * gmicImage.
m_width
885 +
static_cast<size_t>(x);
886 for (
size_t bx = 0; bx < numContiguousColumns; bx++) {
887 r = gmicImage.
m_data[pos] * multiplied;
888 g = gmicImage.
m_data[pos + greenOffset] * multiplied;
889 b = gmicImage.
m_data[pos + blueOffset] * multiplied;
890 a = gmicMaxChannelValue * multiplied;
892 memcpy(floatRGBApixel + bx * pixelSize, &r, 4);
893 memcpy(floatRGBApixel + bx * pixelSize + 4, &g, 4);
894 memcpy(floatRGBApixel + bx * pixelSize + 8, &b, 4);
895 memcpy(floatRGBApixel + bx * pixelSize + 12, &a, 4);
902 static_cast<quint32
>(numContiguousColumns),
905 x +=
static_cast<int>(numContiguousColumns);
911 for (
int y = 0; y < rc.height(); y++) {
913 while (x < rc.width()) {
915 auto numContiguousColumns =
918 numContiguousColumns =
919 qMin(numContiguousColumns,
920 static_cast<size_t>(rc.width() - x));
922 size_t pos =
static_cast<size_t>(y) * gmicImage.
m_width
923 +
static_cast<size_t>(x);
924 for (
size_t bx = 0; bx < numContiguousColumns; bx++) {
925 r = gmicImage.
m_data[pos] * multiplied;
926 g = gmicImage.
m_data[pos + greenOffset] * multiplied;
927 b = gmicImage.
m_data[pos + blueOffset] * multiplied;
928 a = gmicImage.
m_data[pos + alphaOffset] * multiplied;
930 memcpy(floatRGBApixel + bx * pixelSize, &r, 4);
931 memcpy(floatRGBApixel + bx * pixelSize + 4, &g, 4);
932 memcpy(floatRGBApixel + bx * pixelSize + 8, &b, 4);
933 memcpy(floatRGBApixel + bx * pixelSize + 12, &a, 4);
940 static_cast<quint32
>(numContiguousColumns),
943 x +=
static_cast<int>(numContiguousColumns);
957 float gmicActualMaxChannelValue)
959 QImage image = QImage(
static_cast<int>(gmicImage.
m_width),
960 static_cast<int>(gmicImage.
m_height),
961 QImage::Format_ARGB32);
967 const size_t greenOffset =
969 const size_t blueOffset = greenOffset * 2;
972 const float multiplied = 255.0f / gmicActualMaxChannelValue;
974 for (
int y = 0; y < gmicImage.
m_height; y++) {
976 reinterpret_cast<QRgb *
>(image.scanLine(
static_cast<int>(y)));
977 for (
int x = 0; x < gmicImage.
m_width; x++) {
978 const auto pos = y * gmicImage.
m_width + x;
979 const float r = gmicImage.
m_data[pos] * multiplied;
980 const float g = gmicImage.
m_data[pos + greenOffset] * multiplied;
981 const float b = gmicImage.
m_data[pos + blueOffset] * multiplied;
982 pixel[x] = qRgb(
int(r),
int(g),
int(b));
992 const auto greenOffset =
994 const size_t blueOffset = greenOffset * 2;
995 const size_t alphaOffset = greenOffset * 3;
998 const float qimageUnitValue = 255.0f;
999 const float multiplied = gmicUnitValue / qimageUnitValue;
1001 Q_ASSERT(image.width() ==
int(gmicImage.
m_width));
1002 Q_ASSERT(image.height() ==
int(gmicImage.
m_height));
1003 Q_ASSERT(image.format() == QImage::Format_ARGB32);
1007 for (
int y = 0; y < image.height(); y++) {
1009 reinterpret_cast<const QRgb *
>(image.scanLine(y));
1010 for (
int x = 0; x < image.width(); x++) {
1011 const auto pos =
static_cast<size_t>(y) * gmicImage.
m_width
1012 +
static_cast<size_t>(x);
1014 static_cast<float>(qGray(pixel[x])) * multiplied;
1020 for (
int y = 0; y < image.height(); y++) {
1022 reinterpret_cast<const QRgb *
>(image.scanLine(y));
1023 for (
int x = 0; x < image.width(); x++) {
1024 const auto pos =
static_cast<size_t>(y) * gmicImage.
m_width
1025 +
static_cast<size_t>(x);
1027 static_cast<float>(qGray(pixel[x])) * multiplied;
1028 gmicImage.
m_data[pos + greenOffset] =
1029 static_cast<float>(qAlpha(pixel[x])) * multiplied;
1035 for (
int y = 0; y < image.height(); y++) {
1037 reinterpret_cast<const QRgb *
>(image.scanLine(y));
1038 for (
int x = 0; x < image.width(); x++) {
1039 const auto pos =
static_cast<size_t>(y) * gmicImage.
m_width
1040 +
static_cast<size_t>(x);
1042 static_cast<float>(qRed(pixel[x])) * multiplied;
1043 gmicImage.
m_data[pos + greenOffset] =
1044 static_cast<float>(qGreen(pixel[x])) * multiplied;
1045 gmicImage.
m_data[pos + blueOffset] =
1046 static_cast<float>(qBlue(pixel[x])) * multiplied;
1052 for (
int y = 0; y < image.height(); y++) {
1054 reinterpret_cast<const QRgb *
>(image.scanLine(y));
1055 for (
int x = 0; x < image.width(); x++) {
1056 const auto pos =
static_cast<size_t>(y) * gmicImage.
m_width
1057 +
static_cast<size_t>(x);
1059 static_cast<float>(qRed(pixel[x])) * multiplied;
1060 gmicImage.
m_data[pos + greenOffset] =
1061 static_cast<float>(qGreen(pixel[x])) * multiplied;
1062 gmicImage.
m_data[pos + blueOffset] =
1063 static_cast<float>(qBlue(pixel[x])) * multiplied;
1064 gmicImage.
m_data[pos + alphaOffset] =
1065 static_cast<float>(qAlpha(pixel[x])) * multiplied;
1072 dbgKrita <<
"Unexpected gmic image format";
1080 std::map<QString, QString> result{};
1082 result.emplace(pair.second, pair.first);
1090 if (reverseModeMap.find(blendMode) != reverseModeMap.end())
1091 return reverseModeMap.at(blendMode);
const KoID Float32BitsColorDepthID("F32", ki18n("32-bit float/channel"))
const KoID Float16BitsColorDepthID("F16", ki18n("16-bit float/channel"))
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
const KoID Integer16BitsColorDepthID("U16", ki18n("16-bit integer/channel"))
const KoID RGBAColorModelID("RGBA", ki18n("RGB/Alpha"))
const QString COMPOSITE_OVER
const QString COMPOSITE_DARKEN
const QString COMPOSITE_NEGATION
const QString COMPOSITE_OVERLAY
const QString COMPOSITE_DIVIDE
const QString COMPOSITE_LIGHTNESS
const QString COMPOSITE_DODGE
const QString COMPOSITE_SOFT_LIGHT_SVG
const QString COMPOSITE_ADD
const QString COMPOSITE_LIGHTEN
const QString COMPOSITE_COPY_RED
const QString COMPOSITE_LINEAR_BURN
const QString COMPOSITE_FREEZE
const QString COMPOSITE_VALUE
const QString COMPOSITE_GRAIN_MERGE
const QString COMPOSITE_MULT
const QString COMPOSITE_REFLECT
const QString COMPOSITE_OR
const QString COMPOSITE_SATURATION
const QString COMPOSITE_LINEAR_LIGHT
const QString COMPOSITE_COPY_GREEN
const QString COMPOSITE_HARD_LIGHT
const QString COMPOSITE_INTERPOLATION
const QString COMPOSITE_COPY_BLUE
const QString COMPOSITE_SCREEN
const QString COMPOSITE_PIN_LIGHT
const QString COMPOSITE_DIFF
const QString COMPOSITE_HARD_MIX
const QString COMPOSITE_HUE
const QString COMPOSITE_SUBTRACT
const QString COMPOSITE_BURN
const QString COMPOSITE_EXCLUSION
const QString COMPOSITE_AND
const QString COMPOSITE_GRAIN_EXTRACT
const QString COMPOSITE_XOR
const QString COMPOSITE_VIVID_LIGHT
const QString COMPOSITE_LUMINIZE
virtual quint8 * rawData()=0
virtual const quint8 * rawDataConst() const =0
typename RGBTrait::Pixel RGBPixel
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
KisColorFromFloat(float gmicUnitValue=255.0f)
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
typename RGBTrait::Pixel RGBPixel
KisColorFromGrayScaleAlphaFloat(float gmicUnitValue=255.0f)
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
KisColorFromGrayScaleFloat(float gmicUnitValue=255.0f)
typename RGBTrait::Pixel RGBPixel
KisColorToFloatConvertor(float gmicUnitValue=255.0f)
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
typename RGBTrait::Pixel RGBPixel
quint32 pixelSize() const
void crop(qint32 x, qint32 y, qint32 w, qint32 h)
KisRandomConstAccessorSP createRandomConstAccessorNG() const
const KoColorSpace * colorSpace() const
void moveTo(qint32 x, qint32 y)
KisRandomAccessorSP createRandomAccessorNG()
static void convertToGmicImage(KisPaintDeviceSP dev, KisQMicImage &gmicImage, QRect rc=QRect())
static void convertToGmicImageFast(KisPaintDeviceSP dev, KisQMicImage &gmicImage, QRect rc=QRect())
static QImage convertToQImage(const KisQMicImage &gmicImage, float gmicMaxChannelValue=255.0)
static void convertFromGmicImage(const KisQMicImage &gmicImage, KisPaintDeviceSP dst, float gmicMaxChannelValue)
static void convertFromQImage(const QImage &image, KisQMicImage &gmicImage, float gmicUnitValue=1.0)
static QString blendingModeToString(QString blendMode)
static void convertFromGmicFast(const KisQMicImage &gmicImage, KisPaintDeviceSP dst, float gmicUnitValue)
Fast versions.
static QString stringToBlendingMode(QString str)
virtual qint32 numContiguousRows(qint32 y) const =0
virtual void moveTo(qint32 x, qint32 y)=0
virtual qint32 numContiguousColumns(qint32 x) const =0
virtual quint32 pixelSize() const =0
virtual KoID colorModelId() const =0
virtual quint32 channelCount() const =0
virtual KoID colorDepthId() const =0
virtual bool convertPixelsTo(const quint8 *src, quint8 *dst, const KoColorSpace *dstColorSpace, quint32 numPixels, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
virtual const KoColorProfile * profile() const =0
std::shared_ptr< KoColorTransformation > KoColorTransformationSP
static KoColorTransformation * createTransformation(const KoColorSpace *colorSpace)
const std::map< QString, QString > blendingModeMap
std::map< QString, QString > reverseMap()
#define SCALE_FROM_FLOAT(v)
static KoColorTransformation * createTransformationFromGmic(const KoColorSpace *colorSpace, int gmicSpectrum, float gmicUnitValue)
#define SCALE_TO_FLOAT(v)
const KoColorSpace * colorSpace(const QString &colorModelId, const QString &colorDepthId, const KoColorProfile *profile)
static KoColorSpaceRegistry * instance()
const KoColorSpace * rgb8(const QString &profileName=QString())