static void extendMapRect(QRect &mapBoundingRect, const MapRenderer &renderer) { // Start with the basic map size QRectF rect(mapBoundingRect); // Take into account large tiles extending beyond their cell for (const Layer *layer : renderer.map()->tileLayers()) { const TileLayer *tileLayer = static_cast<const TileLayer*>(layer); const QPointF offset = tileLayer->totalOffset(); for (int y = 0; y < tileLayer->height(); ++y) { for (int x = 0; x < tileLayer->width(); ++x) { const Cell &cell = tileLayer->cellAt(x, y); if (!cell.isEmpty()) { QRectF r = cellRect(renderer, cell, QPointF(x, y)); r.translate(offset); rect |= r; } } } } mapBoundingRect = rect.toAlignedRect(); }
static QRectF cellRect(const MapRenderer &renderer, const Cell &cell, const QPointF &tileCoords) { const Tile *tile = cell.tile(); if (!tile) return QRectF(); QPointF pixelCoords = renderer.tileToScreenCoords(tileCoords); QPointF offset = tile->offset(); QSize size = tile->size(); if (cell.flippedAntiDiagonally()) std::swap(size.rwidth(), size.rheight()); // This is a correction needed because tileToScreenCoords does not return // the bottom-left origin of the tile image, but rather the top-left // corner of the cell. pixelCoords.ry() += renderer.map()->tileHeight() - size.height(); return QRectF(pixelCoords, size).translated(offset); }