Browse Source

Stylesheet merge reserve container sizes

Michael Ragazzon 6 years ago
parent
commit
5a07349d44
3 changed files with 27 additions and 0 deletions
  1. 4 0
      Include/RmlUi/Core/Spritesheet.h
  2. 17 0
      Source/Core/Spritesheet.cpp
  3. 6 0
      Source/Core/StyleSheet.cpp

+ 4 - 0
Include/RmlUi/Core/Spritesheet.h

@@ -83,6 +83,10 @@ public:
 	/// Merge 'other' into this.
 	void Merge(const SpritesheetList& other);
 
+	void Reserve(size_t size_sprite_sheets, size_t size_sprites);
+	size_t NumSpriteSheets() const;
+	size_t NumSprites() const;
+
 private:
 	SpritesheetMap spritesheet_map;
 	SpriteMap sprite_map;

+ 17 - 0
Source/Core/Spritesheet.cpp

@@ -123,5 +123,22 @@ void SpritesheetList::Merge(const SpritesheetList& other)
 	}
 }
 
+void SpritesheetList::Reserve(size_t size_sprite_sheets, size_t size_sprites) 
+{ 
+	spritesheet_map.reserve(size_sprite_sheets);
+	// There seems to be a bug in robin hood unordered map (or we are doing something wrong). For certain sizes, we don't find any sprites during the merge after.
+	//sprite_map.reserve(size_sprites);
+}
+
+size_t SpritesheetList::NumSpriteSheets() const 
+{
+	return spritesheet_map.size();
+}
+
+size_t SpritesheetList::NumSprites() const 
+{ 
+	return sprite_map.size();
+}
+
 }
 }

+ 6 - 0
Source/Core/StyleSheet.cpp

@@ -88,6 +88,7 @@ StyleSheet* StyleSheet::CombineStyleSheet(const StyleSheet* other_sheet) const
 	}
 
 	// Any matching @keyframe names are overridden as per CSS rules
+	new_sheet->keyframes.reserve(keyframes.size() + other_sheet->keyframes.size());
 	new_sheet->keyframes = keyframes;
 	for (auto& other_keyframes : other_sheet->keyframes)
 	{
@@ -95,12 +96,17 @@ StyleSheet* StyleSheet::CombineStyleSheet(const StyleSheet* other_sheet) const
 	}
 
 	// Copy over the decorators, and replace any matching decorator names from other_sheet
+	new_sheet->decorator_map.reserve(decorator_map.size() + other_sheet->decorator_map.size());
 	new_sheet->decorator_map = decorator_map;
 	for (auto& other_decorator: other_sheet->decorator_map)
 	{
 		new_sheet->decorator_map[other_decorator.first] = other_decorator.second;
 	}
 
+	new_sheet->spritesheet_list.Reserve(
+		spritesheet_list.NumSpriteSheets() + other_sheet->spritesheet_list.NumSpriteSheets(),
+		spritesheet_list.NumSprites() + other_sheet->spritesheet_list.NumSprites()
+	);
 	new_sheet->spritesheet_list = other_sheet->spritesheet_list;
 	new_sheet->spritesheet_list.Merge(spritesheet_list);