mirror of https://github.com/odrling/Aegisub
192 lines
5.3 KiB
C++
192 lines
5.3 KiB
C++
/*
|
|
* Copyright (C) 2003-2006 Gabest
|
|
* http://www.gabest.org
|
|
*
|
|
* This Program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This Program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with GNU Make; see the file COPYING. If not, write to
|
|
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
*
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <atlcoll.h>
|
|
#include <wxutil.h>
|
|
#include "TextFile.h"
|
|
#include "GFN.h"
|
|
|
|
typedef enum {TIME, FRAME} tmode; // the meaning of STSEntry::start/end
|
|
|
|
class STSStyle
|
|
{
|
|
public:
|
|
CRect marginRect; // measured from the sides
|
|
int scrAlignment; // 1 - 9: as on the numpad, 0: default
|
|
int borderStyle; // 0: outline, 1: opaque box
|
|
double outlineWidth;
|
|
double shadowDepth;
|
|
COLORREF colors[4]; // usually: {primary, secondary, outline/background, shadow}
|
|
BYTE alpha[4];
|
|
int charSet;
|
|
CString fontName;
|
|
double fontSize; // height
|
|
double fontScaleX, fontScaleY; // percent
|
|
double fontSpacing; // +/- pixels
|
|
int fontWeight;
|
|
bool fItalic;
|
|
bool fUnderline;
|
|
bool fStrikeOut;
|
|
bool fBlur;
|
|
double fontAngleZ, fontAngleX, fontAngleY;
|
|
double fontShiftX, fontShiftY;
|
|
int relativeTo; // 0: window, 1: video, 2: undefined (~window)
|
|
|
|
STSStyle();
|
|
|
|
void SetDefault();
|
|
|
|
bool operator == (STSStyle& s);
|
|
bool IsFontStyleEqual(STSStyle& s);
|
|
|
|
void operator = (LOGFONT& lf);
|
|
|
|
friend LOGFONTA& operator <<= (LOGFONTA& lfa, STSStyle& s);
|
|
friend LOGFONTW& operator <<= (LOGFONTW& lfw, STSStyle& s);
|
|
|
|
friend CString& operator <<= (CString& style, STSStyle& s);
|
|
friend STSStyle& operator <<= (STSStyle& s, CString& style);
|
|
};
|
|
|
|
class CSTSStyleMap : public CAtlMap<CString, STSStyle*, CStringElementTraits<CString> >
|
|
{
|
|
public:
|
|
CSTSStyleMap() {}
|
|
virtual ~CSTSStyleMap() {Free();}
|
|
void Free();
|
|
};
|
|
|
|
typedef struct
|
|
{
|
|
CStringW str;
|
|
bool fUnicode;
|
|
CString style, actor, effect;
|
|
CRect marginRect;
|
|
int layer;
|
|
int start, end;
|
|
int readorder;
|
|
} STSEntry;
|
|
|
|
class STSSegment
|
|
{
|
|
public:
|
|
int start, end;
|
|
CAtlArray<int> subs;
|
|
|
|
STSSegment() {};
|
|
STSSegment(int s, int e) {start = s; end = e;}
|
|
STSSegment(const STSSegment& stss) {*this = stss;}
|
|
void operator = (const STSSegment& stss) {start = stss.start; end = stss.end; subs.Copy(stss.subs);}
|
|
};
|
|
|
|
class CSimpleTextSubtitle : public CAtlArray<STSEntry>
|
|
{
|
|
friend class CSubtitleEditorDlg;
|
|
|
|
protected:
|
|
CAtlArray<STSSegment> m_segments;
|
|
virtual void OnChanged() {}
|
|
|
|
public:
|
|
CString m_name;
|
|
tmode m_mode;
|
|
CTextFile::enc m_encoding;
|
|
CString m_path;
|
|
|
|
CSize m_dstScreenSize;
|
|
int m_defaultWrapStyle;
|
|
int m_collisions;
|
|
bool m_fScaledBAS;
|
|
|
|
bool m_fUsingAutoGeneratedDefaultStyle;
|
|
|
|
CSTSStyleMap m_styles;
|
|
|
|
public:
|
|
CSimpleTextSubtitle();
|
|
virtual ~CSimpleTextSubtitle();
|
|
|
|
virtual void Copy(CSimpleTextSubtitle& sts);
|
|
virtual void Empty();
|
|
|
|
void Sort(bool fRestoreReadorder = false);
|
|
void CreateSegments();
|
|
|
|
void Append(CSimpleTextSubtitle& sts, int timeoff = -1);
|
|
|
|
bool Open(CString fn, int CharSet, CString name = _T(""));
|
|
bool Open(CTextFile* f, int CharSet, CString name);
|
|
bool Open(BYTE* data, int len, int CharSet, CString name);
|
|
bool SaveAs(CString fn, exttype et, double fps = -1, CTextFile::enc = CTextFile::ASCII);
|
|
|
|
void Add(CStringW str, bool fUnicode, int start, int end, CString style = _T("Default"), CString actor = _T(""), CString effect = _T(""), CRect marginRect = CRect(0,0,0,0), int layer = 0, int readorder = -1);
|
|
|
|
STSStyle* CreateDefaultStyle(int CharSet);
|
|
void ChangeUnknownStylesToDefault();
|
|
void AddStyle(CString name, STSStyle* style); // style will be stored and freed in Empty() later
|
|
bool CopyStyles(const CSTSStyleMap& styles, bool fAppend = false);
|
|
|
|
bool SetDefaultStyle(STSStyle& s);
|
|
bool GetDefaultStyle(STSStyle& s);
|
|
|
|
void ConvertToTimeBased(double fps);
|
|
void ConvertToFrameBased(double fps);
|
|
|
|
int TranslateStart(int i, double fps);
|
|
int TranslateEnd(int i, double fps);
|
|
int SearchSub(int t, double fps);
|
|
|
|
int TranslateSegmentStart(int i, double fps);
|
|
int TranslateSegmentEnd(int i, double fps);
|
|
const STSSegment* SearchSubs(int t, double fps, /*[out]*/ int* iSegment = NULL, int* nSegments = NULL);
|
|
const STSSegment* GetSegment(int iSegment) {return iSegment >= 0 && iSegment < (int)m_segments.GetCount() ? &m_segments[iSegment] : NULL;}
|
|
|
|
STSStyle* GetStyle(int i);
|
|
bool GetStyle(int i, STSStyle& stss);
|
|
int GetCharSet(int i);
|
|
bool IsEntryUnicode(int i);
|
|
void ConvertUnicode(int i, bool fUnicode);
|
|
|
|
CStringA GetStrA(int i, bool fSSA = false);
|
|
CStringW GetStrW(int i, bool fSSA = false);
|
|
CStringW GetStrWA(int i, bool fSSA = false);
|
|
|
|
#ifdef UNICODE
|
|
#define GetStr GetStrW
|
|
#else
|
|
#define GetStr GetStrA
|
|
#endif
|
|
|
|
void SetStr(int i, CStringA str, bool fUnicode /* ignored */);
|
|
void SetStr(int i, CStringW str, bool fUnicode);
|
|
};
|
|
|
|
extern BYTE CharSetList[];
|
|
extern TCHAR* CharSetNames[];
|
|
extern int CharSetLen;
|
|
|
|
class CHtmlColorMap : public CAtlMap<CString, DWORD, CStringElementTraits<CString> > {public: CHtmlColorMap();};
|
|
extern CHtmlColorMap g_colors;
|
|
|
|
|