summaryrefslogtreecommitdiff
path: root/src/lib/writer.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2023-10-14 21:48:25 +0200
committerCarl Hetherington <cth@carlh.net>2023-10-15 09:10:18 +0200
commit3c802dd6d1451c2c8a7e188f8379738d72e907eb (patch)
tree454396cf5451535b8708a0c4961c7d5c2b30ea1f /src/lib/writer.cc
parent1bfe44b1503fb0f5cffda135076709014337de52 (diff)
Fix DCP content font ID allocation to cope with DCPs that have multiple fonts
with the same name in the same reel (#2600). Previously we had this id_for_font_in_reel() which would give an ID of N_font-ID. This means we got duplicate font IDs. Here we replace that method with FontAllocator, which gives an ID of N_font-ID for the first font and M_font-ID, where M is a number higher than the highest reel index. The idea is to support the required new IDs without breaking exisiting projects. There is some documentation of how it works in doc/design/fonts
Diffstat (limited to 'src/lib/writer.cc')
-rw-r--r--src/lib/writer.cc46
1 files changed, 1 insertions, 45 deletions
diff --git a/src/lib/writer.cc b/src/lib/writer.cc
index 6bc3da504..9ab3d4e1e 100644
--- a/src/lib/writer.cc
+++ b/src/lib/writer.cc
@@ -875,53 +875,9 @@ Writer::write (vector<shared_ptr<Font>> fonts)
}
_chosen_interop_font = fonts[0];
} else {
- set<string> used_ids;
-
- /* Return the index of a _N at the end of a string, or string::npos */
- auto underscore_number_position = [](string s) {
- auto last_underscore = s.find_last_of("_");
- if (last_underscore == string::npos) {
- return string::npos;
- }
-
- for (auto i = last_underscore + 1; i < s.size(); ++i) {
- if (!isdigit(s[i])) {
- return string::npos;
- }
- }
-
- return last_underscore;
- };
-
- /* Write fonts to _fonts, changing any duplicate IDs so that they are unique */
for (auto font: fonts) {
- auto id = fix_id(font->id());
- if (used_ids.find(id) == used_ids.end()) {
- /* This ID is unique so we can just use it as-is */
- _fonts.put(font, id);
- used_ids.insert(id);
- } else {
- auto end = underscore_number_position(id);
- if (end == string::npos) {
- /* This string has no _N suffix, so add one */
- id += "_0";
- end = underscore_number_position(id);
- }
-
- ++end;
-
- /* Increment the suffix until we find a unique one */
- auto number = dcp::raw_convert<int>(id.substr(end));
- while (used_ids.find(id) != used_ids.end()) {
- ++number;
- id = String::compose("%1_%2", id.substr(0, end - 1), number);
- }
- used_ids.insert(id);
- }
- _fonts.put(font, id);
+ _fonts.put(font, fix_id(font->id()));
}
-
- DCPOMATIC_ASSERT(_fonts.map().size() == used_ids.size());
}
}