//#include "./stdafx.h" #include "SpTreeElem.h" #include "Shape.h" #include "Pic.h" #include "CxnSp.h" #include "SpTree.h" #include "GraphicFrame.h" #include "./../SlideMaster.h" namespace PPTX { namespace Logic { CString GetHexColor(const DWORD& ARGB) { BYTE r = (BYTE)((ARGB >> 16) & 0xFF); BYTE g = (BYTE)((ARGB >> 8) & 0xFF); BYTE b = (BYTE)((ARGB & 0xFF)); CString sC = _T(""); sC.Format(_T("#%02X%02X%02X"), r, g, b); return sC; } void CalculateFill(PPTX::Logic::SpPr& oSpPr, nullable& pShapeStyle, NSCommon::smart_ptr& _oTheme, NSCommon::smart_ptr& _oClrMap, CString& strAttr, CString& strNode, bool bOle) { smart_ptr oTheme = _oTheme.smart_dynamic_cast(); smart_ptr oClrMap = _oClrMap.smart_dynamic_cast(); PPTX::Logic::UniFill fill; DWORD ARGB = 0; if (pShapeStyle.is_init() && oTheme.is_init()) { oTheme->GetFillStyle(pShapeStyle->fillRef.idx.get_value_or(0), fill); if (pShapeStyle->fillRef.Color.is_init()) { if (fill.is()) { fill.as().Color = pShapeStyle->fillRef.Color; } } ARGB = pShapeStyle->fillRef.Color.GetRGBColor(_oTheme, _oClrMap, ARGB); } if (oSpPr.Fill.is_init()) oSpPr.Fill.Merge(fill); if (fill.is()) { BlipFill& oBlip = fill.as(); if (oBlip.blip.is_init() && oBlip.blip->embed.is_init()) { CString fopacity = _T(""); size_t eff_count = oBlip.blip->Effects.size(); for (size_t eff = 0; eff < eff_count; ++eff) { if (oBlip.blip->Effects[eff].is()) { PPTX::Logic::AlphaModFix& oAlpha = oBlip.blip->Effects[eff].as(); if (oAlpha.amt.is_init()) { double dA = (double)(oAlpha.amt.get()); dA = (dA * 65536 / 100000); int nA = (int)(dA + 0.5); if (nA < 0) nA = 0; if (nA > 65536) nA = 65536; fopacity = _T(" opacity=\"") + XmlUtils::IntToString(nA) + _T("f\""); } break; } } CString strId = oBlip.blip->embed->ToString(); if(bOle) { strAttr = _T(" filled=\"f\""); strNode = _T(""); } else { if (oBlip.tile.is_init()) strNode = _T(""); else strNode = _T(""); } } } else if (fill.is()) { ARGB = fill.as().Color.GetRGBColor(_oTheme, _oClrMap, ARGB); strAttr = _T(" fillcolor=\"") + GetHexColor(ARGB) + _T("\""); BYTE A = (BYTE)((ARGB >> 24) & 0xFF); if (A != 255) { int fopacity = (int)(((double)A / 255.0) * 65536); strNode = _T(""); } } else if (fill.is()) { GradFill& oGrad = fill.as(); if (oGrad.GsLst.size() > 0) { ARGB = oGrad.GsLst[0].color.GetRGBColor(_oTheme, _oClrMap, ARGB); strAttr = _T(" fillcolor=\"") + GetHexColor(ARGB) + _T("\""); BYTE A = (BYTE)((ARGB >> 24) & 0xFF); if (A != 255) { int fopacity = (int)(((double)A / 255.0) * 65536); strNode = _T(""); } } } else if (fill.is() || !fill.is_init()) { strAttr = _T(" filled=\"f\""); } else { strAttr = _T(" fillcolor=\"") + GetHexColor(ARGB) + _T("\""); BYTE A = (BYTE)((ARGB >> 24) & 0xFF); if (A != 255) { int fopacity = (int)(((double)A / 255.0) * 65536); strNode = _T(""); } } /* BYTE alpha = (BYTE)((ARGB >> 24) & 0xFF); if (alpha < 255) { CString strA = _T(""); strA.Format(_T("%d"), alpha); strAttr += _T(" opacity=\"") + strA + _T("\""); } */ } void CalculateLine(PPTX::Logic::SpPr& oSpPr, nullable& pShapeStyle, NSCommon::smart_ptr& _oTheme, NSCommon::smart_ptr& _oClrMap, CString& strAttr, CString& strNode, bool bOle) { smart_ptr oTheme = _oTheme.smart_dynamic_cast(); smart_ptr oClrMap = _oClrMap.smart_dynamic_cast(); PPTX::Logic::Ln line; DWORD ARGB = 0; if (pShapeStyle.is_init() && oTheme.is_init()) { oTheme->GetLineStyle(pShapeStyle->lnRef.idx.get_value_or(0), line); ARGB = pShapeStyle->lnRef.Color.GetRGBColor(_oTheme, _oClrMap, ARGB); } if (oSpPr.ln.is_init()) oSpPr.ln->Merge(line); if (line.Fill.is()) { ARGB = line.Fill.as().Color.GetRGBColor(_oTheme, _oClrMap, ARGB); strAttr = _T(" strokecolor=\"") + GetHexColor(ARGB) + _T("\""); } else if (bOle) strAttr = _T(" stroked=\"f\""); if (line.w.is_init()) { double dW = 72.0 * (*line.w) / (25.4 * 36000); CString s = _T(""); s.Format(_T(" strokeweight=\"%.2lfpt\""), dW); strAttr += s; } } SpTreeElem::SpTreeElem() { } SpTreeElem::~SpTreeElem() { } SpTreeElem::SpTreeElem(XmlUtils::CXmlNode& node) { fromXML(node); } const SpTreeElem& SpTreeElem::operator =(XmlUtils::CXmlNode& node) { fromXML(node); return *this; } void SpTreeElem::fromXML(XmlUtils::CXmlNode& node) { CString name = XmlUtils::GetNameNoNS(node.GetName()); if (name == _T("sp") || name == _T("wsp")) m_elem.reset(new Logic::Shape(node)); else if (name == _T("pic")) m_elem.reset(new Logic::Pic(node)); else if (name == _T("cxnSp")) m_elem.reset(new Logic::CxnSp(node)); else if (name == _T("grpSp") || name == _T("wgp") || name == _T("spTree") || name == _T("lockedCanvas")) m_elem.reset(new Logic::SpTree(node)); else if (name == _T("graphicFrame")) m_elem.reset(new Logic::GraphicFrame(node)); else if (name == _T("AlternateContent")) { XmlUtils::CXmlNode oNodeFall; if (node.GetNode(_T("mc:Fallback"), oNodeFall)) { XmlUtils::CXmlNodes oNodesC; if (oNodeFall.GetNodes(_T("*"), oNodesC)) { if (1 == oNodesC.GetCount()) { XmlUtils::CXmlNode oNodeC; oNodesC.GetAt(0, oNodeC); fromXML(oNodeC); } else { m_elem.reset(); } } else { m_elem.reset(); } } else { m_elem.reset(); } } else m_elem.reset(); } void SpTreeElem::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) { BYTE _type = pReader->GetUChar(); switch (_type) { case SPTREE_TYPE_SHAPE: { Logic::Shape* p = new Logic::Shape(); p->fromPPTY(pReader); m_elem.reset(p); break; } case SPTREE_TYPE_PIC: { Logic::Pic* p = new Logic::Pic(); p->fromPPTY(pReader); m_elem.reset(p); break; } case SPTREE_TYPE_CXNSP: { Logic::CxnSp* p = new Logic::CxnSp(); p->fromPPTY(pReader); m_elem.reset(p); break; } case SPTREE_TYPE_SPTREE: { Logic::SpTree* p = new Logic::SpTree(); p->m_name = _T("p:grpSp"); pReader->Seek(pReader->GetPos() - 5); // type back + len p->fromPPTY(pReader); m_elem.reset(p); break; } case SPTREE_TYPE_GRFRAME: { Logic::GraphicFrame* pFrame = new Logic::GraphicFrame(); pFrame->fromPPTY(pReader); m_elem.reset(pFrame); break; } case SPTREE_TYPE_NONE: { pReader->SkipRecord(); break; } default: break; } } CString SpTreeElem::toXML() const { if (m_elem.IsInit()) return m_elem->toXML(); return _T(""); } } // namespace Logic } // namespace PPTX