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

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. // system
  36. #include <math.h>
  37. #include <time.h>
  38. // include
  39. #include "hxtypes.h"
  40. #include "hxwintyp.h"
  41. #include "hxcom.h"
  42. #include "hxxml.h"
  43. #include "smiltype.h"
  44. // pnmisc
  45. #include "hxwinver.h"
  46. #include "hxparse.h"
  47. // pncont
  48. #include "hxslist.h"
  49. // rnxmllib
  50. #include "hxxmlprs.h"
  51. // rmasmil
  52. #include "smlparse.h"
  53. #include "animattr.h"
  54. CAttr::CAttr(UINT32 ulAttrName, const char* pszStr)
  55. {
  56.     m_lLastError = HXR_OK;
  57.     m_ulAttrName = ulAttrName;
  58.     m_ulAttrType = kAttrTypeString;
  59.     m_dValue[0]  = 0.0;
  60.     m_dValue[1]  = 0.0;
  61.     m_dValue[2]  = 0.0;
  62.     m_dValue[3]  = 0.0;
  63.     m_eType[0]   = CSS2TypeAuto;
  64.     m_eType[1]   = CSS2TypeAuto;
  65.     m_eType[2]   = CSS2TypeAuto;
  66.     m_eType[3]   = CSS2TypeAuto;
  67.     m_pszValue   = NULL;
  68.     if (m_ulAttrName == kAttrNameLeft   ||
  69.         m_ulAttrName == kAttrNameTop    ||
  70.         m_ulAttrName == kAttrNameRight  ||
  71.         m_ulAttrName == kAttrNameBottom ||
  72.         m_ulAttrName == kAttrNameWidth  ||
  73.         m_ulAttrName == kAttrNameHeight)
  74.     {
  75.         m_ulAttrType = kAttrTypeRealScalar;
  76.         if (pszStr)
  77.         {
  78.             UINT32 ulIndex = (m_ulAttrName == kAttrNameTop ? 1 : 0);
  79.             BOOL   bRel    = FALSE;
  80.             m_lLastError   = ParsePosLenValue(pszStr, m_dValue[ulIndex], bRel);
  81.             if (SUCCEEDED(m_lLastError))
  82.             {
  83.                 m_eType[ulIndex] = (bRel ? CSS2TypePercentage : CSS2TypeLength);
  84.             }
  85.         }
  86.     }
  87.     else if (m_ulAttrName == kAttrNameBackgroundColor ||
  88.              m_ulAttrName == kAttrNameColor)
  89.     {
  90.         m_ulAttrType = kAttrTypeRealVector;
  91.         if (pszStr)
  92.         {
  93.             UINT32   ulColor = 0;
  94.             CSS2Type eType   = CSS2TypeTransparent;
  95.             m_lLastError     = CSmilParser::parseColor(pszStr, ulColor, eType);
  96.             if (SUCCEEDED(m_lLastError))
  97.             {
  98.                 m_dValue[0] = (double) ((ulColor & 0x00FF0000) >> 16);
  99.                 m_dValue[1] = (double) ((ulColor & 0x0000FF00) >>  8);
  100.                 m_dValue[2] = (double)  (ulColor & 0x000000FF);
  101.                 m_dValue[3] = (double) ((ulColor & 0xFF000000) >> 24);
  102.             }
  103.         }
  104.     }
  105.     else if (m_ulAttrName == kAttrNameZIndex)
  106.     {
  107.         m_ulAttrType = kAttrTypeRealScalar;
  108.         if (pszStr)
  109.         {
  110.             m_dValue[0]  = atof(pszStr);
  111.         }
  112.     }
  113.     else if (m_ulAttrName == kAttrNameSoundLevel)
  114.     {
  115.         m_ulAttrType = kAttrTypeRealScalar;
  116.         if (pszStr)
  117.         {
  118.             char* pEndPtr = NULL;
  119.             m_dValue[0]   = strtod(pszStr, &pEndPtr);
  120.             if (!pEndPtr || (pEndPtr && *pEndPtr != '%'))
  121.             {
  122.                 m_lLastError = HXR_FAIL;
  123.             }
  124.         }
  125.     }
  126.     else if (m_ulAttrName == kAttrNameMediaOpacity ||
  127.              m_ulAttrName == kAttrNameBackgroundOpacity)
  128.     {
  129.         m_ulAttrType = kAttrTypeRealScalar;
  130.         if (pszStr)
  131.         {
  132.             UINT32 ulOpacity = 0;
  133.             m_lLastError     = HXParseOpacity(pszStr, ulOpacity);
  134.             if (SUCCEEDED(m_lLastError))
  135.             {
  136.                 m_dValue[0] = (double) ulOpacity;
  137.             }
  138.         }
  139.     }
  140.     else if (m_ulAttrName == kAttrNameCoords ||
  141.              m_ulAttrName == kAttrNameValue)
  142.     {
  143.         m_ulAttrType = kAttrTypeString;
  144.         if (pszStr)
  145.         {
  146.             m_pszValue = new char [strlen(pszStr) + 1];
  147.             if (m_pszValue)
  148.             {
  149.                 strcpy(m_pszValue, pszStr); /* Flawfinder: ignore */
  150.             }
  151.             else
  152.             {
  153.                 m_lLastError = HXR_OUTOFMEMORY;
  154.             }
  155.         }
  156.     }
  157.     else if (m_ulAttrName == kAttrNameLeftTop)
  158.     {
  159.         m_ulAttrType = kAttrTypeRealVector;
  160.         if (pszStr)
  161.         {
  162.             // SPEC: coordinate-pair ::= ( coordinate comma-wsp coordinate )
  163.             //       coordinate      ::= num
  164.             //       num             ::= Number
  165.             //       comma-wsp       ::= S (spacechar|",") S
  166.             //       S               ::= spacechar*
  167.             //       spacechar       ::= (#x20 | #x9 | #xD | #xA)
  168.             //
  169.             // Here we parse coordinate-pair's
  170.             //
  171.             // Allocate a buffer to hold a copy
  172.             char* pszTmp = new char [strlen(pszStr) + 1];
  173.             if (pszTmp)
  174.             {
  175.                 // Copy the string
  176.                 strcpy(pszTmp, pszStr); /* Flawfinder: ignore */
  177.                 // Parse the string
  178.                 UINT32 ulNumFound = 0;
  179.                 char*  pszToken   = strtok(pszTmp, " trn,");
  180.                 while (pszToken && SUCCEEDED(m_lLastError) && ulNumFound < 2)
  181.                 {
  182.                     // Parse the value
  183.                     BOOL bRel    = FALSE;
  184.                     m_lLastError = ParsePosLenValue(pszToken, m_dValue[ulNumFound], bRel);
  185.                     if (SUCCEEDED(m_lLastError))
  186.                     {
  187.                         // Set the type
  188.                         m_eType[ulNumFound] = (bRel ? CSS2TypePercentage : CSS2TypeLength);
  189.                         // Increment the number parsed
  190.                         ulNumFound++;
  191.                         // Get the next token
  192.                         pszToken = strtok(NULL, " trn,");
  193.                     }
  194.                 }
  195.                 if (SUCCEEDED(m_lLastError))
  196.                 {
  197.                     // Make sure we parsed exactly two
  198.                     if (ulNumFound != 2)
  199.                     {
  200.                         // We found less than 2
  201.                         m_lLastError = HXR_FAIL;
  202.                     }
  203.                 }
  204.             }
  205.             else
  206.             {
  207.                 m_lLastError = HXR_OUTOFMEMORY;
  208.             }
  209.         }
  210.     }
  211. }
  212. CAttr::CAttr(UINT32 ulAttrName,
  213.              double dVal0, CSS2Type eType0,
  214.              double dVal1, CSS2Type eType1,
  215.              double dVal2, CSS2Type eType2,
  216.              double dVal3, CSS2Type eType3)
  217. {
  218.     m_lLastError = HXR_OK;
  219.     m_ulAttrName = ulAttrName;
  220.     m_ulAttrType = kAttrTypeString;
  221.     m_dValue[0]  = dVal0;
  222.     m_dValue[1]  = dVal1;
  223.     m_dValue[2]  = dVal2;
  224.     m_dValue[3]  = dVal3;
  225.     m_eType[0]   = eType0;
  226.     m_eType[1]   = eType1;
  227.     m_eType[2]   = eType2;
  228.     m_eType[3]   = eType3;
  229.     m_pszValue   = NULL;
  230.     if (m_ulAttrName == kAttrNameLeft         ||
  231.         m_ulAttrName == kAttrNameTop          ||
  232.         m_ulAttrName == kAttrNameRight        ||
  233.         m_ulAttrName == kAttrNameBottom       ||
  234.         m_ulAttrName == kAttrNameWidth        ||
  235.         m_ulAttrName == kAttrNameHeight       ||
  236.         m_ulAttrName == kAttrNameZIndex       ||
  237.         m_ulAttrName == kAttrNameSoundLevel   ||
  238.         m_ulAttrName == kAttrNameMediaOpacity ||
  239.         m_ulAttrName == kAttrNameBackgroundOpacity)
  240.     {
  241.         m_ulAttrType   = kAttrTypeRealScalar;
  242.     }
  243.     else if (m_ulAttrName == kAttrNameBackgroundColor ||
  244.              m_ulAttrName == kAttrNameColor           ||
  245.              m_ulAttrName == kAttrNameLeftTop)
  246.     {
  247.         m_ulAttrType   = kAttrTypeRealVector;
  248.     }
  249. }
  250. CAttr::CAttr(const CAttr& rAttr)
  251. {
  252.     m_lLastError = rAttr.m_lLastError;
  253.     m_ulAttrName = rAttr.m_ulAttrName;
  254.     m_ulAttrType = rAttr.m_ulAttrType;
  255.     m_dValue[0]  = rAttr.m_dValue[0];
  256.     m_dValue[1]  = rAttr.m_dValue[1];
  257.     m_dValue[2]  = rAttr.m_dValue[2];
  258.     m_dValue[3]  = rAttr.m_dValue[3];
  259.     m_eType[0]   = rAttr.m_eType[0];
  260.     m_eType[1]   = rAttr.m_eType[1];
  261.     m_eType[2]   = rAttr.m_eType[2];
  262.     m_eType[3]   = rAttr.m_eType[3];
  263.     m_pszValue   = NULL;
  264.     if (rAttr.m_pszValue)
  265.     {
  266.         m_pszValue = new char [strlen(rAttr.m_pszValue) + 1];
  267.         if (m_pszValue)
  268.         {
  269.             strcpy(m_pszValue, rAttr.m_pszValue); /* Flawfinder: ignore */
  270.         }
  271.         else
  272.         {
  273.             m_lLastError = HXR_OUTOFMEMORY;
  274.         }
  275.     }
  276. }
  277. CAttr::~CAttr()
  278. {
  279.     HX_VECTOR_DELETE(m_pszValue);
  280. }
  281. double CAttr::Dist(CAttr* pAttr1, CAttr* pAttr2, CAttr* pDepend)
  282. {
  283.     double dRet = 0.0;
  284.     if (Compatible(pAttr1, pAttr2))
  285.     {
  286.         if (pAttr1->m_ulAttrType == kAttrTypeRealScalar ||
  287.             pAttr1->m_ulAttrType == kAttrTypeRealVector)
  288.         {
  289.             double dSum = 0.0;
  290.             for (UINT32 i = 0; i < kVectorSize; i++)
  291.             {
  292.                 double dDiff = GetAbsolute(pAttr2, i, pDepend) -
  293.                                GetAbsolute(pAttr1, i, pDepend);
  294.                 dSum += dDiff * dDiff;
  295.             }
  296.             dRet = sqrt(dSum);
  297.         }
  298.     }
  299.     return dRet;
  300. }
  301. double CAttr::GetAbsolute(CAttr* pAttr, UINT32 i, CAttr* pDepend)
  302. {
  303.     double dRet = 0.0;
  304.     if (i < kVectorSize)
  305.     {
  306.         dRet = pAttr->m_dValue[i];
  307.         if (pAttr->IsRelative(i) && pDepend && !pDepend->IsRelative(i))
  308.         {
  309.             dRet = pAttr->m_dValue[i] * pDepend->m_dValue[i] / 100.0;
  310.         }
  311.     }
  312.     return dRet;
  313. }
  314. void CAttr::Interp(CAttr* pAttr1, double t1,
  315.                    CAttr* pAttr2, double t2,
  316.                    double t, CAttr* pDepend)
  317. {
  318.     if (Compatible(pAttr1, pAttr2) &&
  319.         t1 < t2 && t1 <= t && t <= t2)
  320.     {
  321.         // Copy the first attribute
  322.         *this = *pAttr1;
  323.         // Perform the interpolation
  324.         if (pAttr1->m_ulAttrType == kAttrTypeRealScalar ||
  325.             pAttr1->m_ulAttrType == kAttrTypeRealVector)
  326.         {
  327.             double dFract = (t - t1) / (t2 - t1);
  328.             for (UINT32 i = 0; i < kVectorSize; i++)
  329.             {
  330.                 double d1 = pAttr1->m_dValue[i];
  331.                 double d2 = pAttr2->m_dValue[i];
  332.                 if (pAttr1->IsRelative(i) != pAttr2->IsRelative(i) &&
  333.                     pDepend && !pDepend->IsRelative(i))
  334.                 {
  335.                     // If we are trying to interpolate between
  336.                     // an absolute and relative value, we will first
  337.                     // convert the relative value to absolute
  338.                     if (pAttr1->IsRelative(i) && !pAttr2->IsRelative(i))
  339.                     {
  340.                         // Convert attribute 1 to absolute
  341.                         d1 = GetAbsolute(pAttr1, i, pDepend);
  342.                     }
  343.                     else
  344.                     {
  345.                         // Convert attribute 2 to absolute
  346.                         d2 = GetAbsolute(pAttr2, i, pDepend);
  347.                     }
  348.                     // Since we made sure that both attributes were
  349.                     // absolute, then the result must be absolute as well.
  350.                     m_eType[i] = CSS2TypeLength;
  351.                 }
  352.                 m_dValue[i] = d1 + (d2 - d1) * dFract;
  353.             }
  354.         }
  355.     }
  356. }
  357. void CAttr::Add(CAttr* pAttr, CAttr* pDepend)
  358. {
  359.     if (Compatible(this, pAttr))
  360.     {
  361.         if (m_ulAttrType == kAttrTypeRealScalar ||
  362.             m_ulAttrType == kAttrTypeRealVector)
  363.         {
  364.             for (UINT32 i = 0; i < kVectorSize; i++)
  365.             {
  366.                 double d1 = m_dValue[i];
  367.                 double d2 = pAttr->m_dValue[i];
  368.                 if (IsRelative(i) != pAttr->IsRelative(i) &&
  369.                     pDepend && !pDepend->IsRelative(i))
  370.                 {
  371.                     // If we are trying to add an absolute value
  372.                     // to a relative value, we will first
  373.                     // convert the relative value to absolute
  374.                     if (IsRelative(i) && !pAttr->IsRelative(i))
  375.                     {
  376.                         // Convert attribute 1 to absolute
  377.                         d1 = GetAbsolute(this, i, pDepend);
  378.                     }
  379.                     else
  380.                     {
  381.                         // Convert attribute 2 to absolute
  382.                         d2 = GetAbsolute(pAttr, i, pDepend);
  383.                     }
  384.                     // Since we made sure that both attributes were
  385.                     // absolute, then the result must be absolute as well.
  386.                     m_eType[i] = CSS2TypeLength;
  387.                 }
  388.                 // Add the values
  389.                 m_dValue[i] = d1 + d2;
  390.             }
  391.         }
  392.     }
  393. }
  394. void CAttr::Mult(double dMult)
  395. {
  396.     if (m_ulAttrType == kAttrTypeRealScalar ||
  397.         m_ulAttrType == kAttrTypeRealVector)
  398.     {
  399.         for (UINT32 i = 0; i < kVectorSize; i++)
  400.         {
  401.             m_dValue[i] *= dMult;
  402.         }
  403.     }
  404. }
  405. void CAttr::Clamp()
  406. {
  407.     if (m_ulAttrName == kAttrNameBackgroundColor ||
  408.         m_ulAttrName == kAttrNameColor)
  409.     {
  410.         for (UINT32 i = 0; i < kVectorSize; i++)
  411.         {
  412.             // Round to nearest integer
  413.             m_dValue[i] = floor(m_dValue[i] + 0.5);
  414.             // Clip bottom
  415.             if (m_dValue[i] < 0.0)
  416.             {
  417.                 m_dValue[i] = 0.0;
  418.             }
  419.             // Clip top
  420.             if (m_dValue[i] > 255.0)
  421.             {
  422.                 m_dValue[i] = 255.0;
  423.             }
  424.         }
  425.     }
  426.     else if (m_ulAttrName == kAttrNameZIndex)
  427.     {
  428.         // Round to nearest integer
  429.         m_dValue[0] = floor(m_dValue[0] + 0.5);
  430.         // Clip bottom
  431.         if (m_dValue[0] < 0.0)
  432.         {
  433.             m_dValue[0] = 0.0;
  434.         }
  435.     }
  436.     else if (m_ulAttrName == kAttrNameSoundLevel)
  437.     {
  438.         // Clip bottom
  439.         if (m_dValue[0] < 0.0)
  440.         {
  441.             m_dValue[0] = 0.0;
  442.         }
  443.     }
  444.     else if (m_ulAttrName == kAttrNameMediaOpacity ||
  445.              m_ulAttrName == kAttrNameBackgroundOpacity)
  446.     {
  447.         // Clip bottom
  448.         if (m_dValue[0] < 0.0)
  449.         {
  450.             m_dValue[0] = 0.0;
  451.         }
  452.         // Clip top
  453.         if (m_dValue[0] > 255.0)
  454.         {
  455.             m_dValue[0] = 255.0;
  456.         }
  457.     }
  458. }
  459. double CAttr::GetValueDouble(UINT32 i) const
  460. {
  461.     double dRet = 0.0;
  462.     if (i < kVectorSize)
  463.     {
  464.         dRet = m_dValue[i];
  465.     }
  466.     return dRet;
  467. }
  468. CSS2Type CAttr::GetCSS2Type(UINT32 i) const
  469. {
  470.     CSS2Type eRet = CSS2TypeAuto;
  471.     if (i < kVectorSize)
  472.     {
  473.         eRet = m_eType[i]; 
  474.     }
  475.     return eRet;
  476. }
  477. BOOL CAttr::IsRelative(UINT32 i) const
  478. {
  479.     BOOL bRet = FALSE;
  480.     if (i < kVectorSize)
  481.     {
  482.         bRet = (m_eType[i] == CSS2TypePercentage ? TRUE : FALSE);
  483.     }
  484.     return bRet;
  485. }
  486. const char* CAttr::GetValueString(UINT32 i) const
  487. {
  488.     return m_pszValue;
  489. }
  490. CAttr& CAttr::operator  = (const CAttr& rAttr)
  491. {
  492.     m_lLastError = rAttr.m_lLastError;
  493.     m_ulAttrName = rAttr.m_ulAttrName;
  494.     m_ulAttrType = rAttr.m_ulAttrType;
  495.     m_dValue[0]  = rAttr.m_dValue[0];
  496.     m_dValue[1]  = rAttr.m_dValue[1];
  497.     m_dValue[2]  = rAttr.m_dValue[2];
  498.     m_dValue[3]  = rAttr.m_dValue[3];
  499.     m_eType[0]   = rAttr.m_eType[0];
  500.     m_eType[1]   = rAttr.m_eType[1];
  501.     m_eType[2]   = rAttr.m_eType[2];
  502.     m_eType[3]   = rAttr.m_eType[3];
  503.     HX_VECTOR_DELETE(m_pszValue);
  504.     if (rAttr.m_pszValue)
  505.     {
  506.         m_pszValue = new char [strlen(rAttr.m_pszValue) + 1];
  507.         if (m_pszValue)
  508.         {
  509.             strcpy(m_pszValue, rAttr.m_pszValue); /* Flawfinder: ignore */
  510.         }
  511.         else
  512.         {
  513.             m_lLastError = HXR_OUTOFMEMORY;
  514.         }
  515.     }
  516.     return *this;
  517. }
  518. BOOL CAttr::Compatible(CAttr* pAttr1, CAttr* pAttr2)
  519. {
  520.     BOOL bRet = FALSE;
  521.     if (pAttr1 && pAttr2)
  522.     {
  523.         if (pAttr1->m_ulAttrName == pAttr2->m_ulAttrName &&
  524.             pAttr1->m_ulAttrType == pAttr2->m_ulAttrType)
  525.         {
  526.             bRet = TRUE;
  527.         }
  528.         else if (pAttr1->m_ulAttrName == kAttrNameLeftTop)
  529.         {
  530.             if (pAttr2->m_ulAttrName == kAttrNameLeft ||
  531.                 pAttr2->m_ulAttrName == kAttrNameTop)
  532.             {
  533.                 bRet = TRUE;
  534.             }
  535.         }
  536.         else if (pAttr2->m_ulAttrName == kAttrNameLeftTop)
  537.         {
  538.             if (pAttr1->m_ulAttrName == kAttrNameLeft ||
  539.                 pAttr1->m_ulAttrName == kAttrNameTop)
  540.             {
  541.                 bRet = TRUE;
  542.             }
  543.         }
  544.     }
  545.     return bRet;
  546. }
  547. HX_RESULT CAttr::ParsePosLenValue(const char* pszStr,
  548.                                   double&     rdValue,
  549.                                   BOOL&       rbIsPercent)
  550. {
  551.     HX_RESULT retVal = HXR_OK;
  552.     if (pszStr)
  553.     {
  554.         // Parse the numeric value
  555.         char* pEndPtr = NULL;
  556.         rdValue       = strtod(pszStr, &pEndPtr);
  557.         // Now decide if it was a percent or not
  558.         if (pEndPtr && *pEndPtr == '%')
  559.         {
  560.             rbIsPercent = TRUE;
  561.         }
  562.         else
  563.         {
  564.             rbIsPercent = FALSE;
  565.         }
  566.     }
  567.     else
  568.     {
  569.         retVal = HXR_FAIL;
  570.     }
  571.     return retVal;
  572. }