Skip to content

Commit 521c116

Browse files
committed
save/load qimage buffer using cache directory
1 parent 306973f commit 521c116

File tree

4 files changed

+89
-11
lines changed

4 files changed

+89
-11
lines changed

src/tools.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ extern void setupWidgets();
8787

8888
extern bool hasSelection;
8989

90+
bool saveImageToFile(const QImage &image, const QString &imageFilePath);
91+
QImage loadImageFromFile(const QString &imageFilePath);
92+
9093
extern void setupBackground();
9194
extern void setupScreenShot();
9295
extern void setupPenType();

src/tools/save-load.cpp

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
#include "../tools.h"
1+
#include <QImage>
2+
#include <QByteArray>
3+
#include <QFile>
24

5+
#include "../tools.h"
36

47
#ifdef LIBARCHIVE
58
extern "C" {
@@ -83,3 +86,55 @@ void setupSaveLoad(){
8386
set_shortcut(toolButtons[OPEN], Qt::Key_O, Qt::ControlModifier);
8487
#endif
8588
}
89+
90+
91+
92+
bool saveImageToFile(const QImage &image, const QString &imageFilePath) {
93+
if (image.isNull()) {
94+
return false;
95+
}
96+
97+
QFile imageFile(imageFilePath);
98+
if (!imageFile.open(QIODevice::WriteOnly)) {
99+
return false;
100+
}
101+
102+
QByteArray imageData(reinterpret_cast<const char*>(image.constBits()), image.sizeInBytes());
103+
imageFile.write(imageData);
104+
imageFile.close();
105+
106+
QFile dimensionsFile(imageFilePath+".dim");
107+
if (!dimensionsFile.open(QIODevice::WriteOnly)) {
108+
return false;
109+
}
110+
111+
QDataStream out(&dimensionsFile);
112+
out << image.width() << image.height() << static_cast<int>(image.format());
113+
dimensionsFile.close();
114+
115+
return true;
116+
}
117+
QImage loadImageFromFile(const QString &imageFilePath) {
118+
QFile dimensionsFile(imageFilePath+".dim");
119+
if (!dimensionsFile.open(QIODevice::ReadOnly)) {
120+
return QImage();
121+
}
122+
123+
QDataStream in(&dimensionsFile);
124+
int width, height, format;
125+
in >> width >> height >> format;
126+
dimensionsFile.close();
127+
128+
QFile imageFile(imageFilePath);
129+
if (!imageFile.open(QIODevice::ReadOnly)) {
130+
return QImage();
131+
}
132+
133+
QByteArray loadedData = imageFile.readAll();
134+
imageFile.close();
135+
136+
QImage loadedImage(reinterpret_cast<const uchar*>(loadedData.constData()), width, height, static_cast<QImage::Format>(format));
137+
return loadedImage.copy();
138+
}
139+
140+

src/widgets/DrawingWidget.cpp

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ extern WhiteBoard *board;
2222
extern QWidget * mainWidget;
2323
extern DrawingWidget *drawing;
2424
extern FloatingSettings *floatingSettings;
25+
QString cache = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/pardus-pen/";
2526

2627
extern void updateGoBackButtons();
2728
void removeDirectory(const QString &path);
@@ -108,7 +109,9 @@ class ImageStorage {
108109
int overlayType = BLANK;
109110
int removed = 0;
110111
void saveValue(qint64 id, QImage data) {
111-
values[id] = data;
112+
QDir dir;
113+
dir.mkpath(cache_path);
114+
saveImageToFile(data, cache_path+QString::number(id));
112115
updateGoBackButtons();
113116
if(id > history){
114117
remove(id - history);
@@ -117,19 +120,21 @@ class ImageStorage {
117120
}
118121

119122
void clear(){
120-
values.clear();
121123
image_count = 0;
122124
last_image_num = 1;
123125
removed = 0;
124126
updateGoBackButtons();
127+
removeDirectory(cache_path);
125128
}
126129

127130
QImage loadValue(qint64 id) {
128131
if(removed >= id) {
129132
id = removed +1;
130133
}
131-
if (values.contains(id)) {
132-
return values[id];
134+
QString filePath = cache_path+QString::number(id);
135+
QFile file(filePath);
136+
if(file.exists()){
137+
return loadImageFromFile(cache_path+QString::number(id));
133138
} else {
134139
QImage image = QImage(mainWidget->geometry().width(),mainWidget->geometry().height(), QImage::Format_ARGB32);
135140
image.fill(QColor("transparent"));
@@ -138,16 +143,15 @@ class ImageStorage {
138143
}
139144

140145
void remove(qint64 id){
141-
for (auto it = values.begin(); it != values.end(); ++it) {
142-
if (it.key() == id) {
143-
values.erase(it);
144-
break;
145-
}
146+
QString filePath = cache_path+QString::number(id);
147+
QFile file(filePath);
148+
if(file.exists()){
149+
file.remove();
146150
}
147151
}
148152

149153
private:
150-
QMap<qint64, QImage> values;
154+
QString cache_path = cache + generateRandomString(10)+"/";
151155
};
152156
ImageStorage images;
153157

@@ -313,6 +317,7 @@ DrawingWidget::DrawingWidget(QWidget *parent): QWidget(parent) {
313317
fpressure = get_int((char*)"pressure") / 100.0;
314318

315319
setFocusPolicy(Qt::StrongFocus);
320+
removeDirectory(cache);
316321
}
317322

318323
void DrawingWidget::addPoint(int id, QPointF data) {
@@ -725,3 +730,16 @@ void qImageToFile(const QImage& image, const QString& filename) {
725730
}
726731
}
727732

733+
QString generateRandomString(int length) {
734+
const QString characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
735+
QString randomString;
736+
737+
QRandomGenerator *generator = QRandomGenerator::global();
738+
for (int i = 0; i < length; ++i) {
739+
int index = generator->bounded(characters.length());
740+
randomString.append(characters[index]);
741+
}
742+
743+
return randomString;
744+
}
745+

src/widgets/DrawingWidget.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <QMouseEvent>
99
#include <QApplication>
1010
#include <QScreen>
11+
#include <QRandomGenerator>
1112
#include <iostream>
1213

1314
#include <QtWidgets>
@@ -162,6 +163,7 @@ class DrawingWidget : public QWidget {
162163

163164
QColor convertColor(QColor color);
164165
void qImageToFile(const QImage& image, const QString& filename);
166+
QString generateRandomString(int length);
165167

166168
#endif // DRAWINGWIDGET_H
167169

0 commit comments

Comments
 (0)