Check for available memory on linux too.

This commit is contained in:
Gres 2015-09-28 22:12:38 +03:00
parent 256e812401
commit bd6b417cd8

View File

@ -7,7 +7,22 @@
#include "ImageProcessing.h" #include "ImageProcessing.h"
#include "StAssert.h" #include "StAssert.h"
#ifdef WIN32 #if defined(Q_OS_LINUX)
# include <fstream>
# include <limits>
qint64 getFreeMemory () {
std::string token;
std::ifstream file ("/proc/meminfo");
qint64 freeMem = 0;
while (file >> token) {
if (token == "MemFree:" || token == "Buffers:" || token == "Cached:") {
unsigned long mem = 0;
freeMem += (file >> mem) ? mem : 0;
}
}
return freeMem * 1024;
}
#elif defined(Q_OS_WIN)
# include <windows.h> # include <windows.h>
qint64 getFreeMemory () { qint64 getFreeMemory () {
MEMORYSTATUSEX statex; MEMORYSTATUSEX statex;
@ -128,16 +143,17 @@ Pix * prepareImage (const QImage &image, int preferredScale) {
float scaleY = std::min (float (preferredScale), maxScaleY); float scaleY = std::min (float (preferredScale), maxScaleY);
float scale = std::min (scaleX, scaleY); float scale = std::min (scaleX, scaleY);
#ifdef WIN32
qint64 availableMemory = getFreeMemory () * 0.95; qint64 availableMemory = getFreeMemory () * 0.95;
qint32 actualSize = gray->w * gray->h * gray->d / 8; if (availableMemory > 0) {
float maxScaleMemory = float (availableMemory) / actualSize; qint32 actualSize = gray->w * gray->h * gray->d / 8;
scale = std::min (scale, maxScaleMemory); float maxScaleMemory = float (availableMemory) / actualSize;
#endif scale = std::min (scale, maxScaleMemory);
}
scaled = pixScale (gray, scale, scale); scaled = pixScale (gray, scale, scale);
if (scaled == NULL) {
scaled = gray;
}
} }
ST_ASSERT (scaled != NULL);
if (scaled != gray) { if (scaled != gray) {
pixDestroy (&gray); pixDestroy (&gray);
} }