- Main Page
- Namespaces
- Classes
- Files
- Directories

- File List
- File Members

# STS.h

    00001 /*
    00002  *      Copyright (C) 2003-2005 Gabest
    00003  *      http://www.gabest.org
    00004  *
    00005  *  This Program is free software; you can redistribute it and/or modify
    00006  *  it under the terms of the GNU General Public License as published by
    00007  *  the Free Software Foundation; either version 2, or (at your option)
    00008  *  any later version.
    00009  *
    00010  *  This Program is distributed in the hope that it will be useful,
    00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    00013  *  GNU General Public License for more details.
    00014  *
    00015  *  You should have received a copy of the GNU General Public License
    00016  *  along with GNU Make; see the file COPYING.  If not, write to
    00017  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
    00018  *  http://www.gnu.org/copyleft/gpl.html
    00019  *
    00020  */
    00021
    00022 #pragma once
    00023
    00024 #include <afxtempl.h>
    00025 #include <wxutil.h>
    00026 #include "TextFile.h"
    00027 #include "GFN.h"
    00028
    00029 typedef enum {TIME, FRAME} tmode; // the meaning of STSEntry::start/end
    00030
    00031 class STSStyle
    00032 {
    00033 public:
    00034         CRect   marginRect; // measured from the sides
    00035         int             scrAlignment; // 1 - 9: as on the numpad, 0: default
    00036         int             borderStyle; // 0: outline, 1: opaque box
    00037         double  outlineWidth;
    00038         double  shadowDepth;
    00039         COLORREF colors[4]; // usually: {primary, secondary, outline/background, shadow}
    00040         BYTE    alpha[4];
    00041     int         charSet;
    00042     CString fontName;
    00043         double  fontSize; // height
    00044         double  fontScaleX, fontScaleY; // percent
    00045         double  fontSpacing; // +/- pixels
    00046         int             fontWeight;
    00047         bool    fItalic;
    00048         bool    fUnderline;
    00049         bool    fStrikeOut;
    00050         bool    fBlur;
    00051         double  fontAngleZ, fontAngleX, fontAngleY;
    00052         int             relativeTo; // 0: window, 1: video, 2: undefined (~window)
    00053
    00054         STSStyle();
    00055
    00056         void SetDefault();
    00057
    00058         bool operator == (STSStyle& s);
    00059         bool IsFontStyleEqual(STSStyle& s);
    00060
    00061         void operator = (LOGFONT& lf);
    00062
    00063         friend LOGFONTA& operator <<= (LOGFONTA& lfa, STSStyle& s);
    00064         friend LOGFONTW& operator <<= (LOGFONTW& lfw, STSStyle& s);
    00065
    00066         friend CString& operator <<= (CString& style, STSStyle& s);
    00067         friend STSStyle& operator <<= (STSStyle& s, CString& style);
    00068 };
    00069
    00070 class CSTSStyleMap : public CMapStringToPtr
    00071 {
    00072 public:
    00073         CSTSStyleMap() {}
    00074         virtual ~CSTSStyleMap() {Free();}
    00075         void Free();
    00076 };
    00077
    00078 typedef struct
    00079 {
    00080         CStringW str;
    00081         bool fUnicode;
    00082         CString style, actor, effect;
    00083         CRect marginRect;
    00084         int layer;
    00085         int start, end;
    00086         int readorder;
    00087 } STSEntry;
    00088
    00089 typedef CArray<STSEntry> CSTSArray;
    00090
    00091 typedef CArray<int> CSubArray;
    00092
    00093 class STSSegment
    00094 {
    00095 public:
    00096         int start, end;
    00097         CSubArray subs;
    00098
    00099         STSSegment() {};
    00100         STSSegment(int s, int e) {start = s; end = e;}
    00101         STSSegment(const STSSegment& stss) {*this = stss;}
    00102         void operator = (const STSSegment& stss) {start = stss.start; end = stss.end; subs.Copy(stss.subs);}
    00103 };
    00104
    00105 typedef CArray<STSSegment> CSTSSegmentArray;
    00106
    00107 class CSimpleTextSubtitle : public CSTSArray
    00108 {
    00109         friend class CSubtitleEditorDlg;
    00110
    00111 protected:
    00112         CSTSSegmentArray m_segments;
    00113         virtual void OnChanged() {}
    00114
    00115 public:
    00116         CString m_name;
    00117         tmode m_mode;
    00118         CTextFile::enc m_encoding;
    00119         CString m_path;
    00120
    00121         CSize m_dstScreenSize;
    00122         int m_defaultWrapStyle;
    00123         int m_collisions;
    00124         bool m_fScaledBAS;
    00125
    00126         bool m_fUsingAutoGeneratedDefaultStyle;
    00127
    00128         CSTSStyleMap m_styles;
    00129
    00130 public:
    00131         CSimpleTextSubtitle();
    00132         virtual ~CSimpleTextSubtitle();
    00133
    00134         virtual void Copy(CSimpleTextSubtitle& sts);
    00135         virtual void Empty();
    00136
    00137         void Sort(bool fRestoreReadorder = false);
    00138         void CreateSegments();
    00139
    00140         void Append(CSimpleTextSubtitle& sts, int timeoff = -1);
    00141
    00142         bool Open(CString fn, int CharSet, CString name = _T(""));
    00143         bool Open(CTextFile* f, int CharSet, CString name);
    00144         bool Open(BYTE* data, int len, int CharSet, CString name);
    00145         bool SaveAs(CString fn, exttype et, double fps = -1, CTextFile::enc = CTextFile::ASCII);
    00146
    00147         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);
    00148
    00149         void CreateDefaultStyle(int CharSet);
    00150         void ChangeUnknownStylesToDefault();
    00151         void AddStyle(CString name, STSStyle* style); // style will be stored and freed in Empty() later
    00152         bool CopyStyles(const CSTSStyleMap& styles, bool fAppend = false);
    00153
    00154         bool SetDefaultStyle(STSStyle& s);
    00155         bool GetDefaultStyle(STSStyle& s);
    00156
    00157         void ConvertToTimeBased(double fps);
    00158         void ConvertToFrameBased(double fps);
    00159
    00160         int TranslateStart(int i, double fps);
    00161         int TranslateEnd(int i, double fps);
    00162         int SearchSub(int t, double fps);
    00163
    00164         int TranslateSegmentStart(int i, double fps);
    00165         int TranslateSegmentEnd(int i, double fps);
    00166         const STSSegment* SearchSubs(int t, double fps, /*[out]*/ int* iSegment = NULL, int* nSegments = NULL);
    00167         const STSSegment* GetSegment(int iSegment) {return(iSegment >= 0 && iSegment < m_segments.GetSize() ? &m_segments[iSegment] : NULL);}
    00168
    00169         STSStyle* GetStyle(int i);
    00170         bool GetStyle(int i, STSStyle& stss);
    00171         int GetCharSet(int i);
    00172         bool IsEntryUnicode(int i);
    00173         void ConvertUnicode(int i, bool fUnicode);
    00174
    00175         CStringA GetStrA(int i, bool fSSA = false);
    00176         CStringW GetStrW(int i, bool fSSA = false);
    00177         CStringW GetStrWA(int i, bool fSSA = false);
    00178
    00179 #ifdef UNICODE
    00180 #define GetStr GetStrW
    00181 #else
    00182 #define GetStr GetStrA
    00183 #endif
    00184
    00185         void SetStr(int i, CStringA str, bool fUnicode /* ignored */);
    00186         void SetStr(int i, CStringW str, bool fUnicode);
    00187 };
    00188
    00189 extern BYTE CharSetList[];
    00190 extern TCHAR* CharSetNames[];
    00191 extern int CharSetLen;
    00192
    00193 class CHtmlColorMap : public CMapStringToPtr {public: CHtmlColorMap();};
    00194 extern CHtmlColorMap g_colors;
    00195