2006-01-16 22:02:54 +01:00
|
|
|
// Copyright (c) 2005, Rodrigo Braz Monteiro
|
|
|
|
// All rights reserved.
|
|
|
|
//
|
|
|
|
// Redistribution and use in source and binary forms, with or without
|
|
|
|
// modification, are permitted provided that the following conditions are met:
|
|
|
|
//
|
|
|
|
// * Redistributions of source code must retain the above copyright notice,
|
|
|
|
// this list of conditions and the following disclaimer.
|
|
|
|
// * Redistributions in binary form must reproduce the above copyright notice,
|
|
|
|
// this list of conditions and the following disclaimer in the documentation
|
|
|
|
// and/or other materials provided with the distribution.
|
|
|
|
// * Neither the name of the Aegisub Group nor the names of its contributors
|
|
|
|
// may be used to endorse or promote products derived from this software
|
|
|
|
// without specific prior written permission.
|
|
|
|
//
|
|
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
|
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
|
|
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
// POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
//
|
2009-07-29 07:43:02 +02:00
|
|
|
// Aegisub Project http://www.aegisub.org/
|
|
|
|
|
|
|
|
/// @file ass_style.cpp
|
|
|
|
/// @brief Class for style definitions in subtitles
|
|
|
|
/// @ingroup subs_storage
|
|
|
|
///
|
2006-01-16 22:02:54 +01:00
|
|
|
|
2009-01-04 07:31:48 +01:00
|
|
|
#include "config.h"
|
|
|
|
|
2012-12-01 20:36:30 +01:00
|
|
|
#include <cctype>
|
2009-09-10 15:06:40 +02:00
|
|
|
|
2007-09-12 01:22:26 +02:00
|
|
|
#include <wx/intl.h>
|
2009-09-10 15:06:40 +02:00
|
|
|
#include <wx/tokenzr.h>
|
|
|
|
|
2006-04-04 22:41:09 +02:00
|
|
|
#include "ass_style.h"
|
2012-10-26 16:09:14 +02:00
|
|
|
#include "compat.h"
|
2012-10-25 15:45:06 +02:00
|
|
|
#include "subtitle_format.h"
|
2006-04-04 22:41:09 +02:00
|
|
|
#include "utils.h"
|
2006-01-16 22:02:54 +01:00
|
|
|
|
2010-07-08 09:14:55 +02:00
|
|
|
AssStyle::AssStyle()
|
2012-12-08 03:51:09 +01:00
|
|
|
: name("Default")
|
2011-09-28 21:43:11 +02:00
|
|
|
, font("Arial")
|
2010-07-08 09:14:55 +02:00
|
|
|
, fontsize(20.)
|
|
|
|
, primary(255, 255, 255)
|
|
|
|
, secondary(255, 0, 0)
|
|
|
|
, bold(false)
|
|
|
|
, italic(false)
|
|
|
|
, underline(false)
|
|
|
|
, strikeout(false)
|
|
|
|
, scalex(100.)
|
|
|
|
, scaley(100.)
|
|
|
|
, spacing(0.)
|
|
|
|
, angle(0.)
|
|
|
|
, borderstyle(1)
|
|
|
|
, outline_w(2.)
|
|
|
|
, shadow_w(2.)
|
|
|
|
, alignment(2)
|
|
|
|
, encoding(1)
|
|
|
|
{
|
2012-10-26 16:29:52 +02:00
|
|
|
std::fill(Margin.begin(), Margin.end(), 10);
|
2006-01-16 22:02:54 +01:00
|
|
|
|
|
|
|
UpdateData();
|
|
|
|
}
|
|
|
|
|
2011-12-22 22:15:19 +01:00
|
|
|
static wxString get_next_string(wxStringTokenizer &tok) {
|
2012-10-25 15:45:06 +02:00
|
|
|
if (!tok.HasMoreTokens()) throw SubtitleFormatParseError("Malformed style: not enough fields", 0);
|
2011-12-22 22:15:19 +01:00
|
|
|
return tok.GetNextToken();
|
2006-01-16 22:02:54 +01:00
|
|
|
}
|
|
|
|
|
2011-12-22 22:15:19 +01:00
|
|
|
static int get_next_int(wxStringTokenizer &tok) {
|
|
|
|
long temp;
|
|
|
|
if (!get_next_string(tok).ToLong(&temp))
|
2012-10-25 15:45:06 +02:00
|
|
|
throw SubtitleFormatParseError("Malformed style: could not parse int field", 0);
|
2011-12-22 22:15:19 +01:00
|
|
|
return temp;
|
|
|
|
}
|
2006-01-16 22:02:54 +01:00
|
|
|
|
2012-01-26 21:17:31 +01:00
|
|
|
static double get_next_double(wxStringTokenizer &tok) {
|
2011-12-22 22:15:19 +01:00
|
|
|
double temp;
|
|
|
|
if (!get_next_string(tok).ToDouble(&temp))
|
2012-10-25 15:45:06 +02:00
|
|
|
throw SubtitleFormatParseError("Malformed style: could not parse double field", 0);
|
2011-12-22 22:15:19 +01:00
|
|
|
return temp;
|
|
|
|
}
|
2006-01-16 22:02:54 +01:00
|
|
|
|
2012-12-08 03:51:09 +01:00
|
|
|
AssStyle::AssStyle(wxString rawData, int version) {
|
2011-12-22 22:15:19 +01:00
|
|
|
wxStringTokenizer tkn(rawData.Trim(false).Mid(6), ",", wxTOKEN_RET_EMPTY_ALL);
|
2006-01-16 22:02:54 +01:00
|
|
|
|
2011-12-22 22:15:19 +01:00
|
|
|
name = get_next_string(tkn).Trim(true).Trim(false);
|
|
|
|
font = get_next_string(tkn).Trim(true).Trim(false);
|
2011-12-24 00:21:02 +01:00
|
|
|
fontsize = get_next_double(tkn);
|
2006-01-16 22:02:54 +01:00
|
|
|
|
2011-12-22 22:15:19 +01:00
|
|
|
if (version != 0) {
|
2012-10-26 16:09:14 +02:00
|
|
|
primary = from_wx(get_next_string(tkn));
|
|
|
|
secondary = from_wx(get_next_string(tkn));
|
|
|
|
outline = from_wx(get_next_string(tkn));
|
|
|
|
shadow = from_wx(get_next_string(tkn));
|
2006-01-16 22:02:54 +01:00
|
|
|
}
|
|
|
|
else {
|
2012-10-26 16:09:14 +02:00
|
|
|
primary = from_wx(get_next_string(tkn));
|
|
|
|
secondary = from_wx(get_next_string(tkn));
|
2006-01-16 22:02:54 +01:00
|
|
|
|
|
|
|
// Read and discard tertiary color
|
2011-12-22 22:15:19 +01:00
|
|
|
get_next_string(tkn);
|
2006-01-16 22:02:54 +01:00
|
|
|
|
|
|
|
// Read shadow/outline color
|
2012-10-26 16:09:14 +02:00
|
|
|
outline = from_wx(get_next_string(tkn));
|
2006-01-16 22:02:54 +01:00
|
|
|
shadow = outline;
|
|
|
|
}
|
|
|
|
|
2011-12-22 22:15:19 +01:00
|
|
|
bold = !!get_next_int(tkn);
|
|
|
|
italic = !!get_next_int(tkn);
|
2006-01-16 22:02:54 +01:00
|
|
|
|
2007-01-08 02:00:44 +01:00
|
|
|
if (version != 0) {
|
2011-12-22 22:15:19 +01:00
|
|
|
underline = !!get_next_int(tkn);
|
|
|
|
strikeout = !!get_next_int(tkn);
|
|
|
|
|
|
|
|
scalex = get_next_double(tkn);
|
|
|
|
scaley = get_next_double(tkn);
|
|
|
|
spacing = get_next_double(tkn);
|
|
|
|
angle = get_next_double(tkn);
|
2006-01-16 22:02:54 +01:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
// SSA defaults
|
|
|
|
underline = false;
|
|
|
|
strikeout = false;
|
|
|
|
|
|
|
|
scalex = 100;
|
|
|
|
scaley = 100;
|
|
|
|
spacing = 0;
|
|
|
|
angle = 0.0;
|
|
|
|
}
|
|
|
|
|
2011-12-22 22:15:19 +01:00
|
|
|
borderstyle = get_next_int(tkn);
|
|
|
|
outline_w = get_next_double(tkn);
|
|
|
|
shadow_w = get_next_double(tkn);
|
|
|
|
alignment = get_next_int(tkn);
|
|
|
|
|
2012-03-25 06:04:54 +02:00
|
|
|
if (version == 0)
|
|
|
|
alignment = SsaToAss(alignment);
|
2006-01-16 22:02:54 +01:00
|
|
|
|
|
|
|
// Read left margin
|
2012-01-08 02:33:26 +01:00
|
|
|
Margin[0] = mid(0, get_next_int(tkn), 9999);
|
2006-01-16 22:02:54 +01:00
|
|
|
|
|
|
|
// Read right margin
|
2012-01-08 02:33:26 +01:00
|
|
|
Margin[1] = mid(0, get_next_int(tkn), 9999);
|
2006-01-16 22:02:54 +01:00
|
|
|
|
2012-10-10 16:04:44 +02:00
|
|
|
// Read vertical margin
|
2012-01-08 02:33:26 +01:00
|
|
|
Margin[2] = mid(0, get_next_int(tkn), 9999);
|
2006-01-16 22:02:54 +01:00
|
|
|
|
2011-12-22 22:15:19 +01:00
|
|
|
// Skip alpha level
|
|
|
|
if (version == 0)
|
|
|
|
get_next_string(tkn);
|
2006-01-16 22:02:54 +01:00
|
|
|
|
|
|
|
// Read encoding
|
2011-12-22 22:15:19 +01:00
|
|
|
encoding = get_next_int(tkn);
|
2006-01-16 22:02:54 +01:00
|
|
|
|
2011-12-22 22:15:19 +01:00
|
|
|
if (tkn.HasMoreTokens())
|
2012-10-25 15:45:06 +02:00
|
|
|
throw SubtitleFormatParseError("Malformed style: too many fields", 0);
|
2011-12-22 22:15:19 +01:00
|
|
|
|
|
|
|
UpdateData();
|
2006-01-16 22:02:54 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void AssStyle::UpdateData() {
|
2012-12-01 05:02:46 +01:00
|
|
|
name.Replace(",", ";");
|
|
|
|
font.Replace(",", ";");
|
|
|
|
|
2012-12-08 03:51:09 +01:00
|
|
|
data = wxString::Format("Style: %s,%s,%g,%s,%s,%s,%s,%d,%d,%d,%d,%g,%g,%g,%g,%d,%g,%g,%i,%i,%i,%i,%i",
|
2012-12-01 05:02:46 +01:00
|
|
|
name, font, fontsize,
|
|
|
|
primary.GetAssStyleFormatted(),
|
|
|
|
secondary.GetAssStyleFormatted(),
|
|
|
|
outline.GetAssStyleFormatted(),
|
|
|
|
shadow.GetAssStyleFormatted(),
|
|
|
|
(bold? -1 : 0), (italic ? -1 : 0),
|
|
|
|
(underline?-1:0),(strikeout?-1:0),
|
|
|
|
scalex,scaley,spacing,angle,
|
|
|
|
borderstyle,outline_w,shadow_w,alignment,
|
2012-12-08 03:51:09 +01:00
|
|
|
Margin[0],Margin[1],Margin[2],encoding);
|
2006-01-16 22:02:54 +01:00
|
|
|
}
|
|
|
|
|
2010-07-08 09:14:55 +02:00
|
|
|
wxString AssStyle::GetSSAText() const {
|
2012-12-01 05:02:46 +01:00
|
|
|
return wxString::Format("Style: %s,%s,%g,%s,%s,0,%s,%d,%d,%d,%g,%g,%d,%d,%d,%d,0,%i",
|
|
|
|
name, font, fontsize,
|
|
|
|
primary.GetSsaFormatted(),
|
|
|
|
secondary.GetSsaFormatted(),
|
|
|
|
shadow.GetSsaFormatted(),
|
|
|
|
(bold? -1 : 0), (italic ? -1 : 0),
|
|
|
|
borderstyle,outline_w,shadow_w,AssToSsa(alignment),
|
|
|
|
Margin[0],Margin[1],Margin[2],encoding);
|
2006-01-16 22:02:54 +01:00
|
|
|
}
|
2006-02-27 10:07:08 +01:00
|
|
|
|
2009-06-07 02:22:36 +02:00
|
|
|
AssEntry *AssStyle::Clone() const {
|
2010-07-08 09:14:55 +02:00
|
|
|
return new AssStyle(*this);
|
2006-02-27 10:07:08 +01:00
|
|
|
}
|
2007-04-17 00:13:09 +02:00
|
|
|
|
|
|
|
void AssStyle::GetEncodings(wxArrayString &encodingStrings) {
|
|
|
|
encodingStrings.Clear();
|
2011-09-28 21:43:11 +02:00
|
|
|
encodingStrings.Add(wxString("0 - ") + _("ANSI"));
|
|
|
|
encodingStrings.Add(wxString("1 - ") + _("Default"));
|
|
|
|
encodingStrings.Add(wxString("2 - ") + _("Symbol"));
|
|
|
|
encodingStrings.Add(wxString("77 - ") + _("Mac"));
|
|
|
|
encodingStrings.Add(wxString("128 - ") + _("Shift_JIS"));
|
|
|
|
encodingStrings.Add(wxString("129 - ") + _("Hangeul"));
|
|
|
|
encodingStrings.Add(wxString("130 - ") + _("Johab"));
|
|
|
|
encodingStrings.Add(wxString("134 - ") + _("GB2312"));
|
|
|
|
encodingStrings.Add(wxString("136 - ") + _("Chinese BIG5"));
|
|
|
|
encodingStrings.Add(wxString("161 - ") + _("Greek"));
|
|
|
|
encodingStrings.Add(wxString("162 - ") + _("Turkish"));
|
|
|
|
encodingStrings.Add(wxString("163 - ") + _("Vietnamese"));
|
|
|
|
encodingStrings.Add(wxString("177 - ") + _("Hebrew"));
|
|
|
|
encodingStrings.Add(wxString("178 - ") + _("Arabic"));
|
|
|
|
encodingStrings.Add(wxString("186 - ") + _("Baltic"));
|
|
|
|
encodingStrings.Add(wxString("204 - ") + _("Russian"));
|
|
|
|
encodingStrings.Add(wxString("222 - ") + _("Thai"));
|
|
|
|
encodingStrings.Add(wxString("238 - ") + _("East European"));
|
|
|
|
encodingStrings.Add(wxString("255 - ") + _("OEM"));
|
2007-04-17 00:13:09 +02:00
|
|
|
}
|
2012-03-25 06:04:54 +02:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|