From 88f6bca9d74b266477d0ef1c0654371b6c5925d1 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Fri, 4 Jun 2010 03:07:58 +0000 Subject: [PATCH] Make ASS tag parsing ~50% faster. Originally committed to SVN as r4429. --- aegisub/src/ass_override.cpp | 561 +++++++++++++++-------------------- aegisub/src/ass_override.h | 119 ++++---- 2 files changed, 290 insertions(+), 390 deletions(-) diff --git a/aegisub/src/ass_override.cpp b/aegisub/src/ass_override.cpp index f18189de4..c887ab04b 100644 --- a/aegisub/src/ass_override.cpp +++ b/aegisub/src/ass_override.cpp @@ -34,9 +34,6 @@ /// @ingroup subs_storage /// - -//////////// -// Includes #include "config.h" #ifndef AGI_PRE @@ -47,24 +44,17 @@ #include "ass_dialogue.h" #include "ass_override.h" - -/// @brief Constructor AssOverrideParameter ////////////////////// -/// +/// @brief Constructor AssOverrideParameter::AssOverrideParameter () { classification = PARCLASS_NORMAL; ommited = false; } - - /// @brief Destructor -/// AssOverrideParameter::~AssOverrideParameter () { DeleteValue(); } - - /// @brief Copy /// @param param /// @@ -82,7 +72,6 @@ void AssOverrideParameter::CopyFrom (const AssOverrideParameter ¶m) { ommited = param.ommited; } - /// @brief DOCME /// @param param /// @@ -90,17 +79,11 @@ void AssOverrideParameter::operator= (const AssOverrideParameter ¶m) { CopyFrom(param); } - - -/// @brief Constructor AssDialogueBlockOverride ////////////////////// -/// +/// @brief Constructor AssDialogueBlockOverride::AssDialogueBlockOverride () { } - - /// @brief Destructor -/// AssDialogueBlockOverride::~AssDialogueBlockOverride () { for (size_t i=0;i::iterator cur=Tags.begin();cur!=Tags.end();cur++) { int n = 0; - curTag = *cur; + AssOverrideTag *curTag = *cur; // Find parameters for (std::vector::iterator curParam=curTag->Params.begin();curParam!=curTag->Params.end();curParam++) { - curPar = *curParam; + AssOverrideParameter *curPar = *curParam; if (curPar->GetType() != VARDATA_NONE && curPar->ommited == false) { // Do callback (*callback)(curTag->Name,n,curPar,userData); // Go recursive if it's a block parameter - //if (curPar->classification == VARDATA_BLOCK) { if (curPar->GetType() == VARDATA_BLOCK) { curPar->AsBlock()->ProcessParameters(callback,userData); } @@ -194,9 +167,7 @@ void AssDialogueBlockOverride::ProcessParameters(AssDialogueBlockOverride::Proce } } - - -/// @brief Constructor AssOverrideParamProto ////////////////////////// +/// @brief Constructor /// @param _type /// @param opt /// @param classi @@ -207,37 +178,24 @@ AssOverrideParamProto::AssOverrideParamProto (VariableDataType _type,int opt,ASS classification = classi; } - - /// @brief Destructor -/// AssOverrideParamProto::~AssOverrideParamProto() { } - - /// DOCME -std::list AssOverrideTagProto::proto; +std::vector AssOverrideTagProto::proto; /// DOCME bool AssOverrideTagProto::loaded = false; - - /// @brief Constructor -/// AssOverrideTagProto::AssOverrideTagProto() { } - - /// @brief Destructor -/// AssOverrideTagProto::~AssOverrideTagProto() { } - - /// @brief Load prototypes /// @return /// @@ -245,377 +203,358 @@ void AssOverrideTagProto::LoadProtos () { if (loaded) return; loaded = true; + proto.resize(56); + int i = 0; + + // Longer tag names must appear before shorter tag names + // \alpha - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\alpha"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT)); + proto[i].name = _T("\\alpha"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT)); // \bord - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\bord"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); + i++; + proto[i].name = _T("\\bord"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); // \xbord - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\xbord"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); + i++; + proto[i].name = _T("\\xbord"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); // \ybord - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\ybord"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); + i++; + proto[i].name = _T("\\ybord"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); // \shad - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\shad"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); + i++; + proto[i].name = _T("\\shad"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); // \xshad - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\xshad"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); + i++; + proto[i].name = _T("\\xshad"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); // \yshad - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\yshad"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); + i++; + proto[i].name = _T("\\yshad"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); // \fade(,,,,,,) - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fade"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_RELATIVE_TIME_START)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_RELATIVE_TIME_START)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_RELATIVE_TIME_START)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_RELATIVE_TIME_START)); + i++; + proto[i].name = _T("\\fade"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_RELATIVE_TIME_START)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_RELATIVE_TIME_START)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_RELATIVE_TIME_START)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_RELATIVE_TIME_START)); // \move(,,,[,,]) - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\move"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,OPTIONAL_6,PARCLASS_RELATIVE_TIME_START)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,OPTIONAL_6,PARCLASS_RELATIVE_TIME_START)); + i++; + proto[i].name = _T("\\move"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,OPTIONAL_6,PARCLASS_RELATIVE_TIME_START)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,OPTIONAL_6,PARCLASS_RELATIVE_TIME_START)); + // If these are rearranged, keep rect clip and vector clip adjacent in this order // \clip(,,,) - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\clip"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); + i++; + proto[i].name = _T("\\clip"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); // \clip([,]) - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\clip"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,OPTIONAL_2,PARCLASS_NORMAL)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_DRAWING)); + i++; + proto[i].name = _T("\\clip"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,OPTIONAL_2,PARCLASS_NORMAL)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_DRAWING)); // \iclip(,,,) - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\iclip"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); + i++; + proto[i].name = _T("\\iclip"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); // \iclip([,]) - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\iclip"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,OPTIONAL_2,PARCLASS_NORMAL)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_DRAWING)); + i++; + proto[i].name = _T("\\iclip"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,OPTIONAL_2,PARCLASS_NORMAL)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_DRAWING)); // \fscx - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fscx"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_RELATIVE_SIZE_X)); + i++; + proto[i].name = _T("\\fscx"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_RELATIVE_SIZE_X)); // \fscy - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fscy"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_RELATIVE_SIZE_Y)); + i++; + proto[i].name = _T("\\fscy"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_RELATIVE_SIZE_Y)); // \pos(,) - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\pos"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); + i++; + proto[i].name = _T("\\pos"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); // \org(,) - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\org"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); + i++; + proto[i].name = _T("\\org"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_X)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); // \pbo - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\pbo"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); + i++; + proto[i].name = _T("\\pbo"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_POS_Y)); // \fad(,) - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fad"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_RELATIVE_TIME_START)); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_RELATIVE_TIME_END)); + i++; + proto[i].name = _T("\\fad"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_RELATIVE_TIME_START)); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_RELATIVE_TIME_END)); // \fsp - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fsp"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); + i++; + proto[i].name = _T("\\fsp"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); // \frx - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\frx"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\frx"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \fry - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fry"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\fry"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \frz - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\frz"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\frz"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \fr - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fr"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\fr"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \fax - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fax"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\fax"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \fay - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fay"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\fay"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \1c&H& - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\1c"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\1c"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \2c&H& - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\2c"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\2c"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \3c&H& - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\3c"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\3c"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \4c&H& - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\4c"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\4c"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \1a&H& - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\1a"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\1a"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \2a&H& - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\2a"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\2a"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \3a&H& - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\3a"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\3a"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \4a&H& - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\4a"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\4a"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \fe - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fe"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\fe"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \ko - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\ko"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_KARAOKE)); + i++; + proto[i].name = _T("\\ko"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_KARAOKE)); // \kf - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\kf"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_KARAOKE)); + i++; + proto[i].name = _T("\\kf"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_KARAOKE)); // \be - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\be"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\be"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \blur - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\blur"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\blur"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \fn - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fn"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\fn"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \fs+ - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fs+"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\fs+"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \fs- - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fs-"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\fs-"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \fs - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\fs"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); - + i++; + proto[i].name = _T("\\fs"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_FLOAT,NOT_OPTIONAL,PARCLASS_ABSOLUTE_SIZE)); // \an - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\an"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\an"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \c&H& - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\c"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\c"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \b<0/1/weight> - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\b"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,OPTIONAL_1,PARCLASS_NORMAL)); - proto.back().params.back().defaultValue.SetBool(false); + i++; + proto[i].name = _T("\\b"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,OPTIONAL_1,PARCLASS_NORMAL)); + proto[i].params.back().defaultValue.SetBool(false); // \i<0/1> - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\i"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_BOOL,OPTIONAL_1,PARCLASS_NORMAL)); - proto.back().params.back().defaultValue.SetBool(false); + i++; + proto[i].name = _T("\\i"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_BOOL,OPTIONAL_1,PARCLASS_NORMAL)); + proto[i].params.back().defaultValue.SetBool(false); // \u<0/1> - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\u"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_BOOL,OPTIONAL_1,PARCLASS_NORMAL)); - proto.back().params.back().defaultValue.SetBool(false); + i++; + proto[i].name = _T("\\u"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_BOOL,OPTIONAL_1,PARCLASS_NORMAL)); + proto[i].params.back().defaultValue.SetBool(false); // \s<0/1> - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\s"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_BOOL,OPTIONAL_1,PARCLASS_NORMAL)); - proto.back().params.back().defaultValue.SetBool(false); + i++; + proto[i].name = _T("\\s"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_BOOL,OPTIONAL_1,PARCLASS_NORMAL)); + proto[i].params.back().defaultValue.SetBool(false); // \a - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\a"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\a"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \k - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\k"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_KARAOKE)); + i++; + proto[i].name = _T("\\k"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_KARAOKE)); // \K - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\K"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_KARAOKE)); + i++; + proto[i].name = _T("\\K"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_KARAOKE)); // \q<0-3> - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\q"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\q"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \p - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\p"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\p"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_INT,NOT_OPTIONAL,PARCLASS_NORMAL)); // \r[] - proto.push_back(AssOverrideTagProto()); - proto.back().name = _T("\\r"); - proto.back().params.push_back(AssOverrideParamProto(VARDATA_TEXT,OPTIONAL_1,PARCLASS_NORMAL)); + i++; + proto[i].name = _T("\\r"); + proto[i].params.push_back(AssOverrideParamProto(VARDATA_TEXT,OPTIONAL_1,PARCLASS_NORMAL)); // \t([,,][,]