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

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 <time.h>
  37. // include
  38. #include "hxtypes.h"
  39. #include "hxwintyp.h"
  40. #include "hxcom.h"
  41. #include "hxwin.h"
  42. #include "hxsite2.h"
  43. #include "smiltype.h"
  44. #include "hxxml.h"
  45. #include "ihxpckts.h"
  46. // pncont
  47. #include "hxslist.h"
  48. #include "hxstring.h"
  49. // pnmisc
  50. #include "hxwinver.h"
  51. // rnxmllib
  52. #include "hxxmlprs.h"
  53. // rmasmil
  54. #include "smlelem.h"
  55. #include "smlparse.h"
  56. // smlrendr
  57. #include "passivsw.h"
  58. #include "siteuser.h"
  59. #include "layout.h"
  60. CSmilBasicBox::CSmilBasicBox()
  61. {
  62.     m_pParent                = NULL;
  63.     m_pChildList             = NULL;
  64.     m_bWidthResolved         = FALSE;
  65.     m_bDefaultWidthAssigned  = FALSE;
  66.     m_bHeightResolved        = FALSE;
  67.     m_bDefaultHeightAssigned = FALSE;
  68.     m_Rect.left              = 0;
  69.     m_Rect.top               = 0;
  70.     m_Rect.right             = 0;
  71.     m_Rect.bottom            = 0;
  72.     m_RectNoZoom.left        = 0;
  73.     m_RectNoZoom.top         = 0;
  74.     m_RectNoZoom.right       = 0;
  75.     m_RectNoZoom.bottom      = 0;
  76.     m_pSite                  = NULL;
  77.     m_pPassiveSiteWatcher    = NULL;
  78.     m_pSiteUser              = NULL;
  79.     m_bSiteChangingSize      = FALSE;
  80.     m_bNested      = FALSE;
  81.     m_eResizeBehavior        = ResizeZoom;
  82.     m_dZoomScaleFactorX      = 1.0;
  83.     m_dZoomScaleFactorY      = 1.0;
  84.     m_pChildRendererSiteList = NULL;
  85. }
  86. CSmilBasicBox::~CSmilBasicBox()
  87. {
  88.     HX_DELETE(m_pChildList);
  89.     HX_RELEASE(m_pSite);
  90.     HX_RELEASE(m_pPassiveSiteWatcher);
  91.     HX_RELEASE(m_pSiteUser);
  92.     HX_DELETE(m_pChildRendererSiteList);
  93. }
  94. HX_RESULT CSmilBasicBox::addChild(CSmilBasicBox* pBox)
  95. {
  96.     HX_RESULT retVal = HXR_OK;
  97.     if (!m_pChildList)
  98.     {
  99.         m_pChildList = new CHXSimpleList();
  100.     }
  101.     if (m_pChildList)
  102.     {
  103.         m_pChildList->AddTail((void*) pBox);
  104.         // Make sure our child inherits our resizeBehavior
  105.         pBox->m_eResizeBehavior = m_eResizeBehavior;
  106.     }
  107.     else
  108.     {
  109.         retVal = HXR_OUTOFMEMORY;
  110.     }
  111.     return retVal;
  112. }
  113. HX_RESULT CSmilBasicBox::addRendererSiteChild(IHXSite* pSite)
  114. {
  115.     HX_RESULT retVal = HXR_FAIL;
  116.     if (pSite)
  117.     {
  118.         if (!m_pChildRendererSiteList)
  119.         {
  120.             m_pChildRendererSiteList = new CHXSimpleList();
  121.         }
  122.         if (m_pChildRendererSiteList)
  123.         {
  124.             m_pChildRendererSiteList->AddTail((void*) pSite);
  125.             retVal = HXR_OK;
  126.         }
  127.     }
  128.     return retVal;
  129. }
  130. HX_RESULT CSmilBasicBox::removeRendererSiteChild(IHXSite* pSite )
  131. {
  132.     if(m_pChildRendererSiteList)
  133.     {
  134.         LISTPOSITION pos = m_pChildRendererSiteList->Find(pSite);
  135.         if(pos)
  136.         {
  137.             m_pChildRendererSiteList->RemoveAt(pos);
  138.         }
  139.     }
  140.     return HXR_OK;
  141. }
  142. BOOL CSmilBasicBox::isResolved(BoxDimension eDim)
  143. {
  144.     BOOL bRet = FALSE;
  145.     if (eDim == BoxDimensionWidth)
  146.     {
  147.         bRet = m_bWidthResolved;
  148.     }
  149.     else
  150.     {
  151.         bRet = m_bHeightResolved;
  152.     }
  153.     return bRet;
  154. }
  155. HX_RESULT CSmilBasicBox::computeChildrenMax(BoxDimension eDim,
  156.                                             BOOL         bAllMustBeValid,
  157.                                             REF(INT32)   rlMax)
  158. {
  159.     HX_RESULT retVal = HXR_FAIL;
  160.     // Do we have any children to resolve from? If
  161.     // not, then we can't resolve, so this is failure
  162.     if (m_pChildList &&
  163.         m_pChildList->GetCount() > 0)
  164.     {
  165.         // Now if we are having to compute our dimensions from
  166.         // our children, then we need to loop through our immediate
  167.         // children and compute their maximum value. NOTE: this 
  168.         // assumes that the values of m_cRect.left and m_cRect.top
  169.         // have already been set in this box.
  170.         UINT32       ulNumValid = 0;
  171.         INT32        lMax       = 0;
  172.         LISTPOSITION pos        = m_pChildList->GetHeadPosition();
  173.         while (pos)
  174.         {
  175.             CSmilBasicBox* pListBox = (CSmilBasicBox*) m_pChildList->GetNext(pos);
  176.             if (pListBox)
  177.             {
  178.                 INT32 lDim = 0;
  179.                 if (eDim == BoxDimensionWidth)
  180.                 {
  181.                     if (pListBox->m_bWidthResolved)
  182.                     {
  183.                         lDim = pListBox->m_Rect.right;
  184.                         ulNumValid++;
  185.                     }
  186.                 }
  187.                 else
  188.                 {
  189.                     if (pListBox->m_bHeightResolved)
  190.                     {
  191.                         lDim = pListBox->m_Rect.bottom;
  192.                         ulNumValid++;
  193.                     }
  194.                 }
  195.                 if (lDim > lMax)
  196.                 {
  197.                     lMax = lDim;
  198.                 }
  199.             }
  200.         }
  201.         // If we required all to be valid, then we
  202.         // need ulNumValid == num children. If not,
  203.         // then we just need at least 1 valid.
  204.         if ((bAllMustBeValid  && ulNumValid == (UINT32) m_pChildList->GetCount()) ||
  205.             (!bAllMustBeValid && ulNumValid > 0))
  206.         {
  207.             // Assign the out parameter
  208.             rlMax = lMax;
  209.             // Clear the return value
  210.             retVal = HXR_OK;
  211.         }
  212.     }
  213.     return retVal;
  214. }
  215. /*
  216.  * CSmilBasicRegion methods
  217.  */
  218. CSmilBasicRegion::CSmilBasicRegion(CSmilRegion* pSmilRegion) :
  219.     CSmilBasicBox()
  220. {
  221.     m_pSmilRegion              = pSmilRegion;
  222.     m_rect.left                = 0;
  223.     m_rect.top                 = 0;
  224.     m_rect.right               = 0;
  225.     m_rect.bottom              = 0;
  226.     m_originalRect.left        = 0;
  227.     m_originalRect.top         = 0;
  228.     m_originalRect.right       = 0;
  229.     m_originalRect.bottom      = 0;
  230.     m_mediaSize.cx             = 0;
  231.     m_mediaSize.cy             = 0;
  232.     m_originalMediaSize.cx     = 0;
  233.     m_originalMediaSize.cy     = 0;
  234.     m_bMediaSizeSet            = FALSE;
  235.     m_LayoutRect.m_dLeft       = 0.0;
  236.     m_LayoutRect.m_eLeftType   = CSS2TypeAuto;
  237.     m_LayoutRect.m_dTop        = 0.0;
  238.     m_LayoutRect.m_eTopType    = CSS2TypeAuto;
  239.     m_LayoutRect.m_dRight      = 0.0;
  240.     m_LayoutRect.m_eRightType  = CSS2TypeAuto;
  241.     m_LayoutRect.m_dBottom     = 0.0;
  242.     m_LayoutRect.m_eBottomType = CSS2TypeAuto;
  243.     m_LayoutRect.m_dWidth      = 0.0;
  244.     m_LayoutRect.m_eWidthType  = CSS2TypeAuto;
  245.     m_LayoutRect.m_dHeight     = 0.0;
  246.     m_LayoutRect.m_eHeightType = CSS2TypeAuto;
  247.     m_lZIndex                  = 0;
  248.     m_eFit                     = FitHidden;
  249.     m_ulBackgroundColor        = 0xFF000000;
  250.     m_eBackgroundColorType     = CSS2TypeTransparent;
  251.     m_bImplicitRegion          = FALSE;
  252.     m_bWidthUnspecified        = FALSE;
  253.     m_bHeightUnspecified       = FALSE;
  254.     m_dSoundLevel              = 100.0;
  255.     m_eShowBackground          = ShowBackgroundAlways;
  256.     m_bUnderRootLayout         = TRUE;
  257.     if (pSmilRegion)
  258.     {
  259.         // Copy the layout rect
  260.         m_LayoutRect = pSmilRegion->m_Rect;
  261.         // Set the z-index attribute
  262.         m_lZIndex = pSmilRegion->m_lZIndex;
  263.         // Set the fit attribute
  264.         m_eFit = pSmilRegion->m_eFit;
  265.         // Set the sound level
  266.         m_dSoundLevel = pSmilRegion->m_dSoundLevel;
  267.         // Set the region name
  268.         if (pSmilRegion->m_pNode)
  269.         {
  270.             m_region = pSmilRegion->m_pNode->m_id;
  271.         }
  272.         // Set the background color
  273.         m_ulBackgroundColor    = pSmilRegion->m_ulBackgroundColor;
  274.         m_eBackgroundColorType = pSmilRegion->m_eBackgroundColorType;
  275.         // Set the showBackground attribute
  276.         m_eShowBackground = pSmilRegion->m_eShowBackground;
  277.     }
  278. }
  279. CSmilBasicRegion::~CSmilBasicRegion()
  280. {
  281. }
  282. HX_RESULT CSmilBasicRegion::computeDimension(BoxDimension eDim)
  283. {
  284.     HX_RESULT retVal = HXR_OK;
  285.     if (eDim == BoxDimensionWidth)
  286.     {
  287.         if (!m_bWidthResolved)
  288.         {
  289.             // Is our parent width available?
  290.             BOOL   bParentAvailable = FALSE;
  291.             double dParentWidth     = 0.0;
  292.             if (m_pParent && m_pParent->m_bWidthResolved)
  293.             {
  294.                 bParentAvailable = TRUE;
  295.                 if (m_dZoomScaleFactorX != 1.0 ||
  296.                     m_dZoomScaleFactorY != 1.0)
  297.                 {
  298.                     dParentWidth = (double) HXxRECT_WIDTH(m_pParent->m_RectNoZoom);
  299.                 }
  300.                 else
  301.                 {
  302.                     dParentWidth = (double) HXxRECT_WIDTH(m_pParent->m_Rect);
  303.                 }
  304.             }
  305.             // Now resolve left/right/width
  306.             retVal = resolveDimension(m_LayoutRect.m_dLeft,
  307.                                       m_LayoutRect.m_eLeftType,
  308.                                       m_LayoutRect.m_dRight,
  309.                                       m_LayoutRect.m_eRightType,
  310.                                       m_LayoutRect.m_dWidth,
  311.                                       m_LayoutRect.m_eWidthType,
  312.                                       bParentAvailable,
  313.                                       dParentWidth,
  314.                                       m_Rect.left,
  315.                                       m_Rect.right);
  316.             if (SUCCEEDED(retVal))
  317.             {
  318.                 m_bWidthResolved = TRUE;
  319.                 // XXXMEH - these are holdover members which currently
  320.                 // need to be set, but should be taken out soon
  321.                 m_rect.left          = m_Rect.left;
  322.                 m_rect.right         = m_Rect.right;
  323.                 m_originalRect.left  = m_Rect.left;
  324.                 m_originalRect.right = m_Rect.right;
  325.                 m_bWidthUnspecified  = (m_LayoutRect.m_eWidthType  == CSS2TypeAuto ? TRUE : FALSE);
  326.             }
  327.         }
  328.     }
  329.     else
  330.     {
  331.         if (!m_bHeightResolved)
  332.         {
  333.             // Is our parent width available?
  334.             BOOL   bParentAvailable = FALSE;
  335.             double dParentHeight    = 0.0;
  336.             if (m_pParent && m_pParent->m_bHeightResolved)
  337.             {
  338.                 bParentAvailable = TRUE;
  339.                 if (m_dZoomScaleFactorX != 1.0 ||
  340.                     m_dZoomScaleFactorY != 1.0)
  341.                 {
  342.                     dParentHeight = (double) HXxRECT_HEIGHT(m_pParent->m_RectNoZoom);
  343.                 }
  344.                 else
  345.                 {
  346.                     dParentHeight = (double) HXxRECT_HEIGHT(m_pParent->m_Rect);
  347.                 }
  348.             }
  349.             // Now resolve top/bottom/height
  350.             retVal = resolveDimension(m_LayoutRect.m_dTop,
  351.                                       m_LayoutRect.m_eTopType,
  352.                                       m_LayoutRect.m_dBottom,
  353.                                       m_LayoutRect.m_eBottomType,
  354.                                       m_LayoutRect.m_dHeight,
  355.                                       m_LayoutRect.m_eHeightType,
  356.                                       bParentAvailable,
  357.                                       dParentHeight,
  358.                                       m_Rect.top,
  359.                                       m_Rect.bottom);
  360.             if (SUCCEEDED(retVal))
  361.             {
  362.                 m_bHeightResolved = TRUE;
  363.                 // XXXMEH - these are holdover members which currently
  364.                 // need to be set, but should be taken out soon
  365.                 m_rect.top            = m_Rect.top;
  366.                 m_rect.bottom         = m_Rect.bottom;
  367.                 m_originalRect.top    = m_Rect.top;
  368.                 m_originalRect.bottom = m_Rect.bottom;
  369.                 m_bHeightUnspecified  = (m_LayoutRect.m_eHeightType == CSS2TypeAuto ? TRUE : FALSE);
  370.             }
  371.         }
  372.     }
  373.     return retVal;
  374. }
  375. HX_RESULT CSmilBasicRegion::resolveFromChildren(BoxDimension eDim)
  376. {
  377.     HX_RESULT retVal = HXR_OK;
  378.     INT32 lMax = 0;
  379.     retVal     = computeChildrenMax(eDim, TRUE, lMax);
  380.     if (SUCCEEDED(retVal))
  381.     {
  382.         if (eDim == BoxDimensionWidth)
  383.         {
  384.             m_bWidthResolved = TRUE;
  385.             if (m_LayoutRect.m_eLeftType == CSS2TypeLength)
  386.             {
  387.                 m_Rect.left = (INT32) (m_LayoutRect.m_dLeft + 0.5);
  388.             }
  389.             m_Rect.right = m_Rect.left + lMax;
  390.             // XXXMEH - these are holdover members which currently
  391.             // need to be set, but should be taken out soon
  392.             m_rect.left          = m_Rect.left;
  393.             m_rect.right         = m_Rect.right;
  394.             m_originalRect.left  = m_Rect.left;
  395.             m_originalRect.right = m_Rect.right;
  396.             m_bWidthUnspecified  = (m_LayoutRect.m_eWidthType  == CSS2TypeAuto ? TRUE : FALSE);
  397.         }
  398.         else
  399.         {
  400.             m_bHeightResolved = TRUE;
  401.             if (m_LayoutRect.m_eTopType == CSS2TypeLength)
  402.             {
  403.                 m_Rect.top = (INT32) (m_LayoutRect.m_dTop + 0.5);
  404.             }
  405.             m_Rect.bottom = m_Rect.top + lMax;
  406.             // XXXMEH - these are holdover members which currently
  407.             // need to be set, but should be taken out soon
  408.             m_rect.top            = m_Rect.top;
  409.             m_rect.bottom         = m_Rect.bottom;
  410.             m_originalRect.top    = m_Rect.top;
  411.             m_originalRect.bottom = m_Rect.bottom;
  412.             m_bHeightUnspecified  = (m_LayoutRect.m_eHeightType == CSS2TypeAuto ? TRUE : FALSE);
  413.         }
  414.     }
  415.     return retVal;
  416. }
  417. HX_RESULT CSmilBasicRegion::resolveDimension(double dLeft,  CSS2Type eLeftType,
  418.                                              double dRight, CSS2Type eRightType,
  419.                                              double dWidth, CSS2Type eWidthType,
  420.                                              BOOL bHaveParentWidth, double dParentWidth,
  421.                                              REF(INT32) rlRectMin,
  422.                                              REF(INT32) rlRectMax)
  423. {
  424.     HX_RESULT retVal = HXR_OK;
  425.     // Convert any percentage values
  426.     if (eLeftType  == CSS2TypePercentage ||
  427.         eRightType == CSS2TypePercentage ||
  428.         eWidthType == CSS2TypePercentage)
  429.     {
  430.         if (bHaveParentWidth)
  431.         {
  432.             if (eLeftType == CSS2TypePercentage)
  433.             {
  434.                 eLeftType = CSS2TypeLength;
  435.                 dLeft     = dLeft * dParentWidth / 100.0;
  436.             }
  437.             if (eRightType == CSS2TypePercentage)
  438.             {
  439.                 eRightType = CSS2TypeLength;
  440.                 dRight     = dRight * dParentWidth / 100.0;
  441.             }
  442.             if (eWidthType == CSS2TypePercentage)
  443.             {
  444.                 eWidthType = CSS2TypeLength;
  445.                 dWidth     = dWidth * dParentWidth / 100.0;
  446.             }
  447.         }
  448.         else
  449.         {
  450.             retVal = HXR_FAIL;
  451.         }
  452.     }
  453.     if (SUCCEEDED(retVal))
  454.     {
  455.         // Apply the following algorithm, where bbw
  456.         // is the "bounding box width" or in this
  457.         // case, the parent dimension (pw). See the SMIL 2.0 Layout
  458.         // module for full detail.
  459.         //
  460.         //        Attribute values       Resulting value             RECT values
  461.         // Case left   width  right   left     width    right    min(=left) max(=pw-right)
  462.         // =============================================================================
  463.         //  0   auto   auto   auto      0       pw        0         0         pw
  464.         //  1   auto   auto     R       0      pw-R       R         0        pw-R
  465.         //  2   auto     W    auto      0        W       pw-W       0          W
  466.         //  3   auto     W      R    pw-R-W      W        R      pw-R-W      pw-R
  467.         //  4     L    auto   auto      L      pw-L       0         L         pw
  468.         //  5     L    auto     R       L     pw-R-L      R         L        pw-R
  469.         //  6     L      W    auto      L        W     pw-L-W       L         L+W
  470.         //  7     L      W      R       L        W     pw-L-W       L         L+W
  471.         //
  472.         // The algorithm is the same for top/height/bottom.
  473.         //
  474.         double dMin = 0.0;
  475.         double dMax = 0.0;
  476.         // Which case do we have?
  477.         if (eLeftType == CSS2TypeAuto)
  478.         {
  479.             if (eWidthType == CSS2TypeAuto)
  480.             {
  481.                 if (eRightType == CSS2TypeAuto)
  482.                 {
  483.                     // Case 0
  484.                     if (bHaveParentWidth)
  485.                     {
  486.                         dMin = 0.0;
  487.                         dMax = dParentWidth;
  488.                     }
  489.                     else
  490.                     {
  491.                         retVal = HXR_FAIL;
  492.                     }
  493.                 }
  494.                 else
  495.                 {
  496.                     // Case 1
  497.                     if (bHaveParentWidth)
  498.                     {
  499.                         dMin = 0.0;
  500.                         dMax = dParentWidth - dRight;
  501.                     }
  502.                     else
  503.                     {
  504.                         retVal = HXR_FAIL;
  505.                     }
  506.                 }
  507.             }
  508.             else
  509.             {
  510.                 if (eRightType == CSS2TypeAuto)
  511.                 {
  512.                     // Case 2
  513.                     dMin = 0.0;
  514.                     dMax = dWidth;
  515.                 }
  516.                 else
  517.                 {
  518.                     // Case 3
  519.                     if (bHaveParentWidth)
  520.                     {
  521.                         dMin = dParentWidth - dRight - dWidth;
  522.                         dMax = dParentWidth - dRight;
  523.                     }
  524.                     else
  525.                     {
  526.                         retVal = HXR_FAIL;
  527.                     }
  528.                 }
  529.             }
  530.         }
  531.         else
  532.         {
  533.             if (eWidthType == CSS2TypeAuto)
  534.             {
  535.                 if (eRightType == CSS2TypeAuto)
  536.                 {
  537.                     // Case 4
  538.                     if (bHaveParentWidth)
  539.                     {
  540.                         dMin = dLeft;
  541.                         dMax = dParentWidth;
  542.                     }
  543.                     else
  544.                     {
  545.                         retVal = HXR_FAIL;
  546.                     }
  547.                 }
  548.                 else
  549.                 {
  550.                     // Case 5
  551.                     if (bHaveParentWidth)
  552.                     {
  553.                         dMin = dLeft;
  554.                         dMax = dParentWidth - dRight;
  555.                     }
  556.                     else
  557.                     {
  558.                         retVal = HXR_FAIL;
  559.                     }
  560.                 }
  561.             }
  562.             else
  563.             {
  564.                 if (eRightType == CSS2TypeAuto)
  565.                 {
  566.                     // Case 6
  567.                     dMin = dLeft;
  568.                     dMax = dLeft + dWidth;
  569.                 }
  570.                 else
  571.                 {
  572.                     // Case 7
  573.                     dMin = dLeft;
  574.                     dMax = dLeft + dWidth;
  575.                 }
  576.             }
  577.         }
  578.         // Now assign the out parameters
  579.         if (SUCCEEDED(retVal))
  580.         {
  581.             rlRectMin = (INT32) (dMin + 0.5);
  582.             rlRectMax = (INT32) (dMax + 0.5);
  583.         }
  584.     }
  585.     return retVal;
  586. }
  587. CSmilBasicRootLayout::CSmilBasicRootLayout() :
  588.     CSmilBasicBox()
  589. {
  590.     m_pRoot              = NULL;
  591.     m_OriginalSize.cx    = 0;
  592.     m_OriginalSize.cy    = 0;
  593.     m_bOriginalWidthSet  = FALSE;
  594.     m_bOriginalHeightSet = FALSE;
  595. }
  596. CSmilBasicRootLayout::~CSmilBasicRootLayout()
  597. {
  598. }
  599. HX_RESULT CSmilBasicRootLayout::computeDimension(BoxDimension eDim)
  600. {
  601.     HX_RESULT retVal = HXR_OK;
  602.     // There's nothing to do here really. For <root-layout>
  603.     // and <viewport>, the width and height will get resolved
  604.     // either from the values of "width" and "height" themselves,
  605.     // or they will get resolved from their children's width
  606.     // and height. So if we are already resolved, we will stay
  607.     // resolved and return HXR_OK. If not, we will stay not resolved
  608.     // and return HXR_FAIL.
  609.     if ((eDim == BoxDimensionWidth  && !m_bWidthResolved) ||
  610.         (eDim == BoxDimensionHeight && !m_bHeightResolved))
  611.     {
  612.         retVal = HXR_FAIL;
  613.     }
  614.     return retVal;
  615. }
  616. HX_RESULT CSmilBasicRootLayout::resolveFromChildren(BoxDimension eDim)
  617. {
  618.     HX_RESULT retVal = HXR_OK;
  619.     INT32 lMax = 0;
  620.     retVal     = computeChildrenMax(eDim, TRUE, lMax);
  621.     if (SUCCEEDED(retVal))
  622.     {
  623.         if (eDim == BoxDimensionWidth)
  624.         {
  625.             m_bWidthResolved    = TRUE;
  626.             m_Rect.left         = 0;
  627.             m_Rect.right        = lMax;
  628.             if (!m_bOriginalWidthSet)
  629.             {
  630.                 m_OriginalSize.cx   = m_Rect.right;
  631.                 m_bOriginalWidthSet = TRUE;
  632.             }
  633.         }
  634.         else
  635.         {
  636.             m_bHeightResolved = TRUE;
  637.             m_Rect.top        = 0;
  638.             m_Rect.bottom     = lMax;
  639.             if (!m_bOriginalHeightSet)
  640.             {
  641.                 m_OriginalSize.cy    = m_Rect.bottom;
  642.                 m_bOriginalHeightSet = TRUE;
  643.             }
  644.         }
  645.     }
  646.     return retVal;
  647. }
  648. void CSmilBasicRootLayout::SetParserRootLayout(CSmilRootLayout* pRoot)
  649. {
  650.     // Assign the member variable
  651.     m_pRoot = pRoot;
  652.     // Set up the box parameters
  653.     if (pRoot)
  654.     {
  655.         // Get the resizeBehavior from our CSmilRootLayout element
  656.         m_eResizeBehavior = pRoot->m_eResizeBehavior;
  657.         // Check if the width is resolved on its own.
  658.         // Based on its values along, the width of the
  659.         // root-layout is only resolved if the width
  660.         // is specified as an absolute length
  661.         if (pRoot->m_eWidthType == CSS2TypeLength)
  662.         {
  663.             // Assign the rect values
  664.             m_Rect.left  = 0;
  665.             m_Rect.right = (INT32) (pRoot->m_dWidth + 0.5);
  666.             // Set the resolved flag
  667.             m_bWidthResolved = TRUE;
  668.             // Set the original width and the flag
  669.             if (!m_bOriginalWidthSet)
  670.             {
  671.                 m_OriginalSize.cx   = m_Rect.right;
  672.                 m_bOriginalWidthSet = TRUE;
  673.             }
  674.         }
  675.         // Check if the height is resolved on its own.
  676.         // Based on its values along, the height of the
  677.         // root-layout is only resolved if the height
  678.         // is specified as an absolute length
  679.         if (pRoot->m_eHeightType == CSS2TypeLength)
  680.         {
  681.             // Assign the rect values
  682.             m_Rect.top    = 0;
  683.             m_Rect.bottom = (INT32) (pRoot->m_dHeight + 0.5);
  684.             // Set the resolved flag
  685.             m_bHeightResolved = TRUE;
  686.             // Set the original height and the flag
  687.             if (!m_bOriginalHeightSet)
  688.             {
  689.                 m_OriginalSize.cy    = m_Rect.bottom;
  690.                 m_bOriginalHeightSet = TRUE;
  691.             }
  692.         }
  693.     }
  694. }
  695. BOOL CSmilBasicRootLayout::IsWidthSet() const
  696. {
  697.     return m_bWidthResolved;
  698. }
  699. BOOL CSmilBasicRootLayout::IsHeightSet() const
  700. {
  701.     return m_bHeightResolved;
  702. }
  703. UINT32 CSmilBasicRootLayout::GetWidth() const
  704. {
  705.     return (UINT32) HXxRECT_WIDTH(m_Rect);
  706. }
  707. UINT32 CSmilBasicRootLayout::GetHeight() const
  708. {
  709.     return (UINT32) HXxRECT_HEIGHT(m_Rect);
  710. }
  711. UINT32 CSmilBasicRootLayout::GetBackgroundColor() const
  712. {
  713.     UINT32 ulRet = 0;
  714.     if (m_pRoot)
  715.     {
  716.         ulRet = m_pRoot->m_ulBackgroundColor;
  717.     }
  718.     return ulRet;
  719. }
  720. #if defined(HELIX_FEATURE_SMIL2_MULTIWINDOWLAYOUT)
  721. CSmilBasicViewport::CSmilBasicViewport(CSmilViewport* pPort) :
  722.     CSmilBasicBox()
  723. {
  724.     // Assign member variables
  725.     m_pPort              = pPort;
  726.     m_ulNumActiveMedia   = 0;
  727.     m_bOpen              = FALSE;
  728.     m_OriginalSize.cx    = 0;
  729.     m_OriginalSize.cy    = 0;
  730.     m_bOriginalWidthSet  = FALSE;
  731.     m_bOriginalHeightSet = FALSE;
  732.     m_bViewportIsSetup   = FALSE;
  733.     // Determine if the width and height are resolved
  734.     if (pPort)
  735.     {
  736.         // Get the resize behavior from our CSmilViewport element
  737.         m_eResizeBehavior = pPort->m_eResizeBehavior;
  738.         // Copy the id for convenience
  739.         m_id = pPort->m_pNode->m_id;
  740.         // Check if the width is resolved on its own.
  741.         // Based on its values along, the width of the
  742.         // viewport is only resolved if the width
  743.         // is specified as an absolute length
  744.         if (pPort->m_eWidthType == CSS2TypeLength)
  745.         {
  746.             // Assign the rect values
  747.             m_Rect.left  = 0;
  748.             m_Rect.right = (INT32) (pPort->m_dWidth + 0.5);
  749.             // Set the resolved flag
  750.             m_bWidthResolved = TRUE;
  751.             // Set the original width and flag
  752.             if (!m_bOriginalWidthSet)
  753.             {
  754.                 m_OriginalSize.cx   = m_Rect.right;
  755.                 m_bOriginalWidthSet = TRUE;
  756.             }
  757.         }
  758.         // Check if the height is resolved on its own.
  759.         // Based on its values along, the height of the
  760.         // viewport is only resolved if the height
  761.         // is specified as an absolute length
  762.         if (pPort->m_eHeightType == CSS2TypeLength)
  763.         {
  764.             // Assign the rect values
  765.             m_Rect.top    = 0;
  766.             m_Rect.bottom = (INT32) (pPort->m_dHeight + 0.5);
  767.             // Set the resolved flag
  768.             m_bHeightResolved = TRUE;
  769.             // Set the original height and flag
  770.             if (!m_bOriginalHeightSet)
  771.             {
  772.                 m_OriginalSize.cy    = m_Rect.bottom;
  773.                 m_bOriginalHeightSet = TRUE;
  774.             }
  775.         }
  776.     }
  777. }
  778. CSmilBasicViewport::~CSmilBasicViewport()
  779. {
  780. }
  781. HX_RESULT CSmilBasicViewport::computeDimension(BoxDimension eDim)
  782. {
  783.     HX_RESULT retVal = HXR_OK;
  784.     // There's nothing to do here really. For <root-layout>
  785.     // and <viewport>, the width and height will get resolved
  786.     // either from the values of "width" and "height" themselves,
  787.     // or they will get resolved from their children's width
  788.     // and height. So if we are already resolved, we will stay
  789.     // resolved and return HXR_OK. If not, we will stay not resolved
  790.     // and return HXR_FAIL.
  791.     if ((eDim == BoxDimensionWidth  && !m_bWidthResolved) ||
  792.         (eDim == BoxDimensionHeight && !m_bHeightResolved))
  793.     {
  794.         retVal = HXR_FAIL;
  795.     }
  796.     return retVal;
  797. }
  798. HX_RESULT CSmilBasicViewport::resolveFromChildren(BoxDimension eDim)
  799. {
  800.     HX_RESULT retVal = HXR_OK;
  801.     INT32 lMax = 0;
  802.     retVal     = computeChildrenMax(eDim, TRUE, lMax);
  803.     if (SUCCEEDED(retVal))
  804.     {
  805.         if (eDim == BoxDimensionWidth)
  806.         {
  807.             m_bWidthResolved = TRUE;
  808.             m_Rect.left      = 0;
  809.             m_Rect.right     = lMax;
  810.             if (!m_bOriginalWidthSet)
  811.             {
  812.                 m_OriginalSize.cx   = m_Rect.right;
  813.                 m_bOriginalWidthSet = TRUE;
  814.             }
  815.         }
  816.         else
  817.         {
  818.             m_bHeightResolved = TRUE;
  819.             m_Rect.top        = 0;
  820.             m_Rect.bottom     = lMax;
  821.             if (!m_bOriginalHeightSet)
  822.             {
  823.                 m_OriginalSize.cy    = m_Rect.bottom;
  824.                 m_bOriginalHeightSet = TRUE;
  825.             }
  826.         }
  827.     }
  828.     return retVal;
  829. }
  830. #endif /* #if defined(HELIX_FEATURE_SMIL2_MULTIWINDOWLAYOUT) */