本文整理汇总了C++中KisPaintDeviceSP::createRectIteratorNG方法的典型用法代码示例。如果您正苦于以下问题:C++ KisPaintDeviceSP::createRectIteratorNG方法的具体用法?C++ KisPaintDeviceSP::createRectIteratorNG怎么用?C++ KisPaintDeviceSP::createRectIteratorNG使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类KisPaintDeviceSP
的用法示例。
在下文中一共展示了KisPaintDeviceSP::createRectIteratorNG方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: MostFrequentColor
void KisOilPaintFilter::MostFrequentColor(KisPaintDeviceSP src, quint8* dst, const QRect& bounds, int X, int Y, int Radius, int Intensity) const
{
uint I;
double Scale = Intensity / 255.0;
// Alloc some arrays to be used
uchar *IntensityCount = new uchar[(Intensity + 1) * sizeof(uchar)];
const KoColorSpace* cs = src->colorSpace();
QVector<float> channel(cs->channelCount());
QVector<float>* AverageChannels = new QVector<float>[(Intensity + 1)];
// Erase the array
memset(IntensityCount, 0, (Intensity + 1) * sizeof(uchar));
int startx = qMax(X - Radius, bounds.left());
int starty = qMax(Y - Radius, bounds.top());
int width = (2 * Radius) + 1;
if ((startx + width - 1) > bounds.right()) width = bounds.right() - startx + 1;
Q_ASSERT((startx + width - 1) <= bounds.right());
int height = (2 * Radius) + 1;
if ((starty + height) > bounds.bottom()) height = bounds.bottom() - starty + 1;
Q_ASSERT((starty + height - 1) <= bounds.bottom());
KisRectIteratorSP it = src->createRectIteratorNG(startx, starty, width, height);
do {
cs->normalisedChannelsValue(it->rawData(), channel);
I = (uint)(cs->intensity8(it->rawData()) * Scale);
IntensityCount[I]++;
if (IntensityCount[I] == 1) {
AverageChannels[I] = channel;
} else {
for (int i = 0; i < channel.size(); i++) {
AverageChannels[I][i] += channel[i];
}
}
} while (it->nextPixel());
I = 0;
int MaxInstance = 0;
for (int i = 0 ; i <= Intensity ; ++i) {
if (IntensityCount[i] > MaxInstance) {
I = i;
MaxInstance = IntensityCount[i];
}
}
if (MaxInstance != 0) {
channel = AverageChannels[I];
for (int i = 0; i < channel.size(); i++) {
channel[i] /= MaxInstance;
}
cs->fromNormalisedChannelsValue(dst, channel);
} else {
memset(dst, 0, cs->pixelSize());
cs->setOpacity(dst, OPACITY_OPAQUE_U8, 1);
}
delete [] IntensityCount; // free all the arrays
delete [] AverageChannels;
}
示例2: process
void KisPixelizeFilter::process(KisPaintDeviceSP device,
const QRect& applyRect,
const KisFilterConfiguration* configuration,
KoUpdater* progressUpdater
) const
{
QPoint srcTopLeft = applyRect.topLeft();
Q_ASSERT(device);
Q_ASSERT(configuration);
qint32 width = applyRect.width();
qint32 height = applyRect.height();
//read the filter configuration values from the KisFilterConfiguration object
quint32 pixelWidth = configuration->getInt("pixelWidth", 10);
quint32 pixelHeight = configuration->getInt("pixelHeight", 10);
if (pixelWidth == 0) pixelWidth = 1;
if (pixelHeight == 0) pixelHeight = 1;
qint32 pixelSize = device->pixelSize();
QVector<qint32> average(pixelSize);
qint32 count;
if (progressUpdater) {
progressUpdater->setRange(0, applyRect.width() * applyRect.height());
}
qint32 numberOfPixelsProcessed = 0;
for (qint32 y = 0; y < height; y += pixelHeight - (y % pixelHeight)) {
qint32 h = pixelHeight;
h = qMin(h, height - y);
for (qint32 x = 0; x < width; x += pixelWidth - (x % pixelWidth)) {
qint32 w = pixelWidth;
w = qMin(w, width - x);
for (qint32 i = 0; i < pixelSize; i++) {
average[i] = 0;
}
count = 0;
//read
KisRectConstIteratorSP srcIt = device->createRectConstIteratorNG(srcTopLeft.x() + x, srcTopLeft.y() + y, w, h);
do {
for (qint32 i = 0; i < pixelSize; i++) {
average[i] += srcIt->oldRawData()[i];
}
count++;
} while (srcIt->nextPixel());
//average
if (count > 0) {
for (qint32 i = 0; i < pixelSize; i++)
average[i] /= count;
}
//write
KisRectIteratorSP dstIt = device->createRectIteratorNG(srcTopLeft.x() + x, srcTopLeft.y() + y, w, h);
do {
for (int i = 0; i < pixelSize; i++) {
dstIt->rawData()[i] = average[i];
}
} while (dstIt->nextPixel());
if (progressUpdater) progressUpdater->setValue(++numberOfPixelsProcessed);
}
}
}