patch 9.0.1836: display wrong with virttext, linebreak and breakindent

Problem:  Wrong display with "above" virtual text and 'linebreak' or
          'breakindent' and 'showbreak'.
Solution: Exclude size of "above" virtual text when calculating them.

closes: #13000

Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
diff --git a/src/testdir/dumps/Test_prop_above_and_before_1.dump b/src/testdir/dumps/Test_prop_above_and_before_1.dump
new file mode 100644
index 0000000..b44c5db
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_above_and_before_1.dump
@@ -0,0 +1,6 @@
+|a+0&#ffffff0| @73
+| +0#e000e06&@1|1|2|3| +0#0000000&@69
+@2|b|:+0#e000e06&| |4|5|6| +0#0000000&>c| @64
+|~+0#4040ff13&| @73
+|~| @73
+| +0#0000000&@56|2|,|5|-|8|5| @7|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_above_and_before_2.dump b/src/testdir/dumps/Test_prop_above_and_before_2.dump
new file mode 100644
index 0000000..9fd4040
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_above_and_before_2.dump
@@ -0,0 +1,6 @@
+|a+0&#ffffff0| @73
+| +0#e000e06&@1|1|2|3| +0#0000000&@69
+@2|b|:+0#e000e06&| |4|5|6> +0#0000000&|c| @64
+|~+0#4040ff13&| @73
+|~| @73
+| +0#0000000&@56|2|,|4|-|8|4| @7|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_above_and_before_3.dump b/src/testdir/dumps/Test_prop_above_and_before_3.dump
new file mode 100644
index 0000000..de63090
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_above_and_before_3.dump
@@ -0,0 +1,6 @@
+|a+0&#ffffff0| @73
+| +0#e000e06&@1|1|2|3| +0#0000000&@69
+@2>b|:+0#e000e06&| |4|5|6| +0#0000000&|c| @64
+|~+0#4040ff13&| @73
+|~| @73
+| +0#0000000&@56|2|,|3|-|7|8| @7|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_above_and_before_4.dump b/src/testdir/dumps/Test_prop_above_and_before_4.dump
new file mode 100644
index 0000000..cf1a7a4
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_above_and_before_4.dump
@@ -0,0 +1,6 @@
+|a+0&#ffffff0| @73
+| +0#e000e06&@1|1|2|3| +0#0000000&@69
+@1> |b|:+0#e000e06&| |4|5|6| +0#0000000&|c| @64
+|~+0#4040ff13&| @73
+|~| @73
+| +0#0000000&@56|2|,|2|-|7@1| @7|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_above_and_before_5.dump b/src/testdir/dumps/Test_prop_above_and_before_5.dump
new file mode 100644
index 0000000..d792715
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_above_and_before_5.dump
@@ -0,0 +1,6 @@
+|a+0&#ffffff0| @73
+| +0#e000e06&@1|1|2|3| +0#0000000&@69
+> @1|b|:+0#e000e06&| |4|5|6| +0#0000000&|c| @64
+|~+0#4040ff13&| @73
+|~| @73
+| +0#0000000&@56|2|,|1|-|7|6| @7|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_above_linebreak_1.dump b/src/testdir/dumps/Test_prop_above_linebreak_1.dump
new file mode 100644
index 0000000..59b8108
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_above_linebreak_1.dump
@@ -0,0 +1,6 @@
+|1+0#e000e06#ffffff0|2|3| +0#0000000&@71
+|a| |b| @71
+|c| >d| @71
+|~+0#4040ff13&| @73
+|~| @73
+| +0#0000000&@56|2|,|3| @10|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_above_linebreak_2.dump b/src/testdir/dumps/Test_prop_above_linebreak_2.dump
new file mode 100644
index 0000000..e97974c
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_above_linebreak_2.dump
@@ -0,0 +1,6 @@
+|1+0#e000e06#ffffff0|2|3| +0#0000000&@71
+|a| >b| @71
+|c| |d| @71
+|~+0#4040ff13&| @73
+|~| @73
+| +0#0000000&@56|1|,|3|-|7|8| @7|A|l@1| 
diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim
index c006912..736d50b 100644
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -3523,6 +3523,51 @@
   call StopVimInTerminal(buf)
 endfunc
 
+func Test_prop_above_with_linebreak()
+  CheckRunVimInTerminal
+
+  let lines =<< trim END
+    setlocal linebreak breakindent breakindentopt=shift:4
+    call setline(1, ["a b", "c d"])
+    call prop_type_add('theprop' , #{highlight: 'Special'})
+    call prop_add(1, 0, #{type: 'theprop', text: '123', text_align: 'above'})
+    normal! 2gg$
+  END
+  call writefile(lines, 'XscriptPropAboveLinebreak', 'D')
+  let buf = RunVimInTerminal('-S XscriptPropAboveLinebreak', #{rows: 6})
+  call VerifyScreenDump(buf, 'Test_prop_above_linebreak_1', {})
+  call term_sendkeys(buf, 'k')
+  call VerifyScreenDump(buf, 'Test_prop_above_linebreak_2', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+func Test_prop_above_and_before()
+  CheckRunVimInTerminal
+
+  let lines =<< trim END
+    setlocal linebreak breakindent breakindentopt=shift:2
+    call setline(1, ["a", "  b c"])
+    call prop_type_add('theprop' , #{highlight: 'Special'})
+    call prop_add(2, 0, #{type: 'theprop', text: '  123', text_align: 'above'})
+    call prop_add(2, 4, #{type: 'theprop', text: ': 456'} )
+    normal! 2gg$
+  END
+  call writefile(lines, 'XscriptPropAboveAndBefore', 'D')
+  let buf = RunVimInTerminal('-S XscriptPropAboveAndBefore', #{rows: 6})
+  call VerifyScreenDump(buf, 'Test_prop_above_and_before_1', {})
+  call term_sendkeys(buf, 'h')
+  call VerifyScreenDump(buf, 'Test_prop_above_and_before_2', {})
+  call term_sendkeys(buf, 'h')
+  call VerifyScreenDump(buf, 'Test_prop_above_and_before_3', {})
+  call term_sendkeys(buf, 'h')
+  call VerifyScreenDump(buf, 'Test_prop_above_and_before_4', {})
+  call term_sendkeys(buf, 'h')
+  call VerifyScreenDump(buf, 'Test_prop_above_and_before_5', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
 func Test_prop_below_split_line()
   CheckRunVimInTerminal