diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2022-01-28 13:34:15 +0200 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2022-01-28 13:34:15 +0200 |
commit | 320eb92b1e5806931831863c7eed426b2316d861 (patch) | |
tree | 46eae8282f87486c1d9057622ec0a357c081ff8e /src | |
parent | dda0a57c419fe2e1b6fb7be465ddce84f6e5bff8 (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.c | 12 |
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 | ||
550 | static void commit_RunTypesetter_(iRunTypesetter *d, iGmDocument *doc) { | 550 | static 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 | ||
555 | static const int maxLedeLines_ = 10; | 557 | static 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) { |