# HG changeset patch # User faust3 # Date 1095254212 0 # Node ID 1a4b6e575484fda4d8d116bdd7ad9217b2d3484e # Parent dbe255cbae71bf7b86b6376d4c4ec31b19e8007a This time is a patch to improve subtitle alignment management. It implements SSA alignment styles; note that alignment for SSA files is not actually supported, but for SAMI files (which use the same alignment codes) it is. patch by Salvatore Falco diff -r dbe255cbae71 -r 1a4b6e575484 libvo/sub.c --- a/libvo/sub.c Wed Sep 15 13:08:53 2004 +0000 +++ b/libvo/sub.c Wed Sep 15 13:16:52 2004 +0000 @@ -653,16 +653,23 @@ y = obj->y; + obj->alignment = 0; switch(vo_sub->alignment) { - case SUB_ALIGNMENT_HLEFT: + case SUB_ALIGNMENT_BOTTOMLEFT: + case SUB_ALIGNMENT_MIDDLELEFT: + case SUB_ALIGNMENT_TOPLEFT: obj->alignment |= 0x1; break; - case SUB_ALIGNMENT_HCENTER: - obj->alignment |= 0x0; + case SUB_ALIGNMENT_BOTTOMRIGHT: + case SUB_ALIGNMENT_MIDDLERIGHT: + case SUB_ALIGNMENT_TOPRIGHT: + obj->alignment |= 0x2; break; - case SUB_ALIGNMENT_HRIGHT: + case SUB_ALIGNMENT_BOTTOMCENTER: + case SUB_ALIGNMENT_MIDDLECENTER: + case SUB_ALIGNMENT_TOPCENTER: default: - obj->alignment |= 0x2; + obj->alignment |= 0x0; } i=j=0; diff -r dbe255cbae71 -r 1a4b6e575484 subreader.c --- a/subreader.c Wed Sep 15 13:08:53 2004 +0000 +++ b/subreader.c Wed Sep 15 13:16:52 2004 +0000 @@ -100,6 +100,7 @@ int state; current->lines = current->start = current->end = 0; + current->alignment = SUB_ALIGNMENT_BOTTOMCENTER; state = 0; /* read the first line */ @@ -173,7 +174,38 @@ s = strchr (s, '>'); if (s) { s++; state = 3; continue; } break; - case 5: /* get rid of {...} text */ + case 5: /* get rid of {...} text, but read the alignment code */ + if ((*s == '\\') && (*(s + 1) == 'a') && !sub_no_text_pp) { + if (stristr(s, "\\a1") != NULL) { + current->alignment = SUB_ALIGNMENT_BOTTOMLEFT; + s = s + 3; + } + if (stristr(s, "\\a2") != NULL) { + current->alignment = SUB_ALIGNMENT_BOTTOMCENTER; + s = s + 3; + } else if (stristr(s, "\\a3") != NULL) { + current->alignment = SUB_ALIGNMENT_BOTTOMRIGHT; + s = s + 3; + } else if ((stristr(s, "\\a4") != NULL) || (stristr(s, "\\a5") != NULL) || (stristr(s, "\\a8") != NULL)) { + current->alignment = SUB_ALIGNMENT_TOPLEFT; + s = s + 3; + } else if (stristr(s, "\\a6") != NULL) { + current->alignment = SUB_ALIGNMENT_TOPCENTER; + s = s + 3; + } else if (stristr(s, "\\a7") != NULL) { + current->alignment = SUB_ALIGNMENT_TOPRIGHT; + s = s + 3; + } else if (stristr(s, "\\a9") != NULL) { + current->alignment = SUB_ALIGNMENT_MIDDLELEFT; + s = s + 3; + } else if (stristr(s, "\\a10") != NULL) { + current->alignment = SUB_ALIGNMENT_MIDDLECENTER; + s = s + 4; + } else if (stristr(s, "\\a11") != NULL) { + current->alignment = SUB_ALIGNMENT_MIDDLERIGHT; + s = s + 4; + } + } if (*s == '}') state = 3; ++s; continue; @@ -889,11 +921,11 @@ continue; } if (strstr(directive, "JL") != NULL) { - current->alignment = SUB_ALIGNMENT_HLEFT; + current->alignment = SUB_ALIGNMENT_BOTTOMLEFT; } else if (strstr(directive, "JR") != NULL) { - current->alignment = SUB_ALIGNMENT_HRIGHT; + current->alignment = SUB_ALIGNMENT_BOTTOMRIGHT; } else { - current->alignment = SUB_ALIGNMENT_HCENTER; + current->alignment = SUB_ALIGNMENT_BOTTOMCENTER; } strcpy(line2, line1); p = line2; @@ -1635,7 +1667,7 @@ memset(&second[sub_num], '\0', sizeof(subtitle)); second[sub_num].start = local_start; second[sub_num].end = local_end; - second[sub_num].alignment = SUB_ALIGNMENT_HCENTER; + second[sub_num].alignment = first[sub_first].alignment; n_max = (lines_to_add < SUB_MAX_TEXT) ? lines_to_add : SUB_MAX_TEXT; for (i = 0, j = 0; j < n_max; ++j) { if (placeholder[counter][j] != -1) { diff -r dbe255cbae71 -r 1a4b6e575484 subreader.h --- a/subreader.h Wed Sep 15 13:08:53 2004 +0000 +++ b/subreader.h Wed Sep 15 13:16:52 2004 +0000 @@ -30,9 +30,15 @@ #define MAX_SUBTITLE_FILES 128 #define SUB_MAX_TEXT 10 -#define SUB_ALIGNMENT_HLEFT 1 -#define SUB_ALIGNMENT_HCENTER 0 -#define SUB_ALIGNMENT_HRIGHT 2 +#define SUB_ALIGNMENT_BOTTOMLEFT 1 +#define SUB_ALIGNMENT_BOTTOMCENTER 2 +#define SUB_ALIGNMENT_BOTTOMRIGHT 3 +#define SUB_ALIGNMENT_MIDDLELEFT 4 +#define SUB_ALIGNMENT_MIDDLECENTER 5 +#define SUB_ALIGNMENT_MIDDLERIGHT 6 +#define SUB_ALIGNMENT_TOPLEFT 7 +#define SUB_ALIGNMENT_TOPCENTER 8 +#define SUB_ALIGNMENT_TOPRIGHT 9 typedef struct {