1
0
Fork 0

Codechange: Use structured bindings when iterating font_mapping.

pull/13182/head
Peter Nelson 2024-12-20 17:46:14 +00:00 committed by Peter Nelson
parent c78e309b16
commit 59680867c3
3 changed files with 29 additions and 29 deletions

View File

@ -338,12 +338,12 @@ std::vector<ICURun> ItemizeStyle(std::vector<ICURun> &runs_current, FontMap &fon
int cur_pos = 0;
auto cur_run = runs_current.begin();
for (auto const &font_map : font_mapping) {
while (cur_pos < font_map.first && cur_run != runs_current.end()) {
int stop_pos = std::min(font_map.first, cur_run->start + cur_run->length);
for (auto const &[position, font] : font_mapping) {
while (cur_pos < position && cur_run != runs_current.end()) {
int stop_pos = std::min(position, cur_run->start + cur_run->length);
assert(stop_pos - cur_pos > 0);
runs.emplace_back(cur_pos, stop_pos - cur_pos, cur_run->level, cur_run->script, font_map.second);
runs.emplace_back(cur_pos, stop_pos - cur_pos, cur_run->level, cur_run->script, font);
if (stop_pos == cur_run->start + cur_run->length) cur_run++;
cur_pos = stop_pos;
@ -360,8 +360,8 @@ std::vector<ICURun> ItemizeStyle(std::vector<ICURun> &runs_current, FontMap &fon
if (length == 0) return nullptr;
/* Can't layout our in-built sprite fonts. */
for (auto const &pair : font_mapping) {
if (pair.second->fc->IsBuiltInFont()) return nullptr;
for (auto const &[position, font] : font_mapping) {
if (font->fc->IsBuiltInFont()) return nullptr;
}
auto runs = ItemizeBidi(buff, length);

View File

@ -157,8 +157,8 @@ static CTRunDelegateCallbacks _sprite_font_callback = {
if (length == 0) return nullptr;
/* Can't layout our in-built sprite fonts. */
for (const auto &i : font_mapping) {
if (i.second->fc->IsBuiltInFont()) return nullptr;
for (const auto &[position, font] : font_mapping) {
if (font->fc->IsBuiltInFont()) return nullptr;
}
/* Make attributed string with embedded font information. */
@ -174,35 +174,35 @@ static CTRunDelegateCallbacks _sprite_font_callback = {
/* Apply font and colour ranges to our string. This is important to make sure
* that we get proper glyph boundaries on style changes. */
int last = 0;
for (const auto &i : font_mapping) {
if (i.first - last == 0) continue;
for (const auto &[position, font] : font_mapping) {
if (position - last == 0) continue;
CTFontRef font = (CTFontRef)i.second->fc->GetOSHandle();
if (font == nullptr) {
if (!_font_cache[i.second->fc->GetSize()]) {
CTFontRef font_handle = static_cast<CTFontRef>(font->fc->GetOSHandle());
if (font_handle == nullptr) {
if (!_font_cache[font->fc->GetSize()]) {
/* Cache font information. */
CFAutoRelease<CFStringRef> font_name(CFStringCreateWithCString(kCFAllocatorDefault, i.second->fc->GetFontName().c_str(), kCFStringEncodingUTF8));
_font_cache[i.second->fc->GetSize()].reset(CTFontCreateWithName(font_name.get(), i.second->fc->GetFontSize(), nullptr));
CFAutoRelease<CFStringRef> font_name(CFStringCreateWithCString(kCFAllocatorDefault, font->fc->GetFontName().c_str(), kCFStringEncodingUTF8));
_font_cache[font->fc->GetSize()].reset(CTFontCreateWithName(font_name.get(), font->fc->GetFontSize(), nullptr));
}
font = _font_cache[i.second->fc->GetSize()].get();
font_handle = _font_cache[font->fc->GetSize()].get();
}
CFAttributedStringSetAttribute(str.get(), CFRangeMake(last, i.first - last), kCTFontAttributeName, font);
CFAttributedStringSetAttribute(str.get(), CFRangeMake(last, position - last), kCTFontAttributeName, font_handle);
CGColorRef color = CGColorCreateGenericGray((uint8_t)i.second->colour / 255.0f, 1.0f); // We don't care about the real colours, just that they are different.
CFAttributedStringSetAttribute(str.get(), CFRangeMake(last, i.first - last), kCTForegroundColorAttributeName, color);
CGColorRef color = CGColorCreateGenericGray((uint8_t)font->colour / 255.0f, 1.0f); // We don't care about the real colours, just that they are different.
CFAttributedStringSetAttribute(str.get(), CFRangeMake(last, position - last), kCTForegroundColorAttributeName, color);
CGColorRelease(color);
/* Install a size callback for our special private-use sprite glyphs in case the font does not provide them. */
for (ssize_t c = last; c < i.first; c++) {
if (buff[c] >= SCC_SPRITE_START && buff[c] <= SCC_SPRITE_END && i.second->fc->MapCharToGlyph(buff[c], false) == 0) {
CFAutoRelease<CTRunDelegateRef> del(CTRunDelegateCreate(&_sprite_font_callback, (void *)(size_t)(buff[c] | (i.second->fc->GetSize() << 24))));
for (ssize_t c = last; c < position; c++) {
if (buff[c] >= SCC_SPRITE_START && buff[c] <= SCC_SPRITE_END && font->fc->MapCharToGlyph(buff[c], false) == 0) {
CFAutoRelease<CTRunDelegateRef> del(CTRunDelegateCreate(&_sprite_font_callback, (void *)(size_t)(buff[c] | (font->fc->GetSize() << 24))));
/* According to the offical documentation, if a run delegate is used, the char should always be 0xFFFC. */
CFAttributedStringReplaceString(str.get(), CFRangeMake(c, 1), replacment_str.get());
CFAttributedStringSetAttribute(str.get(), CFRangeMake(c, 1), kCTRunDelegateAttributeName, del.get());
}
}
last = i.first;
last = position;
}
CFAttributedStringEndEditing(str.get());

View File

@ -283,8 +283,8 @@ static std::vector<SCRIPT_ITEM> UniscribeItemizeString(UniscribeParagraphLayoutF
if (length == 0) return nullptr;
/* Can't layout our in-built sprite fonts. */
for (auto const &pair : font_mapping) {
if (pair.second->fc->IsBuiltInFont()) return nullptr;
for (auto const &[position, font] : font_mapping) {
if (font->fc->IsBuiltInFont()) return nullptr;
}
/* Itemize text. */
@ -297,12 +297,12 @@ static std::vector<SCRIPT_ITEM> UniscribeItemizeString(UniscribeParagraphLayoutF
int cur_pos = 0;
std::vector<SCRIPT_ITEM>::iterator cur_item = items.begin();
for (auto const &i : font_mapping) {
while (cur_pos < i.first && cur_item != items.end() - 1) {
for (auto const &[position, font] : font_mapping) {
while (cur_pos < position && cur_item != items.end() - 1) {
/* Add a range that spans the intersection of the remaining item and font run. */
int stop_pos = std::min(i.first, (cur_item + 1)->iCharPos);
int stop_pos = std::min(position, (cur_item + 1)->iCharPos);
assert(stop_pos - cur_pos > 0);
ranges.emplace_back(cur_pos, stop_pos - cur_pos, i.second, cur_item->a);
ranges.emplace_back(cur_pos, stop_pos - cur_pos, font, cur_item->a);
/* Shape the range. */
if (!UniscribeShapeRun(buff, ranges.back())) {