📄 animattr.cpp
字号:
double dSum = 0.0; for (UINT32 i = 0; i < kVectorSize; i++) { double dDiff = GetAbsolute(pAttr2, i, pDepend) - GetAbsolute(pAttr1, i, pDepend); dSum += dDiff * dDiff; } dRet = sqrt(dSum); } } return dRet;}double CAttr::GetAbsolute(CAttr* pAttr, UINT32 i, CAttr* pDepend){ double dRet = 0.0; if (i < kVectorSize) { dRet = pAttr->m_dValue[i]; if (pAttr->IsRelative(i) && pDepend && !pDepend->IsRelative(i)) { dRet = pAttr->m_dValue[i] * pDepend->m_dValue[i] / 100.0; } } return dRet;}void CAttr::Interp(CAttr* pAttr1, double t1, CAttr* pAttr2, double t2, double t, CAttr* pDepend){ if (Compatible(pAttr1, pAttr2) && t1 < t2 && t1 <= t && t <= t2) { // Copy the first attribute *this = *pAttr1; // Perform the interpolation if (pAttr1->m_ulAttrType == kAttrTypeRealScalar || pAttr1->m_ulAttrType == kAttrTypeRealVector) { double dFract = (t - t1) / (t2 - t1); for (UINT32 i = 0; i < kVectorSize; i++) { double d1 = pAttr1->m_dValue[i]; double d2 = pAttr2->m_dValue[i]; if (pAttr1->IsRelative(i) != pAttr2->IsRelative(i) && pDepend && !pDepend->IsRelative(i)) { // If we are trying to interpolate between // an absolute and relative value, we will first // convert the relative value to absolute if (pAttr1->IsRelative(i) && !pAttr2->IsRelative(i)) { // Convert attribute 1 to absolute d1 = GetAbsolute(pAttr1, i, pDepend); } else { // Convert attribute 2 to absolute d2 = GetAbsolute(pAttr2, i, pDepend); } // Since we made sure that both attributes were // absolute, then the result must be absolute as well. m_eType[i] = CSS2TypeLength; } m_dValue[i] = d1 + (d2 - d1) * dFract; } } }}void CAttr::Add(CAttr* pAttr, CAttr* pDepend){ if (Compatible(this, pAttr)) { if (m_ulAttrType == kAttrTypeRealScalar || m_ulAttrType == kAttrTypeRealVector) { for (UINT32 i = 0; i < kVectorSize; i++) { double d1 = m_dValue[i]; double d2 = pAttr->m_dValue[i]; if (IsRelative(i) != pAttr->IsRelative(i) && pDepend && !pDepend->IsRelative(i)) { // If we are trying to add an absolute value // to a relative value, we will first // convert the relative value to absolute if (IsRelative(i) && !pAttr->IsRelative(i)) { // Convert attribute 1 to absolute d1 = GetAbsolute(this, i, pDepend); } else { // Convert attribute 2 to absolute d2 = GetAbsolute(pAttr, i, pDepend); } // Since we made sure that both attributes were // absolute, then the result must be absolute as well. m_eType[i] = CSS2TypeLength; } // Add the values m_dValue[i] = d1 + d2; } } }}void CAttr::Mult(double dMult){ if (m_ulAttrType == kAttrTypeRealScalar || m_ulAttrType == kAttrTypeRealVector) { for (UINT32 i = 0; i < kVectorSize; i++) { m_dValue[i] *= dMult; } }}void CAttr::Clamp(){ if (m_ulAttrName == kAttrNameBackgroundColor || m_ulAttrName == kAttrNameColor) { for (UINT32 i = 0; i < kVectorSize; i++) { // Round to nearest integer m_dValue[i] = floor(m_dValue[i] + 0.5); // Clip bottom if (m_dValue[i] < 0.0) { m_dValue[i] = 0.0; } // Clip top if (m_dValue[i] > 255.0) { m_dValue[i] = 255.0; } } } else if (m_ulAttrName == kAttrNameZIndex) { // Round to nearest integer m_dValue[0] = floor(m_dValue[0] + 0.5); // Clip bottom if (m_dValue[0] < 0.0) { m_dValue[0] = 0.0; } } else if (m_ulAttrName == kAttrNameSoundLevel) { // Clip bottom if (m_dValue[0] < 0.0) { m_dValue[0] = 0.0; } } else if (m_ulAttrName == kAttrNameMediaOpacity || m_ulAttrName == kAttrNameBackgroundOpacity) { // Clip bottom if (m_dValue[0] < 0.0) { m_dValue[0] = 0.0; } // Clip top if (m_dValue[0] > 255.0) { m_dValue[0] = 255.0; } }}double CAttr::GetValueDouble(UINT32 i) const{ double dRet = 0.0; if (i < kVectorSize) { dRet = m_dValue[i]; } return dRet;}CSS2Type CAttr::GetCSS2Type(UINT32 i) const{ CSS2Type eRet = CSS2TypeAuto; if (i < kVectorSize) { eRet = m_eType[i]; } return eRet;}BOOL CAttr::IsRelative(UINT32 i) const{ BOOL bRet = FALSE; if (i < kVectorSize) { bRet = (m_eType[i] == CSS2TypePercentage ? TRUE : FALSE); } return bRet;}const char* CAttr::GetValueString(UINT32 i) const{ return m_pszValue;}CAttr& CAttr::operator = (const CAttr& rAttr){ m_lLastError = rAttr.m_lLastError; m_ulAttrName = rAttr.m_ulAttrName; m_ulAttrType = rAttr.m_ulAttrType; m_dValue[0] = rAttr.m_dValue[0]; m_dValue[1] = rAttr.m_dValue[1]; m_dValue[2] = rAttr.m_dValue[2]; m_dValue[3] = rAttr.m_dValue[3]; m_eType[0] = rAttr.m_eType[0]; m_eType[1] = rAttr.m_eType[1]; m_eType[2] = rAttr.m_eType[2]; m_eType[3] = rAttr.m_eType[3]; HX_VECTOR_DELETE(m_pszValue); if (rAttr.m_pszValue) { m_pszValue = new char [strlen(rAttr.m_pszValue) + 1]; if (m_pszValue) { strcpy(m_pszValue, rAttr.m_pszValue); /* Flawfinder: ignore */ } else { m_lLastError = HXR_OUTOFMEMORY; } } return *this;}BOOL CAttr::Compatible(CAttr* pAttr1, CAttr* pAttr2){ BOOL bRet = FALSE; if (pAttr1 && pAttr2) { if (pAttr1->m_ulAttrName == pAttr2->m_ulAttrName && pAttr1->m_ulAttrType == pAttr2->m_ulAttrType) { bRet = TRUE; } else if (pAttr1->m_ulAttrName == kAttrNameLeftTop) { if (pAttr2->m_ulAttrName == kAttrNameLeft || pAttr2->m_ulAttrName == kAttrNameTop) { bRet = TRUE; } } else if (pAttr2->m_ulAttrName == kAttrNameLeftTop) { if (pAttr1->m_ulAttrName == kAttrNameLeft || pAttr1->m_ulAttrName == kAttrNameTop) { bRet = TRUE; } } } return bRet;}HX_RESULT CAttr::ParsePosLenValue(const char* pszStr, double& rdValue, BOOL& rbIsPercent){ HX_RESULT retVal = HXR_OK; if (pszStr) { // Parse the numeric value char* pEndPtr = NULL; rdValue = strtod(pszStr, &pEndPtr); // Now decide if it was a percent or not if (pEndPtr && *pEndPtr == '%') { rbIsPercent = TRUE; } else { rbIsPercent = FALSE; } } else { retVal = HXR_FAIL; } return retVal;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -