Move Image size check to PaintEngine
parent
cbe326a798
commit
78c2c107db
|
@ -14,6 +14,8 @@ public:
|
||||||
Giant // 15px bold?
|
Giant // 15px bold?
|
||||||
};
|
};
|
||||||
virtual ~PaintEngine() = default;
|
virtual ~PaintEngine() = default;
|
||||||
|
/* Checks if the requested imagesize can handled by the Paintengine. Prints warnings to out. Returns true if there are no trouble*/
|
||||||
|
virtual bool checkImageSize(int w, int h, std::ostream &out) = 0;
|
||||||
virtual bool create(int w, int h) = 0;
|
virtual bool create(int w, int h) = 0;
|
||||||
virtual void fill(const Color &color) = 0;
|
virtual void fill(const Color &color) = 0;
|
||||||
virtual void drawText(int x, int y, Font font, const std::string &text, const Color &color) = 0;
|
virtual void drawText(int x, int y, Font font, const std::string &text, const Color &color) = 0;
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
#include <gdfontmb.h>
|
#include <gdfontmb.h>
|
||||||
#include <gdfontl.h>
|
#include <gdfontl.h>
|
||||||
|
@ -26,6 +27,32 @@ PaintEngine_libgd::~PaintEngine_libgd()
|
||||||
clean();
|
clean();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PaintEngine_libgd::checkImageSize(int w, int h, std::ostream &out)
|
||||||
|
{
|
||||||
|
constexpr int int_max = std::numeric_limits<int>::max();
|
||||||
|
constexpr bool is32bit = (sizeof(void *) == 4);
|
||||||
|
// Estimated approximate maximum was determined by trial and error...
|
||||||
|
// (24100x24100 succeeded; 24200x24200 failed)
|
||||||
|
constexpr long long estimated_max_pixels_32bit = 24100L * 24100L;
|
||||||
|
|
||||||
|
// Print some useful messages in cases where it may not be possible to generate the image...
|
||||||
|
long long pixels = w*h;
|
||||||
|
// Study the libgd code to known why the maximum is the following:
|
||||||
|
long long max_pixels = int_max - int_max % h;
|
||||||
|
|
||||||
|
if (pixels > max_pixels) {
|
||||||
|
out << "WARNING: Image will have " << pixels << " pixels; the PNG graphics library will refuse to handle more than approximately " << int_max << std::endl;
|
||||||
|
out << " (If map generation fails, consider using --scalefactor to reduce the image size by a factor 2)" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (is32bit && pixels > estimated_max_pixels_32bit) {
|
||||||
|
out << "WARNING: Image will have " << pixels << " pixels; The maximum achievable on a 32-bit system is approximately " << estimated_max_pixels_32bit << std::endl;
|
||||||
|
out << " (If map generation fails, consider using --scalefactor to reduce the image size by a factor 2 or 4)" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool PaintEngine_libgd::create(int w, int h)
|
bool PaintEngine_libgd::create(int w, int h)
|
||||||
{
|
{
|
||||||
width = w;
|
width = w;
|
||||||
|
|
|
@ -9,6 +9,7 @@ class PaintEngine_libgd :
|
||||||
public:
|
public:
|
||||||
PaintEngine_libgd();
|
PaintEngine_libgd();
|
||||||
~PaintEngine_libgd() override;
|
~PaintEngine_libgd() override;
|
||||||
|
bool checkImageSize(int w, int h, std::ostream & out) override;
|
||||||
bool create(int w, int h) override;
|
bool create(int w, int h) override;
|
||||||
void fill(const Color &color) override;
|
void fill(const Color &color) override;
|
||||||
void drawText(int x, int y, Font font, const std::string &text, const Color &color) override;
|
void drawText(int x, int y, Font font, const std::string &text, const Color &color) override;
|
||||||
|
|
|
@ -1200,23 +1200,6 @@ void TileGenerator::computeMapParameters(const std::string &input)
|
||||||
m_pictWidth += m_tileBorderXCount * m_tileBorderSize;
|
m_pictWidth += m_tileBorderXCount * m_tileBorderSize;
|
||||||
m_pictHeight /= m_scaleFactor;
|
m_pictHeight /= m_scaleFactor;
|
||||||
m_pictHeight += m_tileBorderYCount * m_tileBorderSize;
|
m_pictHeight += m_tileBorderYCount * m_tileBorderSize;
|
||||||
|
|
||||||
// Print some useful messages in cases where it may not be possible to generate the image...
|
|
||||||
long long pixels = static_cast<long long>(m_pictWidth + borderLeft() + borderRight()) * (m_pictHeight + borderTop() + borderBottom());
|
|
||||||
// Study the libgd code to known why the maximum is the following:
|
|
||||||
long long max_pixels = INT_MAX - INT_MAX % m_pictHeight;
|
|
||||||
if (pixels > max_pixels) {
|
|
||||||
cerr << "WARNING: Image will have " << pixels << " pixels; the PNG graphics library will refuse to handle more than approximately " << INT_MAX << std::endl;
|
|
||||||
cerr << " (If map generation fails, consider using --scalefactor to reduce the image size by a factor 2)" << std::endl;
|
|
||||||
}
|
|
||||||
// Estimated approximate maximum was determined by trial and error...
|
|
||||||
// (24100x24100 succeeded; 24200x24200 failed)
|
|
||||||
#define ESTIMATED_MAX_PIXELS_32BIT (24100*24100L)
|
|
||||||
else if (sizeof(void *) == 4 && pixels > ESTIMATED_MAX_PIXELS_32BIT) {
|
|
||||||
cerr << "WARNING: Image will have " << pixels << " pixels; The maximum achievable on a 32-bit system is approximately " << ESTIMATED_MAX_PIXELS_32BIT << std::endl;
|
|
||||||
cerr << " (If map generation fails, consider using --scalefactor to reduce the image size by a factor 2 or 4)" << std::endl;
|
|
||||||
}
|
|
||||||
#undef ESTIMATED_MAX_PIXELS_32BIT
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1226,6 +1209,8 @@ void TileGenerator::createImage()
|
||||||
int totalPictWidth = m_pictWidth + borderLeft() + borderRight();
|
int totalPictWidth = m_pictWidth + borderLeft() + borderRight();
|
||||||
|
|
||||||
paintEngine = new PaintEngine_libgd();
|
paintEngine = new PaintEngine_libgd();
|
||||||
|
|
||||||
|
paintEngine->checkImageSize(totalPictWidth, totalPictHeight, std::cerr);
|
||||||
if (!paintEngine->create(totalPictWidth, totalPictHeight)) {
|
if (!paintEngine->create(totalPictWidth, totalPictHeight)) {
|
||||||
ostringstream oss;
|
ostringstream oss;
|
||||||
oss << "Failed to allocate " << totalPictWidth << "x" << totalPictHeight << " image";
|
oss << "Failed to allocate " << totalPictWidth << "x" << totalPictHeight << " image";
|
||||||
|
|
Loading…
Reference in New Issue