commit 1e03dbee8b6bdea6018d26c78f3920874ff9e2ac
parent 017d02ea42569d580c16d427f157a5e2909a7864
Author: nibo <nibo@relim.de>
Date: Sat, 7 Dec 2024 17:51:04 +0100
Improve chord diagram parsing and rendering
Diffstat:
3 files changed, 24 insertions(+), 15 deletions(-)
diff --git a/chord_diagram.c b/chord_diagram.c
@@ -451,9 +451,9 @@ string_diagram_draw(
base_position[4] = 0;
sprintf((char *)&base_position, "%d", diagram->base_fret);
if (diagram->base_fret > 9) {
- base_pos_x = x - field_width - field_width / 2;
+ base_pos_x = x - field_width - field_width;
} else {
- base_pos_x = x - field_width;
+ base_pos_x = x - field_width - field_width / 3;
}
if (!pdfioContentSetTextFont(stream, "chord-diagram-regular-font", field_width*1.15)) {
fprintf(stderr, "pdfioContentSetTextFont failed.\n");
@@ -505,7 +505,7 @@ string_diagram_draw(
fprintf(stderr, "pdfioContentSetTextFont failed.\n");
return false;
}
- if (!text_show(stream, diagram->name, x+centered_x, y_above_diagram + 5.0)) {
+ if (!text_show(stream, diagram->name, x+centered_x, y_above_diagram + 7.0)) {
fprintf(stderr, "text_show failed.\n");
return false;
}
diff --git a/chordpro.c b/chordpro.c
@@ -2666,9 +2666,11 @@ cho_chord_diagram_parse(const char *str)
char name[20];
char option[10];
char key[3];
+ char base_fret[3];
int n = 0;
int o = 0;
int k = 0;
+ int b = 0;
int f = 0;
int i;
int fret_count = 0;
@@ -2749,24 +2751,31 @@ cho_chord_diagram_parse(const char *str)
break;
case CDS_BASE_FRET:
if (is_whitespace(c)) {
- if (diagram->u.sd->base_fret == -2) {
+ if (b == 0) {
break;
}
+ base_fret[b] = 0;
+ l = str_to_number(base_fret);
+ if (l == -1) {
+ LOG_DEBUG("str_to_number failed.");
+ cho_log(LOG_ERR, "Invalid base-fret value '%s' in chord diagram.", base_fret);
+ return NULL;
+ }
+ if (l == 0) {
+ cho_log(LOG_ERR, "Invalid base-fret value '%c' in chord diagram.", c);
+ return NULL;
+ }
+ diagram->u.sd->base_fret = (int8_t)l;
state = CDS_OPTION_NAME;
break;
}
- number = char_to_positive_int(c);
- if (number == -1) {
- LOG_DEBUG("char_to_positive_int failed.");
- cho_log(LOG_ERR, "Invalid base-fret value '%c' in chord diagram.", c);
- return NULL;
- }
- if (number == 0) {
- cho_log(LOG_ERR, "Invalid base-fret value '%c' in chord diagram.", c);
+ if (b > 1) {
+ cho_log(LOG_ERR, "base-fret value is too long.");
+ printf("c: %c\n", c);
return NULL;
}
- diagram->u.sd->base_fret = number;
- state = CDS_OPTION_NAME;
+ base_fret[b] = c;
+ b++;
break;
case CDS_FRETS:
number = -2;
diff --git a/out_pdf.c b/out_pdf.c
@@ -1847,7 +1847,7 @@ pdf_content_render(struct PDFContent *content, pdfio_file_t *file)
double x = MARGIN_HORIZONTAL;
double y = 40.0;
double size = 50.0;
- double padding = 20.0;
+ double padding = 30.0;
struct ChordDiagram **d = pages[p]->diagrams;
/* TODO: Handle line break when too long */
while (*d) {