// 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. // // ----------------------------------------------------------------------------- // // AEGISUB // // Website: http://aegisub.cellosoft.com // Contact: mailto:zeratul@cellosoft.com // //////////// // Includes #include "ass_dialogue.h" #include "ass_override.h" #include ////////////////////// AssOverrideParameter ////////////////////// /////////////// // Constructor AssOverrideParameter::AssOverrideParameter () { classification = PARCLASS_NORMAL; ommited = false; } ////////////// // Destructor AssOverrideParameter::~AssOverrideParameter () { } //////// // Copy void AssOverrideParameter::CopyFrom (const AssOverrideParameter ¶m) { switch(param.GetType()) { case VARDATA_INT: SetInt(param.AsInt()); break; case VARDATA_FLOAT: SetFloat(param.AsFloat()); break; case VARDATA_TEXT: SetText(param.AsText()); break; case VARDATA_BOOL: SetBool(param.AsBool()); break; case VARDATA_COLOUR: SetColour(param.AsColour()); break; case VARDATA_BLOCK: SetBlock(param.AsBlock()); break; default: DeleteValue(); } classification = param.classification; ommited = param.ommited; } void AssOverrideParameter::operator= (const AssOverrideParameter ¶m) { CopyFrom(param); } ////////////////////// AssDialogueBlockOverride ////////////////////// /////////////// // Constructor AssDialogueBlockOverride::AssDialogueBlockOverride () { type = BLOCK_OVERRIDE; } ////////////// // Destructor AssDialogueBlockOverride::~AssDialogueBlockOverride () { for (std::vector::iterator cur=Tags.begin();cur!=Tags.end();cur++) { delete *cur; } Tags.clear(); } ///////////// // Read tags void AssDialogueBlockOverride::ParseTags () { // Clear current vector Tags.clear(); // Fix parenthesis matching while (text.Freq(_T('(')) > text.Freq(_T(')'))) { text += _T(")"); } // Initialize tokenizer wxStringTokenizer tkn(text,_T("\\"),wxTOKEN_RET_EMPTY_ALL); while (tkn.HasMoreTokens()) { wxString curTag = _T("\\"); curTag += tkn.GetNextToken(); if (curTag == _T("\\")) continue; // Check for parenthesis matching while (curTag.Freq(_T('(')) > curTag.Freq(_T(')'))) { if (!tkn.HasMoreTokens()) { wxLogWarning(_T("Unmatched parenthesis! Line contents: ") + parent->Text); break; } curTag << _T("\\") << tkn.GetNextToken(); } AssOverrideTag *newTag = new AssOverrideTag; newTag->SetText(curTag); Tags.push_back(newTag); } } /////////////////////////// // Get Text representation wxString AssDialogueBlockOverride::GetText () { text = _T(""); for (std::vector::iterator cur=Tags.begin();cur!=Tags.end();cur++) { text += (*cur)->ToString(); } return text; } /////////////////////////////////// // Process parameters via callback void AssDialogueBlockOverride::ProcessParameters(void (*callback)(wxString,int,AssOverrideParameter *,void *),void *userData) { AssOverrideTag *curTag; AssOverrideParameter *curPar; // Find tags for (std::vector::iterator cur=Tags.begin();cur!=Tags.end();cur++) { int n = 0; curTag = *cur; // Find parameters for (std::vector::iterator curParam=curTag->Params.begin();curParam!=curTag->Params.end();curParam++) { 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); } } n++; } } } ///////////////////////// AssOverrideParamProto ////////////////////////// /////////////// // Constructor AssOverrideParamProto::AssOverrideParamProto (VariableDataType _type,int opt,ASS_ParameterClass classi) { type = _type; optional = opt; classification = classi; } ////////////// // Destructor AssOverrideParamProto::~AssOverrideParamProto() { } ///////////////////////// AssOverrideTagProto ////////////////////////// /////////////// // Static vars std::list AssOverrideTagProto::proto; bool AssOverrideTagProto::loaded = false; /////////////// // Constructor AssOverrideTagProto::AssOverrideTagProto() { } ////////////// // Destructor AssOverrideTagProto::~AssOverrideTagProto() { } /////////////////// // Load prototypes void AssOverrideTagProto::LoadProtos () { if (loaded) return; loaded = true; // \alpha proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\alpha"); proto.back().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)); // \shad proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\shad"); proto.back().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)); // \move(,,,[,,]) proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\move"); 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)); 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)); // \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)); // \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)); // \fscx proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\fscx"); proto.back().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)); // \pos(,) proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\pos"); 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)); // \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)); // \pbo proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\pbo"); proto.back().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)); // \fsp proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\fsp"); proto.back().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)); // \fry proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\fry"); proto.back().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)); // \fr proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\fr"); proto.back().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)); // \2c&H& proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\2c"); proto.back().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)); // \4c&H& proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\4c"); proto.back().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)); // \2a&H& proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\2a"); proto.back().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)); // \4a&H& proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\4a"); proto.back().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)); // \ko proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\ko"); proto.back().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)); // \be<0/1> proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\be"); proto.back().params.push_back(AssOverrideParamProto(VARDATA_BOOL,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)); // \fs proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\fs"); proto.back().params.push_back(AssOverrideParamProto(VARDATA_INT,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)); // \c&H& proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\c"); proto.back().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<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); // \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); // \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); // \a proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\a"); proto.back().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)); // \K proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\K"); proto.back().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)); // \p proto.push_back(AssOverrideTagProto()); proto.back().name = _T("\\p"); proto.back().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)); // \t([,,][,]