lorid

convert chordpro to pdf
git clone git://git.relim.de/lorid.git
Log | Files | Refs | README | LICENSE

commit 7f3022b69d1a31feaa8343a5a28d60c0178b8e20
parent 2a708443ab978f85c2417ebae6a7adc386376996
Author: nibo <nibo@relim.de>
Date:   Fri, 27 Dec 2024 18:23:45 +0100

Fix page breaking rules

Diffstat:
Mout_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; }