void KisPaintDeviceTest::testPlanarReadWrite() { const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8(); KisPaintDeviceSP dev = new KisPaintDevice(cs); quint8* pixel = new quint8[cs->pixelSize()]; cs->fromQColor(QColor(255, 200, 155, 100), pixel); dev->fill(0, 0, 5000, 5000, pixel); delete[] pixel; QColor c1; dev->pixel(5, 5, &c1); QVector<quint8*> planes = dev->readPlanarBytes(500, 500, 100, 100); QVector<quint8*> swappedPlanes; QCOMPARE((int)planes.size(), (int)dev->channelCount()); for (int i = 0; i < 100*100; i++) { // BGRA encoded QVERIFY(planes.at(2)[i] == 255); QVERIFY(planes.at(1)[i] == 200); QVERIFY(planes.at(0)[i] == 155); QVERIFY(planes.at(3)[i] == 100); } for (uint i = 1; i < dev->channelCount() + 1; ++i) { swappedPlanes.append(planes[dev->channelCount() - i]); } dev->writePlanarBytes(swappedPlanes, 0, 0, 100, 100); dev->convertToQImage(0, 0, 0, 1000, 1000).save("planar.png"); dev->pixel(5, 5, &c1); QVERIFY(c1.red() == 200); QVERIFY(c1.green() == 255); QVERIFY(c1.blue() == 100); QVERIFY(c1.alpha() == 155); dev->pixel(75, 50, &c1); QVERIFY(c1.red() == 200); QVERIFY(c1.green() == 255); QVERIFY(c1.blue() == 100); QVERIFY(c1.alpha() == 155); // check if one of the planes is Null. Q_ASSERT(planes.size() == 4); delete planes[2]; planes[2] = 0; dev->writePlanarBytes(planes, 0, 0, 100, 100); dev->convertToQImage(0, 0, 0, 1000, 1000).save("planar_noR.png"); dev->pixel(75, 50, &c1); QCOMPARE(c1.red(), 200); QCOMPARE(c1.green(), 200); QCOMPARE(c1.blue(), 155); QCOMPARE(c1.alpha(), 100); qDeleteAll(planes); swappedPlanes.clear(); }
KisPaintDeviceSP KisGmicSimpleConvertor::convertFromGmicImage(CImg< float >& gmicImage, bool &preserveAlpha) { const KoColorSpace *rgbaFloat32bitcolorSpace = KoColorSpaceRegistry::instance()->colorSpace(RGBAColorModelID.id(), Float32BitsColorDepthID.id(), KoColorSpaceRegistry::instance()->rgb8()->profile()); KisPaintDeviceSP dev = new KisPaintDevice(rgbaFloat32bitcolorSpace); unsigned int channelBytes = gmicImage._width * gmicImage._height * sizeof(float); if (channelBytes == channelSize() * sizeof(float)) { // ok, we can reuse read plannar bytes here dbgPlugins << "[krita] Re-using read plannar bytes"; if ((gmicImage._spectrum == 1) || (gmicImage._spectrum == 3)) { dbgPlugins << "[krita] Releasing alpha channel"; // we can delete alpha channel releaseAlphaChannel(); } } else { // re-accumullate buffers, output image has different dimension..not sure if this ever happens deletePlanes(); bool alphaChannelEnabled = ((gmicImage._spectrum == 2) || (gmicImage._spectrum == 4)); dbgPlugins << "Accumulating...!"; accumulate(gmicImage._width * gmicImage._height, alphaChannelEnabled); } switch (gmicImage._spectrum) { case 1: { grayscale2rgb(gmicImage, m_planarBytes); preserveAlpha = true; break; } case 2: { grayscaleAlpha2rgba(gmicImage, m_planarBytes); break; } case 3: { rgb2rgb(gmicImage, m_planarBytes); preserveAlpha = true; break; } case 4: rgba2rgba(gmicImage, m_planarBytes); break; default: { dbgPlugins << "Unsupported gmic output format : " << gmicImage._width << gmicImage._height << gmicImage._depth << gmicImage._spectrum; } } dev->writePlanarBytes(m_planarBytes, 0, 0, gmicImage._width, gmicImage._height); // release planes deletePlanes(); return dev; }