commit 7f3022b69d1a31feaa8343a5a28d60c0178b8e20
parent 2a708443ab978f85c2417ebae6a7adc386376996
Author: nibo <nibo@relim.de>
Date: Fri, 27 Dec 2024 18:23:45 +0100
Fix page breaking rules
Diffstat:
| M | out_pdf.c | | | 47 | ++++++++++++++++++++++++++++++----------------- |
1 file changed, 30 insertions(+), 17 deletions(-)
diff --git a/out_pdf.c b/out_pdf.c
@@ -1925,6 +1925,7 @@ pdf_content_create(
text_above_index = 20000;
}
}
+ bool text_above_exist;
int i;
for (i = 0; left_aboves[i] && i<text_above_index; i++) {
width = line_width_until_text_above(left_items, left_aboves[i], img_objs, NULL);
@@ -1975,7 +1976,8 @@ pdf_content_create(
LOG_DEBUG("images_find_biggest_height failed.");
return false;
}
- if (i > 0) {
+ text_above_exist = i > 0;
+ if (text_above_exist) {
left_aboves += i;
if (height > 2.0 + ctx.biggest_font_size) {
ctx.y -= height;
@@ -1988,17 +1990,20 @@ pdf_content_create(
}
}
if (ctx.y < margin_bottom) {
- /* INFO: chords/annotations and their corresponding lyrics won't be splitted */
struct PDFText **tmp = NULL;
int tm = 0;
- double prev_y = (*texts)[ctx.text-1]->y;
ctx.y = MEDIABOX_HEIGHT - MARGIN_TOP;
- for (int p = ctx.text-1; prev_y == (*texts)[p]->y; p--) {
- (*texts)[p]->y = ctx.y;
- tmp = erealloc(tmp, (tm+1) * sizeof(struct PDFText *));
- tmp[tm] = (*texts)[p];
- tm++;
- *texts = erealloc(*texts, (--ctx.text) * sizeof(struct PDFText *));
+ if (text_above_exist) {
+ /* INFO: chords/annotations and their corresponding lyrics won't be splitted */
+ double prev_y = (*texts)[ctx.text-1]->y;
+ for (int p = ctx.text-1; prev_y == (*texts)[p]->y; p--) {
+ (*texts)[p]->y = ctx.y;
+ tmp = erealloc(tmp, (tm+1) * sizeof(struct PDFText *));
+ printf("s '%s'\n", (*texts)[p]->text);
+ tmp[tm] = (*texts)[p];
+ tm++;
+ *texts = erealloc(*texts, (--ctx.text) * sizeof(struct PDFText *));
+ }
}
*texts = erealloc(*texts, (ctx.text+1) * sizeof(struct PDFText *));
(*texts)[ctx.text] = NULL;
@@ -2015,13 +2020,15 @@ pdf_content_create(
texts = &ctx.content->pages[ctx.page]->texts;
imgs = &ctx.content->pages[ctx.page]->images;
diagrams = &ctx.content->pages[ctx.page]->diagrams;
- for (int i=0; i<tm; i++) {
- *texts = erealloc(*texts, (ctx.text+1) * sizeof(struct PDFText *));
- (*texts)[ctx.text] = tmp[i];
- ctx.text++;
+ if (text_above_exist) {
+ for (int i=0; i<tm; i++) {
+ *texts = erealloc(*texts, (ctx.text+1) * sizeof(struct PDFText *));
+ (*texts)[ctx.text] = tmp[i];
+ ctx.text++;
+ }
+ free(tmp);
}
- free(tmp);
- if (i > 0) {
+ if (text_above_exist) {
if (height > 2.0 + ctx.biggest_font_size) {
ctx.y -= height;
} else {
@@ -2036,7 +2043,10 @@ pdf_content_create(
i = 0;
while (*left_items && i < item_index) {
if ((*left_items)->is_text) {
- pdf_texts_add_lyrics(*left_items, &ctx, i);
+ if (!pdf_texts_add_lyrics(*left_items, &ctx, i)) {
+ LOG_DEBUG("pdf_texts_add_lyrics failed.");
+ return false;
+ }
} else {
*imgs = erealloc(*imgs, (ctx.image+1) * sizeof(struct PDFImage *));
(*imgs)[ctx.image] = pdf_image_new();
@@ -2065,7 +2075,10 @@ pdf_content_create(
char *tmp;
(*left_items)->u.text->text[pos->text_index] = 0;
tmp = strdup(&(*left_items)->u.text->text[pos->text_index+1]);
- pdf_texts_add_lyrics(*left_items, &ctx, i);
+ if (!pdf_texts_add_lyrics(*left_items, &ctx, i)) {
+ LOG_DEBUG("pdf_texts_add_lyrics failed.");
+ return false;
+ }
free((*left_items)->u.text->text);
(*left_items)->u.text->text = tmp;
}