📄 layout.cpp
字号:
m_bHeightUnspecified = (m_LayoutRect.m_eHeightType == CSS2TypeAuto ? TRUE : FALSE); } } return retVal;}HX_RESULT CSmilBasicRegion::resolveDimension(double dLeft, CSS2Type eLeftType, double dRight, CSS2Type eRightType, double dWidth, CSS2Type eWidthType, BOOL bHaveParentWidth, double dParentWidth, REF(INT32) rlRectMin, REF(INT32) rlRectMax){ HX_RESULT retVal = HXR_OK; // Convert any percentage values if (eLeftType == CSS2TypePercentage || eRightType == CSS2TypePercentage || eWidthType == CSS2TypePercentage) { if (bHaveParentWidth) { if (eLeftType == CSS2TypePercentage) { eLeftType = CSS2TypeLength; dLeft = dLeft * dParentWidth / 100.0; } if (eRightType == CSS2TypePercentage) { eRightType = CSS2TypeLength; dRight = dRight * dParentWidth / 100.0; } if (eWidthType == CSS2TypePercentage) { eWidthType = CSS2TypeLength; dWidth = dWidth * dParentWidth / 100.0; } } else { retVal = HXR_FAIL; } } if (SUCCEEDED(retVal)) { // Apply the following algorithm, where bbw // is the "bounding box width" or in this // case, the parent dimension (pw). See the SMIL 2.0 Layout // module for full detail. // // Attribute values Resulting value RECT values // Case left width right left width right min(=left) max(=pw-right) // ============================================================================= // 0 auto auto auto 0 pw 0 0 pw // 1 auto auto R 0 pw-R R 0 pw-R // 2 auto W auto 0 W pw-W 0 W // 3 auto W R pw-R-W W R pw-R-W pw-R // 4 L auto auto L pw-L 0 L pw // 5 L auto R L pw-R-L R L pw-R // 6 L W auto L W pw-L-W L L+W // 7 L W R L W pw-L-W L L+W // // The algorithm is the same for top/height/bottom. // double dMin = 0.0; double dMax = 0.0; // Which case do we have? if (eLeftType == CSS2TypeAuto) { if (eWidthType == CSS2TypeAuto) { if (eRightType == CSS2TypeAuto) { // Case 0 if (bHaveParentWidth) { dMin = 0.0; dMax = dParentWidth; } else { retVal = HXR_FAIL; } } else { // Case 1 if (bHaveParentWidth) { dMin = 0.0; dMax = dParentWidth - dRight; } else { retVal = HXR_FAIL; } } } else { if (eRightType == CSS2TypeAuto) { // Case 2 dMin = 0.0; dMax = dWidth; } else { // Case 3 if (bHaveParentWidth) { dMin = dParentWidth - dRight - dWidth; dMax = dParentWidth - dRight; } else { retVal = HXR_FAIL; } } } } else { if (eWidthType == CSS2TypeAuto) { if (eRightType == CSS2TypeAuto) { // Case 4 if (bHaveParentWidth) { dMin = dLeft; dMax = dParentWidth; } else { retVal = HXR_FAIL; } } else { // Case 5 if (bHaveParentWidth) { dMin = dLeft; dMax = dParentWidth - dRight; } else { retVal = HXR_FAIL; } } } else { if (eRightType == CSS2TypeAuto) { // Case 6 dMin = dLeft; dMax = dLeft + dWidth; } else { // Case 7 dMin = dLeft; dMax = dLeft + dWidth; } } } // Now assign the out parameters if (SUCCEEDED(retVal)) { rlRectMin = (INT32) (dMin + 0.5); rlRectMax = (INT32) (dMax + 0.5); } } return retVal;}CSmilBasicRootLayout::CSmilBasicRootLayout() : CSmilBasicBox(){ m_pRoot = NULL; m_OriginalSize.cx = 0; m_OriginalSize.cy = 0; m_bOriginalWidthSet = FALSE; m_bOriginalHeightSet = FALSE;}CSmilBasicRootLayout::~CSmilBasicRootLayout(){}HX_RESULT CSmilBasicRootLayout::computeDimension(BoxDimension eDim){ HX_RESULT retVal = HXR_OK; // There's nothing to do here really. For <root-layout> // and <viewport>, the width and height will get resolved // either from the values of "width" and "height" themselves, // or they will get resolved from their children's width // and height. So if we are already resolved, we will stay // resolved and return HXR_OK. If not, we will stay not resolved // and return HXR_FAIL. if ((eDim == BoxDimensionWidth && !m_bWidthResolved) || (eDim == BoxDimensionHeight && !m_bHeightResolved)) { retVal = HXR_FAIL; } return retVal;}HX_RESULT CSmilBasicRootLayout::resolveFromChildren(BoxDimension eDim){ HX_RESULT retVal = HXR_OK; INT32 lMax = 0; retVal = computeChildrenMax(eDim, TRUE, lMax); if (SUCCEEDED(retVal)) { if (eDim == BoxDimensionWidth) { m_bWidthResolved = TRUE; m_Rect.left = 0; m_Rect.right = lMax; if (!m_bOriginalWidthSet) { m_OriginalSize.cx = m_Rect.right; m_bOriginalWidthSet = TRUE; } } else { m_bHeightResolved = TRUE; m_Rect.top = 0; m_Rect.bottom = lMax; if (!m_bOriginalHeightSet) { m_OriginalSize.cy = m_Rect.bottom; m_bOriginalHeightSet = TRUE; } } } return retVal;}void CSmilBasicRootLayout::SetParserRootLayout(CSmilRootLayout* pRoot){ // Assign the member variable m_pRoot = pRoot; // Set up the box parameters if (pRoot) { // Get the resizeBehavior from our CSmilRootLayout element m_eResizeBehavior = pRoot->m_eResizeBehavior; // Check if the width is resolved on its own. // Based on its values along, the width of the // root-layout is only resolved if the width // is specified as an absolute length if (pRoot->m_eWidthType == CSS2TypeLength) { // Assign the rect values m_Rect.left = 0; m_Rect.right = (INT32) (pRoot->m_dWidth + 0.5); // Set the resolved flag m_bWidthResolved = TRUE; // Set the original width and the flag if (!m_bOriginalWidthSet) { m_OriginalSize.cx = m_Rect.right; m_bOriginalWidthSet = TRUE; } } // Check if the height is resolved on its own. // Based on its values along, the height of the // root-layout is only resolved if the height // is specified as an absolute length if (pRoot->m_eHeightType == CSS2TypeLength) { // Assign the rect values m_Rect.top = 0; m_Rect.bottom = (INT32) (pRoot->m_dHeight + 0.5); // Set the resolved flag m_bHeightResolved = TRUE; // Set the original height and the flag if (!m_bOriginalHeightSet) { m_OriginalSize.cy = m_Rect.bottom; m_bOriginalHeightSet = TRUE; } } }}BOOL CSmilBasicRootLayout::IsWidthSet() const{ return m_bWidthResolved;}BOOL CSmilBasicRootLayout::IsHeightSet() const{ return m_bHeightResolved;}UINT32 CSmilBasicRootLayout::GetWidth() const{ return (UINT32) HXxRECT_WIDTH(m_Rect);}UINT32 CSmilBasicRootLayout::GetHeight() const{ return (UINT32) HXxRECT_HEIGHT(m_Rect);}UINT32 CSmilBasicRootLayout::GetBackgroundColor() const{ UINT32 ulRet = 0; if (m_pRoot) { ulRet = m_pRoot->m_ulBackgroundColor; } return ulRet;}#if defined(HELIX_FEATURE_SMIL2_MULTIWINDOWLAYOUT)CSmilBasicViewport::CSmilBasicViewport(CSmilViewport* pPort) : CSmilBasicBox(){ // Assign member variables m_pPort = pPort; m_ulNumActiveMedia = 0; m_bOpen = FALSE; m_OriginalSize.cx = 0; m_OriginalSize.cy = 0; m_bOriginalWidthSet = FALSE; m_bOriginalHeightSet = FALSE; m_bViewportIsSetup = FALSE; // Determine if the width and height are resolved if (pPort) { // Get the resize behavior from our CSmilViewport element m_eResizeBehavior = pPort->m_eResizeBehavior; // Copy the id for convenience m_id = pPort->m_pNode->m_id; // Check if the width is resolved on its own. // Based on its values along, the width of the // viewport is only resolved if the width // is specified as an absolute length if (pPort->m_eWidthType == CSS2TypeLength) { // Assign the rect values m_Rect.left = 0; m_Rect.right = (INT32) (pPort->m_dWidth + 0.5); // Set the resolved flag m_bWidthResolved = TRUE; // Set the original width and flag if (!m_bOriginalWidthSet) { m_OriginalSize.cx = m_Rect.right; m_bOriginalWidthSet = TRUE; } } // Check if the height is resolved on its own. // Based on its values along, the height of the // viewport is only resolved if the height // is specified as an absolute length if (pPort->m_eHeightType == CSS2TypeLength) { // Assign the rect values m_Rect.top = 0; m_Rect.bottom = (INT32) (pPort->m_dHeight + 0.5); // Set the resolved flag m_bHeightResolved = TRUE; // Set the original height and flag if (!m_bOriginalHeightSet) { m_OriginalSize.cy = m_Rect.bottom; m_bOriginalHeightSet = TRUE; } } }}CSmilBasicViewport::~CSmilBasicViewport(){}HX_RESULT CSmilBasicViewport::computeDimension(BoxDimension eDim){ HX_RESULT retVal = HXR_OK; // There's nothing to do here really. For <root-layout> // and <viewport>, the width and height will get resolved // either from the values of "width" and "height" themselves, // or they will get resolved from their children's width // and height. So if we are already resolved, we will stay // resolved and return HXR_OK. If not, we will stay not resolved // and return HXR_FAIL. if ((eDim == BoxDimensionWidth && !m_bWidthResolved) || (eDim == BoxDimensionHeight && !m_bHeightResolved)) { retVal = HXR_FAIL; } return retVal;}HX_RESULT CSmilBasicViewport::resolveFromChildren(BoxDimension eDim){ HX_RESULT retVal = HXR_OK; INT32 lMax = 0; retVal = computeChildrenMax(eDim, TRUE, lMax); if (SUCCEEDED(retVal)) { if (eDim == BoxDimensionWidth) { m_bWidthResolved = TRUE; m_Rect.left = 0; m_Rect.right = lMax; if (!m_bOriginalWidthSet) { m_OriginalSize.cx = m_Rect.right; m_bOriginalWidthSet = TRUE; } } else { m_bHeightResolved = TRUE; m_Rect.top = 0; m_Rect.bottom = lMax; if (!m_bOriginalHeightSet) { m_OriginalSize.cy = m_Rect.bottom; m_bOriginalHeightSet = TRUE; } } } return retVal;}#endif /* #if defined(HELIX_FEATURE_SMIL2_MULTIWINDOWLAYOUT) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -