smlelem.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:13k
源码类别:

Symbian

开发平台:

C/C++

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