smlelem.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:14k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: smlelem.cpp,v 1.1.22.1 2004/07/09 01:57:38 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include <stdlib.h>
  50. #include <stdio.h>
  51. #include <ctype.h>
  52. #include "hxtypes.h"
  53. #include "hxresult.h"
  54. #include "hxcom.h"
  55. #include "hxcomm.h"
  56. #include "ihxpckts.h"
  57. #include "hxfiles.h"
  58. #include "hxformt.h"
  59. #include "hxengin.h"
  60. #include "hxplugn.h"
  61. #include "hxpends.h"
  62. #include "hxasm.h"
  63. #include "hxassert.h"
  64. #include "chxpckts.h"
  65. #include "nptime.h"
  66. #include "smpte.h"
  67. #include "debug.h"
  68. #include "hxstrutl.h"
  69. #include "hxstring.h"
  70. #include "cbqueue.h"
  71. #include "hxslist.h"
  72. #include "hxmap.h"
  73. #include "hxstack.h"
  74. #include "hxwintyp.h"
  75. #include "chxxtype.h"
  76. #include "hxxml.h"
  77. #include "hxxmlprs.h"
  78. #include "xmlreslt.h"
  79. #include "looseprs.h"
  80. #include "sm1parse.h"
  81. #include "sm1time.h"
  82. #include "sm1elem.h"
  83. #include "debugout.h"
  84.  
  85. /*
  86.  * CSmil1Element methods
  87.  */
  88. CSmil1Element::CSmil1Element(SMIL1Node* pNode):
  89.     m_pNode(pNode),
  90.     m_ulDelay((UINT32)-1),
  91.     m_ulBeginOffset((UINT32)-1),
  92.     m_ulClipBegin((UINT32)-1),
  93.     m_ulClipEnd((UINT32)-1),
  94.     m_ulDuration((UINT32)-1),
  95.     m_ulMaxDuration((UINT32)-1),
  96.     m_ulEndOffset((UINT32)-1),
  97.     m_ulEndSync((UINT32)-1),
  98.     m_ulRepeatValue(1),
  99.     m_ulTimestamp(0),
  100.     m_bInsertedIntoTimeline(FALSE),
  101.     m_bIndefiniteDuration(FALSE),
  102.     m_nBeginEventSourceTag(SMILEventSourceNone),
  103.     m_nEndEventSourceTag(SMILEventSourceNone),
  104.     m_nEndsyncEventSourceTag(SMILEventSourceNone),
  105.     m_pHandler(0),
  106.     m_pTimelineElement(NULL)
  107. {
  108.     m_pHyperlinks = new CHXSimpleList;
  109. }
  110. CSmil1Element::~CSmil1Element()
  111. {
  112.     HX_DELETE(m_pHyperlinks);
  113.     HX_DELETE(m_pTimelineElement);
  114. }
  115. void
  116. CSmil1Element::addDuration(UINT32 ulDuration)
  117. {
  118.     // default add duration just attempts to add it to it's parent
  119.     m_ulDuration = ulDuration;
  120.     if(m_pNode->m_pParent && m_pNode->m_pParent->m_pElement)
  121.     {
  122. m_pNode->m_pParent->m_pElement->addDuration(m_ulDuration);
  123.     }
  124. }
  125. void
  126. CSmil1Element::addElement(CSmil1Element* pElement,
  127.     UINT32& ulBeginOffset, UINT32& ulDuration)
  128. {
  129. }
  130. /*
  131.  * CSmil1RootLayout methods
  132.  */
  133. CSmil1RootLayout::CSmil1RootLayout(SMIL1Node* pNode):
  134.     CSmil1Element(pNode),
  135.     m_ulHeight(0),
  136.     m_ulWidth(0),
  137.     m_bWidthUnspecified(TRUE),
  138.     m_bHeightUnspecified(TRUE),
  139.     m_ulBgColor(0)
  140. {
  141.     m_overflow = "hidden";
  142. }
  143. CSmil1RootLayout::~CSmil1RootLayout()
  144. {
  145. }
  146. HX_RESULT
  147. CSmil1RootLayout::handleElement()
  148. {
  149.     HX_RESULT rc = HXR_OK;
  150.     if(m_pHandler)
  151.     {
  152. rc = m_pHandler->handleRootLayout(this);
  153.     }
  154.     return rc;
  155. }
  156. /*
  157.  * CSmil1Region methods
  158.  */
  159. CSmil1Region::CSmil1Region(SMIL1Node* pNode):
  160.     CSmil1Element(pNode),
  161.     m_zIndex(0),
  162.     m_ulBgColor(0),
  163.     m_bBgColorSet(FALSE)
  164. {
  165.     m_fit = "hidden";
  166. }
  167. CSmil1Region::~CSmil1Region()
  168. {
  169. }
  170. HX_RESULT
  171. CSmil1Region::handleElement()
  172. {
  173.     HX_RESULT rc = HXR_OK;
  174.     if(m_pHandler)
  175.     {
  176. rc = m_pHandler->handleRegion(this);
  177.     }
  178.     return rc;
  179. }
  180. /*
  181.  * CSmil1Meta methods
  182.  */
  183. CSmil1Meta::CSmil1Meta(SMIL1Node* pNode):
  184.     CSmil1Element(pNode)
  185. {
  186. }
  187. CSmil1Meta::~CSmil1Meta()
  188. {
  189. }
  190. HX_RESULT
  191. CSmil1Meta::handleElement()
  192. {
  193.     HX_RESULT rc = HXR_OK;
  194.     if(m_pHandler)
  195.     {
  196. rc = m_pHandler->handleMeta(this);
  197.     }
  198.     return rc;
  199. }
  200. /*
  201.  * CSmil1RendererPreFetch methods
  202.  */
  203. CSmil1RendererPreFetch::CSmil1RendererPreFetch(SMIL1Node* pNode):
  204.     CSmil1Element(pNode)
  205. {
  206. }
  207. CSmil1RendererPreFetch::~CSmil1RendererPreFetch()
  208. {
  209. }
  210. HX_RESULT
  211. CSmil1RendererPreFetch::handleElement()
  212. {
  213.     HX_RESULT rc = HXR_OK;
  214.     if(m_pHandler)
  215.     {
  216. rc = m_pHandler->handleRendererPreFetch(this);
  217.     }
  218.     return rc;
  219. }
  220. /*
  221.  * CSmil1EndLayout methods
  222.  */
  223. CSmil1EndLayout::CSmil1EndLayout():
  224.     CSmil1Element(NULL)
  225. {
  226. }
  227. CSmil1EndLayout::~CSmil1EndLayout()
  228. {
  229. }
  230. HX_RESULT
  231. CSmil1EndLayout::handleElement()
  232. {
  233.     HX_RESULT rc = HXR_OK;
  234.     if(m_pHandler)
  235.     {
  236. rc = m_pHandler->handleEndLayout(this);
  237.     }
  238.     return rc;
  239. }
  240. /*
  241.  * CSmil1MetaValues methods
  242.  */
  243. CSmil1MetaValues::CSmil1MetaValues():
  244.     CSmil1Element(NULL),
  245.     m_pValues(0)
  246. {
  247. }
  248. CSmil1MetaValues::~CSmil1MetaValues()
  249. {
  250.     HX_RELEASE(m_pValues);
  251. }
  252. /*
  253.  * CSmil1Source methods
  254.  */
  255. CSmil1Source::CSmil1Source(SMIL1Node* pNode):
  256.     CSmil1Element(pNode)
  257. {
  258. }
  259. CSmil1Source::~CSmil1Source()
  260. {
  261. }
  262. HX_RESULT
  263. CSmil1Source::handleElement()
  264. {
  265.     HX_RESULT rc = HXR_OK;
  266.     if(m_pHandler)
  267.     {
  268. rc = m_pHandler->handleSource(this);
  269.     }
  270.     return rc;
  271. }
  272. void
  273. CSmil1Source::setRange(const char* pRange)
  274. {
  275.     // parse smpte/npt ranges:
  276.     //    smpte:12:03:14.21-12:15:26.03
  277.     //   npt:3:02.5-4:38.6
  278.     //
  279.     char* pPtr = (char *)strstr(pRange, "npt:");
  280.     if(pPtr)
  281.     {
  282. pPtr += 4; // point to beginning of range
  283. char* pHyphen = (char *)strchr(pRange, '-'); // find '-'
  284. if(pHyphen > pPtr)
  285. {
  286.     NPTime beginTime((const char*)CHXString(pPtr, pHyphen-pPtr));
  287.     m_ulClipBegin = (UINT32)beginTime;
  288.     if(strlen(pHyphen+1) > 0)
  289.     {
  290. NPTime endTime((const char*)CHXString(pHyphen+1));
  291. m_ulClipEnd = (UINT32)endTime;
  292.     }
  293. }
  294. else if(pHyphen)
  295. {
  296.     NPTime endTime((const char*)CHXString(pHyphen+1));
  297.     m_ulClipEnd = (UINT32)endTime;
  298. }
  299.     }
  300.     else
  301.     {
  302. pPtr = (char *)strstr(pRange, "smpte:");
  303. if(pPtr)
  304. {
  305.     pPtr += 6; // point to beginning of range
  306.     char* pHyphen = (char *)strchr(pRange, '-'); // find '-'
  307.     if(pHyphen > pPtr)
  308.     {
  309. SMPTETimeCode beginTime = 
  310.     ((const char*)CHXString(pPtr, pHyphen-pPtr));
  311. m_ulClipBegin = (UINT32)beginTime;
  312. if(strlen(pHyphen+1) > 0)
  313. {
  314.     SMPTETimeCode endTime =
  315. ((const char*)CHXString(pPtr, pHyphen-pPtr));
  316.     m_ulClipEnd = (UINT32)endTime;
  317. }
  318.     }
  319.     else if(pHyphen)
  320.     {
  321. SMPTETimeCode endTime((const char*)CHXString(pHyphen+1));
  322. m_ulClipEnd = (UINT32)endTime;
  323.     }
  324. }
  325.     }
  326. }
  327. /*
  328.  * CSmil1SourceUpdate methods
  329.  */
  330. CSmil1SourceUpdate::CSmil1SourceUpdate():
  331.     CSmil1Element(NULL)
  332. {
  333. }
  334. CSmil1SourceUpdate::~CSmil1SourceUpdate()
  335. {
  336. }
  337. HX_RESULT
  338. CSmil1SourceUpdate::handleElement()
  339. {
  340.     HX_RESULT rc = HXR_OK;
  341.     if(m_pHandler)
  342.     {
  343. rc = m_pHandler->handleSourceUpdate(this);
  344.     }
  345.     return rc;
  346. }
  347. /*
  348.  * CSmil1ParElement methods
  349.  */
  350. CSmil1ParElement::CSmil1ParElement(SMIL1Node* pNode):
  351.     CSmil1Element(pNode)
  352. {
  353. }
  354. CSmil1ParElement::~CSmil1ParElement()
  355. {
  356. }
  357. /*
  358.  * CSmil1SeqElement methods
  359.  */
  360. CSmil1SeqElement::CSmil1SeqElement(SMIL1Node*  pNode):
  361.     CSmil1Element(pNode)
  362. {
  363. }
  364. CSmil1SeqElement::~CSmil1SeqElement()
  365. {
  366. }
  367. /*
  368.  * CSmil1AAnchor methods
  369.  */
  370. CSmil1AAnchorElement::CSmil1AAnchorElement(SMIL1Node* pNode):
  371.     CSmil1Element(pNode),
  372.     m_show("replace")
  373. {
  374. }
  375. CSmil1AAnchorElement::~CSmil1AAnchorElement()
  376. {
  377. }
  378. BOOL
  379. CSmil1AAnchorElement::isCurrentLink(UINT32 ulTimeOffset, 
  380.    UINT32 ulXOffset, UINT32 ulYOffset,
  381.    HXxRect regionRect)
  382. {
  383.     BOOL rc = TRUE;
  384.     // coords only - check for out of bounds region
  385.     UINT32 ulRegionWidth = regionRect.right - regionRect.left;
  386.     UINT32 ulRegionHeight = regionRect.bottom - regionRect.top;
  387.     if(ulXOffset > ulRegionWidth ||
  388. ulYOffset > ulRegionHeight)
  389.     {
  390. rc = FALSE;
  391.     }
  392.     if(m_href.GetLength() == 0)
  393.     {
  394. rc = FALSE;
  395.     }
  396.     return rc;
  397. }
  398. void
  399. CSmil1AAnchorElement::rescale(double dXScale, double dYScale,
  400.      BOOL bResetOriginalCoords)
  401. {
  402.     // nothing to do
  403. }
  404. void CSmil1AAnchorElement::rescaleAbsolute(double dXScale, double dYScale)
  405. {
  406.     // nothing to do
  407. }
  408. /*
  409.  * CSmil1Anchor methods
  410.  */
  411. CSmil1AnchorElement::CSmil1AnchorElement(SMIL1Node* pNode):
  412.     CSmil1AAnchorElement(pNode),
  413.     m_zIndex(0),
  414.     m_bTimeValueSet(FALSE),
  415.     m_bCoordsSet(FALSE),
  416.     m_ulLeftX(0),
  417.     m_ulOriginalLeftX(0),
  418.     m_bLeftXIsPercent(FALSE),
  419.     m_ulTopY(0),
  420.     m_ulOriginalTopY(0),
  421.     m_bTopYIsPercent(FALSE),
  422.     m_ulRightX((UINT32)-1),
  423.     m_ulOriginalRightX((UINT32)-1),
  424.     m_bRightXIsPercent(FALSE),
  425.     m_ulBottomY((UINT32)-1),
  426.     m_ulOriginalBottomY((UINT32)-1),
  427.     m_bBottomYIsPercent(FALSE)
  428. {
  429. }
  430. CSmil1AnchorElement::~CSmil1AnchorElement()
  431. {
  432. }
  433. void
  434. CSmil1AnchorElement::rescale(double dXScale, double dYScale,
  435.      BOOL bResetOriginalCoords)
  436. {
  437.     if(bResetOriginalCoords)
  438.     {
  439. m_ulLeftX = m_ulOriginalLeftX;
  440. m_ulRightX = m_ulOriginalRightX;
  441. m_ulTopY = m_ulOriginalTopY;
  442. m_ulBottomY = m_ulOriginalBottomY;
  443.     }
  444.     else
  445.     {
  446. if(!m_bLeftXIsPercent)
  447. {
  448.     m_ulLeftX = (UINT32)(dXScale * (double)m_ulLeftX);
  449. }
  450. if(!m_bRightXIsPercent)
  451. {
  452.     m_ulRightX = (UINT32)(dXScale * (double)m_ulRightX);
  453. }
  454. if(!m_bTopYIsPercent)
  455. {
  456.     m_ulTopY = (UINT32)(dYScale * (double)m_ulTopY);
  457. }
  458. if(!m_bBottomYIsPercent)
  459. {
  460.     m_ulBottomY = (UINT32)(dYScale * (double)m_ulBottomY);
  461. }
  462.     }
  463. }
  464. void CSmil1AnchorElement::rescaleAbsolute(double dXScale, double dYScale)
  465. {
  466.     if(!m_bLeftXIsPercent)
  467.     {
  468.         m_ulLeftX   = (UINT32) (dXScale * ((double) m_ulOriginalLeftX) + 0.5);
  469.     }
  470.     if(!m_bRightXIsPercent)
  471.     {
  472.         m_ulRightX  = (UINT32) (dXScale * ((double) m_ulOriginalRightX) + 0.5);
  473.     }
  474.     if(!m_bTopYIsPercent)
  475.     {
  476.         m_ulTopY    = (UINT32) (dYScale * ((double) m_ulOriginalTopY) + 0.5);
  477.     }
  478.     if(!m_bBottomYIsPercent)
  479.     {
  480.         m_ulBottomY = (UINT32) (dYScale * ((double) m_ulOriginalBottomY) + 0.5);
  481.     }
  482. }
  483. BOOL
  484. CSmil1AnchorElement::isCurrentLink(UINT32 ulTimeOffset, 
  485.    UINT32 ulXOffset, UINT32 ulYOffset,
  486.    HXxRect regionRect)
  487. {
  488.     UINT32 ulRegionWidth = regionRect.right - regionRect.left;
  489.     UINT32 ulRegionHeight = regionRect.bottom - regionRect.top;
  490.     if(m_href.GetLength() == 0)
  491.     {
  492. return FALSE;
  493.     }
  494.     // first check time offset
  495.     if(m_bTimeValueSet)
  496.     {
  497. BOOL bTimeOffsetValid = FALSE;
  498. BOOL bValidBegin = m_ulBeginOffset != (UINT32)-1;
  499. BOOL bValidEnd = m_ulEndOffset != (UINT32)-1;
  500. //[SMIL 1.0 compliance] the following variable and its use, below,
  501. // helps fix PR 26471.  We may have had only our delay set:
  502. BOOL bValidDelay = m_ulDelay != (UINT32)-1;
  503. if(bValidBegin  ||  bValidDelay)
  504. {
  505.     if(ulTimeOffset >= (bValidBegin?m_ulBeginOffset:m_ulDelay) )
  506.     {
  507. if(bValidEnd)
  508. {
  509.     if(ulTimeOffset <= m_ulEndOffset)
  510.     {
  511. bTimeOffsetValid = TRUE;
  512.     }
  513. }
  514. else
  515. {
  516.     bTimeOffsetValid = TRUE;
  517. }
  518.     }
  519. }
  520. else if(bValidEnd)
  521. {
  522.     if(ulTimeOffset <= m_ulEndOffset)
  523.     {
  524. bTimeOffsetValid = TRUE;
  525.     }
  526. }
  527. if(!bTimeOffsetValid)
  528. {
  529.     return FALSE;
  530. }
  531.     }
  532.     if(m_bCoordsSet)
  533.     {
  534. UINT32 ulLeftX = m_ulLeftX;
  535. UINT32 ulRightX = m_ulRightX;
  536. UINT32 ulTopY = m_ulTopY;
  537. UINT32 ulBottomY = m_ulBottomY;
  538. // normalize to pixel coords
  539. if(m_bLeftXIsPercent)
  540. {
  541.     ulLeftX = (UINT32)(((double)m_ulLeftX/100.0) * ulRegionWidth);
  542. }
  543. if(m_bRightXIsPercent)
  544. {
  545.     ulRightX = (UINT32)(((double)m_ulRightX/100.0) * ulRegionWidth);
  546. }
  547. if(m_bTopYIsPercent)
  548. {
  549.     ulTopY = (UINT32)(((double)m_ulTopY/100.0) * ulRegionHeight);
  550. }
  551. if(m_bBottomYIsPercent)
  552. {
  553.     ulBottomY = (UINT32)(((double)m_ulBottomY/100.0) * ulRegionHeight);
  554. }
  555. if(ulXOffset >= ulLeftX &&
  556.    ulXOffset <= ulRightX &&
  557.    ulYOffset >= ulTopY &&
  558.    ulYOffset <= ulBottomY)
  559. {
  560.     return TRUE;
  561. }
  562. else
  563. {
  564.     return FALSE;
  565. }
  566.     }
  567.     else if(ulXOffset > ulRegionWidth ||
  568.     ulYOffset > ulRegionHeight)     
  569.     // assume time OK, coords OK if within bounds of region
  570.     {
  571. return FALSE;
  572.     }
  573.     return TRUE;
  574. }
  575. /*
  576.  * CSmil1AddGroup methods
  577.  */
  578. CSmil1AddGroup::CSmil1AddGroup():
  579.     CSmil1Element(NULL),
  580.     m_nGroup(0),
  581.     m_pValues(NULL),
  582.     m_nTotalTracks(0),
  583.     m_nInitTracks(0),
  584.     m_ulDuration((UINT32)-1)
  585. {
  586. }
  587. CSmil1AddGroup::~CSmil1AddGroup()
  588. {
  589.     HX_RELEASE(m_pValues);
  590. }
  591. HX_RESULT
  592. CSmil1AddGroup::handleElement()
  593. {
  594.     HX_RESULT rc = HXR_OK;
  595.     if(m_pHandler)
  596.     {
  597. rc = m_pHandler->handleAddGroup(this);
  598.     }
  599.     return rc;
  600. }