/* * (c) Copyright Ascensio System SIA 2010-2014 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, * EU, LV-1021. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ #include "./stdafx.h" #include "ShapeProperties.h" #include "Fills/SolidFill.h" #include "Fills/GradFill.h" #include "../Slide.h" #include "../SlideLayout.h" #include "../SlideMaster.h" namespace PPTX { namespace Logic { int GetIntegerFromHex(const CString& string) { return XmlUtils::GetInteger(string); } ShapeProperties::ShapeProperties() { for(int i = 0; i < 10; i++) { TextParagraphPr ppr; RunProperties rpr; ppr.defRPr = rpr; levels[i] = ppr; masters[i] = ppr; } m_nTextType = 0; } ShapeProperties::~ShapeProperties() { } void ShapeProperties::FillFromTextBody(const nullable& Src) { if(Src.IsInit()) { Src->bodyPr.Merge(bodyPr); if(Src->lstStyle.IsInit()) { for(int i = 0; i < 10; i++) { if(Src->lstStyle->levels[i].IsInit()) Src->lstStyle->levels[i]->Merge(levels[i]); } } } } void ShapeProperties::FillFromTextListStyle(const nullable& Src) { if(Src.IsInit()) { for(int i = 0; i < 10; i++) { if(Src->levels[i].IsInit()) Src->levels[i]->Merge(masters[i]); } } } void ShapeProperties::FillFromTextListStyle(const TextListStyle& Src) { for(int i = 0; i < 10; i++) { if(Src.levels[i].IsInit()) Src.levels[i]->Merge(masters[i]); } } void ShapeProperties::FillFontRef(const FontRef& Src) { fontStyle = Src; } void ShapeProperties::FillMasterFontSize(int size) { for(int i = 0; i < 10; i++) { if(masters[i]->defRPr.IsInit()) masters[i]->defRPr->sz = size; else { PPTX::Logic::RunProperties rpr; rpr.sz = size; masters[i]->defRPr = rpr; } } } CString ShapeProperties::GetParagraphAlgn(int level, const nullable& pParagraph)const { if(pParagraph.IsInit()) if(pParagraph->algn.IsInit()) return pParagraph->algn->get(); if (levels[level]->algn.is_init()) return levels[level]->algn.get_value(); if (masters[level]->algn.is_init()) return masters[level]->algn.get_value(); return _T("l"); } int ShapeProperties::GetParagraphLeftMargin(int level, const nullable& pParagraph)const { if(pParagraph.IsInit()) if(pParagraph->marL.IsInit()) return pParagraph->marL.get(); if (levels[level]->marL.is_init()) return levels[level]->marL.get(); if (masters[level]->marL.is_init()) return masters[level]->marL.get(); return 0; } int ShapeProperties::GetParagraphIndent(int level, const nullable& pParagraph)const { if(pParagraph.IsInit()) if(pParagraph->indent.IsInit()) return pParagraph->indent.get(); if (levels[level]->indent.is_init()) return levels[level]->indent.get(); if (masters[level]->indent.is_init()) return masters[level]->indent.get(); return 0; } int ShapeProperties::GetParagraphDefTabSz(int level, const nullable& pParagraph)const { if(pParagraph.IsInit()) if(pParagraph->defTabSz.IsInit()) return pParagraph->defTabSz.get(); if (levels[level]->defTabSz.is_init()) return levels[level]->defTabSz.get(); if (masters[level]->defTabSz.is_init()) return masters[level]->defTabSz.get(); return 376300; } CString ShapeProperties::GetParagraphFontAlgn(int level, const nullable& pParagraph)const { if(pParagraph.IsInit()) if(pParagraph->fontAlgn.IsInit()) return pParagraph->fontAlgn->get(); if (levels[level]->fontAlgn.is_init()) return levels[level]->fontAlgn.get_value(); if (masters[level]->fontAlgn.is_init()) return masters[level]->fontAlgn.get_value(); return _T("base"); } bool ShapeProperties::GetParagraphLatinLnBrk(int level, const nullable& pParagraph)const { if(pParagraph.IsInit()) if(pParagraph->latinLnBrk.IsInit()) return pParagraph->latinLnBrk.get(); if (levels[level]->latinLnBrk.is_init()) return levels[level]->latinLnBrk.get(); if (masters[level]->latinLnBrk.is_init()) return masters[level]->latinLnBrk.get(); return false; } bool ShapeProperties::GetParagraphRtl(int level, const nullable& pParagraph)const { if(pParagraph.IsInit()) if(pParagraph->rtl.IsInit()) return pParagraph->rtl.get(); if (levels[level]->rtl.is_init()) return levels[level]->rtl.get(); if (masters[level]->rtl.is_init()) return masters[level]->rtl.get(); return false; } int ShapeProperties::GetParagraphLnSpc(int level, const nullable& pParagraph)const { if(pParagraph.IsInit()) if(pParagraph->lnSpc.IsInit()) return pParagraph->lnSpc->GetVal(); if(levels[level]->lnSpc.IsInit()) return levels[level]->lnSpc->GetVal(); if(masters[level]->lnSpc.IsInit()) return masters[level]->lnSpc->GetVal(); return 100; } int ShapeProperties::GetParagraphSpcAft(int level, const nullable& pParagraph)const { if(pParagraph.IsInit()) if(pParagraph->spcAft.IsInit()) return pParagraph->spcAft->GetVal(); if(levels[level]->spcAft.IsInit()) return levels[level]->spcAft->GetVal(); if(masters[level]->spcAft.IsInit()) return masters[level]->spcAft->GetVal(); return 0; } int ShapeProperties::GetParagraphSpcBef(int level, const nullable& pParagraph)const { if(pParagraph.IsInit()) if(pParagraph->spcBef.IsInit()) return pParagraph->spcBef->GetVal(); if(levels[level]->spcBef.IsInit()) return levels[level]->spcBef->GetVal(); if(masters[level]->spcBef.IsInit()) return masters[level]->spcBef->GetVal(); return 0; } bool ShapeProperties::HasParagraphBullet(int level, const nullable& pParagraph)const { if(pParagraph.IsInit()) if(pParagraph->ParagraphBullet.is_init()) return pParagraph->ParagraphBullet.has_bullet(); if(levels[level]->ParagraphBullet.is_init()) return levels[level]->ParagraphBullet.has_bullet(); return masters[level]->ParagraphBullet.has_bullet(); } bool ShapeProperties::GetRunBold(int level, const nullable& pRun, const nullable& pParagraph)const { if(pRun.IsInit()) if(pRun->b.IsInit()) return pRun->b.get(); if(pParagraph.IsInit()) if(pParagraph->defRPr.IsInit()) if(pParagraph->defRPr->b.IsInit()) return pParagraph->defRPr->b.get(); if (levels[level]->defRPr->b.is_init()) return levels[level]->defRPr->b.get(); if (masters[level]->defRPr->b.is_init()) return masters[level]->defRPr->b.get(); return false; } bool ShapeProperties::GetRunItalic(int level, const nullable& pRun, const nullable& pParagraph)const { if(pRun.IsInit()) if(pRun->i.IsInit()) return pRun->i.get(); if(pParagraph.IsInit()) if(pParagraph->defRPr.IsInit()) if(pParagraph->defRPr->i.IsInit()) return pParagraph->defRPr->i.get(); if (levels[level]->defRPr->i.is_init()) return levels[level]->defRPr->i.get(); if (masters[level]->defRPr->i.is_init()) return masters[level]->defRPr->i.get(); return false; } CString ShapeProperties::GetRunUnderline(int level, const nullable& pRun, const nullable& pParagraph)const { if(pRun.IsInit()) if(pRun->u.IsInit()) return pRun->u->get(); if(pParagraph.IsInit()) if(pParagraph->defRPr.IsInit()) if(pParagraph->defRPr->u.IsInit()) return pParagraph->defRPr->u->get(); if (levels[level]->defRPr->u.is_init()) return levels[level]->defRPr->u.get_value(); if (masters[level]->defRPr->u.is_init()) return masters[level]->defRPr->u.get_value(); return _T("none"); } CString ShapeProperties::GetRunStrike(int level, const nullable& pRun, const nullable& pParagraph)const { if(pRun.IsInit()) if(pRun->strike.IsInit()) return pRun->strike->get(); if(pParagraph.IsInit()) if(pParagraph->defRPr.IsInit()) if(pParagraph->defRPr->strike.IsInit()) return pParagraph->defRPr->strike->get(); if (levels[level]->defRPr->strike.is_init()) return levels[level]->defRPr->strike.get_value(); if (masters[level]->defRPr->strike.is_init()) return masters[level]->defRPr->strike.get_value(); return _T("noStrike"); } CString ShapeProperties::GetRunCap(int level, const nullable& pRun, const nullable& pParagraph)const { if(pRun.is_init()) if(pRun->cap.is_init()) return pRun->cap->get(); if(pParagraph.is_init()) if(pParagraph->defRPr.is_init()) if(pParagraph->defRPr->cap.is_init()) return pParagraph->defRPr->cap->get(); if (levels[level]->defRPr->cap.is_init()) return levels[level]->defRPr->cap.get_value(); if (masters[level]->defRPr->cap.is_init()) return masters[level]->defRPr->cap.get_value(); return _T("none"); } int ShapeProperties::GetRunBaseline(int level, const nullable& pRun, const nullable& pParagraph)const { if(pRun.is_init()) if(pRun->baseline.is_init()) return pRun->baseline.get(); if(pParagraph.is_init()) if(pParagraph->defRPr.is_init()) if(pParagraph->defRPr->baseline.is_init()) return pParagraph->defRPr->baseline.get(); if (levels[level]->defRPr->baseline.is_init()) return levels[level]->defRPr->baseline.get(); if (masters[level]->defRPr->baseline.is_init()) return masters[level]->defRPr->baseline.get(); return 0; } int ShapeProperties::GetRunSize(int level, const nullable& pRun, const nullable& pParagraph)const { if(pRun.is_init()) if(pRun->sz.is_init()) return pRun->sz.get(); if(pParagraph.is_init()) if(pParagraph->defRPr.is_init()) if(pParagraph->defRPr->sz.is_init()) return pParagraph->defRPr->sz.get(); if (levels[level]->defRPr->sz.is_init()) return levels[level]->defRPr->sz.get(); if (masters[level]->defRPr->sz.is_init()) return masters[level]->defRPr->sz.get(); return 1800; } int ShapeProperties::GetRunSize(int level)const { if (levels[level]->defRPr->sz.is_init()) return levels[level]->defRPr->sz.get(); if (masters[level]->defRPr->sz.is_init()) return masters[level]->defRPr->sz.get(); return 1800; } CString ShapeProperties::GetRunFont(int level, const nullable& pRun, const nullable& pParagraph, LONG& lFontIndex)const { CString strFontName = _T(""); if((pRun.is_init()) && (pRun->latin.is_init())) strFontName = pRun->latin->typeface; else if((pParagraph.is_init()) && (pParagraph->defRPr.is_init()) && (pParagraph->defRPr->latin.is_init())) strFontName = pParagraph->defRPr->latin->typeface; else { if(levels[level]->defRPr->latin.is_init()) strFontName = levels[level]->defRPr->latin->typeface; else if(fontStyle.is_init()) strFontName = (fontStyle->idx->get() == _T("minor"))?_T("+mn-lt"):_T("+mj-lt"); else if(masters[level]->defRPr->latin.is_init()) strFontName = masters[level]->defRPr->latin->typeface; } if(strFontName == _T("+mj-lt")) { strFontName = MajorLatin.typeface; lFontIndex = 0; } else if(strFontName == _T("+mn-lt")) { strFontName = MinorLatin.typeface; lFontIndex = 1; } else if(strFontName == _T("")) { strFontName = MinorLatin.typeface; lFontIndex = 1; } return strFontName; } CString ShapeProperties::GetRunPanose(int level, const nullable& pRun, const nullable& pParagraph)const { CString panose = _T(""); CString style = _T(""); if((pRun.is_init()) && (pRun->latin.is_init())) panose = pRun->latin->panose.get_value_or(_T("")); else if((pParagraph.is_init()) && (pParagraph->defRPr.is_init()) && (pParagraph->defRPr->latin.is_init())) panose = pParagraph->defRPr->latin->panose.get_value_or(_T("")); else { if(levels[level]->defRPr->latin.is_init()) panose = levels[level]->defRPr->latin->panose.get_value_or(_T("")); else if(fontStyle.is_init()) style = fontStyle->idx.get_value_or(_T("major")); else if(masters[level]->defRPr->latin.is_init()) panose = masters[level]->defRPr->latin->panose.get_value_or(_T("")); } if(style == _T("major")) panose = MajorLatin.panose.get_value_or(_T("")); else if(style == _T("minor")) panose = MinorLatin.panose.get_value_or(_T("")); return panose; } BYTE ShapeProperties::GetRunCharset(int level, const nullable& pRun, const nullable& pParagraph)const { CString charset = _T(""); CString style = _T(""); if((pRun.is_init()) && (pRun->latin.is_init())) charset = pRun->latin->charset.get_value_or(_T("")); else if((pParagraph.is_init()) && (pParagraph->defRPr.is_init()) && (pParagraph->defRPr->latin.is_init())) charset = pParagraph->defRPr->latin->charset.get_value_or(_T("")); else { if(levels[level]->defRPr->latin.is_init()) charset = levels[level]->defRPr->latin->charset.get_value_or(_T("")); else if(fontStyle.is_init()) style = fontStyle->idx.get_value_or(_T("major")); else if(masters[level]->defRPr->latin.is_init()) charset = masters[level]->defRPr->latin->charset.get_value_or(_T("")); } if(style == _T("major")) charset = MajorLatin.charset.get_value_or(_T("")); else if(style == _T("minor")) charset = MinorLatin.charset.get_value_or(_T("")); if(charset == _T("")) charset = _T("01"); return GetIntegerFromHex(charset); } BYTE ShapeProperties::GetRunPitchFamily(int level, const nullable& pRun, const nullable& pParagraph)const { CString pitchFamily = _T(""); CString style = _T(""); if((pRun.is_init()) && (pRun->latin.is_init())) pitchFamily = pRun->latin->pitchFamily.get_value_or(_T("")); else if((pParagraph.is_init()) && (pParagraph->defRPr.is_init()) && (pParagraph->defRPr->latin.is_init())) pitchFamily = pParagraph->defRPr->latin->pitchFamily.get_value_or(_T("")); else { if(levels[level]->defRPr->latin.is_init()) pitchFamily = levels[level]->defRPr->latin->pitchFamily.get_value_or(_T("")); else if(fontStyle.is_init()) style = fontStyle->idx.get_value_or(_T("major")); else if(masters[level]->defRPr->latin.is_init()) pitchFamily = masters[level]->defRPr->latin->pitchFamily.get_value_or(_T("")); } if(style == _T("major")) pitchFamily = MajorLatin.pitchFamily.get_value_or(_T("")); else if(style == _T("minor")) pitchFamily = MinorLatin.pitchFamily.get_value_or(_T("")); if(pitchFamily == _T("")) pitchFamily = _T("0"); return GetIntegerFromHex(pitchFamily); } DWORD ShapeProperties::GetRunRGBA(int level, const nullable& pRun, const nullable& pParagraph)const { if(pRun.is_init()) { if(pRun->Fill.is()) return pRun->Fill.as().Color.GetRGBA(); if(pRun->Fill.is()) return pRun->Fill.as().GetFrontColor().GetRGBA(); } if((pParagraph.is_init()) && (pParagraph->defRPr.is_init())) { if(pParagraph->defRPr->Fill.is()) return pParagraph->defRPr->Fill.as().Color.GetRGBA(); if(pParagraph->defRPr->Fill.is()) return pParagraph->defRPr->Fill.as().GetFrontColor().GetRGBA(); } if(levels[level]->defRPr->Fill.is()) return levels[level]->defRPr->Fill.as().Color.GetRGBA(); if(levels[level]->defRPr->Fill.is()) return levels[level]->defRPr->Fill.as().GetFrontColor().GetRGBA(); if(fontStyle.is_init()) return fontStyle->Color.GetRGBA(); if(masters[level]->defRPr->Fill.is()) return masters[level]->defRPr->Fill.as().Color.GetRGBA(); if(masters[level]->defRPr->Fill.is()) return masters[level]->defRPr->Fill.as().GetFrontColor().GetRGBA(); return 0; } DWORD ShapeProperties::GetRunARGB(int level, const nullable& pRun, const nullable& pParagraph)const { if(pRun.is_init()) { if(pRun->Fill.is()) return pRun->Fill.as().Color.GetARGB(); if(pRun->Fill.is()) return pRun->Fill.as().GetFrontColor().GetARGB(); } if((pParagraph.is_init()) && (pParagraph->defRPr.is_init())) { if(pParagraph->defRPr->Fill.is()) return pParagraph->defRPr->Fill.as().Color.GetARGB(); if(pParagraph->defRPr->Fill.is()) return pParagraph->defRPr->Fill.as().GetFrontColor().GetARGB(); } if(levels[level]->defRPr->Fill.is()) return levels[level]->defRPr->Fill.as().Color.GetARGB(); if(levels[level]->defRPr->Fill.is()) return levels[level]->defRPr->Fill.as().GetFrontColor().GetARGB(); if(fontStyle.is_init()) return fontStyle->Color.GetARGB(); if(masters[level]->defRPr->Fill.is()) return masters[level]->defRPr->Fill.as().Color.GetARGB(); if(masters[level]->defRPr->Fill.is()) return masters[level]->defRPr->Fill.as().GetFrontColor().GetARGB(); return 0; } DWORD ShapeProperties::GetRunBGRA(int level, const nullable& pRun, const nullable& pParagraph)const { if(pRun.is_init()) { if(pRun->Fill.is()) return pRun->Fill.as().Color.GetBGRA(); if(pRun->Fill.is()) return pRun->Fill.as().GetFrontColor().GetBGRA(); } if((pParagraph.is_init()) && (pParagraph->defRPr.is_init())) { if(pParagraph->defRPr->Fill.is()) return pParagraph->defRPr->Fill.as().Color.GetBGRA(); if(pParagraph->defRPr->Fill.is()) return pParagraph->defRPr->Fill.as().GetFrontColor().GetBGRA(); } if(levels[level]->defRPr->Fill.is()) return levels[level]->defRPr->Fill.as().Color.GetBGRA(); if(levels[level]->defRPr->Fill.is()) return levels[level]->defRPr->Fill.as().GetFrontColor().GetBGRA(); if(fontStyle.is_init()) return fontStyle->Color.GetBGRA(); if(masters[level]->defRPr->Fill.is()) return masters[level]->defRPr->Fill.as().Color.GetBGRA(); if(masters[level]->defRPr->Fill.is()) return masters[level]->defRPr->Fill.as().GetFrontColor().GetBGRA(); return 0; } DWORD ShapeProperties::GetRunABGR(int level, const nullable& pRun, const nullable& pParagraph)const { if(pRun.is_init()) { if(pRun->Fill.is()) return pRun->Fill.as().Color.GetABGR(); if(pRun->Fill.is()) return pRun->Fill.as().GetFrontColor().GetABGR(); } if((pParagraph.is_init()) && (pParagraph->defRPr.is_init())) { if(pParagraph->defRPr->Fill.is()) return pParagraph->defRPr->Fill.as().Color.GetABGR(); if(pParagraph->defRPr->Fill.is()) return pParagraph->defRPr->Fill.as().GetFrontColor().GetABGR(); } if(levels[level]->defRPr->Fill.is()) return levels[level]->defRPr->Fill.as().Color.GetABGR(); if(levels[level]->defRPr->Fill.is()) return levels[level]->defRPr->Fill.as().GetFrontColor().GetABGR(); if(fontStyle.is_init()) return fontStyle->Color.GetABGR(); if(masters[level]->defRPr->Fill.is()) return masters[level]->defRPr->Fill.as().Color.GetABGR(); if(masters[level]->defRPr->Fill.is()) return masters[level]->defRPr->Fill.as().GetFrontColor().GetABGR(); return 0; } PPTX::Logic::UniColor ShapeProperties::GetColor(int level, const nullable& pRun, const nullable& pParagraph)const { if(pRun.is_init()) { if(pRun->Fill.is()) return pRun->Fill.as().Color; if(pRun->Fill.is()) return pRun->Fill.as().GetFrontColor(); } if((pParagraph.is_init()) && (pParagraph->defRPr.is_init())) { if(pParagraph->defRPr->Fill.is()) return pParagraph->defRPr->Fill.as().Color; if(pParagraph->defRPr->Fill.is()) return pParagraph->defRPr->Fill.as().GetFrontColor(); } if(levels[level]->defRPr->Fill.is()) return levels[level]->defRPr->Fill.as().Color; if(levels[level]->defRPr->Fill.is()) return levels[level]->defRPr->Fill.as().GetFrontColor(); if(fontStyle.is_init()) return fontStyle->Color; if(masters[level]->defRPr->Fill.is()) return masters[level]->defRPr->Fill.as().Color; if(masters[level]->defRPr->Fill.is()) return masters[level]->defRPr->Fill.as().GetFrontColor(); UniColor oUniColor; return oUniColor; } PPTX::Logic::UniColor ShapeProperties::GetColorBullet(int level, const nullable& pParagraph)const { if(pParagraph.IsInit()) { if(pParagraph->buColor.is_init()) { if (pParagraph->buColor.is()) return pParagraph->buColor.as().Color; PPTX::Logic::UniColor oColor; return oColor; } } if (levels[level]->buColor.is_init()) { if (levels[level]->buColor.is()) return levels[level]->buColor.as().Color; PPTX::Logic::UniColor oColor; return oColor; } if (masters[level]->buColor.is_init()) { if (masters[level]->buColor.is()) return masters[level]->buColor.as().Color; PPTX::Logic::UniColor oColor; return oColor; } PPTX::Logic::UniColor oColor; return oColor; } void ShapeProperties::SetParentFilePointer(const WrapperFile* pFile) { bodyPr.SetParentFilePointer(pFile); for(int i = 0; i < 10; i ++) { levels[i]->SetParentFilePointer(pFile); masters[i]->SetParentFilePointer(pFile); } if(fontStyle.is_init()) fontStyle->SetParentFilePointer(pFile); } DWORD ShapeProperties::GetHyperlinkRGBA()const { if(bodyPr.parentFileIs()) return bodyPr.parentFileAs().GetRGBAFromMap(_T("hlink")); else if(bodyPr.parentFileIs()) return bodyPr.parentFileAs().GetRGBAFromMap(_T("hlink")); else if(bodyPr.parentFileIs()) return bodyPr.parentFileAs().GetRGBAFromMap(_T("hlink")); else return 0; } DWORD ShapeProperties::GetHyperlinkARGB()const { if(bodyPr.parentFileIs()) return bodyPr.parentFileAs().GetARGBFromMap(_T("hlink")); else if(bodyPr.parentFileIs()) return bodyPr.parentFileAs().GetARGBFromMap(_T("hlink")); else if(bodyPr.parentFileIs()) return bodyPr.parentFileAs().GetARGBFromMap(_T("hlink")); else return 0; } DWORD ShapeProperties::GetHyperlinkBGRA()const { if(bodyPr.parentFileIs()) return bodyPr.parentFileAs().GetBGRAFromMap(_T("hlink")); else if(bodyPr.parentFileIs()) return bodyPr.parentFileAs().GetBGRAFromMap(_T("hlink")); else if(bodyPr.parentFileIs()) return bodyPr.parentFileAs().GetBGRAFromMap(_T("hlink")); else return 0; } DWORD ShapeProperties::GetHyperlinkABGR()const { if(bodyPr.parentFileIs()) return bodyPr.parentFileAs().GetABGRFromMap(_T("hlink")); else if(bodyPr.parentFileIs()) return bodyPr.parentFileAs().GetABGRFromMap(_T("hlink")); else if(bodyPr.parentFileIs()) return bodyPr.parentFileAs().GetABGRFromMap(_T("hlink")); else return 0; } } } // namespace PPTX