268 lines
6.5 KiB
C
268 lines
6.5 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 "STS.h"
|
||
|
#include "Rasterizer.h"
|
||
|
#include "..\SubPic\ISubPic.h"
|
||
|
|
||
|
class CMyFont : public CFont
|
||
|
{
|
||
|
public:
|
||
|
int m_ascent, m_descent;
|
||
|
|
||
|
CMyFont(STSStyle& style);
|
||
|
};
|
||
|
|
||
|
class CPolygon;
|
||
|
|
||
|
class CWord : public Rasterizer
|
||
|
{
|
||
|
bool m_fDrawn;
|
||
|
CPoint m_p;
|
||
|
|
||
|
void Transform(CPoint org);
|
||
|
|
||
|
bool CreateOpaqueBox();
|
||
|
|
||
|
protected:
|
||
|
CStringW m_str;
|
||
|
|
||
|
virtual bool CreatePath() = 0;
|
||
|
|
||
|
public:
|
||
|
bool m_fWhiteSpaceChar, m_fLineBreak;
|
||
|
|
||
|
STSStyle m_style;
|
||
|
|
||
|
CPolygon* m_pOpaqueBox;
|
||
|
|
||
|
int m_ktype, m_kstart, m_kend;
|
||
|
|
||
|
int m_width, m_ascent, m_descent;
|
||
|
|
||
|
CWord(STSStyle& style, CStringW str, int ktype, int kstart, int kend); // str[0] = 0 -> m_fLineBreak = true (in this case we only need and use the height of m_font from the whole class)
|
||
|
virtual ~CWord();
|
||
|
|
||
|
virtual CWord* Copy() = 0;
|
||
|
virtual bool Append(CWord* w);
|
||
|
|
||
|
void Paint(CPoint p, CPoint org);
|
||
|
};
|
||
|
|
||
|
class CText : public CWord
|
||
|
{
|
||
|
protected:
|
||
|
virtual bool CreatePath();
|
||
|
|
||
|
public:
|
||
|
CText(STSStyle& style, CStringW str, int ktype, int kstart, int kend);
|
||
|
|
||
|
virtual CWord* Copy();
|
||
|
virtual bool Append(CWord* w);
|
||
|
};
|
||
|
|
||
|
class CPolygon : public CWord
|
||
|
{
|
||
|
bool GetLONG(CStringW& str, LONG& ret);
|
||
|
bool GetPOINT(CStringW& str, POINT& ret);
|
||
|
bool ParseStr();
|
||
|
|
||
|
protected:
|
||
|
double m_scalex, m_scaley;
|
||
|
int m_baseline;
|
||
|
|
||
|
CAtlArray<BYTE> m_pathTypesOrg;
|
||
|
CAtlArray<CPoint> m_pathPointsOrg;
|
||
|
|
||
|
virtual bool CreatePath();
|
||
|
|
||
|
public:
|
||
|
CPolygon(STSStyle& style, CStringW str, int ktype, int kstart, int kend, double scalex, double scaley, int baseline);
|
||
|
virtual ~CPolygon();
|
||
|
|
||
|
virtual CWord* Copy();
|
||
|
virtual bool Append(CWord* w);
|
||
|
};
|
||
|
|
||
|
class CClipper : public CPolygon
|
||
|
{
|
||
|
private:
|
||
|
CWord* Copy();
|
||
|
virtual bool Append(CWord* w);
|
||
|
|
||
|
public:
|
||
|
CClipper(CStringW str, CSize size, double scalex, double scaley);
|
||
|
virtual ~CClipper();
|
||
|
|
||
|
CSize m_size;
|
||
|
BYTE* m_pAlphaMask;
|
||
|
};
|
||
|
|
||
|
class CLine : public CAtlList<CWord*>
|
||
|
{
|
||
|
public:
|
||
|
int m_width, m_ascent, m_descent, m_border;
|
||
|
|
||
|
virtual ~CLine();
|
||
|
|
||
|
void Compact();
|
||
|
|
||
|
CRect PaintShadow(SubPicDesc& spd, CRect& clipRect, BYTE* pAlphaMask, CPoint p, CPoint org, int time, int alpha);
|
||
|
CRect PaintOutline(SubPicDesc& spd, CRect& clipRect, BYTE* pAlphaMask, CPoint p, CPoint org, int time, int alpha);
|
||
|
CRect PaintBody(SubPicDesc& spd, CRect& clipRect, BYTE* pAlphaMask, CPoint p, CPoint org, int time, int alpha);
|
||
|
};
|
||
|
|
||
|
enum eftype
|
||
|
{
|
||
|
EF_MOVE = 0, // {\move(x1=param[0], y1=param[1], x2=param[2], y2=param[3], t1=t[0], t2=t[1])} or {\pos(x=param[0], y=param[1])}
|
||
|
EF_ORG, // {\org(x=param[0], y=param[1])}
|
||
|
EF_FADE, // {\fade(a1=param[0], a2=param[1], a3=param[2], t1=t[0], t2=t[1], t3=t[2], t4=t[3])} or {\fad(t1=t[1], t2=t[2])
|
||
|
EF_BANNER, // Banner;delay=param[0][;lefttoright=param[1];fadeawaywidth=param[2]]
|
||
|
EF_SCROLL, // Scroll up/down=param[3];top=param[0];bottom=param[1];delay=param[2][;fadeawayheight=param[4]]
|
||
|
};
|
||
|
|
||
|
#define EF_NUMBEROFEFFECTS 5
|
||
|
|
||
|
class Effect
|
||
|
{
|
||
|
public:
|
||
|
enum eftype type;
|
||
|
int param[8];
|
||
|
int t[4];
|
||
|
};
|
||
|
|
||
|
class CSubtitle : public CAtlList<CLine*>
|
||
|
{
|
||
|
int GetFullWidth();
|
||
|
int GetFullLineWidth(POSITION pos);
|
||
|
int GetWrapWidth(POSITION pos, int maxwidth);
|
||
|
CLine* GetNextLine(POSITION& pos, int maxwidth);
|
||
|
|
||
|
public:
|
||
|
int m_scrAlignment;
|
||
|
int m_wrapStyle;
|
||
|
bool m_fAnimated;
|
||
|
int m_relativeTo;
|
||
|
|
||
|
Effect* m_effects[EF_NUMBEROFEFFECTS];
|
||
|
|
||
|
CAtlList<CWord*> m_words;
|
||
|
|
||
|
CClipper* m_pClipper;
|
||
|
|
||
|
CRect m_rect, m_clip;
|
||
|
int m_topborder, m_bottomborder;
|
||
|
|
||
|
double m_scalex, m_scaley;
|
||
|
|
||
|
public:
|
||
|
CSubtitle();
|
||
|
virtual ~CSubtitle();
|
||
|
virtual void Empty();
|
||
|
|
||
|
void CreateClippers(CSize size);
|
||
|
|
||
|
void MakeLines(CSize size, CRect marginRect);
|
||
|
};
|
||
|
|
||
|
class CScreenLayoutAllocator
|
||
|
{
|
||
|
typedef struct
|
||
|
{
|
||
|
CRect r;
|
||
|
int segment, entry, layer;
|
||
|
} SubRect;
|
||
|
|
||
|
CAtlList<SubRect> m_subrects;
|
||
|
|
||
|
public:
|
||
|
virtual void Empty();
|
||
|
|
||
|
void AdvanceToSegment(int segment, const CAtlArray<int>& sa);
|
||
|
CRect AllocRect(CSubtitle* s, int segment, int entry, int layer, int collisions);
|
||
|
};
|
||
|
|
||
|
[uuid("537DCACA-2812-4a4f-B2C6-1A34C17ADEB0")]
|
||
|
class CRenderedTextSubtitle : public CSimpleTextSubtitle, public ISubPicProviderImpl, public ISubStream
|
||
|
{
|
||
|
CAtlMap<int, CSubtitle*> m_subtitleCache;
|
||
|
|
||
|
CScreenLayoutAllocator m_sla;
|
||
|
|
||
|
CSize m_size;
|
||
|
CRect m_vidrect;
|
||
|
|
||
|
// temp variables, used when parsing the script
|
||
|
int m_time, m_delay;
|
||
|
int m_animStart, m_animEnd;
|
||
|
double m_animAccel;
|
||
|
int m_ktype, m_kstart, m_kend;
|
||
|
int m_nPolygon;
|
||
|
int m_polygonBaselineOffset;
|
||
|
|
||
|
void ParseEffect(CSubtitle* sub, CString str);
|
||
|
void ParseString(CSubtitle* sub, CStringW str, STSStyle& style);
|
||
|
void ParsePolygon(CSubtitle* sub, CStringW str, STSStyle& style);
|
||
|
bool ParseSSATag(CSubtitle* sub, CStringW str, STSStyle& style, STSStyle& org, bool fAnimate = false);
|
||
|
bool ParseHtmlTag(CSubtitle* sub, CStringW str, STSStyle& style, STSStyle& org);
|
||
|
|
||
|
double CalcAnimation(double dst, double src, bool fAnimate);
|
||
|
|
||
|
CSubtitle* GetSubtitle(int entry);
|
||
|
|
||
|
protected:
|
||
|
virtual void OnChanged();
|
||
|
|
||
|
public:
|
||
|
CRenderedTextSubtitle(CCritSec* pLock);
|
||
|
virtual ~CRenderedTextSubtitle();
|
||
|
|
||
|
virtual void Copy(CSimpleTextSubtitle& sts);
|
||
|
virtual void Empty();
|
||
|
|
||
|
public:
|
||
|
bool Init(CSize size, CRect vidrect); // will call Deinit()
|
||
|
void Deinit();
|
||
|
|
||
|
DECLARE_IUNKNOWN
|
||
|
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
|
||
|
|
||
|
// ISubPicProvider
|
||
|
STDMETHODIMP_(POSITION) GetStartPosition(REFERENCE_TIME rt, double fps);
|
||
|
STDMETHODIMP_(POSITION) GetNext(POSITION pos);
|
||
|
STDMETHODIMP_(REFERENCE_TIME) GetStart(POSITION pos, double fps);
|
||
|
STDMETHODIMP_(REFERENCE_TIME) GetStop(POSITION pos, double fps);
|
||
|
STDMETHODIMP_(bool) IsAnimated(POSITION pos);
|
||
|
STDMETHODIMP Render(SubPicDesc& spd, REFERENCE_TIME rt, double fps, RECT& bbox);
|
||
|
|
||
|
// IPersist
|
||
|
STDMETHODIMP GetClassID(CLSID* pClassID);
|
||
|
|
||
|
// ISubStream
|
||
|
STDMETHODIMP_(int) GetStreamCount();
|
||
|
STDMETHODIMP GetStreamInfo(int i, WCHAR** ppName, LCID* pLCID);
|
||
|
STDMETHODIMP_(int) GetStream();
|
||
|
STDMETHODIMP SetStream(int iStream);
|
||
|
STDMETHODIMP Reload();
|
||
|
};
|