From 55b9706cfdd372cca1c9c851bddff0b7a59847a4 Mon Sep 17 00:00:00 2001
From: Fredrik Hallenberg <megahallon@gmail.com>
Date: Fri, 25 Nov 2022 00:39:17 +0100
Subject: [PATCH] Fix automerge at border (#515)

---
 src/ftxui/dom/table_test.cpp | 22 ++++++++++++++++++++++
 src/ftxui/screen/screen.cpp  | 21 ++++++++++++---------
 2 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/src/ftxui/dom/table_test.cpp b/src/ftxui/dom/table_test.cpp
index 3313923e..1e13776c 100644
--- a/src/ftxui/dom/table_test.cpp
+++ b/src/ftxui/dom/table_test.cpp
@@ -708,6 +708,28 @@ TEST(TableTest, RowFlexTwo) {
       screen.ToString());
 }
 
+TEST(TableTest, Merge) {
+  auto table = Table({
+      {"a", "b", "c"},
+      {"d", "e", "f"},
+      {"g", "h", "i"},
+  });
+  table.SelectAll().Border(LIGHT);
+  table.SelectColumn(1).Border(HEAVY);
+  table.SelectRow(1).Border(HEAVY);
+  Screen screen(7, 7);
+  Render(screen, table.Render());
+  EXPECT_EQ(
+    "┌─┲━┱─┐\r\n"
+    "│a┃b┃c│\r\n"
+    "┢━╋━╋━┪\r\n"
+    "┃d┃e┃f┃\r\n"
+    "┡━╋━╋━┩\r\n"
+    "│g┃h┃i│\r\n"
+    "└─┺━┹─┘",
+    screen.ToString());
+}
+
 }  // namespace ftxui
 
 // Copyright 2021 Arthur Sonzogni. All rights reserved.
diff --git a/src/ftxui/screen/screen.cpp b/src/ftxui/screen/screen.cpp
index 2f7b1240..6d19f790 100644
--- a/src/ftxui/screen/screen.cpp
+++ b/src/ftxui/screen/screen.cpp
@@ -501,22 +501,25 @@ void Screen::Clear() {
 // clang-format off
 void Screen::ApplyShader() {
   // Merge box characters togethers.
-  for (int y = 1; y < dimy_; ++y) {
-    for (int x = 1; x < dimx_; ++x) {
+  for (int y = 0; y < dimy_; ++y) {
+    for (int x = 0; x < dimx_; ++x) {
       // Box drawing character uses exactly 3 byte.
       Pixel& cur = pixels_[y][x];
       if (!ShouldAttemptAutoMerge(cur)) {
         continue;
       }
 
-      Pixel& left = pixels_[y][x-1];
-      Pixel& top = pixels_[y-1][x];
-
-      if (ShouldAttemptAutoMerge(left)) {
-        UpgradeLeftRight(left.character, cur.character);
+      if (x > 0) {
+        Pixel& left = pixels_[y][x-1];
+        if (ShouldAttemptAutoMerge(left)) {
+          UpgradeLeftRight(left.character, cur.character);
+        }
       }
-      if (ShouldAttemptAutoMerge(top)) {
-        UpgradeTopDown(top.character, cur.character);
+      if (y > 0) {
+        Pixel& top = pixels_[y-1][x];
+        if (ShouldAttemptAutoMerge(top)) {
+          UpgradeTopDown(top.character, cur.character);
+        }
       }
     }
   }
-- 
GitLab