774fb0f674
* Wrapping all headers that are in agi_pre.h with AGI_PRE. * Sorting alphabetically. * Same operation as r3515. Note: This is broken when precompiled headers are not in use, I'll fix that after this commit so the two changes don't get jumbled up. Originally committed to SVN as r3525.
297 lines
7.8 KiB
C++
297 lines
7.8 KiB
C++
// 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 Project http://www.aegisub.org/
|
|
//
|
|
// $Id$
|
|
|
|
/// @file ass_dialogue.h
|
|
/// @see ass_dialogue.cpp
|
|
/// @ingroup subs_storage
|
|
///
|
|
|
|
|
|
////////////
|
|
// Includes
|
|
|
|
#ifndef AGI_PRE
|
|
#include <vector>
|
|
#endif
|
|
|
|
#include "ass_entry.h"
|
|
#include "ass_time.h"
|
|
|
|
|
|
//////////////
|
|
// Prototypes
|
|
class AssOverrideParameter;
|
|
class AssOverrideTag;
|
|
class AssDialogueBlockPlain;
|
|
class AssDialogueBlockOverride;
|
|
class AssDialogueBlockDrawing;
|
|
|
|
|
|
|
|
/// DOCME
|
|
enum ASS_BlockType {
|
|
|
|
/// DOCME
|
|
BLOCK_BASE,
|
|
|
|
/// DOCME
|
|
BLOCK_PLAIN,
|
|
|
|
/// DOCME
|
|
BLOCK_OVERRIDE,
|
|
|
|
/// DOCME
|
|
BLOCK_DRAWING
|
|
};
|
|
|
|
|
|
/// DOCME
|
|
/// @class AssDialogueBlock
|
|
|
|
/// @brief AssDialogue Blocks
|
|
///
|
|
/// A block is each group in the text field of an AssDialogue
|
|
/// @verbatim
|
|
/// Yes, I {\i1}am{\i0} here.
|
|
///
|
|
/// Gets split in five blocks:
|
|
/// "Yes, I " (Plain)
|
|
/// "\\i1" (Override)
|
|
/// "am" (Plain)
|
|
/// "\\i0" (Override)
|
|
/// " here." (Plain)
|
|
///
|
|
/// Also note how {}s are discarded.
|
|
/// Override blocks are further divided in AssOverrideTag's.
|
|
///
|
|
/// The GetText() method generates a new value for the "text" field from
|
|
/// the other fields in the specific class, and returns the new value.
|
|
/// @endverbatim
|
|
class AssDialogueBlock {
|
|
public:
|
|
|
|
/// DOCME
|
|
wxString text;
|
|
|
|
/// DOCME
|
|
AssDialogue *parent;
|
|
|
|
AssDialogueBlock();
|
|
virtual ~AssDialogueBlock();
|
|
|
|
virtual ASS_BlockType GetType() = 0;
|
|
|
|
/// @brief DOCME
|
|
/// @return
|
|
///
|
|
virtual wxString GetText() { return text; }
|
|
static AssDialogueBlockPlain *GetAsPlain(AssDialogueBlock *base); // Returns a block base as a plain block if it is valid, null otherwise
|
|
static AssDialogueBlockOverride *GetAsOverride(AssDialogueBlock *base); // Returns a block base as an override block if it is valid, null otherwise
|
|
static AssDialogueBlockDrawing *GetAsDrawing(AssDialogueBlock *base); // Returns a block base as a drawing block if it is valid, null otherwise
|
|
};
|
|
|
|
|
|
|
|
/// DOCME
|
|
/// @class AssDialogueBlockPlain
|
|
|
|
/// @brief DOCME
|
|
///
|
|
/// DOCME
|
|
class AssDialogueBlockPlain : public AssDialogueBlock {
|
|
public:
|
|
|
|
/// @brief DOCME
|
|
/// @return
|
|
///
|
|
ASS_BlockType GetType() { return BLOCK_PLAIN; }
|
|
AssDialogueBlockPlain();
|
|
};
|
|
|
|
|
|
|
|
/// DOCME
|
|
/// @class AssDialogueBlockDrawing
|
|
/// @brief DOCME
|
|
///
|
|
/// DOCME
|
|
class AssDialogueBlockDrawing : public AssDialogueBlock {
|
|
public:
|
|
|
|
/// DOCME
|
|
int Scale;
|
|
|
|
|
|
/// @brief DOCME
|
|
/// @return
|
|
///
|
|
ASS_BlockType GetType() { return BLOCK_DRAWING; }
|
|
AssDialogueBlockDrawing();
|
|
void TransformCoords(int trans_x,int trans_y,double mult_x,double mult_y);
|
|
};
|
|
|
|
|
|
|
|
/// DOCME
|
|
/// @class AssDialogueBlockOverride
|
|
/// @brief DOCME
|
|
///
|
|
/// DOCME
|
|
class AssDialogueBlockOverride : public AssDialogueBlock {
|
|
public:
|
|
AssDialogueBlockOverride();
|
|
~AssDialogueBlockOverride();
|
|
|
|
/// DOCME
|
|
std::vector<AssOverrideTag*> Tags;
|
|
|
|
|
|
/// @brief DOCME
|
|
/// @return
|
|
///
|
|
ASS_BlockType GetType() { return BLOCK_OVERRIDE; }
|
|
wxString GetText();
|
|
void ParseTags(); // Parses tags
|
|
|
|
/// Type of callback function passed to ProcessParameters
|
|
typedef void (*ProcessParametersCallback)(wxString,int,AssOverrideParameter*,void *);
|
|
/// @brief Process parameters via callback
|
|
/// @param callback The callback function to call per tag paramer
|
|
/// @param userData User data to pass to callback function
|
|
void ProcessParameters(ProcessParametersCallback callback,void *userData);
|
|
};
|
|
|
|
|
|
|
|
/// DOCME
|
|
/// @class AssDialogue
|
|
/// @brief DOCME
|
|
///
|
|
/// DOCME
|
|
class AssDialogue : public AssEntry {
|
|
private:
|
|
wxString MakeData();
|
|
|
|
public:
|
|
|
|
/// DOCME
|
|
std::vector<AssDialogueBlock*> Blocks; // Contains information about each block of text
|
|
|
|
|
|
/// DOCME
|
|
bool Comment; // Is this a comment line?
|
|
|
|
/// DOCME
|
|
int Layer; // Layer number
|
|
|
|
/// DOCME
|
|
int Margin[4]; // Margins: 0 = Left, 1 = Right, 2 = Top (Vertical), 3 = Bottom
|
|
|
|
/// DOCME
|
|
AssTime Start; // Starting time
|
|
|
|
/// DOCME
|
|
AssTime End; // Ending time
|
|
|
|
/// DOCME
|
|
wxString Style; // Style name
|
|
|
|
/// DOCME
|
|
wxString Actor; // Actor name
|
|
|
|
/// DOCME
|
|
wxString Effect; // Effect name
|
|
|
|
/// DOCME
|
|
wxString Text; // Raw text data
|
|
|
|
|
|
/// @brief DOCME
|
|
/// @return
|
|
///
|
|
ASS_EntryType GetType() { return ENTRY_DIALOGUE; }
|
|
|
|
bool Parse(wxString data,int version=1); // Parses raw ASS data into everything else
|
|
void ParseASSTags(); // Parses text to generate block information (doesn't update data)
|
|
void ParseSRTTags(); // Converts tags to ass format and calls ParseASSTags+UpdateData
|
|
void ClearBlocks(); // Clear all blocks, ALWAYS call this after you're done processing tags
|
|
|
|
/// @brief Process parameters via callback
|
|
/// @param callback The callback function to call per tag paramer
|
|
/// @param userData User data to pass to callback function
|
|
void ProcessParameters(AssDialogueBlockOverride::ProcessParametersCallback callback,void *userData=NULL); // Callback to process parameters
|
|
void ConvertTagsToSRT(); // Converts tags to SRT format
|
|
void StripTags(); // Strips all tags from the text
|
|
void StripTag(wxString tagName);// Strips a specific tag from the text
|
|
wxString GetStrippedText() const; // Gets text without tags
|
|
|
|
void UpdateData(); // Updates raw data from current values + text
|
|
void UpdateText(); // Generates text from the override tags
|
|
const wxString GetEntryData();
|
|
void SetEntryData(wxString newData);
|
|
void Clear(); // Wipes all data
|
|
|
|
|
|
/// @brief DOCME
|
|
/// @return
|
|
///
|
|
virtual int GetStartMS() const { return Start.GetMS(); }
|
|
|
|
/// @brief DOCME
|
|
/// @return
|
|
///
|
|
virtual int GetEndMS() const { return End.GetMS(); }
|
|
|
|
/// @brief DOCME
|
|
/// @param newStart
|
|
///
|
|
virtual void SetStartMS(const int newStart) { AssEntry::SetStartMS(newStart); Start.SetMS(newStart); }
|
|
|
|
/// @brief DOCME
|
|
/// @param newEnd
|
|
///
|
|
virtual void SetEndMS(const int newEnd) { End.SetMS(newEnd); }
|
|
|
|
/// @brief DOCME
|
|
///
|
|
void FixStartMS() { AssEntry::SetStartMS(Start.GetMS()); } // Update StartMS in AssEntry from the Start value here
|
|
|
|
void SetMarginString(const wxString value,int which); // Set string to a margin value (0 = left, 1 = right, 2 = vertical/top, 3 = bottom)
|
|
wxString GetMarginString(int which,bool pad=true); // Returns the string of a margin value (0 = left, 1 = right, 2 = vertical/top, 3 = bottom)
|
|
wxString GetSSAText();
|
|
bool CollidesWith(AssDialogue *target); // Checks if two lines collide
|
|
|
|
AssEntry *Clone() const;
|
|
|
|
AssDialogue();
|
|
AssDialogue(wxString data,int version=1);
|
|
~AssDialogue();
|
|
};
|