diff --git a/src/gfx.cpp b/src/gfx.cpp
index 6912e4abf5..64b10844b8 100644
--- a/src/gfx.cpp
+++ b/src/gfx.cpp
@@ -579,6 +579,8 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left,
 	bool draw_shadow = false;
 	for (int run_index = 0; run_index < line.CountRuns(); run_index++) {
 		const ParagraphLayouter::VisualRun &run = line.GetVisualRun(run_index);
+		const auto &glyphs = run.GetGlyphs();
+		const auto &positions = run.GetPositions();
 		const Font *f = run.GetFont();
 
 		FontCache *fc = f->fc;
@@ -592,14 +594,14 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left,
 		draw_shadow = fc->GetDrawGlyphShadow() && (colour & TC_NO_SHADE) == 0 && colour != TC_BLACK;
 
 		for (int i = 0; i < run.GetGlyphCount(); i++) {
-			GlyphID glyph = run.GetGlyphs()[i];
+			GlyphID glyph = glyphs[i];
 
 			/* Not a valid glyph (empty) */
 			if (glyph == 0xFFFF) continue;
 
-			int begin_x = (int)run.GetPositions()[i * 2]     + left - offset_x;
-			int end_x   = (int)run.GetPositions()[i * 2 + 2] + left - offset_x  - 1;
-			int top     = (int)run.GetPositions()[i * 2 + 1] + y;
+			int begin_x = (int)positions[i * 2]     + left - offset_x;
+			int end_x   = (int)positions[i * 2 + 2] + left - offset_x  - 1;
+			int top     = (int)positions[i * 2 + 1] + y;
 
 			/* Truncated away. */
 			if (truncation && (begin_x < min_x || end_x > max_x)) continue;
diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp
index 2f479247ec..13ca5902d9 100644
--- a/src/gfx_layout.cpp
+++ b/src/gfx_layout.cpp
@@ -254,11 +254,13 @@ Point Layouter::GetCharPosition(std::string_view::const_iterator ch) const
 	/* Scan all runs until we've found our code point index. */
 	for (int run_index = 0; run_index < line->CountRuns(); run_index++) {
 		const ParagraphLayouter::VisualRun &run = line->GetVisualRun(run_index);
+		const auto &positions = run.GetPositions();
+		const auto &charmap = run.GetGlyphToCharMap();
 
 		for (int i = 0; i < run.GetGlyphCount(); i++) {
 			/* Matching glyph? Return position. */
-			if ((size_t)run.GetGlyphToCharMap()[i] == index) {
-				Point p = { (int)run.GetPositions()[i * 2], (int)run.GetPositions()[i * 2 + 1] };
+			if ((size_t)charmap[i] == index) {
+				Point p = { (int)positions[i * 2], (int)positions[i * 2 + 1] };
 				return p;
 			}
 		}
@@ -281,17 +283,20 @@ ptrdiff_t Layouter::GetCharAtPosition(int x, size_t line_index) const
 
 	for (int run_index = 0; run_index < line->CountRuns(); run_index++) {
 		const ParagraphLayouter::VisualRun &run = line->GetVisualRun(run_index);
+		const auto &glyphs = run.GetGlyphs();
+		const auto &positions = run.GetPositions();
+		const auto &charmap = run.GetGlyphToCharMap();
 
 		for (int i = 0; i < run.GetGlyphCount(); i++) {
 			/* Not a valid glyph (empty). */
-			if (run.GetGlyphs()[i] == 0xFFFF) continue;
+			if (glyphs[i] == 0xFFFF) continue;
 
-			int begin_x = (int)run.GetPositions()[i * 2];
-			int end_x   = (int)run.GetPositions()[i * 2 + 2];
+			int begin_x = (int)positions[i * 2];
+			int end_x   = (int)positions[i * 2 + 2];
 
 			if (IsInsideMM(x, begin_x, end_x)) {
 				/* Found our glyph, now convert to UTF-8 string index. */
-				size_t index = run.GetGlyphToCharMap()[i];
+				size_t index = charmap[i];
 
 				size_t cur_idx = 0;
 				for (auto str = this->string.begin(); str != this->string.end();) {