Skip to content

Commit

Permalink
slightly improve text layout speed, 4 -> 3
Browse files Browse the repository at this point in the history
  • Loading branch information
schombert committed Oct 8, 2023
1 parent 0ac1d43 commit 8a7a91a
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 13 deletions.
4 changes: 0 additions & 4 deletions src/ai/ai.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -632,10 +632,6 @@ void take_ai_decisions(sys::state& state) {
auto allow = d.get_allow();
auto ai_will_do = d.get_ai_will_do();

if(d.id.value >= 673) {
auto name = text::produce_simple_string(state, d.get_name());
}

ve::execute_serial_fast<dcon::nation_id>(state.world.nation_size(), [&](auto ids) {
ve::vbitfield_type filter_a = potential
? (ve::compress_mask(trigger::evaluate(state, potential, trigger::to_generic(ids), trigger::to_generic(ids), 0)) & !state.world.nation_get_is_player_controlled(ids))
Expand Down
2 changes: 1 addition & 1 deletion src/gui/topbar_subwindows/gui_diplomacy_window.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -554,7 +554,7 @@ class diplomacy_priority_button : public right_click_button_element_base {
uint8_t rel_flags = bool(rel) ? state.world.gp_relationship_get_status(rel) : 0;
switch(rel_flags & nations::influence::priority_mask) {
case nations::influence::priority_zero:
command::change_influence_priority(state, state.local_player_nation, nation_id, 4);
command::change_influence_priority(state, state.local_player_nation, nation_id, 3);
break;
case nations::influence::priority_one:
command::change_influence_priority(state, state.local_player_nation, nation_id, 0);
Expand Down
19 changes: 14 additions & 5 deletions src/text/fonts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1153,7 +1153,11 @@ void font_manager::load_font(font& fnt, char const* file_data, uint32_t file_siz
}
}

float font::kerning(char codepoint_first, char codepoint_second) const {
float font::kerning(char codepoint_first, char codepoint_second) {
if(auto it = kernings.find(uint16_t((uint16_t(codepoint_first) << 8) | uint16_t(codepoint_second))); it != kernings.end()) {
return it->second;
}

auto utf16_first = win1250toUTF16(codepoint_first);
auto utf16_second = win1250toUTF16(codepoint_second);
auto index_a = FT_Get_Char_Index(font_face, utf16_first);
Expand All @@ -1167,16 +1171,21 @@ float font::kerning(char codepoint_first, char codepoint_second) const {
}

if((index_a == 0) || (index_b == 0)) {
kernings.insert_or_assign(uint16_t((uint16_t(codepoint_first) << 8) | uint16_t(codepoint_second)), 0.0f);
return 0.0f;
}

if(FT_HAS_KERNING(font_face)) {
FT_Vector kerning;
FT_Get_Kerning(font_face, index_a, index_b, FT_KERNING_DEFAULT, &kerning);
return static_cast<float>(kerning.x) / static_cast<float>((1 << 6) * magnification_factor);
auto res = static_cast<float>(kerning.x) / static_cast<float>((1 << 6) * magnification_factor);
kernings.insert_or_assign(uint16_t((uint16_t(codepoint_first) << 8) | uint16_t(codepoint_second)), res);
return res;
} else {
auto rval = gpos::net_kerning(type_2_kerning_tables, index_a, index_b);
return rval * float(64) / float(font_face->units_per_EM);
auto res = rval * float(64) / float(font_face->units_per_EM);
kernings.insert_or_assign(uint16_t((uint16_t(codepoint_first) << 8) | uint16_t(codepoint_second)), res);
return res;
}
}

Expand All @@ -1200,7 +1209,7 @@ float font_manager::line_height(sys::state& state, uint16_t font_id) const {
return float(fonts[text::font_index_from_font_id(font_id) - 1].line_height(text::size_from_font_id(font_id)));
}
}
float font_manager::text_extent(sys::state& state, char const* codepoints, uint32_t count, uint16_t font_id) const {
float font_manager::text_extent(sys::state& state, char const* codepoints, uint32_t count, uint16_t font_id) {
if(state.user_settings.use_classic_fonts) {
return text::get_bm_font(state, font_id).get_string_width(state, codepoints, count);
} else {
Expand Down Expand Up @@ -1291,7 +1300,7 @@ void font::make_glyph(char ch_in) {
}
}

float font::text_extent(sys::state& state, char const* codepoints, uint32_t count, int32_t size) const {
float font::text_extent(sys::state& state, char const* codepoints, uint32_t count, int32_t size) {
float total = 0.0f;
for(uint32_t i = 0; i < count; i++) {
auto c = uint8_t(codepoints[i]);
Expand Down
7 changes: 4 additions & 3 deletions src/text/fonts.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class font {

public:
FT_Face font_face;
ankerl::unordered_dense::map<uint16_t, float> kernings;
std::vector<uint16_t> substitution_indices;
std::vector<uint8_t const*> type_2_kerning_tables;
uint8_t const* gs = nullptr;
Expand All @@ -65,8 +66,8 @@ class font {
float ascender(int32_t size) const;
float descender(int32_t size) const;
float top_adjustment(int32_t size) const;
float kerning(char codepoint_first, char codepoint_second) const;
float text_extent(sys::state& state, char const* codepoints, uint32_t count, int32_t size) const;
float kerning(char codepoint_first, char codepoint_second);
float text_extent(sys::state& state, char const* codepoints, uint32_t count, int32_t size);

friend class font_manager;
};
Expand All @@ -85,7 +86,7 @@ class font_manager {
void load_all_glyphs();

float line_height(sys::state& state, uint16_t font_id) const;
float text_extent(sys::state& state, char const* codepoints, uint32_t count, uint16_t font_id) const;
float text_extent(sys::state& state, char const* codepoints, uint32_t count, uint16_t font_id);
};

void load_standard_fonts(sys::state& state);
Expand Down

0 comments on commit 8a7a91a

Please sign in to comment.