summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2022-01-28 13:34:15 +0200
committerJaakko Keränen <jaakko.keranen@iki.fi>2022-01-28 13:34:15 +0200
commit320eb92b1e5806931831863c7eed426b2316d861 (patch)
tree46eae8282f87486c1d9057622ec0a357c081ff8e /src
parentdda0a57c419fe2e1b6fb7be465ddce84f6e5bff8 (diff)
GmDocument: Don't crash when a line turns out empty
A line with nothing but ANSI escapes was not considered empty, but it didn't produce any text runs so the typesetter was confused. IssueID #443
Diffstat (limited to 'src')
-rw-r--r--src/gmdocument.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/gmdocument.c b/src/gmdocument.c
index 19230392..b856c296 100644
--- a/src/gmdocument.c
+++ b/src/gmdocument.c
@@ -547,9 +547,11 @@ static void clear_RunTypesetter_(iRunTypesetter *d) {
547 clear_Array(&d->layout); 547 clear_Array(&d->layout);
548} 548}
549 549
550static void commit_RunTypesetter_(iRunTypesetter *d, iGmDocument *doc) { 550static size_t commit_RunTypesetter_(iRunTypesetter *d, iGmDocument *doc) {
551 const size_t n = size_Array(&d->layout);
551 pushBackN_Array(&doc->layout, constData_Array(&d->layout), size_Array(&d->layout)); 552 pushBackN_Array(&doc->layout, constData_Array(&d->layout), size_Array(&d->layout));
552 clear_RunTypesetter_(d); 553 clear_RunTypesetter_(d);
554 return n;
553} 555}
554 556
555static const int maxLedeLines_ = 10; 557static const int maxLedeLines_ = 10;
@@ -964,6 +966,7 @@ static void doLayout_GmDocument_(iGmDocument *d) {
964 } 966 }
965 } 967 }
966 iAssert(!isEmpty_Range(&line)); /* must have something at this point */ 968 iAssert(!isEmpty_Range(&line)); /* must have something at this point */
969 size_t numRunsAdded = 0;
967 /* Typeset the paragraph. */ { 970 /* Typeset the paragraph. */ {
968 iRunTypesetter rts; 971 iRunTypesetter rts;
969 init_RunTypesetter_(&rts); 972 init_RunTypesetter_(&rts);
@@ -1036,7 +1039,7 @@ static void doLayout_GmDocument_(iGmDocument *d) {
1036 : 1.0f); 1039 : 1.0f);
1037 } 1040 }
1038 } 1041 }
1039 commit_RunTypesetter_(&rts, d); 1042 numRunsAdded = commit_RunTypesetter_(&rts, d);
1040 break; 1043 break;
1041 } 1044 }
1042 /* Try again... */ 1045 /* Try again... */
@@ -1050,6 +1053,11 @@ static void doLayout_GmDocument_(iGmDocument *d) {
1050 deinit_RunTypesetter_(&rts); 1053 deinit_RunTypesetter_(&rts);
1051 } 1054 }
1052 /* Flag the end of line, too. */ 1055 /* Flag the end of line, too. */
1056 if (numRunsAdded == 0) {
1057 pos.y += lineHeight_Text(run.font) * prefs->lineSpacing;
1058 followsBlank = iTrue;
1059 continue;
1060 }
1053 iGmRun *lastRun = back_Array(&d->layout); 1061 iGmRun *lastRun = back_Array(&d->layout);
1054 lastRun->flags |= endOfLine_GmRunFlag; 1062 lastRun->flags |= endOfLine_GmRunFlag;
1055 if (lastRun->linkId && lastRun->flags & startOfLine_GmRunFlag) { 1063 if (lastRun->linkId && lastRun->flags & startOfLine_GmRunFlag) {