RTS.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #pragma once
  22. #include "STS.h"
  23. #include "Rasterizer.h"
  24. #include "..SubPicISubPic.h"
  25. class CMyFont : public CFont
  26. {
  27. public:
  28. int m_ascent, m_descent;
  29. CMyFont(STSStyle& style);
  30. };
  31. class CPolygon;
  32. class CWord : public Rasterizer
  33. {
  34. bool m_fDrawn;
  35. CPoint m_p;
  36. void Transform(CPoint org);
  37. bool CreateOpaqueBox();
  38. protected:
  39. CStringW m_str;
  40. virtual bool CreatePath() = 0;
  41. public:
  42. bool m_fWhiteSpaceChar, m_fLineBreak;
  43. STSStyle m_style;
  44. CPolygon* m_pOpaqueBox;
  45. int m_ktype, m_kstart, m_kend;
  46. int m_width, m_ascent, m_descent;
  47. 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)
  48. virtual ~CWord();
  49. virtual CWord* Copy() = 0;
  50. virtual bool Append(CWord* w);
  51. void Paint(CPoint p, CPoint org);
  52. };
  53. class CText : public CWord
  54. {
  55. protected:
  56. virtual bool CreatePath();
  57. public:
  58. CText(STSStyle& style, CStringW str, int ktype, int kstart, int kend);
  59. virtual CWord* Copy();
  60. virtual bool Append(CWord* w);
  61. };
  62. class CPolygon : public CWord
  63. {
  64. bool GetLONG(CStringW& str, LONG& ret);
  65. bool GetPOINT(CStringW& str, POINT& ret);
  66. bool ParseStr();
  67. protected:
  68. double m_scalex, m_scaley;
  69. int m_baseline;
  70. CArray<BYTE> m_pathTypesOrg;
  71. CArray<CPoint> m_pathPointsOrg;
  72. virtual bool CreatePath();
  73. public:
  74. CPolygon(STSStyle& style, CStringW str, int ktype, int kstart, int kend, double scalex, double scaley, int baseline);
  75. virtual ~CPolygon();
  76. virtual CWord* Copy();
  77. virtual bool Append(CWord* w);
  78. };
  79. class CClipper : public CPolygon
  80. {
  81. private:
  82. CWord* Copy();
  83.     virtual bool Append(CWord* w);
  84. public:
  85. CClipper(CStringW str, CSize size, double scalex, double scaley);
  86. virtual ~CClipper();
  87. CSize m_size;
  88. BYTE* m_pAlphaMask;
  89. };
  90. class CLine : public CList<CWord*>
  91. {
  92. public:
  93. int m_width, m_ascent, m_descent, m_border;
  94. virtual ~CLine();
  95. void Compact();
  96. CRect PaintShadow(SubPicDesc& spd, CRect& clipRect, BYTE* pAlphaMask, CPoint p, CPoint org, int time, int alpha);
  97. CRect PaintOutline(SubPicDesc& spd, CRect& clipRect, BYTE* pAlphaMask, CPoint p, CPoint org, int time, int alpha);
  98. CRect PaintBody(SubPicDesc& spd, CRect& clipRect, BYTE* pAlphaMask, CPoint p, CPoint org, int time, int alpha);
  99. };
  100. enum eftype
  101. {
  102. 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])}
  103. EF_ORG, // {org(x=param[0], y=param[1])}
  104. 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])
  105. EF_BANNER, // Banner;delay=param[0][;lefttoright=param[1];fadeawaywidth=param[2]]
  106. EF_SCROLL, // Scroll up/down=param[3];top=param[0];bottom=param[1];delay=param[2][;fadeawayheight=param[4]]
  107. };
  108. #define EF_NUMBEROFEFFECTS 5
  109. class Effect
  110. {
  111. public:
  112. enum eftype type;
  113. int param[8];
  114. int t[4];
  115. };
  116. class CSubtitle : public CList<CLine*>
  117. {
  118. int GetFullWidth();
  119. int GetFullLineWidth(POSITION pos);
  120. int GetWrapWidth(POSITION pos, int maxwidth);
  121. CLine* GetNextLine(POSITION& pos, int maxwidth);
  122. public:
  123. int m_scrAlignment;
  124. int m_wrapStyle;
  125. bool m_fAnimated;
  126. int m_relativeTo;
  127. Effect* m_effects[EF_NUMBEROFEFFECTS];
  128. CList<CWord*> m_words;
  129. CClipper* m_pClipper;
  130. CRect m_rect, m_clip;
  131. int m_topborder, m_bottomborder;
  132. double m_scalex, m_scaley;
  133. public:
  134. CSubtitle();
  135. virtual ~CSubtitle();
  136. virtual void Empty();
  137. void CreateClippers(CSize size);
  138. void MakeLines(CSize size, CRect marginRect);
  139. };
  140. class CScreenLayoutAllocator
  141. {
  142. typedef struct
  143. {
  144. CRect r;
  145. int segment, entry, layer;
  146. } SubRect;
  147. CList <SubRect, SubRect&> m_subrects;
  148. public:
  149. virtual void Empty();
  150. void AdvanceToSegment(int segment, const CSubArray& sa);
  151. CRect AllocRect(CSubtitle* s, int segment, int entry, int layer, int collisions);
  152. };
  153. [uuid("537DCACA-2812-4a4f-B2C6-1A34C17ADEB0")]
  154. class CRenderedTextSubtitle : public CSimpleTextSubtitle, public ISubPicProviderImpl, public ISubStream
  155. {
  156. CMap <int, int, CSubtitle*, CSubtitle*> m_subtitleCache;
  157. CScreenLayoutAllocator m_sla;
  158. CSize m_size;
  159. CRect m_vidrect;
  160. // temp variables, used when parsing the script
  161. int m_time, m_delay;
  162. int m_animStart, m_animEnd;
  163. double m_animAccel;
  164. int m_ktype, m_kstart, m_kend;
  165. int m_nPolygon;
  166. int m_polygonBaselineOffset;
  167. void ParseEffect(CSubtitle* sub, CString str);
  168. void ParseString(CSubtitle* sub, CStringW str, STSStyle& style);
  169. void ParsePolygon(CSubtitle* sub, CStringW str, STSStyle& style);
  170. bool ParseSSATag(CSubtitle* sub, CStringW str, STSStyle& style, STSStyle& org, bool fAnimate = false);
  171. bool ParseHtmlTag(CSubtitle* sub, CStringW str, STSStyle& style, STSStyle& org);
  172. double CalcAnimation(double dst, double src, bool fAnimate);
  173. CSubtitle* GetSubtitle(int entry);
  174. protected:
  175. virtual void OnChanged();
  176. public:
  177. CRenderedTextSubtitle(CCritSec* pLock);
  178. virtual ~CRenderedTextSubtitle();
  179. virtual void Copy(CSimpleTextSubtitle& sts);
  180. virtual void Empty();
  181. public:
  182. bool Init(CSize size, CRect vidrect); // will call Deinit()
  183. void Deinit();
  184. DECLARE_IUNKNOWN
  185.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  186. // ISubPicProvider
  187. STDMETHODIMP_(POSITION) GetStartPosition(REFERENCE_TIME rt, double fps);
  188. STDMETHODIMP_(POSITION) GetNext(POSITION pos);
  189. STDMETHODIMP_(REFERENCE_TIME) GetStart(POSITION pos, double fps);
  190. STDMETHODIMP_(REFERENCE_TIME) GetStop(POSITION pos, double fps);
  191. STDMETHODIMP_(bool) IsAnimated(POSITION pos);
  192. STDMETHODIMP Render(SubPicDesc& spd, REFERENCE_TIME rt, double fps, RECT& bbox);
  193. // IPersist
  194. STDMETHODIMP GetClassID(CLSID* pClassID);
  195. // ISubStream
  196. STDMETHODIMP_(int) GetStreamCount();
  197. STDMETHODIMP GetStreamInfo(int i, WCHAR** ppName, LCID* pLCID);
  198. STDMETHODIMP_(int) GetStream();
  199. STDMETHODIMP SetStream(int iStream);
  200. STDMETHODIMP Reload();
  201. };