diff --git a/aegisub/src/ass_style.cpp b/aegisub/src/ass_style.cpp index 90f42c6e9..f93e7c4b5 100644 --- a/aegisub/src/ass_style.cpp +++ b/aegisub/src/ass_style.cpp @@ -246,20 +246,8 @@ AssStyle::AssStyle(wxString rawData, int version) shadow_w = get_next_double(tkn); alignment = get_next_int(tkn); - if (version == 0) { - switch(alignment) { - case 1: alignment = 1; break; - case 2: alignment = 2; break; - case 3: alignment = 3; break; - case 5: alignment = 7; break; - case 6: alignment = 8; break; - case 7: alignment = 9; break; - case 9: alignment = 4; break; - case 10: alignment = 5; break; - case 11: alignment = 6; break; - default: alignment = 2; break; - } - } + if (version == 0) + alignment = SsaToAss(alignment); // Read left margin Margin[0] = mid(0, get_next_int(tkn), 9999); @@ -350,18 +338,7 @@ void AssStyle::UpdateData() { wxString AssStyle::GetSSAText() const { wxString output; - int align = 0; - switch (alignment) { - case 1: align = 1; break; - case 2: align = 2; break; - case 3: align = 3; break; - case 4: align = 9; break; - case 5: align = 10; break; - case 6: align = 11; break; - case 7: align = 5; break; - case 8: align = 6; break; - case 9: align = 7; break; - } + int align = AssToSsa(alignment); wxString n = name; n.Replace(",", ";"); wxString f = font; @@ -405,3 +382,33 @@ void AssStyle::GetEncodings(wxArrayString &encodingStrings) { encodingStrings.Add(wxString("238 - ") + _("East European")); encodingStrings.Add(wxString("255 - ") + _("OEM")); } + +int AssStyle::AssToSsa(int ass_align) { + switch (ass_align) { + case 1: return 1; + case 2: return 2; + case 3: return 3; + case 4: return 9; + case 5: return 10; + case 6: return 11; + case 7: return 5; + case 8: return 6; + case 9: return 7; + default: return 2; + } +} + +int AssStyle::SsaToAss(int ssa_align) { + switch(ssa_align) { + case 1: return 1; + case 2: return 2; + case 3: return 3; + case 5: return 7; + case 6: return 8; + case 7: return 9; + case 9: return 4; + case 10: return 5; + case 11: return 6; + default: return 2; + } +} diff --git a/aegisub/src/ass_style.h b/aegisub/src/ass_style.h index e60b515e2..d383001ec 100644 --- a/aegisub/src/ass_style.h +++ b/aegisub/src/ass_style.h @@ -111,4 +111,9 @@ public: wxString GetSSAText() const; ASS_EntryType GetType() const { return ENTRY_STYLE; } AssEntry *Clone() const; + + /// Convert an ASS alignment to the equivalent SSA alignment + static int AssToSsa(int ass_align); + /// Convert a SSA alignment to the equivalent ASS alignment + static int SsaToAss(int ssa_align); }; diff --git a/aegisub/src/visual_tool.cpp b/aegisub/src/visual_tool.cpp index 790c82f0c..9816d22f9 100644 --- a/aegisub/src/visual_tool.cpp +++ b/aegisub/src/visual_tool.cpp @@ -423,14 +423,8 @@ Vector2D VisualToolBase::GetLinePosition(AssDialogue *diag) { int ovr_align = 0; if ((align_tag = find_tag(diag, "\\an")) && !(*align_tag)[0]->omitted) ovr_align = (*align_tag)[0]->Get(); - else if ((align_tag = find_tag(diag, "\\a"))) { - ovr_align = (*align_tag)[0]->Get(2); - - // \a -> \an values mapping - static int align_mapping[] = { 0, 1, 2, 3, 7, 7, 8, 9, 7, 4, 5, 6 }; - if (static_cast(ovr_align) < sizeof(align_mapping) / sizeof(int)) - ovr_align = align_mapping[ovr_align]; - } + else if ((align_tag = find_tag(diag, "\\a"))) + ovr_align = AssStyle::SsaToAss((*align_tag)[0]->Get(2)); if (ovr_align > 0 && ovr_align <= 9) align = ovr_align;