/* * 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 m_pathTypesOrg; CAtlArray 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 { 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 { 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 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 m_subrects; public: virtual void Empty(); void AdvanceToSegment(int segment, const CAtlArray& 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 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(); };