本文整理汇总了C++中KisPaintDeviceSP::exactBounds方法的典型用法代码示例。如果您正苦于以下问题:C++ KisPaintDeviceSP::exactBounds方法的具体用法?C++ KisPaintDeviceSP::exactBounds怎么用?C++ KisPaintDeviceSP::exactBounds使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类KisPaintDeviceSP
的用法示例。
在下文中一共展示了KisPaintDeviceSP::exactBounds方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: testRoundTrip
void KisClipboardTest::testRoundTrip()
{
const KoColorSpace *cs = KoColorSpaceRegistry::instance()->rgb8();
KisPaintDeviceSP dev = new KisPaintDevice(cs);
KisPaintDeviceSP newDev;
QPoint errorPoint;
QRect fillRect(10,10,20,20);
KoColor pixel(Qt::red, cs);
dev->fill(fillRect.x(),fillRect.y(),
fillRect.width(), fillRect.height(), pixel.data());
QCOMPARE(dev->exactBounds(), fillRect);
KisClipboard::instance()->setClip(dev, QPoint());
newDev = KisClipboard::instance()->clip(QPoint());
QCOMPARE(newDev->exactBounds().size(), fillRect.size());
newDev->setX(dev->x());
newDev->setY(dev->y());
QVERIFY(TestUtil::comparePaintDevices(errorPoint, dev, newDev));
QPoint offset(100,100);
dev->setX(offset.x());
dev->setY(offset.y());
QCOMPARE(dev->exactBounds(), fillRect.translated(offset));
KisClipboard::instance()->setClip(dev, QPoint());
newDev = KisClipboard::instance()->clip(QPoint());
QCOMPARE(newDev->exactBounds().size(), fillRect.translated(offset).size());
newDev->setX(dev->x());
newDev->setY(dev->y());
QVERIFY(TestUtil::comparePaintDevices(errorPoint, dev, newDev));
}
示例2: testClear
void KisPaintDeviceTest::testClear()
{
const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8();
KisPaintDeviceSP dev = new KisPaintDevice(cs);
QVERIFY(dev->extent() == QRect(2147483647, 2147483647, 0, 0));
QVERIFY(dev->exactBounds() == QRect(2147483647, 2147483647, 0, 0));
dev->clear();
QVERIFY(dev->extent() == QRect(2147483647, 2147483647, 0, 0));
QVERIFY(dev->exactBounds() == QRect(2147483647, 2147483647, 0, 0));
dev->clear(QRect(100, 100, 100, 100));
// XXX: This is strange!
QVERIFY(dev->extent() == QRect(64, 64, 192, 192));
QVERIFY(dev->exactBounds() == QRect(64, 64, 192, 192));
dev->clear();
QVERIFY(dev->extent() == QRect(2147483647, 2147483647, 0, 0));
QVERIFY(dev->exactBounds() == QRect(2147483647, 2147483647, 0, 0));
}
示例3: dstIt
QVector<QPoint> splitIntoConnectedComponents(KisPaintDeviceSP dev,
const QRect &boundingRect)
{
QVector<QPoint> points;
const KoColorSpace *cs = dev->colorSpace();
const QRect rect = dev->exactBounds() & boundingRect;
if (rect.isEmpty()) return points;
/**
* Please note that since we modify the device inside
* clearNonZeroComponent() call, we must use a *writable*
* iterator, for not ending up with a lazy copied old version of a
* device.
*/
KisSequentialIterator dstIt(dev, rect);
do {
if (cs->opacityU8(dstIt.rawData()) > 0) {
const QPoint pt(dstIt.x(), dstIt.y());
points << pt;
KisScanlineFill fill(dev, pt, rect);
fill.clearNonZeroComponent();
}
} while (dstIt.nextPixel());
return points;
}
示例4: run
void KisPasteNewActionFactory::run(KisViewManager *viewManager)
{
Q_UNUSED(viewManager);
KisPaintDeviceSP clip = KisClipboard::instance()->clip(QRect(), true);
if (!clip) return;
QRect rect = clip->exactBounds();
if (rect.isEmpty()) return;
KisDocument *doc = KisPart::instance()->createDocument();
KisImageSP image = new KisImage(doc->createUndoStore(),
rect.width(),
rect.height(),
clip->colorSpace(),
i18n("Pasted"));
KisPaintLayerSP layer =
new KisPaintLayer(image.data(), clip->objectName(),
OPACITY_OPAQUE_U8, clip->colorSpace());
KisPainter::copyAreaOptimized(QPoint(), clip, layer->paintDevice(), rect);
image->addNode(layer.data(), image->rootLayer());
doc->setCurrentImage(image);
KisPart::instance()->addDocument(doc);
KisMainWindow *win = viewManager->mainWindow();
win->addViewAndNotifyLoadingCompleted(doc);
}
示例5: convertToGmicImage
void KisGmicSimpleConvertor::convertToGmicImage(KisPaintDeviceSP dev, gmic_image< float >& gmicImage)
{
const KoColorSpace *rgbaFloat32bitcolorSpace = KoColorSpaceRegistry::instance()->colorSpace(RGBAColorModelID.id(),
Float32BitsColorDepthID.id(),
KoColorSpaceRegistry::instance()->rgb8()->profile());
Q_CHECK_PTR(rgbaFloat32bitcolorSpace);
dev->convertTo(rgbaFloat32bitcolorSpace);
QRect rc = dev->exactBounds();
m_planarBytes = dev->readPlanarBytes(rc.x(), rc.y(), rc.width(), rc.height());
setChannelSize(rc.width() * rc.height());
int greenOffset = gmicImage._width * gmicImage._height;
int blueOffset = greenOffset * 2;
int alphaOffset = greenOffset * 3;
quint8 * redChannelBytes = m_planarBytes.at(KoRgbF32Traits::red_pos);
quint8 * greenChannelBytes = m_planarBytes.at(KoRgbF32Traits::green_pos);
quint8 * blueChannelBytes = m_planarBytes.at(KoRgbF32Traits::blue_pos);
quint8 * alphaChannelBytes = m_planarBytes.at(KoRgbF32Traits::alpha_pos);
unsigned int channelSize = sizeof(float);
memcpy(gmicImage._data ,redChannelBytes ,gmicImage._width * gmicImage._height * channelSize);
memcpy(gmicImage._data + greenOffset ,greenChannelBytes ,gmicImage._width * gmicImage._height * channelSize);
memcpy(gmicImage._data + blueOffset ,blueChannelBytes ,gmicImage._width * gmicImage._height * channelSize);
memcpy(gmicImage._data + alphaOffset ,alphaChannelBytes ,gmicImage._width * gmicImage._height * channelSize);
}
示例6: testMakeClone
void KisPaintDeviceTest::testMakeClone()
{
QImage image(QString(FILES_DATA_DIR) + QDir::separator() + "hakonepa.png");
const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8();
KisPaintDeviceSP srcDev = new KisPaintDevice(cs);
srcDev->convertFromQImage(image, 0);
srcDev->move(10,10);
const KoColorSpace * weirdCS = KoColorSpaceRegistry::instance()->lab16();
KisPaintDeviceSP dstDev = new KisPaintDevice(weirdCS);
dstDev->move(1000,1000);
QVERIFY(!dstDev->fastBitBltPossible(srcDev));
QRect cloneRect(100,100,200,200);
QPoint errpoint;
dstDev->makeCloneFrom(srcDev, cloneRect);
QVERIFY(*dstDev->colorSpace() == *srcDev->colorSpace());
QCOMPARE(dstDev->pixelSize(), srcDev->pixelSize());
QCOMPARE(dstDev->x(), srcDev->x());
QCOMPARE(dstDev->y(), srcDev->y());
QCOMPARE(dstDev->exactBounds(), cloneRect);
QImage srcImage = srcDev->convertToQImage(0, cloneRect.x(), cloneRect.y(),
cloneRect.width(), cloneRect.height());
QImage dstImage = dstDev->convertToQImage(0, cloneRect.x(), cloneRect.y(),
cloneRect.width(), cloneRect.height());
if (!TestUtil::compareQImages(errpoint, dstImage, srcImage)) {
QFAIL(QString("Failed to create identical image, first different pixel: %1,%2 \n").arg(errpoint.x()).arg(errpoint.y()).toLatin1());
}
}
示例7: testIdentity
void KisTransformWorkerTest::testIdentity()
{
TestUtil::TestProgressBar bar;
KoProgressUpdater pu(&bar);
KoUpdaterPtr updater = pu.startSubtask();
const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8();
QImage image(QString(FILES_DATA_DIR) + QDir::separator() + "mirror_source.png");
KisPaintDeviceSP dev = new KisPaintDevice(cs);
dev->convertFromQImage(image, "");
KisFilterStrategy * filter = new KisBoxFilterStrategy();
KisTransaction t("test", dev);
KisTransformWorker tw(dev, 1.0, 1.0,
0.0, 0.0,
0.0, 0.0,
0.0,
0, 0, updater, filter, true);
tw.run();
t.end();
QRect rc = dev->exactBounds();
QVERIFY(rc.width() ==image.width());
QVERIFY(rc.height() == image.height());
QImage result = dev->convertToQImage(0, rc.x(), rc.y(), rc.width(), rc.height());
QPoint errpoint;
if (!TestUtil::compareQImages(errpoint, image, result)) {
image.save("test_identity_source.png");
result.save("test_identity_result.png");
QFAIL(QString("Failed to apply identity transformation to image, first different pixel: %1,%2 \n").arg(errpoint.x()).arg(errpoint.y()).toAscii());
}
}
示例8: run
void KisPasteNewActionFactory::run(KisView2 *view)
{
Q_UNUSED(view);
KisPaintDeviceSP clip = KisClipboard::instance()->clip(QRect(), true);
if (!clip) return;
QRect rect = clip->exactBounds();
if (rect.isEmpty()) return;
KisDoc2 *doc = new KisDoc2();
if (!doc) return;
KisImageSP image = new KisImage(doc->createUndoStore(),
rect.width(),
rect.height(),
clip->colorSpace(),
i18n("Pasted"));
KisPaintLayerSP layer =
new KisPaintLayer(image.data(), clip->objectName(),
OPACITY_OPAQUE_U8, clip->colorSpace());
KisPainter p(layer->paintDevice());
p.setCompositeOp(COMPOSITE_COPY);
p.bitBlt(0, 0, clip, rect.x(), rect.y(), rect.width(), rect.height());
p.end();
image->addNode(layer.data(), image->rootLayer());
doc->setCurrentImage(image);
KoMainWindow *win = doc->documentPart()->createMainWindow();
win->show();
win->setRootDocument(doc);
}
示例9: shear
void KisShearVisitor::shear(KisPaintDeviceSP dev, qreal angleX, qreal angleY, KoUpdater *progress)
{
const qreal pi = 3.1415926535897932385;
qreal thetaX = angleX * pi / 180;
qreal shearX = tan(thetaX);
qreal thetaY = angleY * pi / 180;
qreal shearY = tan(thetaY);
QRect r = dev->exactBounds();
progress->setRange(0, r.height() + r.width());
KisPaintDeviceSP sheared;
sheared = xShear(dev, shearX, progress);
sheared = yShear(sheared, shearY, progress);
dev->clear();
KisPainter p2(dev);
r = sheared->extent();
p2.bitBlt(r.x(), r.y(), sheared, r.x(), r.y(), r.width(), r.height());
p2.end();
progress->setProgress(progress->maximum());
}
示例10: processImpl
void KisSmallTilesFilter::processImpl(KisPaintDeviceSP device,
const QRect& /*applyRect*/,
const KisFilterConfiguration* config,
KoUpdater* progressUpdater
) const
{
Q_ASSERT(!device.isNull());
//read the filter configuration values from the KisFilterConfiguration object
quint32 numberOfTiles = config->getInt("numberOfTiles", 2);
QRect srcRect = device->exactBounds();
int w = static_cast<int>(srcRect.width() / numberOfTiles);
int h = static_cast<int>(srcRect.height() / numberOfTiles);
KisPaintDeviceSP tile = device->createThumbnailDevice(srcRect.width() / numberOfTiles, srcRect.height() / numberOfTiles);
if (tile.isNull()) return;
KisPainter gc(device);
gc.setCompositeOp(COMPOSITE_COPY);
if (progressUpdater) {
progressUpdater->setRange(0, numberOfTiles);
}
for (uint y = 0; y < numberOfTiles; ++y) {
for (uint x = 0; x < numberOfTiles; ++x) {
gc.bitBlt(w * x, h * y, tile, 0, 0, w, h);
}
if (progressUpdater) progressUpdater->setValue(y);
}
gc.end();
}
示例11: runPartialDst
void KisPerspectiveTransformWorker::runPartialDst(KisPaintDeviceSP srcDev,
KisPaintDeviceSP dstDev,
const QRect &dstRect)
{
if (m_isIdentity) {
KisPainter::copyAreaOptimizedOldData(dstRect.topLeft(), srcDev, dstDev, dstRect);
return;
}
QRectF srcClipRect = srcDev->exactBounds();
if (srcClipRect.isEmpty()) return;
KisProgressUpdateHelper progressHelper(m_progressUpdater, 100, dstRect.height());
KisRandomSubAccessorSP srcAcc = srcDev->createRandomSubAccessor();
KisRandomAccessorSP accessor = dstDev->createRandomAccessorNG(dstRect.x(), dstRect.y());
for (int y = dstRect.y(); y < dstRect.y() + dstRect.height(); ++y) {
for (int x = dstRect.x(); x < dstRect.x() + dstRect.width(); ++x) {
QPointF dstPoint(x, y);
QPointF srcPoint = m_backwardTransform.map(dstPoint);
if (srcClipRect.contains(srcPoint)) {
accessor->moveTo(dstPoint.x(), dstPoint.y());
srcAcc->moveTo(srcPoint.x(), srcPoint.y());
srcAcc->sampledOldRawData(accessor->rawData());
}
}
progressHelper.step();
}
}
示例12: testWrappedLineIterator
void testWrappedLineIterator(QString testName, const QRect &rect)
{
testName = QString("%1_%2_%3_%4_%5")
.arg(testName)
.arg(rect.x())
.arg(rect.y())
.arg(rect.width())
.arg(rect.height());
const KoColorSpace *cs = KoColorSpaceRegistry::instance()->rgb8();
KisPaintDeviceSP dev = createWrapAroundPaintDevice(cs);
// test rect fits the wrap rect in both dimensions
IteratorSP it = createIterator<IteratorSP>(dev, rect);
int y = 0;
do {
int x = 0;
do {
quint8 *data = it->rawData();
data[0] = 10 * x;
data[1] = 10 * y;
data[2] = 0;
data[3] = 255;
x++;
} while (it->nextPixel());
} while (nextRowGeneral(it, ++y, rect));
QRect rc = dev->defaultBounds()->bounds() | dev->exactBounds();
QImage result = dev->convertToQImage(0, rc.x(), rc.y(), rc.width(), rc.height());
QVERIFY(TestUtil::checkQImage(result, "paint_device_test", "wrapped_iterators", testName));
}
示例13: testGaussianBase
void KisConvolutionPainterTest::testGaussianBase(KisPaintDeviceSP dev, bool useFftw, const QString &prefix)
{
QBitArray channelFlags =
KoColorSpaceRegistry::instance()->rgb8()->channelFlags(true, true);
KisPainter gc(dev);
qreal horizontalRadius = 5, verticalRadius = 5;
for(int i = 0; i < 3 ; i++, horizontalRadius+=5, verticalRadius+=5)
{
QTime timer;
timer.start();
gc.beginTransaction();
if (( horizontalRadius > 0 ) && ( verticalRadius > 0 )) {
KisPaintDeviceSP interm = new KisPaintDevice(dev->colorSpace());
KisConvolutionKernelSP kernelHoriz = KisGaussianKernel::createHorizontalKernel(horizontalRadius);
KisConvolutionKernelSP kernelVertical = KisGaussianKernel::createVerticalKernel(verticalRadius);
const QRect applyRect = dev->exactBounds();
KisConvolutionPainter::TestingEnginePreference enginePreference =
useFftw ?
KisConvolutionPainter::FFTW :
KisConvolutionPainter::SPATIAL;
KisConvolutionPainter horizPainter(interm, enginePreference);
horizPainter.setChannelFlags(channelFlags);
horizPainter.applyMatrix(kernelHoriz, dev,
applyRect.topLeft() - QPoint(0, verticalRadius),
applyRect.topLeft() - QPoint(0, verticalRadius),
applyRect.size() + QSize(0, 2 * verticalRadius),
BORDER_REPEAT);
KisConvolutionPainter verticalPainter(dev, enginePreference);
verticalPainter.setChannelFlags(channelFlags);
verticalPainter.applyMatrix(kernelVertical, interm,
applyRect.topLeft(),
applyRect.topLeft(),
applyRect.size(), BORDER_REPEAT);
QImage result = dev->convertToQImage(0, applyRect.x(), applyRect.y(), applyRect.width(), applyRect.height());
QString engine = useFftw ? "fftw" : "spatial";
QString testCaseName = QString("test_gaussian_%1_%2_%3.png").arg(horizontalRadius).arg(verticalRadius).arg(engine);
TestUtil::checkQImage(result,
"convolution_painter_test",
QString("gaussian_") + prefix,
testCaseName);
gc.revertTransaction();
}
dbgKrita << "Elapsed time:" << timer.elapsed() << "ms";
}
}
示例14: testCrop
void KisPaintDeviceTest::testCrop()
{
const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8();
KisPaintDeviceSP dev = new KisPaintDevice(cs);
quint8* pixel = new quint8[cs->pixelSize()];
cs->fromQColor(Qt::white, pixel);
dev->fill(-14, 8, 433, 512, pixel);
QVERIFY(dev->exactBounds() == QRect(-14, 8, 433, 512));
// Crop inside
dev->crop(50, 50, 150, 150);
QVERIFY(dev->exactBounds() == QRect(50, 50, 150, 150));
// Crop outside, pd should not grow
dev->crop(0, 0, 1000, 1000);
QVERIFY(dev->exactBounds() == QRect(50, 50, 150, 150));
}
示例15: testExactBoundsWeirdNullAlphaCase
void KisPaintDeviceTest::testExactBoundsWeirdNullAlphaCase()
{
const KoColorSpace *cs = KoColorSpaceRegistry::instance()->rgb8();
KisPaintDeviceSP dev = new KisPaintDevice(cs);
QVERIFY(dev->exactBounds().isEmpty());
dev->fill(QRect(10,10,10,10), KoColor(Qt::white, cs));
QCOMPARE(dev->exactBounds(), QRect(10,10,10,10));
const quint8 weirdPixelData[4] = {0,10,0,0};
KoColor weirdColor(weirdPixelData, cs);
dev->setPixel(6,6,weirdColor);
// such weird pixels should not change our opinion about
// device's size
QCOMPARE(dev->exactBounds(), QRect(10,10,10,10));
}