Changed how time is dealt with in Athenasub.
Originally committed to SVN as r2368.
This commit is contained in:
parent
1397871e45
commit
2baf7bd2c4
10 changed files with 147 additions and 88 deletions
|
@ -131,7 +131,6 @@
|
||||||
PrecompiledHeaderThrough="prec.h"
|
PrecompiledHeaderThrough="prec.h"
|
||||||
WarningLevel="4"
|
WarningLevel="4"
|
||||||
WarnAsError="true"
|
WarnAsError="true"
|
||||||
Detect64BitPortabilityProblems="false"
|
|
||||||
DebugInformationFormat="3"
|
DebugInformationFormat="3"
|
||||||
DisableSpecificWarnings="4996"
|
DisableSpecificWarnings="4996"
|
||||||
ForcedIncludeFiles="prec.h"
|
ForcedIncludeFiles="prec.h"
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
#include "api.h"
|
#include "api.h"
|
||||||
#include "tr1.h"
|
#include "tr1.h"
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
|
#include "athenastring.h"
|
||||||
|
#include "athenatime.h"
|
||||||
#include "interfaces.h"
|
#include "interfaces.h"
|
||||||
#include "range.h"
|
#include "range.h"
|
||||||
|
|
||||||
|
|
|
@ -34,27 +34,29 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "athenasub.h"
|
|
||||||
#include "utils.h"
|
|
||||||
|
|
||||||
namespace Athenasub {
|
namespace Athenasub {
|
||||||
|
|
||||||
// Time class
|
// Time class
|
||||||
class CTime : public ITime {
|
class Time {
|
||||||
private:
|
private:
|
||||||
int ms;
|
int ms; // Time in milliseconds
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CTime() { ms = 0; }
|
Time() { ms = 0; }
|
||||||
CTime(int _ms) { ms = _ms; }
|
Time(int milliseconds) { ms = milliseconds; }
|
||||||
|
|
||||||
inline void SetMS(int milliseconds) { ms = milliseconds; }
|
inline void SetMS(int milliseconds) { ms = milliseconds; }
|
||||||
inline int GetMS() const { return ms; }
|
inline int GetMS() const { return ms; }
|
||||||
|
|
||||||
String GetString(int ms_precision,int h_precision) const;
|
|
||||||
void ParseString(const String &data);
|
|
||||||
|
|
||||||
Time Clone() const { return Time(new CTime(*this)); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
inline Time operator+ (const Time& p1,int p2) { return Time(p1.GetMS()+p2); }
|
||||||
|
inline Time operator- (const Time& p1,int p2) { return Time(p1.GetMS()-p2); }
|
||||||
|
inline bool operator== (const Time& p1,const Time& p2) { return p1.GetMS() == p2.GetMS(); }
|
||||||
|
inline bool operator!= (const Time& p1,const Time& p2) { return p1.GetMS() != p2.GetMS(); }
|
||||||
|
inline bool operator<= (const Time& p1,const Time& p2) { return p1.GetMS() <= p2.GetMS(); }
|
||||||
|
inline bool operator>= (const Time& p1,const Time& p2) { return p1.GetMS() >= p2.GetMS(); }
|
||||||
|
inline bool operator< (const Time& p1,const Time& p2) { return p1.GetMS() < p2.GetMS(); }
|
||||||
|
inline bool operator> (const Time& p1,const Time& p2) { return p1.GetMS() > p2.GetMS(); }
|
||||||
}
|
}
|
|
@ -36,6 +36,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "tr1.h"
|
#include "tr1.h"
|
||||||
|
#include "athenatime.h"
|
||||||
#include <wx/string.h>
|
#include <wx/string.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
@ -53,7 +54,6 @@ namespace Athenasub {
|
||||||
class IController;
|
class IController;
|
||||||
class IView;
|
class IView;
|
||||||
class IFormatHandler;
|
class IFormatHandler;
|
||||||
class ITime;
|
|
||||||
class IColour;
|
class IColour;
|
||||||
class IEntry;
|
class IEntry;
|
||||||
class IDialogue;
|
class IDialogue;
|
||||||
|
@ -73,7 +73,6 @@ namespace Athenasub {
|
||||||
typedef shared_ptr<IController> Controller;
|
typedef shared_ptr<IController> Controller;
|
||||||
typedef shared_ptr<IView> View;
|
typedef shared_ptr<IView> View;
|
||||||
typedef shared_ptr<IFormatHandler> FormatHandler;
|
typedef shared_ptr<IFormatHandler> FormatHandler;
|
||||||
typedef shared_ptr<ITime> Time;
|
|
||||||
typedef shared_ptr<IColour> Colour;
|
typedef shared_ptr<IColour> Colour;
|
||||||
typedef shared_ptr<IEntry> Entry;
|
typedef shared_ptr<IEntry> Entry;
|
||||||
typedef shared_ptr<IDialogue> Dialogue;
|
typedef shared_ptr<IDialogue> Dialogue;
|
||||||
|
@ -196,21 +195,6 @@ namespace Athenasub {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// Time
|
|
||||||
class ITime {
|
|
||||||
public:
|
|
||||||
virtual ~ITime() {}
|
|
||||||
|
|
||||||
virtual void SetMS(int milliseconds) = 0;
|
|
||||||
virtual int GetMS() const = 0;
|
|
||||||
|
|
||||||
virtual String GetString(int ms_precision,int h_precision) const = 0;
|
|
||||||
virtual void ParseString(const String &data) = 0;
|
|
||||||
|
|
||||||
virtual Time Clone() const = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Color
|
// Color
|
||||||
class IColour {
|
class IColour {
|
||||||
public:
|
public:
|
||||||
|
@ -276,8 +260,8 @@ namespace Athenasub {
|
||||||
|
|
||||||
// Read accessors
|
// Read accessors
|
||||||
virtual const String& GetText() const = 0;
|
virtual const String& GetText() const = 0;
|
||||||
virtual const ITime& GetStartTime() const = 0;
|
virtual const Time& GetStartTime() const = 0;
|
||||||
virtual const ITime& GetEndTime() const = 0;
|
virtual const Time& GetEndTime() const = 0;
|
||||||
virtual int GetStartFrame() const = 0;
|
virtual int GetStartFrame() const = 0;
|
||||||
virtual int GetEndFrame() const = 0;
|
virtual int GetEndFrame() const = 0;
|
||||||
virtual bool IsComment() const = 0;
|
virtual bool IsComment() const = 0;
|
||||||
|
@ -289,8 +273,8 @@ namespace Athenasub {
|
||||||
|
|
||||||
// Write accessors
|
// Write accessors
|
||||||
virtual void SetText(const String& text) = 0;
|
virtual void SetText(const String& text) = 0;
|
||||||
virtual void SetStartTime(const ITime& start) = 0;
|
virtual void SetStartTime(const Time& start) = 0;
|
||||||
virtual void SetEndTime(const ITime& end) = 0;
|
virtual void SetEndTime(const Time& end) = 0;
|
||||||
virtual void SetStartFrame(int start) = 0;
|
virtual void SetStartFrame(int start) = 0;
|
||||||
virtual void SetEndFrame(int end) = 0;
|
virtual void SetEndFrame(int end) = 0;
|
||||||
virtual void SetComment(bool isComment) = 0;
|
virtual void SetComment(bool isComment) = 0;
|
||||||
|
@ -437,11 +421,4 @@ namespace Athenasub {
|
||||||
virtual Model CreateModel()=0;
|
virtual Model CreateModel()=0;
|
||||||
};
|
};
|
||||||
typedef shared_ptr<ILibAthenaSub> LibAthenaSub;
|
typedef shared_ptr<ILibAthenaSub> LibAthenaSub;
|
||||||
|
|
||||||
|
|
||||||
// Operators
|
|
||||||
inline Time operator+(const ITime& p1,int p2) { Time res = p1.Clone(); res->SetMS(res->GetMS()+p2); return res; }
|
|
||||||
inline Time operator-(const ITime& p1,int p2) { Time res = p1.Clone(); res->SetMS(res->GetMS()-p2); return res; }
|
|
||||||
inline bool operator==(const ITime& p1,const ITime& p2) { return p1.GetMS() == p2.GetMS(); }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,6 +62,96 @@ DialogueASS::DialogueASS(const String &data,int version)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////
|
||||||
|
// Generates a string from a time
|
||||||
|
String GetTimeString(const Time& time,int ms_precision,int h_precision)
|
||||||
|
{
|
||||||
|
// Enforce sanity
|
||||||
|
ms_precision = Mid(0,ms_precision,3);
|
||||||
|
h_precision = Mid(0,h_precision,2);
|
||||||
|
|
||||||
|
// Generate values
|
||||||
|
int _ms = time.GetMS();
|
||||||
|
int h = _ms / 3600000;
|
||||||
|
_ms -= h*3600000;
|
||||||
|
int min = _ms / 60000;
|
||||||
|
_ms -= min*60000;
|
||||||
|
int s = _ms / 1000;
|
||||||
|
_ms -= s*1000;
|
||||||
|
|
||||||
|
// Cap hour value
|
||||||
|
if (h > 9 && h_precision == 1) {
|
||||||
|
h = 9;
|
||||||
|
min = 59;
|
||||||
|
s = 59;
|
||||||
|
_ms = 999;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modify ms to account for precision
|
||||||
|
if (ms_precision == 2) _ms /= 10;
|
||||||
|
else if (ms_precision == 1) _ms /= 100;
|
||||||
|
else if (ms_precision == 0) _ms = 0;
|
||||||
|
|
||||||
|
// Get write buffer
|
||||||
|
String final;
|
||||||
|
size_t size = 7+h_precision+ms_precision;
|
||||||
|
size_t pos = 0;
|
||||||
|
wxChar *buffer = final.GetWriteBuf(size);
|
||||||
|
wxChar temp[16];
|
||||||
|
|
||||||
|
// Write time
|
||||||
|
WriteNumber(buffer,temp,h,h_precision,pos);
|
||||||
|
WriteChar(buffer,_T(':'),pos);
|
||||||
|
WriteNumber(buffer,temp,min,2,pos);
|
||||||
|
WriteChar(buffer,_T(':'),pos);
|
||||||
|
WriteNumber(buffer,temp,s,2,pos);
|
||||||
|
WriteChar(buffer,_T('.'),pos);
|
||||||
|
WriteNumber(buffer,temp,_ms,ms_precision,pos);
|
||||||
|
|
||||||
|
// Write terminator
|
||||||
|
WriteText(buffer,_T("\0"),1,pos);
|
||||||
|
|
||||||
|
// Restore string's state and return
|
||||||
|
final.UngetWriteBuf(pos-1);
|
||||||
|
return final;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////
|
||||||
|
// Parses a string into a time
|
||||||
|
Time ParseTimeString(const String &data)
|
||||||
|
{
|
||||||
|
// Break into an array of values
|
||||||
|
array<size_t,4> values;
|
||||||
|
size_t last = 0;
|
||||||
|
size_t len = data.Length();
|
||||||
|
size_t curIndex = 0;
|
||||||
|
wxChar cur = 0;
|
||||||
|
for (size_t i=0;i<len;i++) {
|
||||||
|
cur = data[i];
|
||||||
|
if (cur == ':' || cur == '.' || cur == ',' || cur == ';') {
|
||||||
|
values.at(curIndex++) = SubStringToInteger(data,last,i);
|
||||||
|
last = i+1;
|
||||||
|
}
|
||||||
|
if (i == len-1) {
|
||||||
|
int value = SubStringToInteger(data,last,len);
|
||||||
|
size_t digits = len - last;
|
||||||
|
if (digits == 2) value *= 10;
|
||||||
|
if (digits == 1) value *= 100;
|
||||||
|
values.at(curIndex++) = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Turn into milliseconds
|
||||||
|
size_t mult[] = { 0, 1, 1000, 60000, 3600000 };
|
||||||
|
size_t accum = 0;
|
||||||
|
for (int i=(int)curIndex;--i>=0;) {
|
||||||
|
accum += values[i] * mult[curIndex-i];
|
||||||
|
}
|
||||||
|
return Time((int)accum);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////
|
//////////////////
|
||||||
// Parse ASS Data
|
// Parse ASS Data
|
||||||
bool DialogueASS::Parse(wxString rawData, int version)
|
bool DialogueASS::Parse(wxString rawData, int version)
|
||||||
|
@ -97,8 +187,8 @@ bool DialogueASS::Parse(wxString rawData, int version)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get times
|
// Get times
|
||||||
time[0].ParseString(tkn.GetString());
|
time[0] = ParseTimeString(tkn.GetString());
|
||||||
time[1].ParseString(tkn.GetString());
|
time[1] = ParseTimeString(tkn.GetString());
|
||||||
|
|
||||||
// Get style and actor
|
// Get style and actor
|
||||||
text[1] = tkn.GetString(true);
|
text[1] = tkn.GetString(true);
|
||||||
|
@ -169,7 +259,7 @@ String DialogueASS::ToText(int version) const
|
||||||
|
|
||||||
// Write times
|
// Write times
|
||||||
for (size_t i=0;i<2;i++) {
|
for (size_t i=0;i<2;i++) {
|
||||||
wxString tempStr = time[i].GetString(2,1);
|
wxString tempStr = GetTimeString(time[i],2,1);
|
||||||
WriteText(buffer,&tempStr[0],10,pos);
|
WriteText(buffer,&tempStr[0],10,pos);
|
||||||
WriteChar(buffer,_T(','),pos);
|
WriteChar(buffer,_T(','),pos);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ namespace Athenasub {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
array<String,4> text; // 0 = text, 1 = style, 2 = actor, 3 = effect
|
array<String,4> text; // 0 = text, 1 = style, 2 = actor, 3 = effect
|
||||||
array<CTime,2> time;
|
array<Time,2> time;
|
||||||
array<short,4> margin;
|
array<short,4> margin;
|
||||||
int layer;
|
int layer;
|
||||||
bool isComment;
|
bool isComment;
|
||||||
|
@ -73,8 +73,8 @@ namespace Athenasub {
|
||||||
bool HasMargins() const { return true; }
|
bool HasMargins() const { return true; }
|
||||||
|
|
||||||
// Read accessors
|
// Read accessors
|
||||||
const ITime& GetStartTime() const { return time[0]; }
|
const Time& GetStartTime() const { return time[0]; }
|
||||||
const ITime& GetEndTime() const { return time[1]; }
|
const Time& GetEndTime() const { return time[1]; }
|
||||||
bool IsComment() const { return isComment; }
|
bool IsComment() const { return isComment; }
|
||||||
int GetLayer() const { return layer; }
|
int GetLayer() const { return layer; }
|
||||||
int GetMargin(int n) const { return margin.at(n); }
|
int GetMargin(int n) const { return margin.at(n); }
|
||||||
|
@ -84,8 +84,8 @@ namespace Athenasub {
|
||||||
const String& GetUserField() const { return text[3]; }
|
const String& GetUserField() const { return text[3]; }
|
||||||
|
|
||||||
// Write acessors
|
// Write acessors
|
||||||
void SetStartTime(const ITime &setStart) { time[0].SetMS(setStart.GetMS()); }
|
void SetStartTime(const Time &setStart) { time[0].SetMS(setStart.GetMS()); }
|
||||||
void SetEndTime(const ITime &setEnd) { time[1].SetMS(setEnd.GetMS()); }
|
void SetEndTime(const Time &setEnd) { time[1].SetMS(setEnd.GetMS()); }
|
||||||
void SetComment(bool _isComment) { isComment = _isComment; }
|
void SetComment(bool _isComment) { isComment = _isComment; }
|
||||||
void SetLayer(int _layer) { layer = _layer; }
|
void SetLayer(int _layer) { layer = _layer; }
|
||||||
void SetMargin(int _margin,int value) { margin.at(_margin) = value; }
|
void SetMargin(int _margin,int value) { margin.at(_margin) = value; }
|
||||||
|
|
|
@ -67,8 +67,8 @@ namespace Athenasub {
|
||||||
|
|
||||||
// Read accessors
|
// Read accessors
|
||||||
virtual const String& GetText() const { ThrowUnsupported(); return EmptyString(); }
|
virtual const String& GetText() const { ThrowUnsupported(); return EmptyString(); }
|
||||||
// virtual ITime& GetStartTime() const { ThrowUnsupported(); return Time(); }
|
//virtual Time& GetStartTime() const { ThrowUnsupported(); return Time(); }
|
||||||
// virtual ITime& GetEndTime() const { ThrowUnsupported(); return Time(); }
|
//virtual Time& GetEndTime() const { ThrowUnsupported(); return Time(); }
|
||||||
virtual int GetStartFrame() const { ThrowUnsupported(); return 0; }
|
virtual int GetStartFrame() const { ThrowUnsupported(); return 0; }
|
||||||
virtual int GetEndFrame() const { ThrowUnsupported(); return 0; }
|
virtual int GetEndFrame() const { ThrowUnsupported(); return 0; }
|
||||||
virtual bool IsComment() const { ThrowUnsupported(); return false; }
|
virtual bool IsComment() const { ThrowUnsupported(); return false; }
|
||||||
|
@ -80,8 +80,8 @@ namespace Athenasub {
|
||||||
|
|
||||||
// Write accessors
|
// Write accessors
|
||||||
virtual void SetText(const String& text) { (void) text; ThrowUnsupported(); }
|
virtual void SetText(const String& text) { (void) text; ThrowUnsupported(); }
|
||||||
virtual void SetStartTime(const ITime& start) { (void) start; ThrowUnsupported(); }
|
virtual void SetStartTime(const Time& start) { (void) start; ThrowUnsupported(); }
|
||||||
virtual void SetEndTime(const ITime& end) { (void) end; ThrowUnsupported(); }
|
virtual void SetEndTime(const Time& end) { (void) end; ThrowUnsupported(); }
|
||||||
virtual void SetStartFrame(int start) { (void) start; ThrowUnsupported(); }
|
virtual void SetStartFrame(int start) { (void) start; ThrowUnsupported(); }
|
||||||
virtual void SetEndFrame(int end) { (void) end; ThrowUnsupported(); }
|
virtual void SetEndFrame(int end) { (void) end; ThrowUnsupported(); }
|
||||||
virtual void SetComment(bool isComment) { (void) isComment; ThrowUnsupported(); }
|
virtual void SetComment(bool isComment) { (void) isComment; ThrowUnsupported(); }
|
||||||
|
|
|
@ -35,9 +35,11 @@
|
||||||
|
|
||||||
#include "Athenasub.h"
|
#include "Athenasub.h"
|
||||||
#include "athenatime.h"
|
#include "athenatime.h"
|
||||||
|
#include "utils.h"
|
||||||
using namespace Athenasub;
|
using namespace Athenasub;
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
//////////////////////
|
//////////////////////
|
||||||
// Generates a string
|
// Generates a string
|
||||||
String CTime::GetString(int ms_precision,int h_precision) const
|
String CTime::GetString(int ms_precision,int h_precision) const
|
||||||
|
@ -68,22 +70,8 @@ String CTime::GetString(int ms_precision,int h_precision) const
|
||||||
else if (ms_precision == 1) _ms /= 100;
|
else if (ms_precision == 1) _ms /= 100;
|
||||||
else if (ms_precision == 0) _ms = 0;
|
else if (ms_precision == 0) _ms = 0;
|
||||||
|
|
||||||
// Old code
|
|
||||||
if (false) {
|
|
||||||
// Generate mask string
|
|
||||||
wxString mask = wxString::Format(_T("%%0%ii:%%0%ii:%%0%ii.%%0%ii"),h_precision,2,2,ms_precision);
|
|
||||||
|
|
||||||
// Generate final string
|
|
||||||
wxString final = wxString::Format(mask,h,min,s,_ms);
|
|
||||||
|
|
||||||
// Done
|
|
||||||
return final;
|
|
||||||
}
|
|
||||||
|
|
||||||
// New code
|
|
||||||
else {
|
|
||||||
// Get write buffer
|
// Get write buffer
|
||||||
wxString final;
|
String final;
|
||||||
size_t size = 7+h_precision+ms_precision;
|
size_t size = 7+h_precision+ms_precision;
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
wxChar *buffer = final.GetWriteBuf(size);
|
wxChar *buffer = final.GetWriteBuf(size);
|
||||||
|
@ -105,7 +93,6 @@ String CTime::GetString(int ms_precision,int h_precision) const
|
||||||
final.UngetWriteBuf(pos-1);
|
final.UngetWriteBuf(pos-1);
|
||||||
return final;
|
return final;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////
|
///////////////////
|
||||||
|
@ -141,3 +128,5 @@ void CTime::ParseString(const String &data)
|
||||||
}
|
}
|
||||||
ms = (int)accum;
|
ms = (int)accum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -108,8 +108,8 @@ int main()
|
||||||
size_t len = entries.size();
|
size_t len = entries.size();
|
||||||
for (size_t i=0;i<len;i++) {
|
for (size_t i=0;i<len;i++) {
|
||||||
Dialogue diag = dynamic_pointer_cast<IDialogue> (entries[i]);
|
Dialogue diag = dynamic_pointer_cast<IDialogue> (entries[i]);
|
||||||
diag->SetStartTime(*(diag->GetStartTime() - 55555));
|
diag->SetStartTime(diag->GetStartTime() - 55555);
|
||||||
diag->SetEndTime(*(diag->GetEndTime() + 5555));
|
diag->SetEndTime(diag->GetEndTime() + 5555);
|
||||||
}
|
}
|
||||||
actions->Finish();
|
actions->Finish();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue