Selaa lähdekoodia

only calc minimaps once

Laserlicht 2 vuotta sitten
vanhempi
sitoutus
58dfc55ca3
2 muutettua tiedostoa jossa 28 lisäystä ja 33 poistoa
  1. 24 31
      client/windows/CMapOverview.cpp
  2. 4 2
      client/windows/CMapOverview.h

+ 24 - 31
client/windows/CMapOverview.cpp

@@ -99,9 +99,9 @@ Canvas CMapOverview::CMapOverviewWidget::createMinimapForLayer(std::unique_ptr<C
 	return canvas;
 }
 
-std::vector<std::shared_ptr<IImage>> CMapOverview::CMapOverviewWidget::createMinimaps(ResourcePath resource, Point size) const
+std::vector<Canvas> CMapOverview::CMapOverviewWidget::createMinimaps(ResourcePath resource) const
 {
-	std::vector<std::shared_ptr<IImage>> ret = std::vector<std::shared_ptr<IImage>>();
+	std::vector<Canvas> ret = std::vector<Canvas>();
 
 	CMapService mapService;
 	std::unique_ptr<CMap> map;
@@ -114,22 +114,15 @@ std::vector<std::shared_ptr<IImage>> CMapOverview::CMapOverviewWidget::createMin
 		return ret;
 	}
 
-	return createMinimaps(map, size);
+	return createMinimaps(map);
 }
 
-std::vector<std::shared_ptr<IImage>> CMapOverview::CMapOverviewWidget::createMinimaps(std::unique_ptr<CMap> & map, Point size) const
+std::vector<Canvas> CMapOverview::CMapOverviewWidget::createMinimaps(std::unique_ptr<CMap> & map) const
 {
-	std::vector<std::shared_ptr<IImage>> ret = std::vector<std::shared_ptr<IImage>>();
+	std::vector<Canvas> ret = std::vector<Canvas>();
 
 	for(int i = 0; i < (map->twoLevel ? 2 : 1); i++)
-	{
-		Canvas canvas = createMinimapForLayer(map, i);
-		Canvas canvasScaled = Canvas(size);
-		canvasScaled.drawScaled(canvas, Point(0, 0), size);
-		std::shared_ptr<IImage> img = GH.renderHandler().createImage(canvasScaled.getInternalSurface());
-		
-		ret.push_back(img);
-	}
+		ret.push_back(createMinimapForLayer(map, i));
 
 	return ret;
 }
@@ -141,9 +134,23 @@ std::shared_ptr<CPicture> CMapOverview::CMapOverviewWidget::buildDrawMinimap(con
 	auto rect = readRect(config["rect"]);
 	auto id = config["id"].Integer();
 
-	if(!renderImage)
+	if(id >= minimaps.size())
 		return nullptr;
 
+	Canvas canvasScaled = Canvas(Point(rect.w, rect.h));
+	canvasScaled.drawScaled(minimaps[id], Point(0, 0), Point(rect.w, rect.h));
+	std::shared_ptr<IImage> img = GH.renderHandler().createImage(canvasScaled.getInternalSurface());
+
+	return std::make_shared<CPicture>(img, Point(rect.x, rect.y));
+}
+
+CMapOverview::CMapOverviewWidget::CMapOverviewWidget(CMapOverview& parent):
+	InterfaceObjectConfigurable(), p(parent)
+{
+	drawPlayerElements = p.tabType == ESelectionScreen::newGame;
+	renderImage = settings["lobby"]["mapPreview"].Bool();
+
+	// create minimaps
 	ResourcePath res = ResourcePath(p.resource.getName(), EResType::MAP);
 	std::unique_ptr<CMap> campaignMap = nullptr;
 	if(p.tabType != ESelectionScreen::newGame)
@@ -159,26 +166,12 @@ std::shared_ptr<CPicture> CMapOverview::CMapOverviewWidget::buildDrawMinimap(con
 			campaignMap = startInfo->campState->getMap(*startInfo->campState->currentScenario());
 		res = ResourcePath(startInfo->fileURI, EResType::MAP);
 	}
-
-	std::vector<std::shared_ptr<IImage>> images;
 	if(!campaignMap)
-		images = createMinimaps(res, Point(rect.w, rect.h));
+		minimaps = createMinimaps(res);
 	else
-		images = createMinimaps(campaignMap, Point(rect.w, rect.h));
-
-
-	if(id >= images.size())
-		return nullptr;
-
-	return std::make_shared<CPicture>(images[id], Point(rect.x, rect.y));
-}
-
-CMapOverview::CMapOverviewWidget::CMapOverviewWidget(CMapOverview& parent):
-	InterfaceObjectConfigurable(), p(parent)
-{
-	drawPlayerElements = p.tabType == ESelectionScreen::newGame;
-	renderImage = settings["lobby"]["mapPreview"].Bool();
+		minimaps = createMinimaps(campaignMap);
 
+	// config
 	const JsonNode config(JsonPath::builtin("config/widgets/mapOverview.json"));
 
 	REGISTER_BUILDER("drawMinimap", &CMapOverview::CMapOverviewWidget::buildDrawMinimap);

+ 4 - 2
client/windows/CMapOverview.h

@@ -34,9 +34,11 @@ class CMapOverview : public CWindowObject
 
 		bool drawPlayerElements;
 		bool renderImage;
+		std::vector<Canvas> minimaps;
+
 		Canvas createMinimapForLayer(std::unique_ptr<CMap> & map, int layer) const;
-		std::vector<std::shared_ptr<IImage>> createMinimaps(ResourcePath resource, Point size) const;
-		std::vector<std::shared_ptr<IImage>> createMinimaps(std::unique_ptr<CMap> & map, Point size) const;
+		std::vector<Canvas> createMinimaps(ResourcePath resource) const;
+		std::vector<Canvas> createMinimaps(std::unique_ptr<CMap> & map) const;
 
 		std::shared_ptr<CPicture> buildDrawMinimap(const JsonNode & config) const;
 	public: