Skip to content

Commit

Permalink
tmxrasterizer: Only load the map once
Browse files Browse the repository at this point in the history
This generally doesn't speed up the process much, since saving the PNGs
is often the slowest bit, but it could matter when rendering many frames
of huge maps.

In case of rendering a world things are more complicated, so for now the
maps are still loaded repeatedly.
  • Loading branch information
bjorn committed Jan 12, 2024
1 parent 64c596b commit 00217a3
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 20 deletions.
47 changes: 28 additions & 19 deletions src/tmxrasterizer/tmxrasterizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,23 @@ int TmxRasterizer::render(const QString &fileName,

const int frameCount = qMax(1, mFrameCount);

std::unique_ptr<Map> map;
std::unique_ptr<MapRenderer> renderer;

// If we're not rendering a world, load the map once and create a renderer
if (!fileName.endsWith(QLatin1String(".world"), Qt::CaseInsensitive)) {
QString errorString;
map = readMap(fileName, &errorString);
if (!map) {
qWarning("Error while reading \"%s\":\n%s",
qUtf8Printable(fileName),
qUtf8Printable(errorString));
return 1;
}

renderer = MapRenderer::create(map.get());
}

for (int frame = 0; frame < frameCount; ++frame) {
if (mFrameCount > 0) {
imageFileName = QString(QLatin1String("%1/%2%3.%4"))
Expand All @@ -150,34 +167,26 @@ int TmxRasterizer::render(const QString &fileName,

int ret;

if (fileName.endsWith(QLatin1String(".world"), Qt::CaseInsensitive))
if (map) {
ret = renderMap(*renderer, imageFileName);
mAdvanceAnimations = mFrameDuration;
} else {
ret = renderWorld(fileName, imageFileName);
else
ret = renderMap(fileName, imageFileName);
mAdvanceAnimations = mAdvanceAnimations + mFrameDuration;
}

if (ret)
return ret;

mAdvanceAnimations += mFrameDuration;
}

return 0;
}

int TmxRasterizer::renderMap(const QString &mapFileName,
int TmxRasterizer::renderMap(const MapRenderer &renderer,
const QString &imageFileName)
{
QString errorString;
std::unique_ptr<Map> map { readMap(mapFileName, &errorString) };
if (!map) {
qWarning("Error while reading \"%s\":\n%s",
qUtf8Printable(mapFileName),
qUtf8Printable(errorString));
return 1;
}

const auto renderer = MapRenderer::create(map.get());
QRect mapBoundingRect = renderer->mapBoundingRect();
const auto map = renderer.map();
QRect mapBoundingRect = renderer.mapBoundingRect();
map->adjustBoundingRectForOffsetsAndImageLayers(mapBoundingRect);
QSize mapSize = mapBoundingRect.size();
qreal xScale, yScale;
Expand Down Expand Up @@ -209,8 +218,8 @@ int TmxRasterizer::renderMap(const QString &mapFileName,

painter.translate(-mapBoundingRect.left(), -mapBoundingRect.top());

drawMapLayers(*renderer, painter);
map.reset();
drawMapLayers(renderer, painter);

return saveImage(imageFileName, image);
}

Expand Down
2 changes: 1 addition & 1 deletion src/tmxrasterizer/tmxrasterizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ class TmxRasterizer
int mLayerTypesToShow = Layer::AnyLayerType & ~Layer::GroupLayerType;

void drawMapLayers(const MapRenderer &renderer, QPainter &painter, QPoint mapOffset = QPoint(0, 0)) const;
int renderMap(const QString &mapFileName, const QString &imageFileName);
int renderMap(const MapRenderer &renderer, const QString &imageFileName);
int renderWorld(const QString &worldFileName, const QString &imageFileName);
int saveImage(const QString &imageFileName, const QImage &image) const;
bool shouldDrawLayer(const Layer *layer) const;
Expand Down

0 comments on commit 00217a3

Please sign in to comment.