#include "image_forever.h" #include #include #include #include struct ImageForeverItem { QImage* image; dust3d::Uuid id; QByteArray* imageByteArray; }; static std::map g_foreverMap; static QMutex g_mapMutex; const QImage* ImageForever::get(const dust3d::Uuid& id) { QMutexLocker locker(&g_mapMutex); auto findResult = g_foreverMap.find(id); if (findResult == g_foreverMap.end()) return nullptr; return findResult->second.image; } void ImageForever::copy(const dust3d::Uuid& id, QImage& image) { QMutexLocker locker(&g_mapMutex); auto findResult = g_foreverMap.find(id); if (findResult == g_foreverMap.end()) return; image = *findResult->second.image; } const QByteArray* ImageForever::getPngByteArray(const dust3d::Uuid& id) { QMutexLocker locker(&g_mapMutex); auto findResult = g_foreverMap.find(id); if (findResult == g_foreverMap.end()) return nullptr; return findResult->second.imageByteArray; } dust3d::Uuid ImageForever::add(const QImage* image, dust3d::Uuid toId) { QMutexLocker locker(&g_mapMutex); if (nullptr == image) return dust3d::Uuid(); dust3d::Uuid newId = toId.isNull() ? dust3d::Uuid::createUuid() : toId; if (g_foreverMap.find(newId) != g_foreverMap.end()) return newId; QImage* newImage = new QImage(*image); QByteArray* imageByteArray = new QByteArray(); QBuffer pngBuffer(imageByteArray); pngBuffer.open(QIODevice::WriteOnly); newImage->save(&pngBuffer, "PNG"); g_foreverMap[newId] = { newImage, newId, imageByteArray }; return newId; } void ImageForever::remove(const dust3d::Uuid& id) { QMutexLocker locker(&g_mapMutex); auto findImage = g_foreverMap.find(id); if (findImage == g_foreverMap.end()) return; delete findImage->second.image; delete findImage->second.imageByteArray; g_foreverMap.erase(id); }