#pragma once namespace ImageStudio { namespace Serialize { namespace Paint { namespace Common { inline static BSTR GetAttribute(XML::IXMLDOMNamedNodeMapPtr pAttributes, _bstr_t bsName) { IXMLDOMNodePtr tempNode = pAttributes->getNamedItem(bsName); if (NULL == tempNode) return NULL; BSTR bsValue; tempNode->get_text(&bsValue); return bsValue; } static void FromXmlString(CString& strText) { strText.Replace(_T("'"), _T("'")); strText.Replace(_T("<"), _T("<")); strText.Replace(_T(">"), _T(">")); strText.Replace(_T("""), _T("\"")); strText.Replace(_T("&"), _T("&")); } class CXmlAttributeReader { public: static float FloatAttributeFromNode(XmlUtils::CXmlNode &oXmlNode, const CString &strNode, const CString &strAttribute, const float fDefaultValue = 0.0f) { XmlUtils::CXmlNode oNode; if (oXmlNode.GetNode(strNode, oNode)) { return oNode.ReadAttributeOrValueFloat(strAttribute, fDefaultValue); } else return fDefaultValue; } // --- static REAL FloatPtAttributeFromXml(XmlUtils::CXmlNode &oXmlNode, const CString &strAttribute, REAL fDefaultValue = 0) { CString strAttributeValue = oXmlNode.GetAttributeOrValue(strAttribute, _T("NaNpt")); if ((strAttributeValue == _T("NaNpt")) || (strAttributeValue == _T("inherit")) || (strAttributeValue == _T("auto"))) { return fDefaultValue; } CString strMetric = _T(""); GetMetric(strAttributeValue, strMetric); if (strAttributeValue.GetLength() == 0) { return fDefaultValue; } else { return ConvertToPt(strAttributeValue, strMetric, fDefaultValue); } } static REAL FloatPtFromBSTR(BSTR bsValue, REAL fDefaultValue = 0) { CString strAttributeValue = (CString)bsValue; if ((strAttributeValue == _T("inherit")) || (strAttributeValue == _T("auto"))) { return fDefaultValue; } CString strMetric = _T(""); GetMetric(strAttributeValue, strMetric); if (strAttributeValue.GetLength() == 0) { return fDefaultValue; } else { return ConvertToPt(strAttributeValue, strMetric, fDefaultValue); } } static REAL FloatMmAttributeFromXml(XmlUtils::CXmlNode &oXmlNode, const CString &strAttribute, REAL fDefaultValue = 0) { CString strAttributeValue = oXmlNode.GetAttributeOrValue(strAttribute, _T("NaNpt")); if ((strAttributeValue == _T("NaNpt")) || (strAttributeValue == _T("inherit"))) { return fDefaultValue; } CString strMetric = _T(""); GetMetric(strAttributeValue, strMetric); if (strAttributeValue.GetLength() == 0) { return fDefaultValue; } else { return ConvertToMm(strAttributeValue, strMetric, fDefaultValue); } } // --- static REAL FloatPtFromString(const CString &strValue) { CString strTmpValue = strValue; CString strMetric = _T(""); GetMetric(strTmpValue, strMetric); if (strTmpValue.GetLength() == 0) { return 0.0f; } else { return ConvertToPt(strTmpValue, strMetric); } } // --- static CString TextFromNode(XmlUtils::CXmlNode &oXmlNode, const CString &strNode) { XmlUtils::CXmlNode oNode; if (oXmlNode.GetNode(strNode, oNode)) return oNode.GetText(); else return _T(""); } // --- static LONG LongAttributeHexFromXml(XmlUtils::CXmlNode &oXmlNode, const CString &strAttributeName, const LONG &iDefaultValue) { CString strAttrubuteValue = oXmlNode.GetAttributeOrValue(strAttributeName, _T("NaN")); if ((strAttrubuteValue == _T("NaN")) || (strAttrubuteValue.GetLength() < 2)) { return iDefaultValue; } else { if (strAttrubuteValue[0] == _T('#')) strAttrubuteValue.Delete(0, 1); strAttrubuteValue = _T("0x") + strAttrubuteValue; } LONG iResultValue = iDefaultValue; #ifdef _UNICODE swscanf_s(strAttrubuteValue, L"%x", &iResultValue); #else sscanf_s(strAttrubuteValue, "%x", &iResultValue); #endif return iResultValue; } static LONG LongHexFromBSTR(BSTR bsValue, LONG iDefaultValue) { CString strAttrubuteValue = (CString)bsValue; if (strAttrubuteValue.GetLength() < 2) { return iDefaultValue; } else { if (strAttrubuteValue[0] == _T('#')) strAttrubuteValue.Delete(0, 1); strAttrubuteValue = _T("0x") + strAttrubuteValue; } LONG iResultValue = iDefaultValue; #ifdef _UNICODE swscanf_s(strAttrubuteValue, L"%x", &iResultValue); #else sscanf_s(strAttrubuteValue, "%x", &iResultValue); #endif return iResultValue; } // --- static REAL ConvertToPt(const CString &strAttributeValue, const CString &strMetric, const REAL &fDefaultValue = 0) { REAL fAttributeValue = (REAL)XmlUtils::GetDouble(strAttributeValue); if (strMetric == _T("mm")) { fAttributeValue *= 72.0f / 25.4f; } else if (strMetric == _T("cm")) { fAttributeValue *= 72.0f / 2.54f; } else if (strMetric == _T("in")) { fAttributeValue *= 72.0f; } else if (strMetric == _T("%")) { fAttributeValue = -fAttributeValue / 100.0f; } return fAttributeValue; } static REAL ConvertToMm(const CString &strAttributeValue, const CString &strMetic, const REAL &fDefaultValue = 0) { REAL fAttributeValue = (REAL)XmlUtils::GetDouble(strAttributeValue); if (strMetic == _T("cm")) { fAttributeValue *= 10.0f; } else if (strMetic == _T("pt")) { fAttributeValue *= 25.4f / 72.0f; } else if (strMetic == _T("in")) { fAttributeValue *= 25.4f; } else if (strMetic == _T("%")) { fAttributeValue = fDefaultValue * fAttributeValue / 100.0f; } return fAttributeValue; } // --- static void GetMetric(CString &strAttributeValue, CString &strMetric) { int iLength = strAttributeValue.GetLength(); if (strAttributeValue[iLength - 1] == _T('%')) { strMetric = strAttributeValue.Mid(iLength - 1); strAttributeValue.Delete(iLength - 1, 1); } else { strMetric = strAttributeValue.Mid(iLength - 2); strAttributeValue.Delete(iLength - 2, 2); } } // --- static CString GetFontWeight(const NSStructuresGDI::CFont &oFont) { if (oFont.Bold == TRUE) return _T("bold"); else return _T("normal"); } static void SetFontWeight(NSStructuresGDI::CFont &oFont, const CString &strFontWeight) { if (strFontWeight == _T("bold")) oFont.Bold = TRUE; else if (strFontWeight == _T("normal")) oFont.Bold = FALSE; } static CString GetFontStyle(const NSStructuresGDI::CFont &oFont) { if (oFont.Italic == TRUE) return _T("italic"); else return _T("normal"); } static void SetFontStyle(NSStructuresGDI::CFont &oFont, const CString &strFontStyle) { if (strFontStyle == _T("italic")) oFont.Italic = TRUE; else if (strFontStyle == _T("normal")) oFont.Italic = FALSE; } static CString GetFontUnderline(const NSStructuresGDI::CFont &oFont) { if (oFont.Underline == 0) return _T(""); else if (oFont.Underline == 1) return _T("single"); else if (oFont.Underline == 2) return _T("double"); else if (oFont.Underline == 3) return _T("thick"); else if (oFont.Underline == 4) return _T("dotted"); else if (oFont.Underline == 5) return _T("dottedHeavy"); else if (oFont.Underline == 6) return _T("dash"); else if (oFont.Underline == 7) return _T("dashedHeavy"); else if (oFont.Underline == 8) return _T("dashLong"); else if (oFont.Underline == 9) return _T("dashLongHeavy"); else if (oFont.Underline == 10) return _T("dotDash"); else if (oFont.Underline == 11) return _T("dashDotHeavy"); else if (oFont.Underline == 12) return _T("dotDotDash"); else if (oFont.Underline == 13) return _T("dashDotDotHeavy"); else if (oFont.Underline == 14) return _T("wave"); else if (oFont.Underline == 15) return _T("wavyHeavy"); else if (oFont.Underline == 16) return _T("wavyDouble"); return _T(""); } static void SetFontUnderline(NSStructuresGDI::CFont &oFont, const CString &strUnderline) { if (strUnderline == _T("")) oFont.Underline = 0; else if (strUnderline == _T("single")) oFont.Underline = 1; else if (strUnderline == _T("double")) oFont.Underline = 2; else if (strUnderline == _T("thick")) oFont.Underline = 3; else if (strUnderline == _T("dotted")) oFont.Underline = 4; else if (strUnderline == _T("dottedHeavy")) oFont.Underline = 5; else if (strUnderline == _T("dash")) oFont.Underline = 6; else if (strUnderline == _T("dashedHeavy")) oFont.Underline = 7; else if (strUnderline == _T("dashLong")) oFont.Underline = 8; else if (strUnderline == _T("dashLongHeavy")) oFont.Underline = 9; else if (strUnderline == _T("dotDash")) oFont.Underline = 10; else if (strUnderline == _T("dashDotHeavy")) oFont.Underline = 11; else if (strUnderline == _T("dotDotDash")) oFont.Underline = 12; else if (strUnderline == _T("dashDotDotHeavy")) oFont.Underline = 13; else if (strUnderline == _T("wave")) oFont.Underline = 14; else if (strUnderline == _T("wavyHeavy")) oFont.Underline = 15; else if (strUnderline == _T("wavyDouble")) oFont.Underline = 16; } static CString GetFontStrikeout(NSStructuresGDI::CFont &oFont, const CString &strStrikeout) { if (oFont.Strikeout == 0) return _T(""); else if (oFont.Strikeout == 1) return _T("single"); else if (oFont.Strikeout == 2) return _T("double"); return _T(""); } static void SetFontStrikeout(NSStructuresGDI::CFont &oFont, const CString &strStrikeout) { if (strStrikeout == _T("")) oFont.Strikeout = 0; else if (strStrikeout == _T("single")) oFont.Strikeout = 1; else if (strStrikeout == _T("double")) oFont.Strikeout = 2; } static CString GetLeaderTab(const byte &bLeaderTab) { if (bLeaderTab == 0) return _T(""); else if (bLeaderTab == 1) return _T("dot"); else if (bLeaderTab == 2) return _T("hyphen"); else if (bLeaderTab == 3) return _T("underscore"); return _T(""); } static byte SetLeaderTab(const CString &strLeaderTab) { if (strLeaderTab == _T("") || strLeaderTab == _T("none")) return 0; else if (strLeaderTab == _T("dot")) return 1; else if (strLeaderTab == _T("hyphen")) return 2; else if (strLeaderTab == _T("underscore")) return 3; return 0; } static CString GetTypeTab(const byte &bTypeTab) { if (bTypeTab == 0) return _T("left"); else if (bTypeTab == 1) return _T("right"); else if (bTypeTab == 2) return _T("num"); return _T("left"); } static byte SetTypeTab(const CString &strTypeTab) { if (strTypeTab == _T("left")) return 0; else if (strTypeTab == _T("right")) return 1; else if (strTypeTab == _T("num")) return 2; return 0; } // --- static void SetPenStyle(NSStructuresGDI::CPen& oPen, const CString& strPenStyle) { if (strPenStyle == _T("solid")) { //oPen.SetStyle(0); } else if (strPenStyle == _T("dashed")) { //oPen.SetStyle(1); } else if (strPenStyle == _T("dotted")) { //oPen.SetStyle(2); } } // --- static CString GetBaselineShift(const WORD &nBaselineShift) { if (nBaselineShift == 1) { return _T("super"); } else if (nBaselineShift == 2) { return _T("sub"); } else { return _T("baseline"); } } static void SetBaselineShift(WORD &nBaselineShift, REAL &fBaselineShift, const CString &strBaselineShift) { if (strBaselineShift == _T("super")) { nBaselineShift = 1; fBaselineShift = 0.0f; } else if (strBaselineShift == _T("sub")) { nBaselineShift = 2; fBaselineShift = 0.0f; } else if (strBaselineShift == _T("baseline")) { nBaselineShift = 0; fBaselineShift = 0.0f; } else { nBaselineShift = 0; fBaselineShift = FloatPtFromString(strBaselineShift); } } // --- static CString GetTextAlignment(const WORD &nTextAlignment) { if (nTextAlignment == 0) { return _T("left"); } else if (nTextAlignment == 1) { return _T("center"); } else if (nTextAlignment == 2) { return _T("right"); } else { return _T("justify"); } } static void SetTextAlignment(WORD &nTextAlignment, const CString &strTextAlignment) { if (strTextAlignment == _T("center")) { nTextAlignment = 1; } else if (strTextAlignment == _T("right")) { nTextAlignment = 2; } else if (strTextAlignment == _T("justify")) { nTextAlignment = 3; } else if (strTextAlignment == _T("left")) { nTextAlignment = 0; } } // --- static CString GetBreakType(const int& breakType) { if (breakType == 1) return _T("page"); else if (breakType == 2) return _T("column"); else return _T(""); } static void SetBreakType(int& breakType, const CString& breakTypeStr) { if (breakTypeStr == _T("page")) breakType = 1; else if (breakTypeStr == _T("column")) breakType = 2; else breakType = 0; } // --- static void SetRelativeFrom(BYTE& nRelativeFrom, const CString& strRelativeFrom) { if (strRelativeFrom == _T("page")) { nRelativeFrom = 0; } else if (strRelativeFrom == _T("margin")) { nRelativeFrom = 1; } else { nRelativeFrom = 2; } } // --- static void SetAlternateType(BYTE& nType, const CString& strType) { if (strType == _T("topAndBottom")) { nType = 1; } else if (strType == _T("square")) { nType = 2; } else if (strType == _T("through")) { nType = 2; } else if (strType == _T("tight")) { nType = 3; } else if (strType == _T("none")) { nType = 4; } else if (strType == _T("inline")) { nType = 0; } } // --- static void SetAlternatePosition(BYTE& nPosition, const CString& strPosition) { nPosition = 0; if (strPosition == _T("center")) { nPosition = 1; } else if (strPosition == _T("right")) { nPosition = 2; } } // --- static void SetKeepNext(BYTE& nKeepNext, const CString& strKeepNext) { nKeepNext = 0; if (strKeepNext == _T("always")) { nKeepNext = 1; } } static void SetKeepTogether(BYTE& nKeepTogether, const CString& strKeepTogether) { nKeepTogether = 0; if (strKeepTogether == _T("always")) { nKeepTogether = 1; } } // --- static LONG BGRToRGB(const LONG &iBGR) { LONG iRed = (iBGR & 0x00FF0000) >> 16; LONG iGreen = (iBGR & 0x0000FF00); LONG iBlue = (iBGR & 0x000000FF) << 16; LONG iRGB = iRed | iGreen | iBlue; if (iRGB != 0x00FFFFFF) { return iRGB; } else { return 0; } } }; class CXmlAttributeReader2 { public: static float TextToPt(XmlUtils::CXmlNode& oNode, const CString& strChildNode = _T(""), const float& fDefaultValue = 0) { CString strValue = _T(""); if (strChildNode == _T("")) { strValue = oNode.GetText(); return ToPt(strValue, fDefaultValue); } else { XmlUtils::CXmlNode oChildNode; if (oNode.GetNode(strChildNode, oChildNode)) return TextToPt(oChildNode, _T(""), fDefaultValue); } return fDefaultValue; } static CString AttrToStr(XmlUtils::CXmlNode& oNode, const CString& strChildNode, const CString& strAttrName) { if (strChildNode == _T("")) return oNode.GetAttribute(strAttrName); else { XmlUtils::CXmlNode oChildNode; if (oNode.GetNode(strChildNode, oChildNode)) return oChildNode.GetAttribute(strAttrName); } return _T(""); } static float AttrToPt(XmlUtils::CXmlNode& oNode, const CString& strChildNode, const CString& strAttrName, const float& fDefaultValue = 0) { CString strValue = _T(""); if (strChildNode == _T("")) { strValue = oNode.GetAttribute(strAttrName); return ToPt(strValue, fDefaultValue); } else { XmlUtils::CXmlNode oChildNode; if (oNode.GetNode(strChildNode, oChildNode)) return AttrToPt(oChildNode, _T(""), strAttrName, fDefaultValue); } return fDefaultValue; } private: static float ToPt(CString& strValue, const float& fDefaultValue = 0) { CString strMetric = Metric(strValue); if (strValue.GetLength() == 0) return fDefaultValue; float fValue = (float)XmlUtils::GetDouble(strValue); if (strMetric == _T("mm")) fValue *= 72.0f / 25.4f; else if (strMetric == _T("cm")) fValue *= 72.0f / 2.54f; else if (strMetric == _T("in")) fValue *= 72.0f; else if (strMetric == _T("%")) fValue = -fValue / 100.0f; else if (strMetric == _T("")) fValue /= 20.0f; return fValue; } static CString Metric(CString& strValue) { CString strMetric; int iLength = strValue.GetLength(); if (isdigit(strValue[iLength - 1])) strMetric = _T(""); else if (strValue[iLength - 1] == _T('%')) strMetric = strValue.Mid(iLength - 1); else strMetric = strValue.Mid(iLength - 2); int iMetricLength = strMetric.GetLength(); strValue.Delete(iLength - iMetricLength, iMetricLength); return strMetric; } }; } } } }